RC Empfänger auslesen, kein konstanter Wert

Gast #328276
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.
Gast #328278
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.
Angehängte Dateien:
Gast #328279
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.
Gast #328280
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?
Gast #328281
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?
Gast #328282
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.
Gast #328286
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.
Gast #328288
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.
Gast #328289
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.
Gast #328291
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren