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.