www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega32 und Timer2


Autor: kaputtnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hastu systemtime als volatile gekennzeichnet?

Autor: kaputtnix (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: risu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.