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, 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
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
Autoren