mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik pic interupt


Autor: HDW (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Reiner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: HDW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.