PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : 8 Kanal RC-Empfänger auswerten



CountryYankey
13.09.2005, 19:04
Hallo!

Ich möchte meinen Roboter gerne mit einem Modellbau 8 Kanal empfänger ausstatten.
Dazu habe ich, damit ich nicht für jeden Kanal einen eigenen Port brauche, mit dem Oszilloskop am Epfänger den Pin herausgesucht, an dem alle acht Kanäle anliegen, und mit meinem RNBFRA mit Int0 verbunden.

Das Signal funktioniert praktisch genauso wie das eines einzelnen Servos, über die Pulslänge, bloß dass acht Pulse kommen, und dann ein langer Puls als Ende/oder Anfang.

Ich habe schon mit dem timer1 herumexperimentiert, er misst aber nicht 8 Zeiten, die sich mit den Knüppelbewegungen der Fernsteuerung verändern, sondern misst konstante und sinnlose Zeiten.

Jetzt brauche ich eure Hilfe, da mir als Anfänger nichts mehr einfällt.
Vielen Dank im Vorraus
CountryYankey

Xtreme
13.09.2005, 19:51
Bist du sicher das du die Signale alle an einem Port abgreifen willst??? Ich denke es ist einfacher für jeden Kanal einen einzelnen Port zu haben. Da kannst du sicher sein, dass das Signal durch alle Stufen im Emfänger (Verstärker, Decoder, PCM Generator usw durch ist) Es sei denn du hast den Schaltplan des Empfängers analysiert ;-) Ansonsten müsstest du uns das Signal genauer beschreiben als

Das Signal funktioniert praktisch genauso wie das eines einzelnen Servos, über die Pulslänge, bloß dass acht Pulse kommen, und dann ein langer Puls als Ende/oder Anfang.
Oszilloskopbild
Vielecht is die Frequenz für Timer1 zu hoch (unwarscheinlich) wenn es PCM Signale sind, dann sollten sie so im 1-2 ms Bereich liegen.

MfG Xtreme

CountryYankey
13.09.2005, 20:23
Ja, ich möchte es schon so lösen. Es ist ausserdem kein pcm Empfänger, und ich habe das Signal vor dem Baustein abgegriffen, der es in die einzelnen Servosignale zerlegt.
Ich habe ein Schema des Signals angehängt.

Dieser Code sollte im Terminal ja verschiedene Längen anzeigen, also müsste sich alle acht Ausgaben das Ergebnis wiederholen, das tut es auch, aber es sind immer die selben Messwerte.

Config Timer1 = Timer , Prescale = 64
Enable Timer1
On Timer1 Ueberlauf
Enable Interrupts

Config Int0 = Falling
Enable Int0

On Int0 I1

Do

'noch nix drin
Loop

I1:
Zeit = Timer1
Timer1 = 0
Print Zeit

Return

Ueberlauf:
Print "Ueberlauf!"
Return

dann kommt sowas raus:
1020
572
650
650
890
442
649
649
und dass obwohl die einzelnen Werte bis auf den Langen annähernd gleich lang sein müssten, und auf Knüppelbewegungen nicht reagieren.

Dino Dieter
13.09.2005, 21:07
Hallo


Dazu habe ich, damit ich nicht für jeden Kanal einen eigenen Port brauche, mit dem Oszilloskop am Epfänger den Pin herausgesucht, an dem alle acht Kanäle anliegen, und mit meinem RNBFRA mit Int0 verbunden.

Das ist schon der richtige Weg. Was ich vermisse, ist das umschalten der Flanke für INT0 . Sonst löst ja der ja nur auf die fallende Flanke aus. Daher deine Zeiten.

Und lass die Print Anweisung aus der INT Routine raus. Schreib die 8 Zeiten in ein Array und gib sie aus, wenn du Zeit hast .

Sag mal, welche Takt du daran hast und welchen µC.

MFG
Dieter

gpo
13.09.2005, 21:53
Hallo,

soetwas hab ich auch schon mal gemacht:


Dim Puls(10) As Word 'Syncimpuls plus 9 Servos
Dim Kanal As Byte

Kanal = 1
On Icp1 Messen Nosave 'Pulslänge messen mit ICP-Eingang
On Ovf1 Kreset Nosave 'Kanalzähler rücksetzen

Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising 'rising oder falling anpassen an das Signal



Enable Ovf1 'Overflow-Interrupt
Enable Icp1 'Capture-Interrupt

Enable Interrupts


Cursor Off
Cls

Do
Locate 1 , 1
Lcd Puls(2) ; " " ; Puls(3) ; " " ; Puls(4) ; " " 'Puls(2) ist Kanal 1, Puls(3) ist Kanal 2 usw.
Locate 2 , 1
Lcd Puls(5) ; " " ; Puls(6) ; " " ; Puls(7) ; " " 'Puls(x)=4000 entspricht 1ms, 8000 entspricht 2ms... (4 Mhz Prozessortakt)
Loop

Messen:
push r10
push r11
push r24
push r25
push r26
push r27
in r24,sreg
push r24

Puls(kanal) = Timer1
Timer1 = 50000 'gilt für 4 Mhz Prozessortakt
Incr Kanal

pop r24
!Out Sreg , R24
pop r27
pop r26
pop r25
pop r24
pop r11
pop r10

Return


Kreset:
push r24
in r24,sreg
push r24

Kanal = 1

pop r24
!Out sreg,r24
pop r24
Return

End

So funktioniert das ganze fehlerfrei.

Das ist mein erster Beitrag, mitlesen tue ich schon lange. Meine Interessen sind hauptsächlich Modellbau/Modellflug und AVR Microcontroller.

Gruß
Günter

CountryYankey
14.09.2005, 13:01
Hallo zusammen,


Das mit dem Array habe ich ausprobiert, und es hat funktioniert, das Störende waren wirklich die print Anweisungen.

Es reicht wenn man eine Flanke misst, da die low Zeiten immer gleich lang sind, und es somit egal ist auf welche Flanke man misst.

Ich habe den ATMEGA 16 auf 8Mhz.

Den Code von Günther konnte ich leider mangels freiem ICP nicht probieren.

Vielen Dank
CountryYankey


Hier noch der Code der jetzt funktioniert:

Config Timer1 = Timer , Prescale = 64
Enable Timer1
On Timer1 Ueberlauf1
Enable Interrupts


Config Int0 = Falling
Enable Int0

On Int0 Auslesen


N = 0

Do
Waitms 1000
Print Kanal(1) ; " Kanal1"
Print Kanal(2) ; " Kanal2"
Print Kanal(3) ; " Kanal3"
Print Kanal(4) ; " Kanal4"
Print Kanal(5) ; " Kanal5"
Print Kanal(6) ; " Kanal6"
Print Kanal(7) ; " Kanal7"
Print Kanal(8) ; " Kanal8"
Print Kanal(9) ; " Kanal9"

Loop

End

Auslesen:
Kanal(n ) = Timer1
Timer1 = 0
If Kanal(9) < 1000 Then N = 8
Incr N
If N = 10 Then N = 1
Return


Ueberlauf1:
Print "!"
Return

fuchsili
15.09.2006, 22:17
Das interssiert mich auch...

was machst du wenn der Empfänger plötzlich Störungen hat oder der Sender wegfällt ( Entfernung zu groß, Akku leer...)? Hast du sowas wie eine Fail-Safe-Routine?
Wüßte gerne wie man sowas dann macht.

Gruß

fuchsili...

Xtreme
16.09.2006, 16:08
Also Fail- Safe stellt man bei mir am Sender ein. Und der Empfänger muss das natürlich auch unterstützen...

fuchsili
16.09.2006, 17:01
wo greifst du nun dein Signal ab in dem alle Kanäle drin sind?
Muß man dazu den Empfänger manipulieren?
Was passiert den wenn du den Sender ausschaltest?

fuchsili

CountryYankey
21.09.2006, 19:52
hallo

Das singnal greife ich direkt auf der Platine ab, auf einem Pin, den ich mit dem Oszi ausgemessen habe, also hab ich wenn man das so sieht den Empfänger manipuliert, es geht jetzt halt ein Kabel raus.
Mit Sender ausschalten halt ich mich halt an die Modellbauregel, den Sender zuerst anschalten, und zuletzt ausschalten; ansonsten kommt ein Rauschen, was aber auch dazu führt, das die Signale nicht mehr ausgelesen werden können, also kann man das einfach abfangen.
Und dann kann man ja im Programm einfach Standardwerte ausgeben, das ist dann ja so was ähnliches wie Fail-Safe.

Viele Grüße
CountryYankey

fuchsili
21.09.2006, 21:34
Halle,

welchen Empfänger hast du?
kannst du mir ein Bild schicken wo man diesen Punkt sieht.
Dann würde ich das auch mal versuchen. Bin zwar vom KnowHow her nicht so bewandert, aber ein Oszi hab ich....

Gruß
fuchsili :strom

CountryYankey
21.09.2006, 22:27
Ich habe dafür einen
Graupner JR C16 (FM35S)
hergenommen, das Signal liegt gegen Ground an einem Wiederstand an, ein Bild wird dir da wenig helfen, aber man findet es leicht (Es ist insgesamt zweimal auf der platine, einmal ziemlich verwaschen, und einmal als rechtecksignal)

CountryYankey