Hallo Im PIc16f84A wird mittels TMR0 alle 4ms ein Interupt ausgelöst. Nach 250 Interupts sind 1s vorbei und es folgen einige Routinen, die das Register "sec" incrementieren, es an ein LCD ausgeben und mit einer Weckzeit vergleichen. Problem: Der Interupt incrementiert "sec" nicht jede Sekunde, sondern scheinbar alle 4ms, also bei jedem Interupt. Das Register loop4ms (Inhalt .250) soll eigentlich bei jedem Interupt heruntergezählt werden und erst nach 250 Interupts (nach 1s) das Register "sec" incrementieren. Wenn ich den Teil mit dem loop4ms rausnehme, ändert sich nichts. Da liegt dann wohl der Fehler. Nur dummerweise sehe ich ihn nicht! Hab' den Quellcode mal angehängt. mfg Wolfram Hildebrandt
Bin nur drübergeflogen und mir sind zwei dinge aufgefallen:
1. der retfie ist hier ohne wiederherstellung der geretteten daten
eingebracht!
du solltest lieber weiter nach unten springen
decfsz loop4ms
retfie
2. damit erledigt sich dann auch gleich das du innerhalb der 250
interrupts das timerflag nicht löscht
MooseChecker
movwf w_copy ; w retten
swapf STATUS, w ; STATUS retten
movwf s_copy ;
movlw .131 ; 256-125=131 ((1MHz : 32 ): 125 = 250 Hz)
movwf TMR0
decfsz loop4ms
goto xxxx ; <<<<<<----------
movlw .250
movwf loop4ms
call increase
call OUT
call Weckvergleichsec
xxxx: <<<<<-----------------
swapf s_copy, w ; STATUS zurück
movwf STATUS
swapf w_copy, f ; w zurück mit flags
swapf w_copy, w
bcf INTCON, T0IF ; Interrupt-Flag löschen
bsf INTCON, GIE ; enable Interrupt
retfie
Ausgezeichnet! Genau das war der Fehler. Wenn ich das T0IF nicht wieder auf Null setze, geht der PIC nach dem Interupt direkt wieder in einen neuen Interupt. Dadurch wird der TMR0 praktisch nicht mehr verwendet und die Zeit wird zu schnell hochgezählt. Das hätte ich eigentlich selber sehen müssen, zumal ich gerade vorher noch gelesen habe, dass das Flag zurückgesetzt werden muss, um nicht den PIC im Interupt gefangen zu halten. Ich danke Dir!
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.