Files
42_EXT_03_42chips/rush00/interrupts.c
2025-03-15 16:41:12 +01:00

66 lines
2.3 KiB
C

#include "rush_header.h"
volatile Role role = WAITING;
void setup_button_interrupt() { // interruption SW1 (PD2)
EICRA |= (1 << ISC01); // trigger on falling edge for INT0
EIMSK |= (1 << INT0); // Activate INT0
SREG |= (1 << SREG_I);
}
ISR(INT0_vect) { // interruption SW1 (PD2)
if (!TEST_PIN(BUTTON1)) {
_delay_ms(30);
flash_led(D4);
if (role == MASTER) {
// write_one_byte_data(0x01);
read_one_byte_data();
} else if (role == SLAVE) {
// PORTD &= ~(1 << PD2); // Pull PD2 low (active LOW signal)
// _delay_ms(10); // Give master time to catch the signal
// PORTD |= (1 << PD2); // Reset line HIGH
}
}
}
ISR(TWI_vect) { // interruption slave receive data, Table 12-1 : 25, 2-wire Serial Interface
uint8_t status = TWSR & MASK_WITHOUT_LAST_3;
switch (status) {
// Slave Receiver cases
case TW_SR_SLA_ACK: // SLA+W received, ACK sent
// flash_led(D4);
turn_on_led_2_light();
break;
case TW_SR_DATA_ACK: // data received, ACK sent
if (role == WAITING) {
role = SLAVE;
}
received_data = TWDR; // store received data
break;
case TW_SR_STOP: // STOP or REPEATED START
break;
case TW_SR_DATA_NACK: // data received but slave answered NACK (no ACK an means end of communication or error)
break;
// Slave Transmitter cases
case TW_ST_SLA_ACK: // SLA+R received, ACK sent - First byte to be transmitted
flash_led(D4);
TWDR = 0x10; // send first data byte
break;
case TW_ST_DATA_ACK: // data sent, ACK received - Additional bytes can be sent
TWDR = 0x10; // send next data byte
break;
case TW_ST_DATA_NACK: // data sent, NACK received - No more data requested
break; // master doesn't want more data
case TW_ST_LAST_DATA: // last data byte sent, ACK received
break; // All data sent
default:
break;
}
TWCR = (1 << TWINT) | (1 << TWEN) | (1 << TWEA) | (1 << TWIE); // Clear interrupt flag and enable next transfer
}