Divers
This commit is contained in:
parent
2c1b324d4f
commit
b54944447e
6 changed files with 145 additions and 114 deletions
2
Makefile
2
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
|
||||
|
|
|
|||
190
main.c
190
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(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;
|
||||
}
|
||||
|
||||
uint8_t p=0;
|
||||
|
||||
int main(void)
|
||||
{
|
||||
|
|
@ -95,19 +49,29 @@ void setup(void)
|
|||
lcd_clear();
|
||||
lcd_home();
|
||||
lcd_display();
|
||||
lcdprint("Pyro RF ! ");
|
||||
|
||||
_delay_ms(200);
|
||||
|
||||
lcd_setCursor(1,1);
|
||||
lcdprint("** Pyro RF ! **");
|
||||
spi_init_master();
|
||||
_delay_ms(200);
|
||||
_delay_ms(500);
|
||||
lcd_setCursor(3,2);
|
||||
lcdprint("Init Radio");
|
||||
|
||||
rf24_setup();
|
||||
while (1){
|
||||
_delay_ms(500);
|
||||
rf24_setup();
|
||||
rf24_init();
|
||||
rf24_update_status();
|
||||
if(rf24_status==0x0E)
|
||||
break;
|
||||
lcd_setCursor(1,2);
|
||||
lcdprint("Radio Error ! ");
|
||||
_delay_ms(500);
|
||||
}
|
||||
|
||||
rf24_init();
|
||||
//char st = rf24_read_reg(STATUS);
|
||||
rf24_update_fifo_status();
|
||||
debughex(&rf24_status,1);
|
||||
lcd_setCursor(1,2);
|
||||
lcdprint("Radio Ok ! ");
|
||||
_delay_ms(1500);
|
||||
lcd_clear();
|
||||
|
||||
#if defined(__AVR_ATmega32A__)
|
||||
GICR|=_BV(INT2);
|
||||
|
|
@ -118,20 +82,25 @@ void setup(void)
|
|||
#endif
|
||||
|
||||
|
||||
rf24_RXMode();
|
||||
|
||||
// Timer1 => 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 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 _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 _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
31
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;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
|
||||
|
|
|
|||
5
rf24.h
5
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();
|
||||
|
|
|
|||
18
tools.c
Normal file
18
tools.c
Normal 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
11
tools.h
Normal 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
|
||||
Loading…
Reference in a new issue