Timer läuft bei OCR=255, sonst nicht

Gast #3447330
Lesenswert?
• ▲
▼
Ich habe folgendes Problem:

Der Timer 2 meines ATmega8 soll 500x pro Sekunde einen Interrupt 
auslösen.

CPU-Frequenz ist 4MHz (kein Teiler). Den Timer habe ich auf CTC Mode und 
Prescaler 32 gesetzt. Dann ergibt sich 4000000/32/500-1 = 249 (0xF9):
1
TCCR2 =  (1 << WGM21) | (0 << WGM20) | (0 << CS22) | (1 << CS21) | (1 << CS20);
2
OCR2 = 0xFF;

Ich habe die Testroutine auf eine LED heruntergebrochen, die im 
Sekundentakt blinken soll (toggle alle 250 Interrupts). Dazu frage ich 
das TOV2 Flag ab.

Setze ich OCR = 0xFF; funktioniert das auch (Zeit halt nicht perfekt, 
aber nah genug an 1s um das behaupten zu können), sobald ich es mit 0xF9 
(oder irgendeinem anderen Wert) versuche, scheint der Timer zu stehen, 
zumindest tut sich nichts mehr.

Exakt selbes Verhalten, wenn ich mit 1MHz/8 oder 8MHz/64 arbeite.

Wo könnte mein Fehler liegen?
Gast #3447347
Lesenswert?
• ▲
▼
OK, hier:
1
#define F_CPU 4000000UL
2

3
int main(void) {
4
  DDRC = (1 << DDC1);
5
  TCCR2 =  (1 << WGM21) | (0 << WGM20) | (0 << CS22) | (1 << CS21) | (1 << CS20);
6
  OCR2 = 0xF9;
7

8
  sei();
9

10
  while (1) {
11
    if (TIFR & (1 << TOV2)) {
12
      TIFR |= 1 << TOV2;
13
      timerInterrupt();
14
    }
15
  }
16
  return 0;
17
}
18

19
void timerInterrupt(void) {
20
  static uint8_t counter;
21
  counter++;
22
  if(counter == 250) {
23
    PORTC ^= (1<<PC1);
24
    counter = 0;
25
  }
26
}
Gast #3447360
Lesenswert?
• ▲
▼
Dabei soll nichts herauskommen. Aber da ich mit einigen Einstellungen 
experimentiert habe und die 0 auch nicht weh tut, habe ich es zur 
Übersicht drin gelassen.

Da lag das Problem auch nicht, mti dem richtigen Interrupt Flag läuft 
das Programm nun und kann seine eigentliche Aufgabe leisten.
Gast #3447365
Lesenswert?
• ▲
▼
Kaj schrieb:
> P.C. schrieb:TCCR2 = (1<<WGM21) | (0<<WGM20) | (0<<CS22) |
> (1<<CS21) | (1<<CS20);
>
> Was soll da raus kommen, wenn du irgendwas mit 0 veroderst? außerdem
> kannst du eine 0 nicht schieben...
>
> Grüße

Hi,

jedenfalls kommt kein Fehler raus, es kann nichts passieren.
Mathematisch gesehen ist das zwar Unsinn, das stimmt. Aber wenn man
eine Übersicht über alle Bits haben möchte, kann man das schon machen.
Sonst sieht man ja nur die Bits, die auf "1" stehen. Und so kann man
auch mal schnell ein Bit ändern, um Tests zu machen und braucht nichts
neu zu schreiben. Wenn man dann mit der Programmierung fertig ist,
kann man ja die "0<<" Ausdrücke rausschmeißen, der Schönheit halber.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.