Ik ben vandaag begonnen met PIC's programmeren. Ik gebruik de mini-cursus van picbasic. De eerste voorbeelden gaan goed, maar zosnel er een variabel in voor komt gaat het mis.

DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

DIM LedTeller AS BYTE         ;Maak variabele met de naam 'LedTeller' aan 

CLEAR                         ;Wis alle RAM geheugen

;Hoofdprogramma
WHILE LedTeller < 8           ;Zolang teller kleiner is dan 8 ...
  TOGGLE PORTA.1              ;Aan moet uit, uit moet aan (knipper)
  DELAYMS 500                 ;500 milliseconden = 0,5 seconde
  LedTeller = LedTeller + 1   ;Teller met 1 verhogen
WEND                          ;...deze lus uitvoeren

HIGH PORTA.1                  ;LED uitzetten

END                           ;Einde programma

De LED hoort te knipperen, maar de LED blijft gewoon branden. Als ik een paar keer de voedingsspanning eraf heb gehaald en weer erop heb gezet, brandt de LED helemaal niet meer.

Weet iemand waar dit aan kan liggen?
Alvast bedankt voor de hulp.

Wat je nu doet is het volgende:
Zolang de teller onder 8 is, knippert de led en tel je omhoog. Zodra teller boven 8 is, gaat de led uit en doe je niets meer.
Lijkt me niets verkeerd aan, 1/32 kans dat de teller onder de 8 start, dus knipperen zal ie niet veel doen.

Ik heb ook al geprobeerd om CLEAR te vervangen met LedTeller = 0, maar dan doet hij het nog steeds niet.

Op 4 januari 2008 20:18:10 schreef Videomodulator:
Lijkt me niets verkeerd aan, 1/32 kans dat de teller onder de 8 start, dus knipperen zal ie niet veel doen.

Waarom?
De teller is altijd 0 aan het begin van het programma.

Programma komt rechtstreeks van www.picbasic.nl

Hardware probleempje?

Op 4 januari 2008 21:10:55 schreef Henry S.:
...De teller is altijd 0 aan het begin van het programma...

Daar ga ik nooit blindelings van uit. Ik zie trouwens geen mainloop, dus na 8 keer tellen loopt ie tot de end en blijft daar hangen afaik.

Op 4 januari 2008 21:33:43 schreef Videomodulator:
[...]Daar ga ik nooit blindelings van uit.

Datasheet gegeven. Als de boel start staat alles op 0.

