Real Time Clock pada AVR ATmega16

Timing merupakan sebuah fungsi dasar yang dikerjakan oleh mikrokontroler. Setiap mikrokontroler paling sedikit memiliki satu modul timer/counter di dalamnya. Namun, jika counter di-clock secara internal, beberapa isu akan muncul dalam beberapa kasus. Terkadang, frekuensi clock tidak stabil, atau terkadang, frekuensi clock lebih tinggi dari yang dibutuhkan. Terkadang, clock eksternal dibutuhkan untuk mendapatkan kualitas yang dibutuhkan. Untuk menyelesaikan masalah-masalah ini, beberapa mikrokontroler AVR hadir dengan osilator yang mendukung kristal 32768 Hz. Frekuensi ini nyaman untuk timer 8-bit, yang dapat diturunkan menjadi 1 Hz dengan prescaler 128. Membagi 32768 dengan 128 memberikan hasil 256, satu cacahan penuh dengan overflow interrupt.

Berikut adalah prosedur yang aman untuk memindahkan sumber clock, merujuk pada datasheet:

1. Disable the Timer/Counter2 interrupts by clearing OCIE2 and TOIE2.
2. Select clock source by setting AS2 as appropriate.
3. Write new values to TCNT2, OCR2, and TCCR2.
4. To switch to asynchronous operation: Wait for TCN2UB, OCR2UB, and TCR2UB.
5. Clear the Timer/Counter2 Interrupt Flags.
6. Enable interrupts, if needed

Berikut adalah implementasinya:

void RTCInit(void)
{
  TIMSK  = 0;
  //Enable asynchronous mode
  ASSR  = (1<<AS2);
  //set initial counter value
  TCNT2 = 0;
  //set prescaller 128
  TCCR2 |= (1<<CS22)|(1<<CS00);
  //wait for registers update
  while (ASSR & ((1<<TCN2UB)|(1<<TCR2UB)));
  //clear interrupt flags
  TIFR2  = (1<<TOV2);
  //enable TOV2 interrupt
  TIMSK |= (1<<TOIE2);
}