Hallo an alle, ich verwende den ATmega8 um aus einem RC-Empfänger Servosignale auszulesen. Im Augenblick sind es zwei jeweils mit ext. Int0/Int1 pin. Das funktioniert soweit prima, allerdings benötige ich weitere Kanäle. Daher möchte ich das Empfänger Summensignal vor der Aufspaltung auf die Servobuchse auslesen, das funktioniert dann idealeweise mit nur einem externen Interrupt. Frage: Gibt es ein Protokoll welches das Timing der Signale auf dem "Bus" definiert, oder entspricht das 1:1 der Aneinanderreihung der einzelnen Kanäle ? Danke Stefan
Am besten machst du das mit "input capture". Das Signal sieht so aus: Immer wenn beim empfangenen Signal eine positive Flanke (oder eine negative - auf welche man triggert, müßte egal sein) kommt, wird im Empfänger ein Servokanal auf low und der nächste auf high geschaltet. Die Pulse vom Sender sind dabei glaube ich 0.5 ms lang. Die Servopulse können also mit einem 1-aus-n-Zähler aus dem Signal generiert werden (z.B. von einem 4022). Die Synchronisation erfolgt durch eine längere Pause am Ende des Impulstelegramms.
Hallo Stefan, Die Signale hängen hintereinander, es sind allerdings beim "Wechsel" Pulsflanken drin. Synchronisiert wird dann auf den langen "low" Puls nach dem letzten Kanal. (oder vor dem ersten...) Hier beschrieben: http://www.sprut.de/electronic/modell/allgemein/index.htm http://www.klaus-leidinger.de/mp/RC-Elektronik/Tester/Servotest/Servotester.html und hier mit AVR Code: http://www.ulrichradig.de/home/index.php/avr/avr_-_rc HTH, Klaus
Klaus, Rolf, danke für die Info ungefähr so habe ich mir das vorgestellt. Das schwierigste scheint mir dabei die richtige Synchronisierung zu sein. Da mein Prozessor ja "nebenbei" noch ein Anstellwinkelsignal per ADC auswertet und Servos ansteuert muß ich ausserdem zeitkritisch arbeiten. Werde mir mal ein Konzept ausdenken. Stefan
Ist zwar schon etwas älter, geht daher auch eleganter, aber vielleicht hilft's ja trotzdem: http://www.hanneslux.de/avr/mobau/impdecoder/idec.html ...
Hallo Stefan, Rolf hatte es ja schon im Prinzip beschrieben, und in dem Code auf meiner Seite ist es auch so gelöst (allerdings für 8051). Im AVR ist es einfacher: Timer mit mind. 3ms Überlauf starten INT0 auf neg. Flanke triggern bei Timer Überlauf -> Kanalzähler auf 1 bei INT0 mußt Du dann noch per Flag unterscheiden ob der Timer zurückgesetzt, oder der Timerwert für den aktuellen Kanal ausgewertet und der Kanalzähler erhöht wird. Das sind nur wenige Instruktionen pro Interrupt. Viele Grüße, Klaus
Genau, die Seite von Hannes hatte ich in meiner Liste vergessen ;-) dabei passt die vermutlich am besten, wenn es Assembler sein soll. CU, Klaus
Jo suuper, die Seite von Hannes. Insbesondere weil ich auch in assembler (mit Workpad plus) schreibe. Danke Euch Stefan
Ich bin auch gerade drann, mein Summensignal auszuwerten. Bei mir sind es zwei Kanäle. Ich habe das in C im ICP-Interrupt hinbekommen. Findest Du im unten genannten Link. Leider hapert es immernoch bei Reichweitengrenzen. Hier ist das Signal stark gestört und die beiden Motore meines Robbe 6X6 fangen dann an, etwas zu "spinnen". Der Empfänger ist aber auch nur ein billiger 2Kanal AM, der damals mit dabei war. Kannst es Dir ja mal ansehen. Hatte ich vor wenigen Wochen reingestellt: Beitrag "Re: Servoausgänge verUNDen" Gruß AxelR.
Hast du schon mal mit Heuristik probiert: Man kann doch sicher davon ausgehen, dass sich die Kanalimpulse von einem Telegramm zum nächsten Telegramm um nicht allzuviel ändern werden. Tun sies doch, dann hast du eine Störung.
Hallo Leute melde mich nochmal hierzu. Habe mal im ATmega8 Datasheet nachgeschaut und festgestellt das die "input capture function" nur in Verbindung mit Timer1 vorhanden ist. Den brauche ich aber um meine Servoausgänge zu steuern. Als Alternative kann ich aber die externen INT0/1 oder den Analogcomparator verwenden. Bei steigender/fallender -Flanke kann so einen Interrupt ausgelöst werden. Die zugehörige ISR kann ich dann zum Starten und abfragen von z.B. Timer0 verwenden. Was haltet Ihr davon? Muß jetzt leider weg - schaue heute Mittag wieder rein. Gruß Stefan @Axel: Danke für deinen Link, aber mit C stehe ich (noch) auf Kriegsfuß.
@Stefan, das ist das vorgehen das ich hier gemeint: Beitrag "Re: Servo Summensignal auswerten" und hier beschrieben hatte: Beitrag "Re: Servoausgänge verUNDen" Einfach die beiden Signale auf die beiden INT Eingänge, und ein Flag das aufpasst ob es die start oder stop Flanke des Signales war. Wenn die beiden Kanäle nebeneinanderliegen, ist das Stop des ersten Kanals auch gleichzeitig das Start des zweiten. Das erhaltene Signal kannst Du dann auch noch auf Plausibilität prüfen (min und max Wert) Mit dem Timer Überlauf triggerst Du auf Anfang. Wenn Du den Code brauchst, ich kann ihn heute Abend mal posten... Ciao, Klaus
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.