#include <avr/io.h>

#include "utils.h"
#include "bitmanip.h"

// TIMER
#define PRESCALE_VALUE				1024		// can be 1, 8, 64, 256, 1024
// table 16-5 : prescale sets
#define PRESCALE_SET(value)  \
									((value) == 1   ? (0<<CS12 | 0<<CS11 | 1<<CS10) : \
									 (value) == 8   ? (0<<CS12 | 1<<CS11 | 0<<CS10) : \
									 (value) == 64  ? (0<<CS12 | 1<<CS11 | 1<<CS10) : \
									 (value) == 256 ? (1<<CS12 | 0<<CS11 | 0<<CS10) : \
									 (value) == 1024? (1<<CS12 | 0<<CS11 | 1<<CS10) : \
													  (0<<CS12 | 0<<CS11 | 0<<CS10))
#define TIME_MS(ms)					(((F_CPU / PRESCALE_VALUE) * ms) / 1000)

// END MACROS

// write a program that blinks an LED every 500ms using a software timer
int main() {
	MODE_OUTPUT(LED2);
	CLEAR_ELEM(LED2);

	TCCR1B |= (PRESCALE_SET(PRESCALE_VALUE));	// 16.4 : set timer according to prescale value, in register TCCR1B, table 16-5 : prescale sets

	while(1) {
		if (TCNT1 >= TIME_MS(500)) {			// 16.11.4 : read timer with register TCNT1 (read/write allowed), that combines two 8 bits registers
			TOGGLE_PIN(LED2);
			TCNT1 = 0;							// reset timer value, also in register TCNT1
		}
	}
}





