Forum: Mikrocontroller und Digitale Elektronik AVR Timer1 im CTC resetten/synchronisieren


von Mario F. (superdude)


Lesenswert?

Hallo,

ich betreibe auf einem ATmega32 den Timer1 im CTC-Modus,
so dass ich daraus einen Sekundentakt ableiten kann (nach 
AVR - Die genaue Sekunde / RTC ).
1
#define TIMER_PRESCALER_FREQ 250
2
3
ISR (TIMER1_COMPA_vect)
4
{
5
#if (F_CPU % TIMER_PRESCALER_FREQ)
6
  OCR1A  = (F_CPU/CLOCK24_TIMER_PRESCALER_FREQ) - 1;
7
#endif
8
9
  static uint8_t soft_prescaler = 0x0000;
10
  if (--soft_prescaler == 0)
11
  {
12
#if (F_CPU % TIMER_PRESCALER_FREQ) // handle remainder
13
    OCR1A = (F_CPU/TIMER_PRESCALER_FREQ) + 
14
            (F_CPU%TIMER_PRESCALER_FREQ) - 1;
15
#endif
16
    LED_TOGGLE; // LED toggeln
17
    // irgendeine HH:MM:SS uhr +1 sekunde zaehlen lassen
18
    soft_prescaler = TIMER_PRESCALER_FREQ;
19
  }
20
}

Das ganze funktioniert auch wunderbar.
Nun moechte ich das Blinken mit einem externen Event synchronisieren, am 
einfachsten entprellter Tasterdruck in der main()-loop.
Ich verwende dazu folgenden Code
1
void timer_sync(void)
2
{
3
  cli(); // Ints sperren
4
  TCCR1B = (1<<WGM12); // Timer1 stillegen
5
  TCNT1 = 0x0000; // Timer1 auf 0 setzen (Hi vor Lo setzen macht der gcc)
6
  TCCR1B = (1<<WGM12) | (1<<CS10); // Timer1 in CTC Modus
7
  sei(); // Ints enablen
8
}

Das Blinken aendert sich aber nicht, sondern ist im gleichen Takt wie 
vorher. Der timer_sync()-Aufruf erfolgt auch wirklich unverzoegert nach 
dem Event.
Kann mir einer sagen, warum der Timer1 meinen timer_sync()-Aufruf 
ignoriert?

Vielen Dank!

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.