Aus RN-Wissen.de
Wechseln zu: Navigation, Suche
Laderegler Test Tueftler Seite

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


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

Autoren


LiFePO4 Speicher Test