diff options
Diffstat (limited to 'rf_test')
| -rw-r--r-- | rf_test/Recv.Makefile | 2 | ||||
| -rw-r--r-- | rf_test/Send.Makefile | 2 | ||||
| -rw-r--r-- | rf_test/recv.c | 87 | ||||
| -rw-r--r-- | rf_test/send.c | 87 |
4 files changed, 91 insertions, 87 deletions
diff --git a/rf_test/Recv.Makefile b/rf_test/Recv.Makefile index c7b98a7..cd5b4ff 100644 --- a/rf_test/Recv.Makefile +++ b/rf_test/Recv.Makefile @@ -9,7 +9,7 @@ CFLAGS = -std=gnu99 CFLAGS += -Os CFLAGS += -Wall CFLAGS += -mmcu=$(MCU) -CFLAGS += -DBAUD=4800 +CFLAGS += -DBAUD=2400 CFLAGS += -DF_CPU=16000000UL CFLAGS += -ffunction-sections -fdata-sections diff --git a/rf_test/Send.Makefile b/rf_test/Send.Makefile index e7d3e79..397a9db 100644 --- a/rf_test/Send.Makefile +++ b/rf_test/Send.Makefile @@ -9,7 +9,7 @@ CFLAGS = -std=gnu99 CFLAGS += -Os CFLAGS += -Wall CFLAGS += -mmcu=$(MCU) -CFLAGS += -DBAUD=4800 +CFLAGS += -DBAUD=2400 CFLAGS += -DF_CPU=16000000UL CFLAGS += -ffunction-sections -fdata-sections diff --git a/rf_test/recv.c b/rf_test/recv.c index a908bbe..9cb3daa 100644 --- a/rf_test/recv.c +++ b/rf_test/recv.c @@ -1,80 +1,67 @@ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> -#include <util/setbaud.h> #define TEST_LED PB1 #define LOCK_LED PD6 #define UNLOCK_LED PD7 -#define SYN 0xA1 -#define FIN 0xB2 -#define LOCK 0xC3 -#define UNLOCK 0xD3 +#define SYN 0xAA +#define LOCK 0xB5 +#define UNLOCK 0xAE -static void usart_init(void) -{ - UBRR0H = UBRRH_VALUE; - UBRR0L = UBRRL_VALUE; - UCSR0B = (1 << RXEN0) | (1 << RXCIE0); - UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); -} +#define SIGPIN PB3 +#define SIGLEN 200 + +static volatile unsigned char data = 0; -static unsigned char usart_recv(void) +static inline void led_init(void) { - while((UCSR0A & (1 << RXC0)) == 0); - return UDR0; + DDRB |= (1 << TEST_LED); + DDRD |= (1 << LOCK_LED) | (1 << UNLOCK_LED); } -static void led_init(void) +static inline void pcint2_init(void) { - DDRB |= (1 << TEST_LED); - DDRD |= (1 << LOCK_LED) | (1 << UNLOCK_LED); - PORTD |= (1 << LOCK_LED) | (1 << UNLOCK_LED); + PCICR |= (1 << PCIE2); + PCMSK2 |= (1 << PCINT2); } int main(void) { - usart_init(); + DDRB &= ~(1 << SIGPIN); + PORTB &= ~(1 << SIGPIN); + led_init(); + pcint2_init(); sei(); - for (;;) - ; + for (;;) { + if (data == LOCK) { + PORTD |= (1 << LOCK_LED); + PORTD &= ~(1 << UNLOCK_LED); + } + + if (data == UNLOCK) { + PORTD &= ~(1 << LOCK_LED); + PORTD |= (1 << UNLOCK_LED); + } + + data = 0; + _delay_ms(100); + } return 0; } -ISR(USART_RX_vect) +ISR(PCINT2_vect) { - unsigned char data, buf; - - data = 0; - buf = usart_recv(); - - if (buf == SYN) { - buf = usart_recv(); - - while (buf != FIN) { - buf = usart_recv(); - - if (buf == SYN) { - PORTB ^= (1 << TEST_LED); - return; - } - - if (buf != FIN) - data = buf; - } + int n, bit; - if(data == LOCK) { - PORTD |= (1 << LOCK_LED); - PORTD &= ~(1 << UNLOCK_LED); - } else if (data == UNLOCK) { - PORTD |= (1 << UNLOCK_LED); - PORTD &= ~(1 << LOCK_LED); - } + for (n = 7; n >= 0; n--) { + _delay_ms(SIGLEN); + bit = ((PINB >> SIGPIN) & 1); + data = bit == 1 ? (data | (1 << n)) : (data & ~(1 << n)); } - } diff --git a/rf_test/send.c b/rf_test/send.c index de69818..3ea0719 100644 --- a/rf_test/send.c +++ b/rf_test/send.c @@ -1,70 +1,87 @@ #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> -#include <util/setbaud.h> -#define LOCK_LED PB1 +#define LOCK_LED PB5 #define LOCK_BTN PD6 #define UNLOCK_BTN PD7 -#define SYN 0xA1 -#define FIN 0xB2 -#define LOCK 0xC3 -#define UNLOCK 0xD3 +#define SYN 0xAA +#define LOCK 0xB5 +#define UNLOCK 0xAE -static void usart_init(void) -{ - UBRR0H = UBRRH_VALUE; - UBRR0L = UBRRL_VALUE; - UCSR0B = (1 << TXEN0); - UCSR0C = (1 << UCSZ01) | (1 << UCSZ00); -} +#define SIGPIN PD2 +#define SIGLEN 500 -static void usart_send(unsigned char data) +static inline void send(unsigned char c) { - while (!(UCSR0A & (1 << UDRE0))) - ; - UDR0 = data; -} + int n; + + for (n = 7; n >= 0; n--) { + PORTD = ((c >> n) & 1) == 1 + ? PORTD | (1 << SIGPIN) + : PORTD & ~(1 << SIGPIN); -static inline void pcint2_init(void) -{ - PCICR |= (1 << PCIE2); - PCMSK2 |= ((1 << PCINT22) | (1 << PCINT23)); + _delay_us(SIGLEN); + } + + PORTD &= ~(1 << SIGPIN); } static inline void lock(void) { + send(SYN); + send(LOCK); PORTB |= (1 << LOCK_LED); - - usart_send(SYN); - usart_send(LOCK); - usart_send(FIN); } static inline void unlock(void) { + send(SYN); + send(UNLOCK); PORTB &= ~(1 << LOCK_LED); +} + +static inline int is_btn_pressed(unsigned char btn) +{ + if (!((PINB >> btn) & 0x01)) { + _delay_us(2000); + return !((PINB >> btn) & 0x01); + } + + return 0; +} - usart_send(SYN); - usart_send(UNLOCK); - usart_send(FIN); +static inline void pcint2_init(void) +{ + PCICR |= (1 << PCIE2); + PCMSK2 |= ((1 << PCINT22) | (1 << PCINT23)); } int main(void) { DDRB |= (1 << LOCK_LED); - PORTB |= (1 << LOCK_LED); - usart_init(); + DDRD &= ~((1 << LOCK_BTN) | (1 << UNLOCK_BTN)); + PORTD |= (1 << LOCK_BTN) | (1 << UNLOCK_BTN); + + DDRD |= (1 << SIGPIN); + PORTD &= ~(1 << SIGPIN); + + pcint2_init(); + sei(); for (;;) { - _delay_ms(4000); - lock(); - _delay_ms(4000); - unlock(); } return 0; } +ISR(PCINT2_vect) +{ + if (is_btn_pressed(LOCK_BTN)) + lock(); + + if (is_btn_pressed(UNLOCK_BTN)) + unlock(); +} |
