Hallo, in meinem Projekt nutze ich ADC, Timer0 und Timer2 (jeweils PWM), RS232 - quasi fast alles was es gibt und es funktioniert einwandfrei ... Nur der Timer1 bereitet mir Probleme. Hier mein code: void CTimer::Init() { TCCR1A = 0x00; TCCR1B = 0x1d; // Prescaler 1024 OCR1AH = (15625 & 0xff00) >> 8; OCR1AL = (15625 & 0x00ff); // 2sec bei 8MHz Start(); } void CTimer::Start() { TCNT1H = 0x00; // timerval auf 0 zurücksetzen TCNT1L = 0x00; TIMSK |= 0x10; // Timer erneut aktivieren } ich hab dazu noch eine Interruptroutine: SIGNAL (SIG_OUTPUT_COMPARE1A) { // blabla } Der Timer läuft von 0 bis 0xfffe und bleibt dann stehen - die Interruptroutine wird nie ausgeführt ... Normalerweise hab ich in meiner Interruptroutine noch ein TIMSK |= 0x10 drin ... Laut dem Datenblatt des ATMEGA16 hab ich alles richtig gemacht ... Weiß jemand, wo mein Problem liegt? Wie gesagt - alles andere funktioniert ...
Das habe ich übersehen: TCCR1B = 0x0d; // Prescaler 1024 statt TCCR1B = 0x1d; // Prescaler 1024 bei 0x1d wird ICR1 statt OCR1A für den Compare verwendet ... Der Timer läuft jetzt von 0 - 15625 und setzt sich dann sauber wieder auf 0 zurück und läuft weiter ... Trotzdem krieg ich noch keinen Interrupt...
Ach bin ich bescheuert ... ich hatte angenommen das Global-Interrupt-Flag wird von hausaus vom GCC gesetzt - ein sei(); wirkt wunder ... Ok - Alle Fragen geklärt ...
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.