Forum: Mikrocontroller und Digitale Elektronik RC Empfänger auslesen, kein konstanter Wert


von Markus (Gast)


Lesenswert?

Hi.
Ich versuche gerade die impulse eines Modellbau empfängers mit einem
AVR abzufragen.
Jedoch habe ich das problem das bei jeder Messung die genauigkeit um
+/- 1 schwankt. Hat jemand von euch erfahrung und wie habt ihr das dann
gelöst?
Ich arbeite mit einem Timer mit Prescaler 8 und einer Taktfrequenz von
4MHz.

Beim senden der Impulse an ein Servo geht es wunderbar nur beim
Empfangen hab ich eben +/- 1. Das lässt dann wiederum mein Servo
zittern.

von Axel R. (Gast)


Lesenswert?

wasn +/-1?
Netzlast?
Henkelobsttüte nehmen...

Im Ernst: Stück Program wäre nicht schlecht.
sprichst Du von µs oder 10ms-Raster?

von Markus (Gast)


Angehängte Dateien:

Lesenswert?

Also +/- 1 war auf  meine Variable bezogen sorry.

Code ist nun dabei.
Also ursprünglich wollte ich jede 100µsec auswerten aber jetzt bin ich
vollkommen in einem anderen Raster. Komischerweise funktioniert es so
gerade.

Die Variable rec_servo_1 beinhaltet die aktuelle Servoposition.
Wenn diese auf 59 ist, so steht das Servo in der Mitte.
Und genau diese Variable variiert eben dauernd.

von Christian Rötzer (Gast)


Lesenswert?

Hm, ich kapier' Deinen Source nicht, aber willst Du wirklich, dass

if (!(PORTC = 0b00000001))
{
    PORTC = 0b00000001;
}

Sollte das nicht evtl.

if (!(PORTC == 0b00000001))
{
    PORTC = 0b00000001;
}

heissen? Kommt mehrmals vor.

von Markus (Gast)


Lesenswert?

Ah danke Chris, hatte ich total übersehen.
Das ändern aber leider noch nichts an meinem Timing problem.


Noch ne Timing frage.
Wenn ich alle 100µsec einen Impuls vom Timer will dann mach ich das
doch folgendermaßen.

Takt = 4 000 000 Hz
alle 10µsec = 100 000 Hz

4 000 000 / 100 000 = 40
Also Prescaler auf 8 und 40/8 = 5
Und Output compare auf 5 einstellen.

Damit sollte ich doch jede 10µsec. einen Output Compare interrupt haben
oder nicht?

von Rolf Magnus (Gast)


Lesenswert?

> Damit sollte ich doch jede 10µsec. einen Output Compare interrupt
> haben oder nicht?

Ich denke schon. Beachte aber, daß du dann nicht viel in deiner
Interrupt-Routine tun darfst, da nur 40 Taktzyklen zur Verfügung
stehen, bevor der nächste Interrupt kommt. Davon gehen schon mal
mindestens 8 nur für die Interrupt-Behandlung selbst drauf (Sprung in
den Interrupt-Vektor und reti), dazu kommen nochmal 2 für's rjmp in
die eigentliche Interrupt-Routine. Der Compiler generiert für diese
einen Prolog, der ohne das Sichern der in der Interrupt-Routine
benutzten Register schon mal 8 Taktzyklen braucht. Der Epilog am Ende
braucht nochmal 7. Für jedes Register, das gesichert werden muß, kommen
nochmal 4 (2 im Prolog für push und 2 im Epilog für pop) dazu.
Wir sind also schon bei 25 Taktzyklen Minimum (Unter manchen Umständen
können es noch zwei oder drei mehr sein), ohne daß die
Interrupt-Routine überhaupt etwas tut. Ich denke, dein Problem ist, daß
deine Interrupt-Routine nicht rechtzeitig fertig wird und das dein
Timing durcheinanderbringt.

Ich verstehe aber nicht ganz, warum du überhaupt einen Zähler nur so
kurz laufen und dann einen Interrupt generieren läßt, nur um darin dann
 per Software zu zählen.


