176 lines
2.3 KiB
C
176 lines
2.3 KiB
C
#include <avr/io.h>
|
|
#include <avr/sleep.h>
|
|
#include <avr/wdt.h>
|
|
#include <avr/interrupt.h>
|
|
#include <avr/power.h>
|
|
#include <avr/pgmspace.h>
|
|
//#include <avr/eeprom.h>
|
|
#include <util/delay.h>
|
|
#include <stdlib.h>
|
|
#include <stdbool.h>
|
|
#include <stdio.h>
|
|
|
|
#include "defines.h"
|
|
#include "lcd.h"
|
|
#include "spi.h"
|
|
#include "rf24.h"
|
|
#include "Hamming.h"
|
|
#include "tools.h"
|
|
|
|
int main (void);
|
|
void setup (void);
|
|
void loop (void);
|
|
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;
|
|
|
|
uint8_t p=0;
|
|
|
|
int main(void)
|
|
{
|
|
setup();
|
|
while (1)
|
|
loop();
|
|
}
|
|
|
|
void setup(void)
|
|
{
|
|
#if defined(USBCON)
|
|
USBCON=0;
|
|
#endif
|
|
|
|
lcd_init(20,4);
|
|
lcd_backlight(1);
|
|
lcd_clear();
|
|
lcd_home();
|
|
lcd_display();
|
|
lcd_setCursor(1,1);
|
|
lcdprint("** Pyro RF ! **");
|
|
spi_init_master();
|
|
_delay_ms(500);
|
|
lcd_setCursor(3,2);
|
|
lcdprint("Init Radio");
|
|
|
|
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);
|
|
}
|
|
|
|
lcd_setCursor(1,2);
|
|
lcdprint("Radio Ok ! ");
|
|
_delay_ms(1500);
|
|
lcd_clear();
|
|
|
|
#if defined(__AVR_ATmega32A__)
|
|
GICR|=_BV(INT2);
|
|
|
|
#elif defined(__AVR_ATmega32U4__)
|
|
EICRA=_BV(ISC21);
|
|
EIMSK=_BV(INT2);
|
|
#endif
|
|
|
|
|
|
|
|
// Timer1 => 5ms
|
|
#if F_CPU == 8000000UL
|
|
#define TIMERLOOP 5000
|
|
#else
|
|
#define TIMERLOOP 10000
|
|
#endif
|
|
|
|
|
|
#if defined(TIMSK1)
|
|
TCCR1A = 0;
|
|
TCNT1=0;
|
|
OCR1A = TIMERLOOP;
|
|
TIMSK1 = _BV(OCIE1A);
|
|
TCCR1B = _BV(WGM12)|_BV(CS11);
|
|
#else
|
|
TCCR1A = 0;
|
|
TCNT1=0;
|
|
OCR1A = TIMERLOOP;
|
|
TIMSK = _BV(OCIE1A);
|
|
TCCR1B = _BV(WGM12)|_BV(CS11);
|
|
#endif
|
|
|
|
sei();
|
|
|
|
}
|
|
|
|
|
|
void loop(void)
|
|
{
|
|
skip_sleep=0;
|
|
|
|
_radio();
|
|
|
|
_lcd();
|
|
|
|
if(!skip_sleep){
|
|
set_sleep_mode(SLEEP_MODE_IDLE);
|
|
sleep_mode();
|
|
}
|
|
}
|
|
|
|
|
|
ISR(TIMER1_COMPA_vect){
|
|
skip_sleep=1;
|
|
if(t_lcd) t_lcd--;
|
|
}
|
|
|
|
ISR(INT2_vect){
|
|
skip_sleep=1;
|
|
|
|
}
|
|
|
|
|
|
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;
|
|
}
|
|
}
|