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.