0,0 → 1,230 |
//############################################################################ |
// - LED CTRL Main |
// - ATMEGA8 mit 8MHz |
// - Nur für den privaten Gebrauch |
// - Keine Garantie auf Fehlerfreiheit |
// - Kommerzielle Nutzung nur mit meiner Zustimmung |
// - walter Meyer @ www.freakware.de |
// - 11.12.2007 |
// - Make sure Fuses are programmed for internal 8 MHz RC Oscilator |
//############################################################################*/ |
|
#include "main.h" |
#include "uart.h" |
#include "twislave.h" |
|
volatile unsigned int ppm_signal = 1500; |
volatile unsigned char ppm_new = 0; |
volatile unsigned char TMR1OvF = 0; |
volatile unsigned char ch0; |
volatile unsigned char ch1; |
volatile unsigned char ch2; |
volatile unsigned char ch3; |
volatile unsigned char ch4; |
volatile unsigned char ch5; |
|
|
|
SIGNAL(SIG_OVERFLOW1) |
{ |
TMR1OvF++; |
} |
|
|
SIGNAL(SIG_INPUT_CAPTURE1) |
{ |
static unsigned int pos_ICR; |
static unsigned int ppm; |
|
if ((TCCR1B & (1<<ICES1)) != 0) //rising edge |
{ |
TCCR1B &= ~(1<<ICES1); //set falling egde |
TMR1OvF = 0; |
pos_ICR = ICR1; |
} |
else //falling edge |
{ |
TCCR1B |= (1<<ICES1); //set rising egde |
ppm = (ICR1 - pos_ICR + (int) TMR1OvF * 65536); |
if ((ppm > 600) && (ppm < 2400)) |
{ |
if (ppm > 2100) ppm = 2100; |
if (ppm < 900) ppm = 900; |
ppm = (ppm_signal * 7 + ppm) / 8; |
ppm_signal = ppm; |
ppm_new = 1; |
} |
|
} |
|
} |
|
|
|
|
|
SIGNAL(SIG_OVERFLOW0) |
{ |
static unsigned char counter; |
unsigned char PORTB_BAK; |
unsigned char PORTD_BAK; |
|
PORTB_BAK = PORTB; |
PORTD_BAK = PORTD; |
|
|
if (counter == 0) |
{ |
PORTB_BAK clrbit (CH0_B | CH1_B | CH2_B); |
PORTD_BAK clrbit (CH3_D | CH4_D | CH5_D); |
} |
|
|
if (ch0 == 255) |
{ |
PORTB_BAK setbit CH0_B; |
} |
if (ch0 == counter) |
{ |
PORTB_BAK setbit CH0_B; |
} |
if (ch0 == 0) |
{ |
PORTB_BAK clrbit CH0_B; |
} |
|
|
|
|
|
|
if (ch1 == counter) |
{ |
PORTB_BAK setbit CH1_B; |
} |
if (ch2 == counter) |
{ |
PORTB_BAK setbit CH2_B; |
} |
if (ch3 == counter) |
{ |
PORTD_BAK setbit CH3_D; |
} |
if (ch4_BAK == counter) |
{ |
PORTD setbit CH4_D; |
} |
if (ch5_BAK == counter) |
{ |
PORTD setbit CH5_D; |
} |
} |
|
|
|
} |
|
|
|
|
counter++; |
|
PORTB = PORTB_BAK; |
PORTD = PORTD_BAK; |
|
|
} |
|
|
|
|
|
/*##############################################################################*/ |
void StartPWM(unsigned char txbyte) |
{ |
//Timer 0 Config for getting right timing for IR Pattern |
TCCR0 = (0<<CS02)|(0<<CS01)|(1<<CS00); // (@8MHz) = 1/8us Clk = 256/8 = 32us overflow |
TIMSK setbit (1<<TOIE0); // enable Int |
|
} |
|
|
|
|
|
|
|
/*##############################################################################*/ |
void StartPPM(void) |
{ |
|
//global timer1 Config |
TCCR1A = (0<<COM1A1)|(0<<COM1A0)|(0<<COM1B1)|(0<<COM1B0)| |
(0<<FOC1A) |(0<<FOC1B) |(0<<WGM10) |(0<<WGM11); |
TCCR1B = (1<<ICNC1)|(1<<ICES1)|(0<<WGM13)| |
(0<<WGM12)|(0<<CS12)|(1<<CS11)|(0<<CS10); //ICP_POS_FLANKE |
|
// interrupts |
TIMSK |= (1<<TICIE1)|(1<<TOIE1); //ICP_INT_ENABLE and TIMER1_INT_ENABLE |
|
} |
|
|
|
int GetPPM(void) |
{ |
//this routines seems to be nesseccary, as reading a 16 bit value |
//on a 8 bit machine is not atomic, so if an interrupt apears between reading |
//low and high byte of the 16 bit value a wrong result is possible |
|
unsigned char intmask; |
unsigned int ppm_temp; |
|
intmask = TIMSK; //backup interupt enable bits |
TIMSK &= ~(1<<TICIE1); //disable ppm interrupt |
ppm_temp = ppm_signal; |
TIMSK = intmask; //restore interupt enable bits |
return(ppm_temp); //return ppm_signal |
|
} |
|
|
/*##############################################################################*/ |
// MAIN |
/*##############################################################################*/ |
int main (void) |
{ |
|
DDRC = (1<<ledred); |
PORTC = 0x00; |
DDRD = (1<<ledgreen); |
PORTD = 0x00; |
DDRB = (1<<1)|(1<<2)|(1<<3); |
PORTB = 0x00; |
|
|
ch0 = 0; |
ch1 = 0; |
ch2 = 0; |
ch3 = 0; |
ch4 = 0; |
ch5 = 0; |
|
//StartUART(); |
StartPPM(); |
StartI2C(); |
StartPWM(); |
sei(); |
|
|
while (1) |
{ |
//printf("%d ",ppm_signal); |
|
|
|
|
} |
|
|
} |