Forum: Mikrocontroller und Digitale Elektronik ATMega8 CTC funktioniert nicht


von Elektron (Gast)


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

von Gast (Gast)


Lesenswert?

Wo der TOP Wert hin sollte steht im Datenblatt, OCR1A scheint es nicht 
zu sein.

von Elektron (Gast)


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

von Wolfgang S. (wsm)


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

von Oliver (Gast)


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

von Stefan E. (sternst)


Lesenswert?

Oliver wrote:

> Dein Code ist richtig.

Nö.

WGM12 liegt nicht in TCCR1A.

von Oliver (Gast)


Lesenswert?

arrghh....

:-)

Oliver

von Elektron (Gast)


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

von Justus S. (jussa)


Lesenswert?

Elektron wrote:

> @Stefan Kannst du mir bitte deine Aussage etwas erläutern?

laut Datenblatt gehört WGM12 ins TCCR1B...

von Elektron (Gast)


Lesenswert?

Aja. Vielen dank. Das habe ich im Eifer des Gefechts übersehn.
Gruß
Peter

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.