Problem med loopar - PIC, 16F84

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
opatagio
Inlägg: 236
Blev medlem: 24 maj 2005, 20:19:21

Problem med loopar - PIC, 16F84

Inlägg 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 :)
Användarvisningsbild
Schnegelwerfer
Inlägg: 1863
Blev medlem: 8 november 2004, 13:46:56

Inlägg 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å.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg 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.
AndersL
EF Sponsor
Inlägg: 148
Blev medlem: 17 september 2004, 21:39:22
Ort: Ängelholm

Inlägg 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!
Användarvisningsbild
Schnegelwerfer
Inlägg: 1863
Blev medlem: 8 november 2004, 13:46:56

Inlägg 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.
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg 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...
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
opatagio
Inlägg: 236
Blev medlem: 24 maj 2005, 20:19:21

Inlägg 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.
Rymdninja
Inlägg: 330
Blev medlem: 15 december 2003, 13:41:25
Ort: Göteborg

Inlägg 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....
Användarvisningsbild
JockeE
Inlägg: 330
Blev medlem: 4 augusti 2004, 08:46:50

Inlägg 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å.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg 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.
opatagio
Inlägg: 236
Blev medlem: 24 maj 2005, 20:19:21

Inlägg 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 :)
cyr
Inlägg: 2712
Blev medlem: 27 maj 2003, 16:02:39
Ort: linköping
Kontakt:

Inlägg 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?
opatagio
Inlägg: 236
Blev medlem: 24 maj 2005, 20:19:21

Inlägg av opatagio »

Använder 4MHz kristall.
Användarvisningsbild
Icecap
Inlägg: 26632
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

Efter vad jag minns är det bara de första 8 karaktärer i labels som används.
Skriv svar