Forum: Mikrocontroller und Digitale Elektronik pic interupt


von HDW (Gast)


Angehängte Dateien:

Lesenswert?

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

von Reiner (Gast)


Lesenswert?

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

von HDW (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.