www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Probleme mit Timer2 im AtMega8


Autor: bytebold (Gast)
Datum:

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


Autor: Johannes A. (Gast)
Datum:

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

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.