mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Timer2 beim ATmega8 tut nicht richtig


Autor: Philipp Burch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich hab' ein Prob mit dem Timer/Counter2 bei meinem ATmega8. Bei der
Simulation im AVR-Studio wird zwar der Interrupt beim Compare-Match
aufgerufen, nicht aber der Overflow-Handler. Ich hab' mal geguckt, was
mit dem TOV2-Bit passiert, wenn es einen Überlauf gibt und siehe da - es
wird auch nicht gesetzt. Woran kann sowas liegen? Auch wenn ich das
Programm auf den µC lade scheint der Interrupt nicht aufgerufen zu
werden.

Hier mal den relevanten Code:
.org 0x0000                  ;Kommt ganz an den Anfang des Speichers
rjmp RESET                  ;Interruptvektoren überspringen
                      ;und zum Hauptprogramm
rjmp EXT_INT0                ;IRQ0 Handler
reti ;rjmp EXT_INT1              ;IRQ1 Handler
rjmp TIM2_COMP                ;Timer2 Compare Handler
rjmp TIM2_OVF                ;Timer2 Overflow Handler


;--- weiteres Zeugs ---


RESET:

;Stackpointer initialisieren
ldi temp, LOW(RAMEND)
out SPL, temp
ldi temp, HIGH(RAMEND)
out SPH, temp

;Interrupt 0 bei steigender Flanke aufrufen
ldi temp, 1 << ISC00 ^ 1 << ISC01
out MCUCR, temp
;Interrupt 0 aktivieren
in temp, GIMSK
sbr temp, 1 << INT0
out GIMSK, temp

;Timer/Counter2 wird als PWM-Generator für den Motor verwendet
(Vorteiler auf 1024)
ldi temp, 1 << WGM21 ^ 1 << CS21 ^ 1 << CS22
out TCCR2, temp

;Bei wahrem Vergleich und Überlauf einen Interrupt auslösen
ldi temp, 1 << OCIE2 ^ 1 << TOIE2
out TIMSK, temp

;--- weiteres Zeugs ---

;Interrupts global aktivieren
sei

mainloop:
  sbic PINC, PC_KeyPlus
  rjmp mainloop_b
    cbr State, 1 << ST_Motor_Direction
    ldi temp, 100
    out OCR2, temp

  mainloop_b:

  sbic PINC, PC_KeyMinus
  rjmp mainloop_a
    sbr State, 1 << ST_Motor_Direction
    ldi temp, 100
    out OCR2, temp

  mainloop_a:

rjmp mainloop                ;Endlosschleife

;--- weiteres Zeugs ---

TIM2_COMP:
  ;Statusregister sichern
  in temp, SREG
  push temp
  ;Timer2 Compare-Interrupt
  ;Motor ausschalten
  sbi PORTC, PC_Motor0
  sbi PORTC, PC_Motor1

  pop temp
  out SREG, temp
reti

TIM2_OVF:
  ;Verwendete Register sichern
  push temp
  ;Statusregister sichern
  in temp, SREG
  push temp

  ;Timer2 Overflow-Interrupt
  ;Motor einschalten (Wenn er laufen soll)
  in temp, Motor_Speed
  breq TIM2_OVF_a
    mov temp, state
    andi temp, 1 << ST_Motor_Direction
    breq TIM2_OVF_b
      ;Motor läuft rückwärts
      sbi PORTC, PC_Motor0
      cbi PORTC, PC_Motor1

    rjmp TIM2_OVF_a

    TIM2_OVF_b:
      ;Motor läuft vorwärts
      cbi PORTC, PC_Motor0
      sbi PORTC, PC_Motor1

  TIM2_OVF_a:

  pop temp
  out SREG, temp
  pop temp
reti

Wer kann mir helfen?

Danke im Voraus!

Autor: D. W. (dave) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es geht entweder CTC-Mode oder Overflow.
Dein "Compare Match" heißt ja "Clear Timer On Compare Match".. er
kann also nie überlaufen, da er immer resettet wird.
Deswegen kanns nur den OCR-IRQ geben.

Autor: Philipp Burch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Axo, na wenn ich das gewusst hätte... Hab's jetzt gerade auf
Normal-Mode umgestellt und jetzt klappt's freu. Irgendwie hab' ich
das einfach falsch verstanden, was im Datenblatt steht... Naja, jetzt
tut's ja!

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.