pyrorf/main.c
arnaud.houdelette b54944447e Divers
2019-09-10 16:07:13 +02:00

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;
}
}