diff -r f01fb659e54d -r e4ac5a591dcd hello.c --- a/hello.c Thu Apr 03 18:49:18 2014 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,116 +0,0 @@ -#include -#include "stdlib.h" - -#include - -#define TIMER_FLAGS GPIOR0 -#define TIMER1_BUSY 1 - -/* - * Setup timers. - */ -void timer_init (void) -{ - TCCR1A = ( - // OC1A output pin disconnected - 0b00 << COM1A0 - // OC1B output pin disconnected - | 0b00 << COM1B0 - // no PWM - | 0b00 << WGM10 - ); - TCCR1B = ( - // CTC mode - 0b01 << WGM12 - ); - TCCR1C = 0; -} - -void timer1_start (short cycles) -{ - // count up from zero... - TCNT1 = 0; - - // ...to the given number of timer cycles - OCR1A = cycles; - - // start! - sbi(&TIMER_FLAGS, TIMER1_BUSY); - TIMSK1 = ( - // OCA interrupt - 0b1 << OCIE1A // enable - ); - TCCR1B = ( - // WGM - 0b01 << WGM12 // CTC - - // clocksource - | 0b101 << CS10 // 1024'th - ); -} - -static void timer1_stop () -{ - // WGM: normal - // clocksource: stop - TCCR1B = 0; - - cbi(&TIMER_FLAGS, TIMER1_BUSY); -} - -ISR(TIMER1_COMPA_vect) -{ - timer1_stop(); - - // XXX: cpu will automatically wake up from sleep() -} - -/* - * Sleep on timer1 interrupt. - */ -void timer_sleep (int cycles) -{ - // set timer - timer1_start(cycles); - - // sleep - // TODO: PRR - SMCR = ( - // idle sleep - (0b00 << SM0) - - // enable sleep - | (0b1 << SE) - ); - - // sleep - while (tbi(&TIMER_FLAGS, TIMER1_BUSY)) { - __asm__ ( "sleep" :: ); - } - - // cleanup - SMCR = 0; -} - -int main (void) -{ - timer_init(); - - // LED - sbi(&DDRB, DDB5); - - sei(); - - // blink - short timeout = 1000; - short delta = 10; - - while (true) { - // bitflip - xbi(&PORTB, PORTB5); - - timer_sleep(timeout); - - timeout += delta; - } -}