/* created by Bertrand VANDEPORTAELE */ #include #include const int ledPin=13; //broche 13=PB5 #define XOR ^ #define HEAT_BEAT_DIVIDER_MAX 129 /* periode HEAT_BEAT_DIVIDER_MAX 520us 1 1042us 2 1560us 3 2080us 4 4160us 8 20300us 39 20850us 40 1045ms 2000 1/15seconde -> 130 */ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// unsigned int heart_beat_divider = 0 ; #define PRESCALER_INDEX 3 #define TIMER_PERIOD 8000 // TIMER ISR VECTOR and configuration unsigned char isr_modulo_count, global_isr_modulo = 0 ; ISR(TIMER2_COMPA_vect){ //transmit interrupt heart_beat_divider = heart_beat_divider + 1 ; if(heart_beat_divider >= HEAT_BEAT_DIVIDER_MAX){ PORTB ^= 0x01 <<5 ; //bit 5 du port B heart_beat_divider = 0; } } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setupTimer2(unsigned char prescaler, unsigned int period){ TCCR2A = 0;// set entire TCCR2A register to 0 TCCR2B = 0;// same for TCCR2B TCNT2 = 0;//initialize counter value to 0 OCR2A = period;// = (16*10^6) / (8000*8) - 1 (must be <256) // turn on CTC mode TCCR2A |= (1 << WGM21); switch(prescaler){ case 0 : // Set CS20 bit for no prescaler TCCR2B |= (1 << CS20); case 1 : // Set CS21 bit for 8 prescaler TCCR2B |= (1 << CS21); case 2 : // Set CS21 bit for 64 prescaler TCCR2B |= (1 << CS21) | (1 << CS20); break ; case 3 : // Set CS21 bit for 128 prescaler TCCR2B |= (1 << CS22) ; break ; case 4 : // Set CS21 bit for 256 prescaler TCCR2B |= (1 << CS22) | (1 << CS21); break ; case 5 : // Set CS21 bit for 1024 prescaler TCCR2B |= (1 << CS22) | (1 << CS21) | (1 << CS20); break ; default : TCCR2B |= (1 << CS20); break ; } // enable timer compare interrupt TIMSK2 |= (1 << OCIE2A); } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void setup() { // start serial port at 9600 bps: Serial.begin(115200); pinMode(ledPin, OUTPUT); cli();//stop interrupts setupTimer2(PRESCALER_INDEX, TIMER_PERIOD); // setup interrupt with prescaler (see datasheet for prescaler value, and reload value) sei();//allow interrupts } ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// void loop() { }