Forum: Mikrocontroller und Digitale Elektronik Atmega328p Timer2 will nicht


von mike (Gast)


Lesenswert?

N Abend,

Folgendes:
Der Timer2 will nicht laufen. Timer0 macht's dagegen ohne Probleme.
Zum Test toggle ich einen Ausgang. Weis jemand warum?
1
void StartTimer0(void){
2
  TIMSK0 |= ((1<<TOIE0));
3
  TIMSK0 |= ((1<<OCIE0A));
4
  TCCR0B |= ((1<<CS00)|(1<<CS02));
5
}
6
void StartTimer2(void){
7
  TIMSK2 |= ((1<<TOIE2));
8
  TIMSK2 |= ((1<<OCIE2A));
9
  TCCR2B |= ((1<<CS20)|(1<<CS22));
10
}
11
int main(void){
12
   TCNT0=0;
13
   OCR0A=124;
14
   StartTimer0();
15
  TCNT2=0;
16
  OCR2A=124;
17
  StartTimer2();
18
while(1){
19
}
20
ISR(TIMER0_OVF_vect){
21
//  PORTB ^= ((1<<DDB5));
22
}
23
ISR(TIMER2_OVF_vect){
24
  PORTB ^= ((1<<DDB5));
25
}

von ... (Gast)


Lesenswert?


von spess53 (Gast)


Lesenswert?

HI

Wozu vier Timerinterups aktivieren und dann SEI weglassen?

MfG Spess

von isidor (Gast)


Lesenswert?

So wie die Klammern ab main() stehen würden die beiden
ISRs jetzt innerhalb von main() definiert sein (und
am Ende würde eine Klammer fehlen).

Ich hab es nicht ausprobiert ob das geht .....

von mike (Gast)


Lesenswert?

sei(); ist gesetz, sonst würde auch der Timer0 Overflow nicht 
funktionieren. Ich wollte hier nur wirklich relevantes zeigen.
Die Klammern bei while sind richtig.

Ich habe inzwischen mal Timer1 getestet - exakt wie Timer0 
initialisiert. Auch dieser funktioniert. Nur Timer2 will nicht. Die LED 
geht an und das war's.
Bei den anderen beiden Timern kann man deutlich das flackern erkennen. 
Das will mir nicht in den Kopf...

von mike (Gast)


Lesenswert?

mike schrieb:
> sei(); ist gesetz, sonst würde auch der Timer0 Overflow nicht
> funktionieren. Ich wollte hier nur wirklich relevantes zeigen.
> Die Klammern bei while sind richtig.
>
> Ich habe inzwischen mal Timer1 getestet - exakt wie Timer0
> initialisiert. Auch dieser funktioniert. Nur Timer2 will nicht. Die LED
> geht an und das war's.
> Bei den anderen beiden Timern kann man deutlich das flackern erkennen.
> Das will mir nicht in den Kopf...

Aber ja, es fehlt eine Klammer von main().

von Thomas E. (thomase)


Lesenswert?

mike schrieb:
> Die LED geht an und das war's.
Und dann geht sie wieder aus und wieder an und wieder aus...

8 x schneller als beim Timer0. Du guckst also nur zu langsam.

mfg.

von mike (Gast)


Lesenswert?

Fehler gefunden!

Alle 3 Timer sind eigentlich gleich aufgebaut
Alle Registernamen sind quasi identisch - bis auf die Zahl im Namen.
Allerdings unterscheiden sich die prescaler.
Timer2 kennt keine externe clock source hat dafür 2 Teiler mehr als 
Timer0 und Timer1. Und hier lag der Hase im Pfeffer.

Solche Sachen überliest man gerne auch 100mal.

Aber jetzt gehts...

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.