#include #include #include #include "uart.h" #define SET_PWM(a) (OCR0A = (a)) void setup(void); int main(void) { uint8_t output = 0, c; setup(); for (;;) { switch((c = uart_getchar())) { case '?': break; case 'n': case '0': output = 0; break; case 'y': case '1': output = 1; break; case 't': case 'T': output ^= 1; break; } uart_putchar(c); if (output) SET_PWM(40); else SET_PWM(1); _delay_ms(1000); SET_PWM(0); } return 0; } void setup(void) { /* serial */ uart_init(); /* Initialize timer for PWM *** PWM with timer1 management: * TCCR1A-COM1A1: * TCCR1A-WGM10: * TOP = 0x00FF * frequency is : 12 MHz(fclk) / 256(prscl) / 255 (top)/ 2 = 91.91Hz * frequency is : 18.432 MHz(fclk) / 256(prscl) / 255 (top)/ 2 = 141.18Hz * frequency is : 18.432 MHz(fclk) / 1024(prscl) / 255 (top)/ 2 = 35.29Hz * frequency is : 16 MHz(fclk) / 1024(prscl) / 255 (top)/ 2 = 30.64Hz * TCCR1B CS12 = 256 prescaler, CS12 + CS10 = 1024 prescaler * * 23/24 =~ 1.5ms */ TCCR0A |= _BV(COM1A1) | _BV(WGM10); TCCR0B |= _BV(CS12) | _BV(CS10); /* TIMSK0 |= _BV(TOIE0); */ /* pwm output; */ DDRD |= 0xFF; }