Atmega32 und Timer2

Gast #943217
Lesenswert?

Hallo!
Ich nutze die Timer 0 und 1 bereits und möchte Timer 2 gerne benutzen um 
Zeit zu messen. Um sicher zu gehen, dass bereits eine bestimmte Zeit 
(0.5 sekunden) verstrichen ist, habe ich eine Schleife eingefügt. 
Irgendwie funktioniert das nicht so wies soll. Systemtakt ist 4Mhz. Ich 
starte den Timer also mit dem höchsten Prescaler (1024) und erhalte 
4khz. Außerdem möchte ich einen Interrupt auslösen, sobald der Timer 
überläuft.

TCCR2 |= (1<< CS22) | (0<<CS21) | (1 << CS20);
TIMSK |= (1<<TOIE2);

Dies sollte 16 mal in der Sekunde geschehen. Den Interrupt fange ich wie 
folgt ab:

ISR(TIMER2_OVF_vect)
{
  systemtime++;
}

Systemtime ist halt ein Int.

Ich starte also den Timer, tue irgendwas, dann setze ich einen zweiten 
Integer starttimer=systemtime und messe. Ich will sichergehen, dass 
mindestens eine halbe Sekunde vergangen ist und tue dies hier:

  while((systemtime-starttime)<8)
    {
                            tuwas
                  }

Leider wartet der Mega keine halb Sekunde. Ich würde fast behaupten, er 
wartet gar nicht. Wird mir da etwas wegoptimiert oder habe ich mit 
Timer/Interrupt etwas falsch gemacht? Ich würde mich freuen, wenn ihr 
mir (mal wieder) helfen könntet.
Gast #943247
Lesenswert?

So, ich lasse mir Systemtime gerade über ein Display ausgeben. Die 
Variable erhöht sich jede Sekunde um etwa 256 und nicht um 16. Ich will 
meinen, ich habe den Timer falsch initialisiert?
Grüße!
Gast #943267
Lesenswert?

Hi,

> Ich starte den Timer also mit dem höchsten Prescaler (1024)
> und erhalte 4khz. Außerdem möchte ich einen Interrupt auslösen,
> sobald der Timer überläuft.
>     TCCR2 |= (1<< CS22) | (0<<CS21) | (1 << CS20);

1. Dein Code widerspricht Deinem Text: "(1<< CS22) | (1 << CS20)" 
entspricht einem Vorteiler von 128.
Teiler von 1024:
       TCCR2 |= (1<< CS22) | (1<<CS21) | (1 << CS20);

2. Bei dem von Dir laut Beschreibung angestrebten Teiler von 1024 dauert 
ein TimerCounter-Takt 0.256 ms, also f ~ 3,9 kHz.


Gruß

  risu

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