Forum: Mikrocontroller und Digitale Elektronik Probleme mit Timer2 im AtMega8


von bytebold (Gast)


Lesenswert?

Hallo,
ich habe Probleme mit dem Timer2 in einem AtMega8.
In AVRStudio läuft in der Simulation alles einwandfrei, nur auf dem 
Atmega
macht der Timer, was er will.
Grundsätzlich ist mein Vorhaben gar nicht so schwierig, ich rufe eine 
Sub-
routine auf, möchte ein paar ms warten, um die Routine dann wieder 
aufzu-
rufen, Anzahl der Aufrufe=4.
In der ISR wird ein Flag zurückgesetzt, was ich vorher gesetzt habe. Die
Steuerung des Timers soll mit den Clk- Bits erfolgen. Alle 0 --> Timer
gestoppt, im Hauptprogramm wird der Timer mit dem Prescaler gestartet.
Die Initialisierung:

  ldi   TempA, ((1<<CTC2)|(0<<CS22)|(0<<CS21)|(0<<CS20))
  out  TCCR2, TempA
  ldi  TempA, 1<<OCF2
  out  TIFR, TempA
  in  TempA, TIMSK
  ori  TempA, 1<<OCIE2
  out  TIMSK, TempA
  ldi  TempA, Timer2Wert
  out  OCR2, TempA

Die ISR:

Timer2serv:
  cli
  in  save_sreg, SREG
  push  TempA
  clr  Timer2Ready
  ldi   TempA, ((1<<CTC2)|(0<<CS22)|(0<<CS21)|(0<<CS20))
  out  TCCR2, TempA
  pop  TempA
  out  SREG, save_sreg
  sei
  reti

Das Hauptprogramm:

Send4Packets:
  rcall  SendPacket
  ldi  Timer2Ready, 1
  ldi   TempA, ((1<<CTC2)|(1<<CS22)|(1<<CS21)|(1<<CS20))
  out  TCCR2, TempA
loop1:
  tst  Timer2Ready
  brne  loop1

  rcall  SendPacket
  ldi  Timer2Ready, 1
        ldi   TempA, ((1<<CTC2)|(1<<CS22)|(1<<CS21)|(1<<CS20))
  out  TCCR2, TempA
loop2:
  tst  Timer2Ready
  brne  loop2

  rcall  SendPacket
  ldi  Timer2Ready, 1
  ldi   TempA, ((1<<CTC2)|(1<<CS22)|(1<<CS21)|(1<<CS20))
  out    TCCR2, TempA
loop3:
  tst  Timer2Ready
  brne  loop3

  rcall  SendPacket
  ldi   TempA, ((1<<CTC2)|(1<<CS22)|(1<<CS21)|(1<<CS20))
  out    TCCR2, TempA
loop4:
  tst  Timer2Ready
  brne  loop4

Wenn ich den Timer im CTC- Mode durchlaufen lasse, kann ich auch die
Zeit mit Timer2Wert einstellen, läuft das Programm so wie es oben
beschrieben ist, funktioniert die Timereinstellung nicht.

Hat irgendjemand eine Idee, woran das liegen kann?

Gruß, bytebold


von Johannes A. (Gast)


Lesenswert?

Erstmal so sieht mir das normal aus, außer dass ich nie auf die Idee 
gekommen wäre, das CTC-Bit (WGM21) beim Abschalten des Timers zu setzen. 
Alle CS-Bits 0 ist Timer AUS, und in dem Zustand passiert eh nichts, 
auch kein CTC...

Im übrigen ist der CTC-Modus nicht wirklich für den Zweck da, für den Du 
ihn benutzt.

Ansonsten zur ISR noch zweierlei:

1. cli/sei sind innerhalb einer ISR unnötig (cli passiert beim Aufruf 
und sei mit dem reti implizit), und

2. versuch mal, statt des OC-Interrupts den Timer Overflow zu verwenden. 
Womöglich ist TCNT bei dem hohen Vorteilerwert, den Du benutzt, noch gar 
nicht wieder 0, wenn Du den Timer abstellst... Der TOV-Interrupt kommt 
dagegen genau dann, denn TCNT den Wert 0 annimmt.

Gruß Johannes

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.