//#include <avr/io.h>
//#include <avr/interrupt.h>//
#define OC2A_PIN PORTB3 // pin D11
#define OC2B_PIN PORTD3 // pin D3
#define INT0_PIN PORTD2 // pin D2
#define DEBUG_PIN PORTD4 // pin D4
#define CONTROL_PIN PORTB4 // pin D12
#define INTF0_IS_SET bit_is_set(EIFR,INTF0) // check INT0 flag
#define EDGE_IS_RISING bit_is_set(PIND,INT0_PIN) // check INT0 pin edge
#define CLEAR_INTF0 bitSet(EIFR, INTF0) // clear INT0 flag
#define DEBUG_ON bitSet(PORTD,DEBUG_PIN) // set debug pin
#define DEBUG_OFF bitClear(PORTD,DEBUG_PIN) // clear debug pin
#define TRIGGER_ON bitSet(TCCR2A, COM2B1) // activate brake trigger pulses
#define TRIGGER_OFF bitClear(TCCR2A, COM2B1) // deactivate brake trigger pulses
bool brakeOn = false;
int main() {
setup();
while (true) {
loop();
}
return 0;
}
void setup() {
setupPins();
setupExtInt();
setupTimer2();
}
void setupPins() {
bitSet(DDRB, OC2A_PIN); // set as output
bitSet(DDRD, OC2B_PIN); // set as output
bitSet(DDRD, DEBUG_PIN); // set as output
}
void setupExtInt() {
bitSet(EICRA, ISC00); // Any logical change on INT1 generates an interrupt request.
bitSet(EIMSK, INT0); // enable External Interrupt Request 0
}
void setupTimer2() {
TCCR2A = 0; // clear register
TCCR2B = 0; // clear register
bitSet(TCCR2A, WGM20); // Mode 1, Phase Correct PWM, TOP = 0XFF, TOV Flag Set on BOTTOM
bitSet(TCCR2B, CS20); // No prescaling
bitSet(TCCR2A, COM2A1); // Clear OC2A on Compare Match when up-counting.
OCR2A = 127; // set duty cycle
OCR2B = 15; // set duty cycle
};
void loop() {
brakeOn = bit_is_set(PINB, CONTROL_PIN);
if (brakeOn) {
if (INTF0_IS_SET) { // INT0 flag set?
CLEAR_INTF0; // clear it
if (EDGE_IS_RISING) { // rising edge?
TRIGGER_ON; // activate trigger pulses
}
else { // falling edge?
TRIGGER_OFF; // deactivate trigger pulses
}
}
}
else {
TRIGGER_OFF;
}
}