#include #include #include #include #include #include "sound.h" // create prototype function void TimerInit(); void PWMInit(); // global variable here volatile uint16_t cnt_snd=0; /* 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 */ /* prescaller 8 , Xtal 16MHz tick = 8/16Mhz= 0.5 us delay=counter*tick delay=counter*0.5us untuk sampling rate 8 khz maka Tsampling= 1/8Khz= 125us counter = 125/0.5us = 250 */ ISR (TIMER1_COMPA_vect) { PORTB ^= (1 << PB7); // pin 13 Arduino OCR3A=~pgm_read_byte(&salam_raw[cnt_snd]); if (cnt_snd==salam_raw_len-1) { cnt_snd=0; _delay_ms(200); } else { cnt_snd++; } } int main(void) { DDRB |=_BV(DDB7); //LED output TimerInit(); /// schedule 10ms PWMInit(); sei(); /// enable global interupsi while (1) { sleep_mode(); // sleep } } void TimerInit() { TCCR1B |= _BV(WGM12); // CTC TCCR1B |= _BV(CS11); //prescaller 8 OCR1A = 250 ; // delayms TIMSK1 |= (1 << OCIE1A); // enable compare match interrupt } void PWMInit(){ DDRE= _BV(PE3); //activate PWM output TCCR3B = _BV(CS30); //prescaller 1 TCCR3B |= _BV(WGM32); //Fast PWM 8 Bit on Timer3 TCCR3A |= _BV(WGM30); TCCR3A |= _BV(COM3A1); //non inverting OCR3A=128; // test PWM }