#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <stdio.h>
void usart_init(uint16_t ubrr) {
UBRR0H = (ubrr >> 8);
UBRR0L = ubrr;
UCSR0B = (1 << RXEN0) | (1 << TXEN0); // Enable receiver & transmitter
UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); // 8-bit data, 1 stop bit
}
void usart_transmit(char data) {
while (!(UCSR0A & (1 << UDRE0))); // Wait for empty buffer
UDR0 = data;
}
void usart_print(const char *str) {
while (*str) {
usart_transmit(*str++);
}
}
#define F_CPU 16000000UL
#define BAUD 115200
#define UBRR_VALUE ((F_CPU / (16UL * BAUD)) - 1)
volatile uint8_t button_count = 0;
void setup() {
usart_init(UBRR_VALUE);
DDRD &= ~(1<<PD0);// INT0 is also PD0 and we set the DDR to input
PORTD |= (1<<PD0);// enable pullup resistor on PD0
EICRA |= (1<<ISC01); // these two bits set
EICRA &= ~(1<<ISC00);// INT0 to trigger on a FALLING edge
EIMSK |= (1<<INT0);
sei(); // Enable global interrupts
}
ISR(INT0_vect) {
usart_print("Interrupt Triggered!\n");
_delay_ms(50); // Software debounce
if (!(PIND & (1 << PD3))) { // Confirm button is still pressed
button_count++;
char buffer[16];
sprintf(buffer, "Count: %d\n", button_count);
usart_print(buffer);
}
}
int main() {
setup();
while (1) {
usart_print("Hello\n");
_delay_ms(1000);
}
}