De gebruikelijke vraag: De led heeft toch wel een serieweerstand van 270 ~ 470 Ohm? Om de een of andere reden denken de meesten dat dat een overbodig onderdeel is, en mishandelen de pin driver om de stroom door de led te begrenzen |:(

Ik gebruik 1kOhm, dus daar ligt het denk ik niet aan

Ik heb nog geprobeerd met een PIC16F627, maar blijkbaar kan ik daar geen INTRC_OSC_NOCLKOUT gebruiken. En ik heb geen idee wat ik daar anders in moet vullen. Weet iemand dat, dan kan ik morgen nog eens proberen.

[Bericht gewijzigd door Henry S. op (38%)]

High portA.1 om de boel uit te krijgen...
Stel nou dat je een zwevende spanning hebt. (geen pullups)

Ik kan het niet van me afzetten, maar goed onderbouwen lukt me ook niet.

Anyway,
Als je nu eens de LED met de weerstand naar Massa brengt?
En je veranderd in je code de HIGH naar LOW, doe je het net even andersom.

Dus brandt je LED bij een "hoge" uitgang.

Kijk eens wat hij dan doet.

Op 4 januari 2008 21:41:26 schreef klein is fijn:
[...]Datasheet gegeven. Als de boel start staat alles op 0.

Picbasic gegeven, Clear zet alles op 0.

Op 4 januari 2008 21:33:43 schreef Videomodulator:
Ik zie trouwens geen mainloop, dus na 8 keer tellen loopt ie tot de end en blijft daar hangen afaik.

De While - Wend lus is toch de mainloop, End stopt het programma.

@Fantomaz: Maakt voor de werking zoverre uit dat hoog laag is en laag hoog, nog steeds een knipperled.

de TS z'n led knippert niet. Programma loopt niet of er is iets niet goed aangesloten of vergeten.

Op 4 januari 2008 22:31:43 schreef mezelf:
Ik heb nog geprobeerd met een PIC16F627, maar blijkbaar kan ik daar geen INTRC_OSC_NOCLKOUT gebruiken. En ik heb geen idee wat ik daar anders in moet vullen. Weet iemand dat, dan kan ik morgen nog eens proberen.

Die configbit werkt wel, zie datasheet.

[Bericht gewijzigd door Henry S. op (20%)]

Op 5 januari 2008 01:49:36 schreef Henry S.:
@Fantomaz: Maakt voor de werking zoverre uit dat hoog laag is en laag hoog, nog steeds een knipperled.

de TS z'n led knippert niet. Programma loopt niet of er is iets niet goed aangesloten of vergeten.

Mee eens, maar in mijn hoofd spookt een onverklaarbare reden dat het iets met pullup of pulldown is.
Door nu de LED naar massa te schakelen, waarbij "high" de LED van zijn 5V voorzien, ben ik benieuwd of het verschil maakt.
Als de betreffende poort door een storende omgevingsfactor steeds hoog blijft, moet dat een geinverteerd effect geven wanneer je de boel naar massa schakelt ipv van de 5V naar de 0v poort.

Als je de uitgang Laag maakt, dan wordt deze 0 volt.

Als de LED tussen de 5 volt en de uitgang zit, dan gaat deze aan (als de LED niet omgekeerd zit) omdat er nu een spanning van 5 volt over de LED (met weerstand) staat.

mezelf: Wat voor voeding gebruik je, en gebruik je ook ontkoppel Ctjes ?

[Bericht gewijzigd door MMSoft op (14%)]

Op 4 januari 2008 21:33:43 schreef Videomodulator:
[...]Daar ga ik nooit blindelings van uit. Ik zie trouwens geen mainloop, dus na 8 keer tellen loopt ie tot de end en blijft daar hangen afaik.

Dat is juist de bedoeling.
Het is een cursus.
Klein beginnen, dit voorbeeldje laat zien dat een lus 8 keer wordt doorlopen en dat het programma dan stopt.
Dat wordt in de begeleidende tekst van de cursus duidelijk uitgelegd.

De telvariabele begint wel degelijk vanaf 0 te tellen.
De PICBasic instructie CLEAR zorgt hiervoor, ook dat staat duidelijk in de begeleidende cursus tekst vermeldt.

---

@Fantomaz: Met pull-ups heeft het hier niets mee te maken, er wordt hier geen ingang gebruikt.

---

Ik denk aan een hardware probleem.
Heb je een keurig gestabiliseerde 5V (dus niet van een treintrafo o.i.d.)?
Heb je een ontkoppel condensator (100n over de voedingspinnen van de PIC) geplaatst?
Verder alles goed gecontroleerd?

Ik heb alles ontkoppeld en alles 5 keer gecontroleerd. Ik denk dat het een hardwareprobleem is. Ik ben er ook al achter gekomen dat PORTA.4 dood is en met programmeren krijg ik nu steeds een error:

Verify error at adress 0x0000. Value in image is 0x282A and value in target is 0x3FFF.

Ik heb al een nieuwe PIC besteld

DEVICE 16F628A                ;We gebruiken een 16F628A type
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE              ;Alle ingangen digitaal

DIM LedTeller AS BYTE         ;Maak variabele met de naam 'LedTeller' aan 

CLEAR                         ;Wis alle RAM geheugen

;Hoofdprogramma
WHILE LedTeller < 8           ;Zolang teller kleiner is dan 8 ...
  TOGGLE PORTA.1              ;Aan moet uit, uit moet aan (knipper)
  IF Ledteller >= 8 THEN Ledteller = 0 ; Als de waarde Teller gelijk of groter is dan 8, reset naar 0
  DELAYMS 500                 ;500 milliseconden = 0,5 seconde
  Inc Ledteller               ;Teller met 1 verhogen
WEND                          ;...deze lus uitvoeren

HIGH PORTA.1                  ;LED uitzetten

END                           ;Einde programma

is poort a4 nu net niet die ene die het aleen doet met pullup ? volgens mij denkt elke begineling dat die dood is,

pic's kunnen doorgaans veel mishandeling aan hoor

Op 5 januari 2008 10:32:25 schreef Frits Kieftenbelt:
@Fantomaz: Met pull-ups heeft het hier niets mee te maken, er wordt hier geen ingang gebruikt.

-zucht-...
Ik doe even een paar weken niets met PIC's en begin ik het nou al kwijt te raken? :)

Troost je, ik was ALL_DIGITAL TRUE vergeten ,en dan gaat PortA toch dingen doen die je niet verwacht ;)
En dan ben je weer een half uur verder...

