ATMega8 CTC funktioniert nicht

Gast #1231826
Lesenswert?
• ▲
▼
Hallo,
bei meinen ATMega 8 funktioniert beim Timer 1 leider das Automatische 
löschen nach dem Comparematch nicht. Sieht hier irgendjemand einen 
Fehler in dem Code?
1
//erzeugt einen Comparematch Init alle 1/4000 S
2
void timer1_init(void){
3
    TCCR1A |= (1<<WGM12);  //CTC
4
    TCCR1B |= (1<<CS10);  //Kein Vorteiler
5
    OCR1A = 3686;
6
    TIMSK = (1<<OCIE1A);
7
  }
8

9

10
ISR(TIMER1_COMPA_vect){
11
  static unsigned int zaehler = 0;
12
  zaehler++;
13
    if(zaehler == 4000){
14
      zaehler = 0;
15
      uart_putc(0x31);
16
    }
17
  }
18

19
int main (void)
20
{
21
  unsigned char Buffer[512];
22
  uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
23
  timer1_init();
24
  timer2_init();
25
  sei();
Das ist nur ein Auschnitt aus der Main. Wenn ich in die ISR TCNT1 = 0; 
einfüge geht es. Es liegt also ziemlich sicher am CTC.
Gruß
Peter
Gast #1231867
Lesenswert?
• ▲
▼
Hallo,
Laut Datenblatt ist wenn WGM12 = 1 und Alle anderen WGM Bits null sind 
OCR1A der Top Wert. (S98, Mode 4).
Ich habe WGM 13 ja nicht 1 weil dann wäre es ja laut DB ICR1 (S99, Mode 
12).
Gruß
Peter
#1232020
Lesenswert?
• ▲
▼
Ich habe vor kurzem eine PLL programmiert und alles Bits für CTC 
gesetzt.

Siehe:

Controllregister für Timer1 = Counter1
Controllregister für Timer1

Tccr1a.7 = 0 : Tccr1a.6 = 1      'für Toggle OC1A = PB1
Tccr1a.5 = 0 : Tccr1a.4 = 0      'für Toggle OC1B = PB2 = disconnected
Tccr1a.3 = 0 : Tccr1a.2 = 0      'unbenutzt
Tccr1a.1 = 0 : Tccr1a.0 = 0      'WGM11=0, WGM10=0
Tccr1b.7 = 0 : Tccr1b.6 = 0 : Tccr1b.5 = 0  'unbenutzt
Tccr1b.4 = 0 : Tccr1b.3 = 1      'WGM13=0, WGM12=1 für CTC-Mode mit 
OCR1A
Tccr1b.2 = 1 : Tccr1b.1 = 1 : Tccr1b.0 = 0  'T1-Pin, falling edge

In Kurzschreibweise:

Tccr1a = &B01000000
Tccr1b = &B00001110
Ddrb = &B00011111                'Output OC1A/B, OC2 , Teilerausgang

Wolfgang
Gast #1232057
Lesenswert?
• ▲
▼
>Es liegt also ziemlich sicher am CTC.

Es liegt sehr sicher nicht am CTC. Der funktioniert, auch beim Mega8. 
AVRStudio simuliert nicht in alle Betriebsarten der 16-Bit-Timer 
richtig, aber davon sprichst du ja nicht, oder?

Dein Code ist richtig.

Oliver
Gast #1232175
Lesenswert?
• ▲
▼
Hallo,
@Oliver
der Fehler tritt real auf.
@Stefan Kannst du mir bitte deine Aussage etwas erläutern? Was habe ich 
beim DB falsch gelesen? Auf welches Register bezieht sich denn der 
Comparmatch.
Gruß
Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren