From b54944447ef5f96bdfe537cdd1433bb0a8a4265e Mon Sep 17 00:00:00 2001 From: "arnaud.houdelette" Date: Tue, 10 Sep 2019 16:07:13 +0200 Subject: [PATCH] Divers --- Makefile | 2 +- main.c | 192 ++++++++++++++++++++++++------------------------------- rf24.c | 31 +++++++-- rf24.h | 5 +- tools.c | 18 ++++++ tools.h | 11 ++++ 6 files changed, 145 insertions(+), 114 deletions(-) create mode 100644 tools.c create mode 100644 tools.h diff --git a/Makefile b/Makefile index 99a0be4..584f41b 100644 --- a/Makefile +++ b/Makefile @@ -55,7 +55,7 @@ RESETPORT = /dev/ttyU0 TARGET = pyrorf -SRC = main.c lcd.c spi.c rf24.c Hamming.c HammingCalculateParitySmallAndFast.c +SRC = main.c lcd.c spi.c rf24.c Hamming.c HammingCalculateParitySmallAndFast.c tools.c CXXSRC = ASRC = i2cmaster.S MCU = atmega32u4 diff --git a/main.c b/main.c index 1ffccf3..953adb0 100644 --- a/main.c +++ b/main.c @@ -15,67 +15,21 @@ #include "spi.h" #include "rf24.h" #include "Hamming.h" +#include "tools.h" int main (void); void setup (void); void loop (void); -void lcdprint( char* ptr); -void debughex (uint8_t* ptr,uint8_t len); +void _lcd(); +void _radio(); +uint8_t radiobuffer[32]; +enum { SRX, STX,SOFF } radiostate; +volatile uint8_t skip_sleep; +volatile uint8_t t_lcd=0,t_radio=0; -int decode_radioin (uint8_t * buffer){ - uint8_t err=0, errcpt=0, plen, cpt, incrc,crc; - uint8_t* in = buffer; - uint8_t* out, *end; - - // Decode first 2 bytes - err = HammingCorrect2416(in,in+1,*(in+2)); - if(err >2) { lcdprint("RXH1"); return 0; } - - errcpt+=err; - in+=3; - - // len - plen = buffer[0] & 0x0F; - if(plen>32) return 0; - - // Hamming - cpt = plen + (plen&1); // even - cpt = (cpt/2)*3; - end = buffer + cpt; - - // Correct - while(in2){ - lcdprint("RXH"); return 0; - } - errcpt+=err; in+=3; - } - - // Shift (strip parity) - in = buffer+3; - out = buffer+2; - while(in 5ms +#if F_CPU == 8000000UL +#define TIMERLOOP 5000 +#else +#define TIMERLOOP 10000 +#endif + + #if defined(TIMSK1) - // setup Timer1 TCCR1A = 0; TCNT1=0; - OCR1A = 10000; + OCR1A = TIMERLOOP; TIMSK1 = _BV(OCIE1A); TCCR1B = _BV(WGM12)|_BV(CS11); #else - // setup Timer1 TCCR1A = 0; TCNT1=0; - OCR1A = 10000; + OCR1A = TIMERLOOP; TIMSK = _BV(OCIE1A); TCCR1B = _BV(WGM12)|_BV(CS11); #endif @@ -140,30 +109,16 @@ void setup(void) } -volatile int i=0,j=0; -volatile int u=0,insomnia=0; - -uint8_t buff[40]; void loop(void) { - insomnia=0; - if(!u){ - u=0; - //char buf[15]; - lcd_setCursor(12,0); - rf24_update_status(); - debughex(&rf24_status,1); - if((rf24_status&0x0E)!=0x0E){ - int s = rf24_receive(buff); - s= decode_radioin(buff); - lcd_setCursor(0,1); - debughex(buff,s); - insomnia=1; - } - } + skip_sleep=0; - if(!insomnia){ + _radio(); + + _lcd(); + + if(!skip_sleep){ set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode(); } @@ -171,30 +126,51 @@ void loop(void) ISR(TIMER1_COMPA_vect){ - i+=5; - if(u)u--; + skip_sleep=1; + if(t_lcd) t_lcd--; } ISR(INT2_vect){ - insomnia=1; - lcd_setCursor(12,3); - lcdprint("INT"); + skip_sleep=1; + } -void lcdprint( char* ptr) -{ - while (*ptr) lcd_write(*ptr++); + +void _radio(){ + switch(radiostate){ + case SOFF: + rf24_RXMode(); + radiostate = SRX; + break; + case STX: + if(!t_radio){ + rf24_flushTX(); + rf24_RXMode(); + radiostate = SRX; + } + if(rf24_TXDone()){ + rf24_RXMode(); + radiostate = SRX; + } + break; + case SRX: + if(rf24_receive(radiobuffer)){ + + } + break; + + } + } - -void debughex (uint8_t* ptr,uint8_t len) { - while (len--) { - uint8_t c = *(ptr++); - uint8_t ch= c>>4; - c &= 0x0F; - lcd_write(ch>9?ch+'A'-10:ch+'0'); - lcd_write(c>9?c+'A'-10:c+'0'); +void _lcd() { + if(!t_lcd){ + t_lcd=200; + lcd_setCursor(0,0); + if(p) + lcd_write('*'); + else + lcd_write(' '); + p=p?0:1; } } - - diff --git a/rf24.c b/rf24.c index 8689a5f..7c82bb5 100644 --- a/rf24.c +++ b/rf24.c @@ -10,7 +10,7 @@ uint8_t rf24_buffer[33]; uint8_t plens[]={32,12,12,12,12,12}; uint8_t lenregs[]={RX_PW_P0,RX_PW_P1,RX_PW_P2,RX_PW_P3,RX_PW_P4,RX_PW_P5}; -uint8_t rf24_CONFIG = _BV(MASK_TX_DS)|_BV(MASK_MAX_RT); +uint8_t rf24_CONFIG = _BV(MASK_MAX_RT); uint8_t rf24_status; uint8_t rf24_fifo; @@ -113,6 +113,8 @@ void rf24_init() void rf24_Off() { + rf24_ceLow(); + rf24_write_reg(CONFIG,rf24_CONFIG&0xF8); rf24_csnLow(); spi_transfer(FLUSH_RX); @@ -125,6 +127,7 @@ void rf24_Off() void rf24_RXMode() { + rf24_ceLow(); rf24_csnLow(); spi_transfer(FLUSH_RX); @@ -133,11 +136,15 @@ void rf24_RXMode() rf24_ceHi(); } -int rf24_receive(uint8_t * buffer) +uint8_t rf24_receive(uint8_t * buffer) { rf24_update_status(); + if(rf24_status&_BV(RX_DR)) + rf24_write_reg(STATUS,_BV(RX_DR)); + int pipe = (rf24_status & 0x0E) >> 1; if(pipe==7) return 0; + int len = plens[pipe]; int i=len; rf24_csnLow(); @@ -145,11 +152,27 @@ int rf24_receive(uint8_t * buffer) while (i--) *(buffer++) = spi_transfer(NOP); rf24_csnHi(); - - rf24_write_reg(STATUS,_BV(RX_DR)); return len; } +void rf24_flushTX() +{ + rf24_ceLow(); + rf24_csnLow(); + spi_transfer(FLUSH_RX); + rf24_csnHi(); +} + +uint8_t rf24_TXDone() +{ + rf24_update_status(); + if(rf24_status&_BV(TX_DS)){ + rf24_write_reg(STATUS,_BV(TX_DS)); + return 1; + } + return 0; +} + /* diff --git a/rf24.h b/rf24.h index 1d02e64..d6c016e 100644 --- a/rf24.h +++ b/rf24.h @@ -18,7 +18,10 @@ void rf24_setup(); void rf24_init(); void rf24_RXMode(); void rf24_Off(); -int rf24_receive(uint8_t * buffer); +uint8_t rf24_receive(uint8_t * buffer); + +uint8_t rf24_TXDone(); +void rf24_flushTX(); /* void rf24_RXMode(); diff --git a/tools.c b/tools.c new file mode 100644 index 0000000..7f4cfac --- /dev/null +++ b/tools.c @@ -0,0 +1,18 @@ +#include "tools.h" +#include "lcd.h" + +void lcdprint( char* ptr) +{ + while (*ptr) lcd_write(*ptr++); +} + + +void debughex (uint8_t* ptr,uint8_t len) { + while (len--) { + uint8_t c = *(ptr++); + uint8_t ch= c>>4; + c &= 0x0F; + lcd_write(ch>9?ch+'A'-10:ch+'0'); + lcd_write(c>9?c+'A'-10:c+'0'); + } +} diff --git a/tools.h b/tools.h new file mode 100644 index 0000000..a8c19d1 --- /dev/null +++ b/tools.h @@ -0,0 +1,11 @@ +#ifndef defines_tools +#define defines_tools + +#include +#include + +void lcdprint( char* ptr); +void debughex (uint8_t* ptr,uint8_t len); + + +#endif