From 62d54ff86ddc6d91154c144ba092bb5103943d49 Mon Sep 17 00:00:00 2001 From: Sadeep Madurange Date: Fri, 11 Apr 2025 15:46:49 +0800 Subject: Ding reliably working with btn. --- ding.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 48 insertions(+), 7 deletions(-) (limited to 'ding.c') diff --git a/ding.c b/ding.c index 2bf9fe6..548c618 100644 --- a/ding.c +++ b/ding.c @@ -17,7 +17,42 @@ #define RX_PCMSK PCMSK2 #define RX_PCINTVEC PCINT2_vect +#define LOCK_PIN PC5 +#define LOCK_DDR DDRC +#define LOCK_PORT PORTC +#define LOCK_PCIE PCIE1 +#define LOCK_PCINT PCINT13 +#define LOCK_PCMSK PCMSK1 +#define LOCK_PCINTVEC PCINT1_vect + static volatile int rxdr = 0; +static volatile int lock = 0; + +static inline void init_rx(void) +{ + RX_DDR &= ~(1 << RX_PIN); + RX_PORT |= (1 << RX_PIN); + PCICR |= (1 << RX_PCIE); + RX_PCMSK |= (1 << RX_PCINT); +} + +static inline void init_btns(void) +{ + LOCK_DDR &= ~(1 << LOCK_PIN); + LOCK_PORT |= (1 << LOCK_PIN); + PCICR |= (1 << LOCK_PCIE); + LOCK_PCMSK |= (1 << LOCK_PCINT); +} + +static inline int is_btn_pressed(unsigned char btn) +{ + if (!((PINC >> btn) & 0x01)) { + _delay_us(2000); + return !((PINC >> btn) & 0x01); + } + + return 0; +} int main(void) { @@ -27,6 +62,9 @@ int main(void) uint8_t rxaddr[ADDRLEN] = { 194, 178, 82 }; uint8_t txaddr[ADDRLEN] = { 194, 178, 83 }; + init_rx(); + init_btns(); + //wdt_stop(); uart_init(); radio_init(rxaddr); @@ -35,9 +73,6 @@ int main(void) sei(); radio_listen(); - _delay_ms(2000); - radio_sendto(txaddr, "SYN", 3); - for (;;) { if (rxdr) { n = radio_recv(buf, MAXPDLEN); @@ -47,12 +82,12 @@ int main(void) uart_write("INFO: "); uart_write_line(buf); } - } else { - uart_write_line("No IRQ"); } - _delay_ms(2000); - radio_sendto(txaddr, "SYN", 3); + if (lock) { + radio_sendto(txaddr, "SYN", 3); + lock = 0; + } } return 0; @@ -62,3 +97,9 @@ ISR(RX_PCINTVEC) { rxdr = 1; } + +ISR(LOCK_PCINTVEC) +{ + if (is_btn_pressed(LOCK_PIN)) + lock = 1; +} -- cgit v1.2.3