[AtMega32] Timer Geschwindigkeit falsch

Gast #1660380
Lesenswert?

Hallo zusammen,

ich probiere gerade den Timer an meinem AtMega32 korrekt zu verwenden.
Ich habe einen Systemtakt von 16MHz. Entspricht das dem clkI/O, der für 
den Timertakt verwendet wird? Im Datenblatt finde ich dazu keine 
definitive Aussage...

Die wichtigen Code-Teile:
1
int main(void)
2
{  
3
  // Timer konfigurieren
4
  TCCR1A = (1<<WGM12); // CTC Modus
5
  TCCR1B |= (1<<CS11) | (1<<CS10); // Prescaler 64
6

7
  // ((16000000/64)/1000) = 250
8
  OCR1A = 250-1; // Aufruf alle 1ms
9

10
  // Compare Interrupt erlauben
11
  TIMSK |= (1<<OCIE1A);
12

13
  // Global Interrupts aktivieren
14
  sei();
15
    while(1)
16
    {
17
        char lcdBuffer[20];
18
        for (int i=0; i<20; i++)
19
            lcdBuffer[i] = ' ';
20
        sprintf(lcdBuffer, "Zeit: %02d.%03d", sekunde, millisekunden); 
21
        lcd_line(lcdBuffer);
22
    }
23
}
24

25
ISR (TIMER1_COMPA_vect)
26
{
27
  millisekunden++;
28
  if(millisekunden == 1000)
29
  {
30
    sekunde++;
31
    millisekunden = 0;
32
  }
33
}

Normalerweise sollten die Sekunden/Millisekunden Angaben nun korrekt 
hochlaufen, sie tun dies allerdings viel zu langsam. (geschätzt Faktor 
800 oder so)

Wo mache ich einen Fehler? Ich habe mich schon mehrmals durchs 
Datenblatt gewühlt, kann aber nix finden...

Viele Grüße,
Daniel
Gast #1660399
Lesenswert?

Daniel schrieb:
> du musst den Timer in der Interruptroutine neu laden..

Nein, das macht der Controller selbst ;)

spess53 schrieb:
>> TCCR1A = (1<<WGM12); // CTC Modus
>
> WGM12 befindet sich im Register TCCR1B

Genau daran lags, vielen Dank! Dämlicher Fehler, da hätt ich noch ewig 
dran gesucht.

Grrrr schrieb:
> Bitte kompilierbaren Code posten.

Werde ich demnächst machen.

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