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
#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

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