int input_pin = 2; // Pin for the switch
volatile int value;
volatile int state_flag = 0; // Tracks button presses and the mode of operation
// LED control frequencies
const unsigned long pulse_0_5Hz = 1000; // 0.5 Hz -> 1000ms (on + off)
const unsigned long pulse_1Hz = 500; // 1 Hz -> 500ms (on + off)
void setupTimer3() {
noInterrupts();
// Clear registers
TCCR3A = 0;
TCCR3B = 0;
TCNT3 = 0;
// 1 Hz (16000000 / ((15624+1)*1024))
OCR3A = 15624;
// CTC mode
TCCR3B |= (1 << WGM32);
// Prescaler 1024
TCCR3B |= (1 << CS32) | (1 << CS30);
// Output Compare Match A Interrupt Enable
TIMSK3 |= (1 << OCIE3A);
interrupts();
}
void setup() {
pinMode(input_pin, INPUT);
attachInterrupt(digitalPinToInterrupt(input_pin), state, FALLING); // FALLING edge for switch press
DDRC = 0xFF; // Set PORTC pins (PC0 to PC7) as output for LEDs
setupTimer3();
Serial.begin(9600);
}
void loop() {
// Green LED (PC0) blinking to indicate the program is running
if (state_flag == 0) {
PORTC = (1 << PC0); // Turn on green LED
delay(500);
PORTC = (0 << PC0); // Turn off green LED
delay(500);
}
// Handle the different states based on button presses
else if (state_flag == 1) {
// 3 LEDs (PC1, PC2, PC3) blinking at 0.5Hz
PORTC = (1 << PC1) | (1 << PC2) | (1 << PC3); // Turn on LEDs
delay(pulse_0_5Hz); // Wait 1 second (0.5 Hz)
PORTC = (0 << PC1) | (0 << PC2) | (0 << PC3); // Turn off LEDs
delay(pulse_0_5Hz);
}
else if (state_flag == 2) {
// 4 LEDs (PC4, PC5, PC6, PC7) blinking at 1Hz
PORTC = (1 << PC4) | (1 << PC5) | (1 << PC6) | (1 << PC7); // Turn on LEDs
delay(pulse_1Hz); // Wait 0.5 second (1 Hz)
PORTC = (0 << PC4) | (0 << PC5) | (0 << PC6) | (0 << PC7); // Turn off LEDs
delay(pulse_1Hz);
}
else if (state_flag == 3) {
// Turn off all LEDs
PORTC = 0x00;
}
}
// Interrupt Service Routine for the button press
void state() {
value = digitalRead(input_pin); // Read the switch state
Serial.print("Input reading: ");
Serial.println(value);
// Debounce: Wait for 200ms before processing the next press
delay(200);
// Switch state based on the current state_flag
if (value == HIGH) {
// Increment state and loop back to 0 after state 3
state_flag++;
if (state_flag > 3) {
state_flag = 0;
}
}
}
// Timer interrupt service routine for LED control
ISR(TIMER3_COMPA_vect) {
// This ISR runs every time Timer3 reaches OCR3A value
// For now, this isn't changing behavior as the LED timing is handled in the loop() based on state_flag
}