#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/sleep.h>
void TimerInit();
/*
pada mode ctc interupsi yang berpengaruh adalah compare match
karena tcnt tidak pernah mencapai level max(0xFF) tetapi
mencapai level TOP yaitu sama dengan nilai dari output compare
*/
/*
// TUGAS: Cari prescaler terbaik untuk membangkitkan sinyal dgn delay 12 mS
// 12 ms = 12000 uS
Prescaler /1
Tick: 0.0625 uS
Tmax: 4096 uS = ~ 4mS //tidak bisa dipakai
Prescaler /8
Tick: 0.5 uS
Tmax: 32768 uS = ~32 mS //bisa dipakai
Counter: 12000/0.5 = 24000
Prescaler /64
Tick: 4 uS
Tmax: 262144 uS = ~ 262 mS //bisa dipakai
Counter: 12000/4 = 3000
Prescaler /256
Tick: 16 uS
Tmax: 1048576 uS = ~ 1048 mS //bisa dipakai
Counter: 12000/16 = 750
Prescaler /1024
Tick: 64 uS
Tmax: 4194304 uS = ~ 4194 mS //bisa dipakai
Counter: 12000/64 = 187.5 //Counter tidak bulat
*/
/*
prescaller = 8 , Xtal 16MHz
tick = 8/16Mhz= 0.5 us
delay=counter*tick
delay=counter*0.5us
untuk Tsampling = 12mS = 12000 uS
counter = 12000/0.5us = 24000
*/
int main(void) {
DDRB |=_BV(DDB7); //LED output
TimerInit();
while (1) {
if (TIFR1 & _BV(OCF1A)){
PORTB ^= (1 << PB7);
TIFR1 |= _BV(OCF1A);
}
}
}
void TimerInit() {
TCCR1B |= _BV(WGM12); // CTC
TCCR1B |= _BV(WGM13); // CTC ICRn
TCCR1B |= _BV(CS11) | _BV(CS10); //prescaller 64
ICR1 = 3000 ; //
}
PB4
PH6
PH5
PH4
PB7
PB6