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.
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
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.
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
Der Interrupt ist schon initialisiert. Die Deklaration bzw. Implementation fehlt noch: ISR (TIMER2_ ...) { }
und das I-flag auch noch. #asm ("sei") oder so (wie sieht das beim GCC aus?)
crazy horse wrote: > und das I-flag auch noch. > #asm ("sei") oder so (wie sieht das beim GCC aus?)
1 | sei(); |
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.