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
|
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
|
||||||
|
|
|
||||||
190
main.c
190
main.c
|
|
@ -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");
|
||||||
|
|
||||||
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();
|
lcd_setCursor(1,2);
|
||||||
//char st = rf24_read_reg(STATUS);
|
lcdprint("Radio Ok ! ");
|
||||||
rf24_update_fifo_status();
|
_delay_ms(1500);
|
||||||
debughex(&rf24_status,1);
|
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
31
rf24.c
|
|
@ -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
5
rf24.h
|
|
@ -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
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