Übrigens: Was für einen AVR verwendest du überhaupt?

von Markus (Gast)


Lesenswert?

Hi Magnus.
Danke für die Antwort das habe ich nicht gewusst das dabei so viele
Schritte verlohrengehen.
Ich verwende einen Mega 8515.
Naja ich denke das ist die einzigste Möglichkeit eben die Impulsdauer
des Empfängers zu zählen, oder gibt es da noch eine andere
Möglichkeit?
Bitte beachte das dies mit 6 Empfängerkanälen zugleich funktionieren
soll.

von Markus (Gast)


Lesenswert?

PS: Ähhh Hi Rolf meinte ich .......

von Axel R. (Gast)


Lesenswert?

...
Bitte beachte das dies mit 6 Empfängerkanälen zugleich funktionieren
soll.
...

keine Panik! die kommen NACHEINANDER.

von Markus (Gast)


Lesenswert?

Jo Axel das stimmt, aber so kann ich den Timer nicht mit einem externen
Interrupt triggern bzw. ein oder ausschalten lassen da ich so sonst 6
Timer benötigen würde.

von Rolf Magnus (Gast)


Lesenswert?

Die Idee ist, den Timer einfach durchlaufen zu lassen und sich, wenn ein
Pin toggelt, den aktuellen Timerwert zu merken. Leider hat der Mega8515
keinen PCINT und nur drei INT-Eingänge, sonst könnte man die dafür
nehmen. Der Input-Capture ist dafür auch gut geeignet, aber halt auch
nur einmal vorhanden.

von Markus (Gast)


Lesenswert?

Ja wobei ich glaube das es einfach nicht wirklich genau mit 4MHz geht.
Das ist zu langsam. Warscheinlich werde ich auf einen anderen Controler
ausweichen und es mit 16MHz versuchen.

von Christian Rötzer (Gast)


Lesenswert?

Innovation:

Falls Du Dich traust, direkt am Empfänger zu löten, würde ich mal
sehen, ob da ein 4017 (Johnson-Counter) drauf ist. Wenn dem so wäre,
könntest Du Dich direkt auf die Clock- und Reset-Leitung dieses
Bausteins klemmen und kannst somit mit nur zwei Leitungen alle Kanäle
dekodieren.

von Axel R. (Gast)


Lesenswert?

@Markus

sieh doch mal bei HanneS auf seinen Seiten nach. da wird das auch
gemacht. mitm tiny15. Der läuft nur mit 1.6Mhz.
Ich habe es in Basic mit 4Mhz programmiert(nicht schlagen). geht auch.
Du kannst die Impulslängen der einzelnen Kanäle sammeln, kommen ja
hintereinander und am Ende der Impulsfolge hast Du noch massig Zeit,
die Werte umzurechnen und zu agieren, bevor die neue Impulsfolge
anfängt. Die einzelnen Kanäle kannst Du mit dioden zusammenschalten,
wenn Du im Empfänger nicht den Demodulatorausgang suchen willst.

von Rolf Magnus (Gast)


Lesenswert?

Wenn man alle zusammenschaltet, hat man auch den Vorteil, input capture
verwenden und dadurch ohne großen Rechenaufwand die Impulslängen
taktzyklengenau ermitteln zu können.

von Doom (Gast)


Lesenswert?

Hallo,

das mit dem zusammenschalten der Ausgänge über Dioden hatte ich auch
ausprobiert, aber dummerweise schaltet mein Empfänger in dem Moment, in
dem der erste Kanal wieder auf low geht, den zweiten Kaal auf high, so
daß das zusammengeschaltete Signal keine Unterscheidung mehr ermöglicht
hatte (war also bei 6 Kanälen in Mittelstellung 9ms auf high und 11ms
auf low). Ich habe dann doch am Empfänger rumgelötet, um das Signal vor
dem "auseinanderrupfen" nach aussen führen zu können und per ICP zu
verarbeiten.

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
Noch kein Account? Hier anmelden.