@PD5DJ: Leuk maar overbodig, Ledteller >= 8 komt nooit voor en hoort ook niet in de lus. Zet dan Ledteller = 0 voor de lus. Maar ook dat is overbodig in dit geval.

Op 5 januari 2008 12:30:22 schreef sould3mon:
is poort a4 nu net niet die ene die het aleen doet met pullup?

Dat klopt, maar niet iedereen leest de datasheet ;)

De aanpassing van PD5DJ is, zoals Henry al schreef, totaal nutteloos en moet er ook niet worden ingezet omdat dan de hele beschrijving van de demonstratie niet meer klopt.

Nog maar eens:
De beginnerscursus laat met dit voorbeeld zien hoe een teller werkt.
Het is juist de bedoeling dat de LED stopt met knipperen als de lus 8x doorlopen is, zodat de beginnende programmeur aan de LED kan zien dat het in de praktijk klopt.
De beginner kan nu gaan stoeien met de diverse waarden in het programma en kijken wat er gebeurt, aldoende leert men.

De PIC is in mijn ogen nu morsdood. Het enige trucje wat hij nog kan is een led laten branden als hij een beetje losjes in het breadboard zit. Vraag me niet hoe het kan, maar de led gaat branden als de pic op de contacten 'ligt', en niet ín de contacten zit. Hetzelfde gebeurde toen ik de 100nF condensator opnieuw inprikte.

En over porta.4: ik had al iets gelezen dat er een poort open-drain was, maar ik wist niet meer welke.

Zijn PIC's ook zo gevoelig voor statische lading als de 4000 serie? Want ik denk er net aan dat ik met wollen sokken op zon plastic achtige vloer (die waar je zo goed statische ladingen op maakt) rondloop:P

Heb je mogelijk sluiting in de Breadbord?

Weet je zeker dat de weerstandswaarde goed is?

Het is wel bizar dat het niet werkt.
Frits heeft een simpele opzet gemaakt die bij bijna iedereen heeft gewerkt. (Bijna iedereen omdat er ook mensen zijn die het alleen maar lezen en niet echt bouwen :-))

Mogelijk toch statische invloeden die je PIC het loodje hebben laten leggen?

Ik heb al een paar keer geschoven op het breadbord en de weerstand is goed (1K).

Ik denk dat het gewoon afwachen word totdat mijn nieuwe PIC er is (dickbest is snel dus dat zal niet lang meer duren)

Slecht breadboard? Er zijn breadboards die bij aanschaf al bij met name IC's slecht contact maken. Meten!

Ik zou die "defecte" PIC maar bewaren, want de kans is groot dat ook je nieuwe PIC het niet doet.
Volgens mij ligt het probleem ergens anders, even afwachten...

Op de een of andere manier doet de PIC het weer (de wonderen zijn de wereld nog niet uit). Ik heb zover ik me kan herinneren helemaal niks veranderd.

Ik zit nog wel met het probleem van de variabelen. Ik heb een testprogramma geschreven om te kijken wat er misgaat:

DEVICE 16F648A
CONFIG INTRC_OSC_NOCLKOUT, WDT_OFF, PWRTE_ON, LVP_OFF, MCLRE_OFF
ALL_DIGITAL TRUE

DIM n AS BYTE		

CLEAR

Label:
IF n = 0 THEN 
  LOW PORTA.0
ELSEIF n = 1 THEN 
  LOW PORTA.1
ELSEIF n = 2 THEN
  LOW PORTA.2
ELSEIF n = 3 THEN
  LOW PORTA.3
ELSE
  LOW PORTA
ENDIF

INC n

DELAYMS 1000
HIGH PORTA
GOTO Label

END

Als n = 0, wordt poort PORTA.0 hoog, als n = 1 wordt PORTA.1 hoog etc. Daarna wordt er 1 bij n opgeteld, wacht de PIC een seconde en begint het proces weer opnieuw.
Aan de poorten heb ik leds met 1k weerstand gehangen.

Als de PIC opstart, gaat led 0 branden. Na een seconde gaat led 1 branden en deze blijft branden. Na een kwartier brandt hij nog steeds.

Ik heb nog meer programmas geschreven waarmee ik een beetje het 'gedrag' van de variabelen kan bekijken, maar die ga ik hier niet allemaal posten. Ik kan wel verklappen dat er geen enkele werkt zoals hij hoort te werken.