Forum: Mikrocontroller und Digitale Elektronik [AtMega32] Timer Geschwindigkeit falsch


von Daniel (Gast)


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

von Daniel (Gast)


Lesenswert?

Hi,

du musst den Timer in der Interruptroutine neu laden..


Gruß Daniel

von spess53 (Gast)


Lesenswert?

Hi

> TCCR1A = (1<<WGM12); // CTC Modus

WGM12 befindet sich im Register TCCR1B

MfG Spess

von Grrrr (Gast)


Lesenswert?

Bitte kompilierbaren Code posten.

von Daniel (Gast)


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.

von Rene K. (draconix)


Lesenswert?

Was auch gerne vergessen wird beim Atmega16 / 32 in Verbindung mit einem 
16Mhz Quarz: Fusebit CKOPT setzen!

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.