Forum: Mikrocontroller und Digitale Elektronik Atmega32 und Timer2


von kaputtnix (Gast)


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.

von Sven P. (Gast)


Lesenswert?

Hastu systemtime als volatile gekennzeichnet?

von kaputtnix (Gast)


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!

von risu (Gast)


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

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.