Forum: Mikrocontroller und Digitale Elektronik Atmega32 16Bit Timer


von Geri (Gast)


Lesenswert?

Hi

Ich arbeite gerade an einem Schulprojekt und nun ist folgendes Problem 
aufgetreten.
Ich will eine exakte Zeitmessung mittels Timer2 und 2 Lichtschranken 
realisieren.

Ich weis jedoch nicht wie ich den Timer initialisieren muss, dass ich 
eine Interruptzeit von 0,2ms habe.

Die Taktfrequenz beträgt 16 MHz. Es wird ein AtMega32 verwendet.

von Michael K. (Gast)


Lesenswert?

16MHz entsprechen 62,5ns pro Cycle.

Prescaler 1: 0,2ms / 62,5ns / 1 = 3200
Prescaler 8: 0,2ms / 62,5ns / 8 = 400
Prescaler 64: 0,2ms / 62,5ns / 64 = 50

-->

OCR2  = 50;
TCCR2 = (1 << CS22) | (1 << WGM21); // Timer 2 CTC Mode, Prescaler 64
TIMSK = (1 << OCIE2);

Grüße,
Michael

von Geri (Gast)


Lesenswert?

Danke für die Schnelle antwort.
Aber wie starte und stoppe ich jetzt den Timer und wie intialisiere ich 
den Interrupt ??
Bin noch Neuling auf dem Gebiet. Danke im Voraus.

von Karl H. (kbuchegg)


Lesenswert?

Einen Timer kann man starten/stoppen indem man ihm einen
Vorteiler zuweist, bzw. den Vorteiler auf 0 setzt.

TCCR2 &= ~( 1 << CS22 );
stoppt daher deinen Timer und
TCCR2 |= (1 << CS22);
startet ihn wieder

von Michael K. (Gast)


Lesenswert?

Der Interrupt ist schon initialisiert. Die Deklaration bzw. 
Implementation fehlt noch:

ISR (TIMER2_ ...)
{
}

von crazy horse (Gast)


Lesenswert?

und das I-flag auch noch.
#asm ("sei") oder so (wie sieht das beim GCC aus?)

von Karl H. (kbuchegg)


Lesenswert?

crazy horse wrote:
> und das I-flag auch noch.
> #asm ("sei") oder so (wie sieht das beim GCC aus?)
1
  sei();

von Geri (Gast)


Lesenswert?

Danke

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.