Dieser Artikel ist noch lange nicht vollständig. Der Auto/Initiator hofft das sich weitere User am Ausbau des Artikels beteiligen.
Das Ergänzen ist also ausdrücklich gewünscht! Besonders folgende Dinge würden noch fehlen: Mehr Grundlagen/ Erklärungen, und Code Beispiele in C |
Inhaltsverzeichnis
Vorwort
Um einen RC-Empfänger mit einem ATmega auszuwerten bedient man sich am besten des Summensignals. Im Wiki von Mikrokopter.de findet sich eine Liste mit getesteten Empfängern und kurzen Anleitungen wie man an das Signal kommt. Die Quellcode Beispiele in diesem Artikel funktionieren mit einen Atmel ATmega32 der mit einem 16Mhz Quarz betrieben wird. Werden andere µC's oder andere Quarze verwendet ändern sich natürlich einige Zeilen. Besonders bei Verwendung eines anderen Quarzes müssen die Zeilen "preload für 4ms" auf den entsprechend richtigen Preload geändert werden! Evtl. muss auch der Prescaler angepasst werden.
Für BASCOM kann man mit folgendem Code die Kanäle 1-6 auslesen (atmega32, 16Mhz Quarz - bei Bedarf anpassen):
Auslesen mit Timer0
$baud = 9600 $crystal = 16000000 $regfile "m32def.dat" $framesize = 32 $swstack = 32 $hwstack = 64 Config Timer0 = Timer , Prescale = 256 , Capture Edge = Falling , Noise Cancel = 1 Enable Timer0 On Timer0 Pausedetected Config Int1 = Falling 'Summensignal an int1 (am Mega32: Port D3), Reaktion auf fallende Flanke Enable Interrupts Enable Int1 'einschalten Int1 On Int1 Measure 'springe zum Interrupt von Timer0 Dim Empf(6) As Word Dim Channel As Byte Do 'Main Loop gibt Signale per UART aus Print Empf(1) ; " CH1" Print Empf(2) ; " CH2" Print Empf(3) ; " CH3" Print Empf(4) ; " CH4" Print Empf(5) ; " CH5" Print Empf(6) ; " CH6" Print " " Waitms 500 Loop Measure: 'Reaktion auf fallende Flanke Select Case Channel Case 1 : Empf(1) = Timer0 Case 2 : Empf(2) = Timer0 Case 3 : Empf(3) = Timer0 Case 4: Empf(4) = Timer0 Case 5: Empf(5) = Timer0 Case 6: Empf(6) = Timer0 End Select Timer0 = 6 'preload für 4ms Incr Channel Return Pausedetected: Channel = 0 Return End
Auslesen mit Timer1
Alternativ kann man den Empfänger natürlich auch mit Timer1 auslesen. Hier ist die Auflösung höher:
$baud = 9600 $crystal = 16000000 $regfile "m32def.dat" $framesize = 32 $swstack = 32 $hwstack = 64 Config Timer1 = Timer , Prescale = 8 , Capture Edge = Falling , Noise Cancel = 1 Enable Timer1 On Timer1 PauseDetect Config Int1 = Falling Enable Interrupts Enable Int1 On Int1 Measure Dim Empf(6) As Word Dim Channel As Byte Do Print Empf(1) ; " CH1" Print Empf(2) ; " CH2" Print Empf(3) ; " CH3" Print Empf(4) ; " CH4" Print Empf(5) ; " CH5" Print Empf(6) ; " CH6" Print " " Waitms 500 Loop Measure: Select Case Channel Case 1 : Empf(1) = Timer1 Case 2 : Empf(2) = Timer1 Case 3 : Empf(3) = Timer1 Case 4: Empf(4) = Timer1 Case 5: Empf(5) = Timer1 Case 6: Empf(6) = Timer1 End Select Timer1 = 57536 'preload für 4ms Incr Channel Return PauseDetect: Channel = 0 Return End