#include #include #include #include #include #include //#include #include #include #include #include #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; } }