Forum: Compiler & IDEs Timer1 von ATMEGA16


von Thomas Pototschnig (Gast)


Lesenswert?

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 ...

von Thomas Pototschnig (Gast)


Lesenswert?

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...

von Thomas Pototschnig (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.