This commit is contained in:
arnaud.houdelette 2019-09-10 16:07:13 +02:00
parent 2c1b324d4f
commit b54944447e
6 changed files with 145 additions and 114 deletions

View file

@ -55,7 +55,7 @@ RESETPORT = /dev/ttyU0
TARGET = pyrorf 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 = CXXSRC =
ASRC = i2cmaster.S ASRC = i2cmaster.S
MCU = atmega32u4 MCU = atmega32u4

184
main.c
View file

@ -15,67 +15,21 @@
#include "spi.h" #include "spi.h"
#include "rf24.h" #include "rf24.h"
#include "Hamming.h" #include "Hamming.h"
#include "tools.h"
int main (void); int main (void);
void setup (void); void setup (void);
void loop (void); void loop (void);
void lcdprint( char* ptr); void _lcd();
void debughex (uint8_t* ptr,uint8_t len); 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 p=0;
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(in<end){
err= HammingCorrect2416(in,in+1,*(in+2));
if(err>2){
lcdprint("RXH"); return 0;
}
errcpt+=err; in+=3;
}
// Shift (strip parity)
in = buffer+3;
out = buffer+2;
while(in<end){
*(out++)=*(in++); // Copy Byte
*(out++)=*(in++); // Copy Byte
in++; // skip parity
}
/*
// Calc CRC
in=buffer;
incrc=buffer[3];
buffer[3]=0;
cpt=plen;
crc=0;
while(cpt--) crc= _crc8_ccitt_update(crc,*(in++));
if(crc!=incrc) {printf("CRC\n"); return 0; }
*/
return plen;
}
int main(void) int main(void)
{ {
@ -95,19 +49,29 @@ void setup(void)
lcd_clear(); lcd_clear();
lcd_home(); lcd_home();
lcd_display(); lcd_display();
lcdprint("Pyro RF ! "); lcd_setCursor(1,1);
lcdprint("** Pyro RF ! **");
_delay_ms(200);
spi_init_master(); spi_init_master();
_delay_ms(200); _delay_ms(500);
lcd_setCursor(3,2);
lcdprint("Init Radio");
while (1){
_delay_ms(500);
rf24_setup(); rf24_setup();
rf24_init(); rf24_init();
//char st = rf24_read_reg(STATUS); rf24_update_status();
rf24_update_fifo_status(); if(rf24_status==0x0E)
debughex(&rf24_status,1); break;
lcd_setCursor(1,2);
lcdprint("Radio Error ! ");
_delay_ms(500);
}
lcd_setCursor(1,2);
lcdprint("Radio Ok ! ");
_delay_ms(1500);
lcd_clear();
#if defined(__AVR_ATmega32A__) #if defined(__AVR_ATmega32A__)
GICR|=_BV(INT2); GICR|=_BV(INT2);
@ -118,20 +82,25 @@ void setup(void)
#endif #endif
rf24_RXMode();
// Timer1 => 5ms
#if F_CPU == 8000000UL
#define TIMERLOOP 5000
#else
#define TIMERLOOP 10000
#endif
#if defined(TIMSK1) #if defined(TIMSK1)
// setup Timer1
TCCR1A = 0; TCCR1A = 0;
TCNT1=0; TCNT1=0;
OCR1A = 10000; OCR1A = TIMERLOOP;
TIMSK1 = _BV(OCIE1A); TIMSK1 = _BV(OCIE1A);
TCCR1B = _BV(WGM12)|_BV(CS11); TCCR1B = _BV(WGM12)|_BV(CS11);
#else #else
// setup Timer1
TCCR1A = 0; TCCR1A = 0;
TCNT1=0; TCNT1=0;
OCR1A = 10000; OCR1A = TIMERLOOP;
TIMSK = _BV(OCIE1A); TIMSK = _BV(OCIE1A);
TCCR1B = _BV(WGM12)|_BV(CS11); TCCR1B = _BV(WGM12)|_BV(CS11);
#endif #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) void loop(void)
{ {
insomnia=0; skip_sleep=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;
}
}
if(!insomnia){ _radio();
_lcd();
if(!skip_sleep){
set_sleep_mode(SLEEP_MODE_IDLE); set_sleep_mode(SLEEP_MODE_IDLE);
sleep_mode(); sleep_mode();
} }
@ -171,30 +126,51 @@ void loop(void)
ISR(TIMER1_COMPA_vect){ ISR(TIMER1_COMPA_vect){
i+=5; skip_sleep=1;
if(u)u--; if(t_lcd) t_lcd--;
} }
ISR(INT2_vect){ ISR(INT2_vect){
insomnia=1; skip_sleep=1;
lcd_setCursor(12,3);
lcdprint("INT");
}
void lcdprint( char* ptr)
{
while (*ptr) lcd_write(*ptr++);
} }
void debughex (uint8_t* ptr,uint8_t len) { void _radio(){
while (len--) { switch(radiostate){
uint8_t c = *(ptr++); case SOFF:
uint8_t ch= c>>4; rf24_RXMode();
c &= 0x0F; radiostate = SRX;
lcd_write(ch>9?ch+'A'-10:ch+'0'); break;
lcd_write(c>9?c+'A'-10:c+'0'); 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 _lcd() {
if(!t_lcd){
t_lcd=200;
lcd_setCursor(0,0);
if(p)
lcd_write('*');
else
lcd_write(' ');
p=p?0:1;
}
}

31
rf24.c
View file

@ -10,7 +10,7 @@ uint8_t rf24_buffer[33];
uint8_t plens[]={32,12,12,12,12,12}; 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 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_status;
uint8_t rf24_fifo; uint8_t rf24_fifo;
@ -113,6 +113,8 @@ void rf24_init()
void rf24_Off() void rf24_Off()
{ {
rf24_ceLow();
rf24_write_reg(CONFIG,rf24_CONFIG&0xF8); rf24_write_reg(CONFIG,rf24_CONFIG&0xF8);
rf24_csnLow(); rf24_csnLow();
spi_transfer(FLUSH_RX); spi_transfer(FLUSH_RX);
@ -125,6 +127,7 @@ void rf24_Off()
void rf24_RXMode() void rf24_RXMode()
{ {
rf24_ceLow(); rf24_ceLow();
rf24_csnLow(); rf24_csnLow();
spi_transfer(FLUSH_RX); spi_transfer(FLUSH_RX);
@ -133,11 +136,15 @@ void rf24_RXMode()
rf24_ceHi(); rf24_ceHi();
} }
int rf24_receive(uint8_t * buffer) uint8_t rf24_receive(uint8_t * buffer)
{ {
rf24_update_status(); rf24_update_status();
if(rf24_status&_BV(RX_DR))
rf24_write_reg(STATUS,_BV(RX_DR));
int pipe = (rf24_status & 0x0E) >> 1; int pipe = (rf24_status & 0x0E) >> 1;
if(pipe==7) return 0; if(pipe==7) return 0;
int len = plens[pipe]; int len = plens[pipe];
int i=len; int i=len;
rf24_csnLow(); rf24_csnLow();
@ -145,11 +152,27 @@ int rf24_receive(uint8_t * buffer)
while (i--) while (i--)
*(buffer++) = spi_transfer(NOP); *(buffer++) = spi_transfer(NOP);
rf24_csnHi(); rf24_csnHi();
rf24_write_reg(STATUS,_BV(RX_DR));
return len; 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;
}
/* /*

5
rf24.h
View file

@ -18,7 +18,10 @@ void rf24_setup();
void rf24_init(); void rf24_init();
void rf24_RXMode(); void rf24_RXMode();
void rf24_Off(); 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(); void rf24_RXMode();

18
tools.c Normal file
View file

@ -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');
}
}

11
tools.h Normal file
View file

@ -0,0 +1,11 @@
#ifndef defines_tools
#define defines_tools
#include <stdlib.h>
#include <stdint.h>
void lcdprint( char* ptr);
void debughex (uint8_t* ptr,uint8_t len);
#endif