diff options
| author | Sadeep Madurange <sadeep@asciimx.com> | 2025-04-11 15:46:49 +0800 |
|---|---|---|
| committer | Sadeep Madurange <sadeep@asciimx.com> | 2025-04-11 15:46:49 +0800 |
| commit | 62d54ff86ddc6d91154c144ba092bb5103943d49 (patch) | |
| tree | 9946fcad064f5279c19e343bb1bfd03fffd25c69 | |
| parent | 52112f19821f6f667c51f3ac2c68da41365e0b43 (diff) | |
| download | avr-nrf24l01-driver-62d54ff86ddc6d91154c144ba092bb5103943d49.tar.gz | |
Ding reliably working with btn.
| -rw-r--r-- | ding.c | 55 |
1 files changed, 48 insertions, 7 deletions
@@ -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; +} |
