Sida 1 av 2
Problem med loopar - PIC, 16F84
Postat: 24 maj 2005, 20:24:56
av opatagio
Hej, jag har läst forumet i en tid men aldrig känt att jag behövt registrera mig. Men nu är den dagen kommen och jag har lite problem. Det är säkert något generalfel jag gjort men vore tacksam om någon kan förklara varför man aldrig kommer ur de här looparna.
Kod: Markera allt
;----------------------------
Minutes
movlw d'2'
movwf Loop1count
decfsz MinCount,1
goto Loop1
goto Output
Loop1
movlw d'2'
movwf Loop2count
decfsz Loop1count,1
goto Loop2
goto Minutes
Loop2
movlw d'2'
movwf Loop3count
decfsz Loop2count,1
goto Loop3
goto Loop1
Loop3
decfsz Loop3count,1
goto Loop3
goto Loop2
;----------------------------
Man hoppar till Minutes. Den är inte noll, går till Loop1 = inte noll, går till Loop2 = inte noll, går till Loop3 = kör Loop3 tills den blir noll sedan går tillbaka till Loop2 = noll, går till Loop1 = noll, går till Minutes = inte noll, går till Loop1 igen osv osv. Men när Minutes når 0 ska man hoppa till Output. Av nåon anledning stannar man vid Loop3. Kör decsfz Loop3count. Men även om den är noll så går han tillbaka till Loop3 (alltså raden under decsfz Loop3count)
Det blev lite rörigt men hoppas någon förstår och kan banka in lite vett i mig

Postat: 24 maj 2005, 20:59:18
av Schnegelwerfer
Jag kan ju börja med att banka in lite vett att inte använda PIC16F84!
Dina loopar var väldigt snåriga må jag säga! Jag kan i alla fall inte se något fel just nu, men jag kanske har stirrat mig blind på problemet.
En tanke som slog mig är ju att stacken bara är 8 nivåer djup, d.v.s. det går ju inte att ha hur många nästlade subrutiner som helst. Kan det vara det som spökar kanske?
Vad händer om en PIC fyller stacken? Det vore intressant att veta hur den beter sig då.
Postat: 24 maj 2005, 21:21:18
av cyr
Jag får stack overflow i min hjärna när jag försöker följa de här looparna också, men det är iaf inte det som är problemet i PICen, det är ju inga subrutiner...
OT, men om man fyller stacken på PIC16 skrivs helt enkelt det äldsta över tror jag, ringbuffert alltså.
Det jag tänkte föreslå var att resultatet från decfsz hamnade i W istället för variabeln, men det var ju fel. Brukar alltid själv skriva W och F istället för 0 och 1, det är enklare att komma ihåg.
Postat: 24 maj 2005, 22:08:08
av AndersL
Det är säkert redan gjort flera gånger, men mitt förslag är:
kolla så att variablerna är definierade
etiketten Output är rätt
kör en ny 'make' på projektet
Lycka till!
Postat: 24 maj 2005, 22:25:44
av Schnegelwerfer
Cyr: Du har ju rätt där i att inget kommer att läggas på stacken, eftersom det ju inte var några subrutiner inblandade.
Om man gör sådana här nästlade loopar är ju chansen att man gör något tankefel ganska stor!
Jag tycker att det borde gå att göra det du vill på ett enklare sätt.
Postat: 24 maj 2005, 22:42:57
av cyr
Har du kapat bort något i looparna, eller ser koden ut exakt så här?
Jag ser inte någon nytta med att köra flera olika nästade loopar kors och tvärs ett par gånger vardera på det här sättet, det är därför jag undrar...
Postat: 25 maj 2005, 08:09:43
av Icecap
Varför laddar du om varje loopcount inuti loopen? På det viset kan du nog inte få en loop att avslutas.
Kod: Markera allt
Loop:
Loopcount = 2
Loopcount = Loopcount - 1
if Loopcount <> 0 goto Loop
kommer ju aldrig att sluta
Kod: Markera allt
Loop:
Loopcount = 2
LoopX:
Loopcount = Loopcount - 1
if Loopcount <> 0 goto LoopX
kommer däremot att avslutas.
Postat: 25 maj 2005, 09:30:50
av opatagio
Programmet visar inga fel i MPLAB när jag kompilierar det.
Grejen med programmet är att om Loop2 blir noll ska den gå till Loop1. Men Loop1 är inte noll så ska han ladda in talet 2 igen så att Loop2 körs lika länge igen. När loop3 blir noll ska den gå till Minutes. Är Minutes inte noll ska han ladda in talet 2 igen så att Loop1 körs igen osv osv.
Vad jag egentligen vill ha är en 60 sekunders "loop". Där MinCount ställs in genom knapptryckning. Men det buggar ur sig vid Loop3. Först körs allt som det ska, på andra varvet hänger sig pekaren vid Loop3 coh kör bara Loop3 fastän den egentligen är klar och ska gå till Loop2.
edit: Icecap, jag laddar föregående Loop. Inte samma loop som programmet befinner sig i.
Sedan angående processorn så har jag flera pic16f628 men ännu mer pic16f84a från gamla dagar

Men så snart de är slut så går jag givetvis över till 16f628 helt.
Postat: 25 maj 2005, 12:21:07
av Rymdninja
ett skott i mörkret eftersom jag inte vet så mycket om picar och inte ens helt säker på vilket programspråk det är
Men är syntaxen på
movlw d'2' rätt? Jag tänker snarast på fnuttarna runt tvåan...fnuttar är juh ganska vanligt att använda för "characters" (bokstäver sas). Och ascii värdet för '2' är juh 50 så det skulle bli en ganska lång loop....
Postat: 25 maj 2005, 12:44:59
av JockeE
D'2' är ett skrivsätt som används för att ange för assembleraren att det är fråga om ett deciamalt tal (basen 10). Ett snabbare skrivsätt är .2
Den delen av koden är det alltså inga fel på.
Postat: 25 maj 2005, 12:54:57
av Icecap
Du har såklart testat att emulera i MPLAP och följa värden och hopp så du borde ju ha svaret därifrån.
Postat: 25 maj 2005, 13:54:09
av opatagio
Hmm det här var knepigt. Finns det någon begränsning för hur många tecken en label får vara? Bytte nämligen till kortare namn (hade Loop1Top, Loop2Mid osv förut) och nu ser det ut att fungera hur fint som helst.
Men jag efterlyser ändå någon smidigare metod att få 60 sekunders loop(ar).
Icecap: givetvis testar jag alltid i emulator/simulator

Postat: 25 maj 2005, 14:17:52
av cyr
Förstår fortfarande inte meningen med alla dessa olika loopar?
Ska du räkna sekunder så använd en timer. Tyvärr har ju F84 (som är värdelös!) bara TMR0, men den är iaf bättre än inget.
Vilken klockfrekvens använder du?
Postat: 25 maj 2005, 15:45:18
av opatagio
Använder 4MHz kristall.
Postat: 25 maj 2005, 15:46:57
av Icecap
Efter vad jag minns är det bara de första 8 karaktärer i labels som används.