Hallo Zusammen, ich bin verzweifelt auf der Suche nach einer Lösung meines Problems. Ich habe schon seit Tagen etliche Beiträge und Quellcodes durchgearbeitet jedoch ohne Erfolg. Ich bin ziemlicher Anfänder in Programmierung von MC`s mit C. Zu meinem Problem: Ich benutze das Board myAVR Board MK2 USB mit nem ATmega8. Es soll mit diesem boa ein RC Summensignal mit 4 Kanälen ausgewertet werden. Das Summesignal, wie im Bild dargestellt beinhaltet 8 Kanäle, wovon ich nur 4 auswerten möchte. Meine Überlegungen: Ich lege das Signal an PB0(ICP1) an und warte auf Interrupt bei steigender (oder fallender) Flanke. Dann wird ein Timer gestartet und der Wert, bis zur nächsten steigenden Flanke in Variable gespeichert.... Kann mir jemand bei dem Quellcode helfen, in der Variablen sollen nachher die Kanäle mit unterschiedlichen Zeiten stehen. Somit habe ich die einzelnen Kanäle des Summensignals ausgewertet. So sind zumindest meine Überlegungen. Hoffe ihr könnt mir bei dem Thema helfen. Gruß Markus
Markus schrieb: > Dann wird ein Timer > gestartet und der Wert, bis zur nächsten steigenden Flanke in Variable > gespeichert.... Darin liegt dein Denkfehler. Den Timer startest du bereits davor, und der input capture interrupt liest den aktuellen Timerwert in sein Register. Wenn man von diesem den vorherigen ICP-Wert abzieht (uint16_t Rechnung, dann darf man auch bei einfachem Zählerüberlauf dazwischen direkt subtrahieren), dann hat man die Länge des Impulses (bzw. der Impulspause) in Zähler"ticks". Ansonsten ist das Thema schon ausreichend oft diskutiert worden hier, benutze mal die Suche.
Danke Jörg für deine Antwort, habe nun mit der Suchfunktion und einigen Artikeln dieses Programm: #include <inttypes.h> #include <avr/interrupt.h> #include <avr/io.h> #define F_CPU 16000000UL // Quarz mit 16 Mhz #include <util/delay.h> volatile uint8_t ikanal=10,ipuls=0, isumme[9]; volatile uint16_t icnt=0; ISR(TIMER1_CAPT_vect) { uint16_t icnt_tmp = ICR1; uint16_t izeit = icnt_tmp-icnt; if(ikanal<9) isumme[ikanal++] = izeit; if(izeit>156) ikanal=0; icnt = icnt_tmp; } void RC_ICP_init(void) { TIMSK |= (1<<TICIE1); // Capture Interrupt enable TCCR1B |= (1<<CS12) | (1<<ICES1); // Prescaler 256 Timer 1, Steigende Flanke Capture } int main(void) { DDRB &= ~(1 << PB0); // PB0 Input ICP PORTB |= (1<<PB0); // Pull up on PB0 DDRC = 0xff; // PORT A komplett Output RC_ICP_init(); // ICP Init sei(); // Globale Interrupts erlauben for(;;) { if( ikanal < 9 ) // gibts gültige Werte? { if( (isumme[8] < 92) || (isumme[8] >102)) PORTC |= (1 << PC0); else PORTC &= ~( 1 << PC0 ); if( (isumme[1] < 92) || (isumme[1] >102) ) PORTC |= (1 << PC1); else PORTC &= ~( 1 << PC1 ); if( (isumme[2] < 92) || (isumme[2] >102)) PORTC |= (1 << PC2); else PORTC &= ~( 1 << PC2 ); if( (isumme[3] < 92) || (isumme[3] >102) ) PORTC |= (1 << PC3); else PORTC &= ~( 1 << PC3 ); if( (isumme[4] < 92) || (isumme[4] >102)) PORTC |= (1 << PC4); else PORTC &= ~( 1 << PC4 ); if( (isumme[5] < 92) || (isumme[5] >102) ) PORTC |= (1 << PC5); else PORTC &= ~( 1 << PC5 ); } } } Das Programm soll aber auf einem myAVR Board MK2 USB mit nem ATmega8 laufen. Die Quarz Angabe oben #define F_CPU 16000000UL // Quarz mit 16 Mhz ist die auf den Empfängerquarz bezogen? Mein Empfänger ist ein Graupner R700 35MHz. Wenn ich den Code nun teste, leuchten, bzw. Blinken bei mir alle LED`s gleichzeitig. Ohne dass ich einen Stick der Fernbedienung bewege! Könnt ihr mir diesbezüglich helfen. Danke im voraus Markus
Hi, ich habe mal die Software von Ulrich Radig genutzt. Hat super funktioniert. Ist frei bei privater Nutzung. http://www.ulrichradig.de/home/index.php/avr/avr_-_rc Mfg Ed
Hallo Ed, die den Quellcode von Ulrich Radig habe ich mir auch schon mehrfach angesehen, jedoch blicke ich nicht durch und kann es auf mein Problem nicht umschreiben. Vielleicht kann mir jemand erklären, wie ich auf die Zahlenwerte komme. if(izeit>156) 156?? if( (isumme[8] < 92) || (isumme[8] >102)) 92?? und 102??? vielleicht muss ich diese für mein PPM Signal(Bild im Anhang) nur anpassen!
Mein PPM-Signal: Schalter min --> Signal 1ms Schlater neutral --> Signal 1,5ms Schalter max Stellung --> Signal 2ms
Hallo Zusammen, benötige dringend den Quellcode in C zum Einlesen eines Summensignals (Bild im Anhang). Ich muss die ersten 4 Kanäle einlesen. Schalterstellung zuvor erklärt. Arbeite mit myAVR Board MK2 USB mit nem ATmega8 der Empfänger der Funke ist ein Graupner R700 35MHz. Hoffe jemand kann mir den Code zur Verfügung stellen! Danke im voraus Markus
Markus Lisges schrieb: > Hallo Zusammen, > benötige dringend den Quellcode in C zum Einlesen eines Summensignals Wenn man schon fremde Threads kapert, sollte man die zumindest mal vorher lesen. Ed schrieb: > ich habe mal die Software von Ulrich Radig genutzt. Hat super > funktioniert. Ist frei bei privater Nutzung. > http://www.ulrichradig.de/home/index.php/avr/avr_-_rc Markus Lisges schrieb: > (Bild im Anhang) Kein Bild. Oliver
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.