#include #include #include //Initialisierung AD-Wandler void ADC_wandlung(); void motor(); unsigned char lenkung_soll; //Sollwert unsigned char lenkung_ist; //Istwert void auswertung(); volatile unsigned char Pulsdauer; volatile unsigned char i; volatile unsigned char wert; volatile unsigned char servowert = 0; //volatile unsigned char e; volatile unsigned char a; //Hilfsvariable, wird als Bedingung für kompletten LOW-Pegel Impuls verwendet volatile unsigned char b; //Hilfsvariable für Schleife in der Funktion "Auswertung" volatile unsigned char c; volatile unsigned char bit = 0; //Gibt die Anzahl der empfangenen Bits an volatile unsigned char Startimpuls; //Startbit void ADC_wandlung() //PORTC, Bit2 { ADCSRA |= (1<= (lenkung_soll -3))) { PORTB &= ~(1 << PB3); PORTB &= ~(1 << PB0); } if((lenkung_ist +3) < (lenkung_soll)) { PORTB |= (1 << PB3); PORTB &= ~(1 << PB0); } if((lenkung_ist -3) > (lenkung_soll)) { PORTB |= (1 << PB0); PORTB &= ~(1 << PB3); } } int main(void) { DDRB |= (1 << PB1); TCCR0B |= (1 << CS01); TCCR1 |= (1 << CS11); MCUCR |= (1 << ISC01); //IRQ bei Signalwechsel für Servosignal (INT0/PD2) GIMSK |= (1 << INT0); //External Interrupt in INT0 enable ADMUX &= ~((1<= 28) && (Pulsdauer <= 32) && (b == 0)) //Entspricht die Puldauer der entsprechenden Länge, wird das Startbit erkannt { cli(); Startimpuls = Pulsdauer; b++; a = 0; PORTB &= ~(1 << PB1); sei(); } if((b >= 1) && (b <= 8) && (a == 1)) //Der Wert von b entspricht dem jeweiligem Datenbit { cli(); auswertung(); //Wird ausgeführt, nachdem ein Bit komplett empfangen wurde servowert = servowert + wert; //Rechnet die 8 Datenbits zusammen sei(); } if(b > 8) //Ist das komplette Signal ausgewertet, fange wieder von neu an { if(servowert <= 70) servowert = 70; if(servowert >= 180) servowert = 180; lenkung_soll = servowert; servowert = 0; b = 0; Pulsdauer = 0; wert = 0; //e = 0; } } } //Interrupt wird bei einer positiven oder negativen Flanke am Pin INT0 ausgelöst ISR(INT0_vect) { if((MCUCR & (1 << ISC01)) && (!(MCUCR & (1 << ISC00)))) //Interrupt ist auf negative Flanke eingestellt und nicht auf positive { c = 5; PORTB &= ~(1 << PB3); PORTB &= ~(1 << PB0); TCNT0 = 0; //Timer auf 0 setzen MCUCR |= ((1 << ISC01) | (1 << ISC00)); //Interrupt auf positive Flanke einstelllen } else { c = 0; MCUCR &= ~(1 << ISC00); //Interrupt auf negative Flanke einstellen Pulsdauer = TCNT0; //Die Pulsdauer entspricht dem Wert, der im Register TCNT0 steht a = 1; //Variable a wird gleich 1, wenn ein kompletter Low-Pegel empfangen wurde } //e++; //if(e >= 2) //GIMSK &= ~(1 << INT0); } //Die Funktion wird ausgeführt, wenn ein kompletter Low-Pegel empfangen wurde. Hier werden die 8 Daten-Bits augewertet. void auswertung() { if(Pulsdauer > Startimpuls) i = 1; if(Pulsdauer < Startimpuls) { i= 0; wert = 0; } if( i == 1 && b > 0 && b < 9 ) { wert = 1 << ( b - 1 ); } a = 0; b++; }