www.mikrocontroller.net

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


Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wasn +/-1?
Netzlast?
Henkelobsttüte nehmen...

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

Autor: Markus (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PS: Ähhh Hi Rolf meinte ich .......

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
...
Bitte beachte das dies mit 6 Empfängerkanälen zugleich funktionieren
soll.
...

keine Panik! die kommen NACHEINANDER.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Doom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.