39 lines
1.1 KiB
C
39 lines
1.1 KiB
C
#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
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|