Forum: Mikrocontroller und Digitale Elektronik Servo ansteuern


von Daniel (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe vor ein paar Tagen ein Entwicklungsboard (STK500) und ein paar
Servos geschenkt bekommen. Nach ein paar Spielereien mit den LED's hab
ich mich mal an die Ansteuerung der Servos herangemacht. Hab dann hier
auf der Seite etwas gestöbert und mir erstmal das Prinzip der
Servosteuerung veranschaulicht. Hab dann auch den angefügten Quellcode
gefunden, soweit angepasst und ausprobiert. Die Servos an das STK500
angeschlossen und los dachte ich. Doch leider dreht der Servo nur bis
zum linken Anschlag und das wars.

Sind leider meine ersten Erfahrungen auf dem Gebiet, für ein paar
Ratschläge wäre ich echt dankbar.

Grüße   Daniel

von mr.chip (Gast)


Lesenswert?

Hallo

Eventuell wäre noch ein Schaltplan nützlich.

Ich vermute aber: Dein Signal ist zu lange oder zu kurz auf H. Ein
H-Signal ist aber vorhanden, sonst würde das Servo stehen. Kontrolliere
mal, ob...

...der Pin, an dem das Servo hängt, auch tatsächlich ein H/L-Signal
bekommt oder eventuell immer auf H bzw. L ist.

...dieses Signal auch tatsächlich mit dem vorgesehenen Timing abläuft.
(Am besten im Simulator das Programm jeweils bis zum Umschalten des
Pins laufen lassen und dann die Zeitspanne messen.)

...du das Timing richtig Interpretiert hast. Ein 'Taktzyklus' dauert
20 ms. In diesem Taktzyklus geht das Signal für 1 - 2 ms auf H.
Vielleicht hast du es so interepretiert: 20 ms L, dann 1 - 2 ms H.

Gruss

Michael

von Magnus Müller (Gast)


Lesenswert?

Mit welcher Taktfrequenz betreibst du den AVR?

Verwendest du einen externen Quarz, oder den internen Oszillator?

Wenn du einen externen Quarz verwendest (oder meinst zu verwenden)...
bist du dir sicher, daß du den Controller entsprechend vorbereitet hast
(Stichwort Fusebits)?

Was passiert, wenn du via RS232 Daten an den Controller schickst?
Soweit ich das beim ersten Überfliegen des Codes erkennen konnte, wird
die Sollposition des Servos über die serielle Schnittstelle
vorgegeben.

Gruß,
Magnetus

von Daniel (Gast)


Lesenswert?

Hi, erst einmal Danke für eure Antworten.

Also ich verwende den externen Quartz auf dem STK500, die Fusebits sind
richtig gesetzt (auf externen Quartz umgestellt).

Das mit dem schicken über RS232 versteh ich nicht ganz. Wie kann ich
ihm denn da Daten schicken?

von Magnus Müller (Gast)


Lesenswert?

"Also ich verwende den externen Quartz auf dem STK500, die Fusebits
   sind richtig gesetzt (auf externen Quartz umgestellt)."

Aha, und mit welcher Frequenz schwingt nun dieser Quarz?


  "Das mit dem schicken über RS232 versteh ich nicht ganz. Wie kann
   ich ihm denn da Daten schicken?"

Ganz einfach: Du verbindest die entsprechenden Portpins des Controllers
mit den RX-/TX- Pins nahe der 8 Ausgabe-LEDs. Ausserdem verbindest du
die serielle Schnittstelle deines PCs mit der 9poligen SUBD-Buchse
(welche mit "SPARE" beschriftet ist). Um nun die Daten vom PC zum µC
und umgekehrt vom µC zum PC zu schicken benötigst du natürlich noch ein
entsprechendes Programm auf dem PC (im einfachsten Fall ein
stinknormales Terminalprogramm z.B. "Hyper Terminal")

Gruß,
Magnetus

von Magnus Müller (Gast)


Lesenswert?

@Daniel:

...und? ...gibts was neues?

wart
Magnetus

von Daniel (Gast)


Lesenswert?

Hallo Daniel,

nachdem ich mich nun etwas intensiver mit der ganzen Thematik
beschäftigt habe, ist der Stang der Dinge folgendermaßen:

Der Mikrocontroller läuft nicht wie oben beschrieben mit einem externen
Quarz, sondern mit dem internen Oszillator. Die Fuses habe ich wieder
dementsprechen umgestellt.

Das mit dem Daten schicken über die RS232-Schnittstele hab ich nun auch
kapiert. Habe meinen PC mit der SUBD-Buchse(SPARE) des STK500 und die
UART-Ausgänge des Boards (RX&TX) mit den UART-Eingängen des
Mikrocontrollers verbunden. Dann wollte ich dem Controller mit meinem
Terminal die Werte für die entsprechenden Servostellen schicken. Hat
leider nicht hingehauen. Der Servo dreht sofort bis Anschlag links und
das wars. Wird wohl daran liegen, dass das Programm für einen Takt mit
8MHz geschrieben ist und der interne maximal 3,69MHZ beträgt.

Ob High oder Low Pegel anliegt, kann ich schwer sagen da ich leider
kein Oszi hab. Mit nem normalen Messgerät geht das nicht oder?

Bin jetzt gerade dabei das Programm auf meinen Takt umzuschreiben. Da
ich dass zum ersten mal mache wird das wohl noch ein wenig dauern. Für
Tipps und Ratschläge wäre ich echt dankbar....!!!

Gruß

von Daniel (Gast)


Lesenswert?

Eigentlich soltte es "Hallo Magnetus" und nicht "Hallo Daniel"
heißen...gg

von Magnus Müller (Magnetus) (Gast)


Lesenswert?

"Der Mikrocontroller läuft nicht wie oben beschrieben mit einem
  externen Quarz, sondern mit dem internen Oszillator"

Wenn du mit dem internen Oszillator arbeitest wirst du
höchstwahrscheinlich keine seriellen Daten zwischen µC und PC
austauschen können (interner Oszillator ist zu ungenau).

Gruß,
Magnetus

von Daniel (Gast)


Lesenswert?

Schade, dann muss ich wohl mal bei Conrad rum und mir einen besorgen.

Gruß

von Hannes L. (hannes)


Lesenswert?

Nur mal so zum Schaun, wie man Servos ansteuern kann:

http://www.hanneslux.de/avr/mobau/7ksend/7ksend02.html

Ist allerdings ohne serielle Schnittstelle zum PC, dafür mit
Steuerknüppeln und Tastern.

...

von Jürgen S. (gordon)


Lesenswert?

Die Ansteuerung eines Servos ist eigentlich recht einfach. Du muß einen
Impuls generieren der 1-2ms auf High liegt und dann 18ms auf Low. 1ms
entspricht der einen Endlage 1,5ms Mitte und 2ms die andere Endlage.
Ich habe in Assembler ein Programm geschrieben das 32 Servos
gleichzeitig ansteuern kann.

von Rolf Magnus (Gast)


Lesenswert?

> Die Ansteuerung eines Servos ist eigentlich recht einfach.

Schwieriger wird's da schon, wenn man mehrere Servosignale von einem
Empfänger einlesen und gleichzeitig welche generieren will. Ich
überlege mir gerade, wie ich mit einem AVR einen Servomischer mit
jeweils fünf Ein- und Ausgängen so hinbekomme, dass er jitterfrei ist.

von Jürgen S. (gordon)


Lesenswert?

Die Generierung der Servosignale  ist nur im Bereich der 1-2ms
zeitkritisch. In der Pause von 18ms kann der Prozessor so ziemlich
alles machen (bei mir die Dekodierung des DCC Signals). Die Pause kann
auch mal verlängert werden ohne das der Impuls darunter leidet.

von Hannes L. (hannes)


Lesenswert?

> Die Generierung der Servosignale  ist nur im Bereich der 1-2ms
> zeitkritisch.

Da ist überhaupt nichts zeitkritisch, denn das Generieren der Impulse
kann ein Timer "nebenher" machen. Zwischen den Timer-Interrupts steht
dann mindestens eine Millisekunde Rechenzeit (das sind bei 1MHz 1000
Takte!!) für andere Aufgaben zur Verfügung. Man sollte beim
Programmieren nur keine Scheu vor Interrupts haben.

...

von Jürgen S. (gordon)


Lesenswert?

Das ist richtig wenn du nur einen Servo steuern willst. In meinem
Programm werden aber 32 Servos gleichzig mit völlig unterschiedlichen
Werten gesteuert. Den ersten Teil von 1ms übernimmt bei mir auch ein
Timer der variable Teil ist aber der zeitkritische Teil weil da ein
Zähler läuft und je nach Zählerstand dann die einzelnen Servoimpulse
beendet werden. Die reine Impulsausgabe benötigt ungefähr 5%
Rechenleistung bei 8MHz Takt. Der Rest ist frei verfügbar.

von Hannes L. (hannes)


Lesenswert?

@Jürgen:
Da üblicherweise die Servoimpulse mehrerer Kanäle nacheinander
übertragen werden, kann ein Timer mehrere Impulse generieren. Will man
sich dabei an die Vorgabe 20ms Wiederholrate halten, dann bekommt man
(knapp) 10 Kanäle in einem Timer-Kanal unter. Erhöht man den
Wiederholabstand geringfügig, so schafft ein Timerkanal 11
Servokanäle.
Die dafür in Frage kommenden 40-poligen AVRs haben alle mindestens
Timer0 und Timer1. Timer1 hat zwei Compare-Einheiten, jede dieser
Compare-Einheit kann dann 11 Servokanäle generieren. Timer0 kann über
Überlauf-Interrupt weitere 11 Servokanäle generieren. Mit dem (meist
auch vorhandenem) Timer2 kann man die 23ms generieren, die die
Impulserzeugung wieder "anschubsen". Alternativ lässt man jede der 3
Gruppen einfach im Kreis laufen, dann ist die Wiederholrate eben nicht
konstant, sondern variiert mit der Summe aller Kanalimpulse einer
Gruppe.
Da Timer1 aufgrund der Nutzung beider Compare-Interrupts frei durch
läuft (nie im Zählerstand manipuliert wird), kann man mit dem
Input-Capture-Interrupt auch noch ein Impulstelegramm von einem
RC-Empfänger (das Demodulator-Signal, das alle Kanalimpulse enthält)
einlesen und hat bei Bedarf im Hauptprogramm noch genügend Zeit, daraus
die Servopositionen der zu generierenden Impulse zu errechnen. Denn die
gesamte Impulserzeugung läuft im Interrupt und bremst das Programm
nicht aus. Ich denke mal, dass das Erzeugen deiner 32 Servoimpulse im
Interrupt weniger als 20% Rechenzeit eines mit 1MHz laufenden ATMegas
benötigt und der AVR die restliche Zeit rechnen oder pennen kann.

...

von Rolf Magnus (Gast)


Lesenswert?

> Da Timer1 aufgrund der Nutzung beider Compare-Interrupts frei
> durch läuft (nie im Zählerstand manipuliert wird), kann man mit
> dem Input-Capture-Interrupt auch noch ein Impulstelegramm von
> einem RC-Empfänger (das Demodulator-Signal, das alle Kanalimpulse
> enthält) einlesen

Dazu muss man aber entweder den Empfänger modifizieren oder alle Pins
mit einem Oder zusammenschalten (und hoffen, dass der Empfänger die
Signale auch tatsächlich noch so ausgibt, wie man's erwartet - bei
welchen mit Prozessor kann's auch anders sein).
Außerdem muss man ja irgendwann auch auf das Input-Capture-Signal
reagieren. Der Timer-Wert wird zwar automatisch in das Capture-Register
geladan, aber irgendwann muss man den auch mal woanders hinschreiben.
Wenn ich dazu aber den Input-Capture-Interrupt verwende, kann der
wieder die Output-Compare-Interrupts verzögern und damit wieder Jitter
auslösen.

von Hannes L. (hannes)


Lesenswert?

> Wenn ich dazu aber den Input-Capture-Interrupt verwende, kann der
> wieder die Output-Compare-Interrupts verzögern und damit wieder
> Jitter auslösen.

Diese paar Takte dürften den Kohl nicht fett machen. Natürlich sollte
man keine ellenlangen Routinen in der ISR ausführen. Es ist ja nur die
Differenz zum Timerstand des letzten ICP-Interrupts zu bilden und zu
sichern (SRAM über Pointer), sowie der neue Timestamp zu sichern
(Register). Es ist nichtmal eine Flankenumschaltung vorzunehmen, da ja
der Impulsabstand relevant ist und daher immer auf dieselbe Flanke
getriggert werden kann. Das Aufarbeiten der Werte geschieht dann in der
Mainloop.

> Dazu muss man aber entweder den Empfänger modifizieren oder alle
> Pins
> mit einem Oder zusammenschalten (und hoffen, dass der Empfänger die
> Signale auch tatsächlich noch so ausgibt, wie man's erwartet - bei
> welchen mit Prozessor kann's auch anders sein).

Gut, das geht nicht bei allen Empfängern. Einige Empfänger haben dieses
Signal aber an der Stromversorgungsbuchse anliegen. Man kann aber auch
die einzelnen Kanäle mittels RC-Differenziergliedern und ODER-IC
zusammenfassen, so dass Nadelimpulse im Kanalimpulsabstand entstehen,
die dann per ICP ausgewertet werden. Wer sich Anlagen mit Prozessor
kauft, muss natürlich damit rechnen, dass sie nicht mehr der bisher
üblichen Norm entsprechen und dass er sie nicht (so leicht) für andere
Zwecke missbrauchen kann.

Mir ging es mit meinem Beitrag aber nur darum, zu zeigen, dass man
Servoimpulse (auch viele davon) recht effizient in Timer-Interrupts
erzeugen kann und nicht auf Warteschleifen im Hauptprogramm angewiesen
ist.

...

von Rolf Magnus (Gast)


Lesenswert?

>> Wenn ich dazu aber den Input-Capture-Interrupt verwende, kann der
>> wieder die Output-Compare-Interrupts verzögern und damit wieder
>> Jitter auslösen.
>
> Diese paar Takte dürften den Kohl nicht fett machen.

Naja, der Sprung in den Interrupt-Vektor beim Auftreten eines
Interrupts braucht schon mal 5 Taktzyklen. Falls gerade ein Befehl
ausgefuehrt wird, der mehrere Taktzyklen braucht, wird der zuerst
zuende abgearbeitet. Bei einem call oder ret waeren das je nach
Controller (Flash kleiner oder groesser als 64k) 4 oder 5 Taktzyklen.
Im Unguenstigsten Fall (Interrupt nach dem ersten Taktzyklus eines
call) kommen also nochmal 4 dazu. Im Interrupt-Vektor steht dann ein
rjmp, der nochmal 2 Taktzyklen braucht. Am Ende der Interrupt-Routine
kommt ein reti dazu mit 5 Taktzyklen. Insgesamt haben wir damit bis zu
16 Taktzyklen, ohne ueberhaupt irgendwas gemacht zu haben.

> Es ist ja nur die Differenz zum Timerstand des letzten
> ICP-Interrupts zu bilden und zu sichern (SRAM über Pointer),

Dazu braucht man Register, die vorher gesichert werden muessen und
nachher wieder zurueckgeholt. Pro Register 4 Taktzyklen. Zum Differenz
bilden muss man noch das SREG sichern und wiederherstellen, macht 6
Taktzyklen.

Selbst, wenn man sehr minimalistisch im Interrupt arbetitet, ist man
ruckzuck bei 30 Taktzyklen, was schon fast vier Mikrosekunden sind. Um
soviel kann sich dann die OCR-Interrupt-Routine und damit die
Pulsausgabe verzoegern. Man koennte hoechstens die Interrupts in der
Input-Capture-Routine gleich am Anfang wieder freischalten, um das zu
minimieren. Das koennte aber zu Stackueberlaeufen fuehren, wenn am
Eingang mal nur Rauschen ankommt.

> sowie der neue Timestamp zu sichern (Register).

ok, das geht in nur einem Taktzyklus.

> Es ist nichtmal eine Flankenumschaltung vorzunehmen, da ja
> der Impulsabstand relevant ist und daher immer auf dieselbe Flanke
> getriggert werden kann.

Relevant ist die Differenz zwischen steigender und fallender Flanke.

> Das Aufarbeiten der Werte geschieht dann in der Mainloop.

Dazu muss man aber zumindest irgenwdo mitzaehlen, welcher Impuls zu
welchem Kanal gehoert. Eine Sychronisation braucht man auch, um
sicherzustellen, dass nicht mal versehentlich ein Impuls
verlorgengegangen ist.

> Einige Empfänger haben dieses Signal aber an der
> Stromversorgungsbuchse anliegen.

Hmm, das wusste ich nicht. Allerdings hat von denen, die ich hier habe,
kaum einer eine solche Buchse. Die Stromversorgung geschieht ueber einen
der Servoausgaenge.

> Mir ging es mit meinem Beitrag aber nur darum, zu zeigen, dass man
> Servoimpulse (auch viele davon) recht effizient in
> Timer-Interrupts erzeugen kann und nicht auf Warteschleifen im
> Hauptprogramm angewiesen ist.

Ja klar, das geht sicherlich auch prima. Nur will ich mir halt einen
Servomischer bauen, und dazu muss man eben auch parallel zum Ausgeben
noch einlesen.

von Rolf Magnus (Gast)


Lesenswert?

> Selbst, wenn man sehr minimalistisch im Interrupt arbetitet, ist
> man ruckzuck bei 30 Taktzyklen, was

... bei einem Takt von 8 Mhz ...

> schon fast vier Mikrosekunden sind.

von Hannes L. (hannes)


Lesenswert?

> Nur will ich mir halt einen
> Servomischer bauen, und dazu muss man eben auch parallel zum
> Ausgeben noch einlesen.

Sorry, aber ich vermute, dass dieses Vorhaben ohne Verwendung von
Interrupts schwieriger zu realisieren ist und sicherlich auch mehr
Jitter aufweist.

...

von Der inoffizielle WM-Rahul (Gast)


Lesenswert?

Da werde ich meine Idee eines Servo-Mischers wohl doch mal realisieren
müssen...
Mal sehen, ob mein futaba-Empfänger auch die Signale am
Batterie-Anschluß "preisgibt".
Bis jetzt kam es bei meinen Servo-Anwendungen noch nie zu einem Jitter
- liegt vermutlich daran, dass ich von Anfang an mit Interrupts
gearbeitet habe, und den neuen Wert für die Servo-Ausgabe erst nach der
Ausgabe des momentanen Telegramms aktualisiert habe.

> schon fast vier Mikrosekunden sind.
Das klingt fast nach "Eins Punkt Einundzwanzig Gigawatt!"...
Wie hoch soll denn die Auflösung sein?
4 Mikrosekunden liegen vermutlich unter der Auflösung des
Servo...(Unbewiesene Behauptung meinerseits)

@Daniel:

Für die Verwendung der seriellen Schnittstelle in Verbindung mit einem
PC bieten sich Baudraten-kompatible Frequenzen an; 3,686MHz gehört
dazu.
Hast du schon mal die Übertragungsfunktion alleine zum Laufen
bekommen?
Ich baue meine Programme meist modular auf, so dass ich z.B. einen
Block mit der Servo-Impuls-Erzeugung und einen Block mit der
UART-Kommuniktation habe. Wenn beides einzeln funktioniert, sollte es
in der Regel auch zusammen arbeiten...

von Fred (Gast)


Lesenswert?

Hi,

wie wäre es denn, alle Impulsausgänge der jeweiligen Kanäle über
jeweils eine Diode zusammenzufassen? Das müßte doch das komplette
Kanal-Impulsdiagramm ergeben, oder?
Gruß

Fred

von Der inoffizielle WM-Rahul (Gast)


Lesenswert?

Das würde auch gehen.
Wenn man aber das Signal vor dem Ausgangsdecoder (CD4017 oder so bei
den meisten älteren Empfängern) bekommt, kann man sich die Dioden und
das Zusammenfassen sparen.
Ich verfolge noch einen anderen Ansatz, und werde berichten, wenn es
funktioniert.

von Rolf Magnus (Gast)


Lesenswert?

@HanneS

> Sorry, aber ich vermute, dass dieses Vorhaben ohne Verwendung von
> Interrupts schwieriger zu realisieren ist und sicherlich auch mehr
> Jitter aufweist.

Vielleicht hat man eine Chance, wenn man ausgagsseitig mit Interrupts
arbeitet und eingangsseitig nicht, denn dann werden die OC-Interrupts
nicht mehr durch andere verzoegert und man hat zumindest ausgangsseitig
den Jitter soweit wie moeglich minimiert.
Das Eingangssignal kann man dan noch nachbearbeiten (z.B. filtern). So
richtig gefallen will mir das aber auch nicht.

>> schon fast vier Mikrosekunden sind.
> Das klingt fast nach "Eins Punkt Einundzwanzig Gigawatt!"...
> Wie hoch soll denn die Auflösung sein?
> 4 Mikrosekunden liegen vermutlich unter der Auflösung des
> Servo...(Unbewiesene Behauptung meinerseits)

Vermutlich eher nicht. Analogservos haben keine Aufloesung in dem Sinne
und Digitalservos haben meines Wissens zwischen 1024 und 4096 Schritten,
was deutlich kleinere Schritte als als 4 Mikrosekunden sind. Ausserdem
verdoppelt sich der Jitter noch, denn es kann ja sowohl die steigende
Flanke verzoegert werden (Puls 4 Mikrosekunden zu kurz) als auch die
fallende (Puls 4 Mikrosekunden zu lang). Dann ist der Jitter immerhin
schon etwa 1/125 des Gesamtwegs des Servos.
Welche Aufloesung ich haben will, ist dabei eigentlich gar nicht so
wichtig, denn der Jitter ist trotzdem da.

von Rolf Magnus (Gast)


Lesenswert?

Ich hatte auch schon daran gedacht, das Problem ganz zu umgehen, indem
ich zwei Prozessoren verwende, von denen einer die Signale  einliest,
die Mischerberechnungen macht und dann per SPI an den zweiten
weitergibt, der dann nur noch die Servopulse generiert.

von Der inoffizielle WM-Rahul (Gast)


Lesenswert?

Noch was zu ICP:
Bei ICP wird der Timer-Wert ins ICP-Register geschrieben und bleibt
dort solange, bis er von einem weiteren ICP-Ereignis (oder manuell)
überschrieben wird.
Somit ist es irrelevant, wann innerhalb der 1-2ms das ICP-Register
abgefragt wird.
Bei 4-5 Servo-Signalen sollte es wirklich keine Probleme geben, wenn
man die Signale der Reihe nach ausgibt.

von Rolf Magnus (Gast)


Lesenswert?

> Somit ist es irrelevant, wann innerhalb der 1-2ms das ICP-Register
> abgefragt wird.

Natuerlich. Aber dennoch muss es dann irgendwann mal abgefragt werden.
Man muss also entweder doch einen Interrupt verwenden oder in einer
Warteschleife auf das ICP-Ereignis warten.

Ich will auch nicht sagen, dass es nicht geht, sondern nur, dass es
nicht so einfach ist, wie man auf den ersten Blick vielleicht denkt.

von Hannes L. (hannes)


Lesenswert?

Rolf, wer hindert dich denn daran, auf den ICP-Interrupt zu verzichten
und stattdessen das ICP-Interrupt-Flag per Software in der Mainloop
abzufragen?

Dann hat dein OC-Interrupt für die Kanalimpulserzeugung (wieviele
Kanäle willst du erzeugen?) immer freie Bahn. In der Mainloop fragst du
dann das ICP-Flag ab und übernimmst den jeweils neuen Wert, prüfst ihn
auf Impulsbreite (dabei nebenbei die Synchronpause erkennen) und legst
ihn über Pointer aufs RAM. Da der Pointer ja mitzählt, kannst du ihn
zur Ende-Kennung nutzen und hast in der Synchronpause genug Zeit, deine
Impulsbreiten durchzuwürfeln und neu zu sortieren (mixen). Danach gehts
wieder in die Abfrageschleife. Sicher geht das auch ohne die
ICP-Hardware (Flag und Register) durch direkte Portabfrage und Auslesen
des Timerstandes, aber mit der ICP-Funktionalität dürften die
eingelesenen Werte genauer (jitterfreier) sein.

Übrigens haben meine Programme zur Auswertung von Servoimpulsen alle
eine Hysterese zur Unterdrückung des Jitters. Ansonsten sind sie aber
sicherlich nicht optimal programmiert, denn es sind Anfängerprojekte.
Sie tun aber ihre Arbeit, weshalb sie nicht nochmal optimiert (dem
heutigen Wissen angepasst) werden.

Bit- & Bytebruch...
...HanneS... (...nur echt mit Pünktchen und ohne WM...)

von Rolf Magnus (Gast)


Lesenswert?

> Rolf, wer hindert dich denn daran, auf den ICP-Interrupt zu
> verzichten und stattdessen das ICP-Interrupt-Flag per Software in
> der Mainloop abzufragen?

Keiner. Das meinte ich doch mit "oder in einer Warteschleife auf das
ICP-Ereignis warten."

Das scheint mir bisher auch die beste Loesung zu sein.

> Dann hat dein OC-Interrupt für die Kanalimpulserzeugung (wieviele
> Kanäle willst du erzeugen?) immer freie Bahn.

Im aktuellen Fall 5 Kanaele, spaeter dann aber auch mehr.

> In der Mainloop fragst du dann das ICP-Flag ab und übernimmst den
> jeweils neuen Wert, prüfst ihn auf Impulsbreite (dabei nebenbei
> die Synchronpause erkennen) und legst ihn über Pointer aufs RAM.

Wie lang ist die Synchronpause denn eigentlich mindestens?

> Sicher geht das auch ohne die ICP-Hardware (Flag und Register)
> durch direkte Portabfrage und Auslesen des Timerstandes, aber mit
> der ICP-Funktionalität dürften die eingelesenen Werte genauer
> (jitterfreier) sein.

Ja, das denke ich auch.

von Hannes L. (hannes)


Lesenswert?

> Wie lang ist die Synchronpause denn eigentlich mindestens?

Eigentlich 20ms minus Summe aller Kanalimpulse.
Vor 30 Jahren, als Kanalimpulserzeugung/Auswertung mit NE555 noch als
Innovation galt, reservierte man mindestens 4...5ms für die
Synchronpause, die ja mittels RC-Glied erkannt werden musste.

Heute, im digitalen Zeitalter, ist das einfacher, da kann man zählen,
ist der Impulsabstand größer als der maximal erlaubte Kanalimpuls, dann
war es halt die Synchronpause. Zusätzlich prüfe ich meist auch noch den
Telegrammabstand...

...

von Rolf Magnus (Gast)


Lesenswert?

>> Wie lang ist die Synchronpause denn eigentlich mindestens?
>
> Eigentlich 20ms minus Summe aller Kanalimpulse.

Aber zwischen den Kanaelen muss doch auch noch eine Pause sein.
Wie sieht das Impulstelegramm denn nun eigentlich exakt aus? Ich hab
das so verstanden, dass zwischen zwei Impulsen immer eine einigermassen
konstant lange Pause ist. Am Ende ergibt sich eine Synchronisationspause
mit variabler Laenge (je nach Summe der Impulslaengen).

von Hannes L. (hannes)


Lesenswert?

Das Impulstelegramm für den Sender besteht aus Impulsen von 0,5ms
Breite, deren Abstand die Kanalimpulsinformation enthalten.
Beim Decodieren (vor 30 Jahren per Schieberegister) wird immer die
gleiche Flanke (eigentlich egal ob steigend oder fallend) genutzt um
den aktuellen Kanalimpuls zu deaktivieren und den nächsten Kanalimpuls
zu aktivieren. Zwischen den einzelnen (decodierten) Kanalimpulsen ist
also keine Pause.

Die Pause ist nur im Mixed-Signal vorhanden, da dort die Impulse nur
0,5ms breit sind, die Information steckt ja nicht in der Impulsbreite,
sondern im Flankenabstand.

Deine Frage suggeriert mir aber, dass du dir den oben angegebenen Link
nicht oder nicht richtig angeschaut hast. Dort wird nämlich das gesamte
Impulstelegramm und die einzelnen Servoimpulse generiert.

8-)

...

von Rolf Magnus (Gast)


Lesenswert?

> Beim Decodieren (vor 30 Jahren per Schieberegister)

Ich habe einen ca 3 Jahre alten Empfaenger, der das immer noch so
macht.

> wird immer die gleiche Flanke (eigentlich egal ob steigend oder
> fallend) genutzt um den aktuellen Kanalimpuls zu deaktivieren und
> den nächsten Kanalimpuls zu aktivieren. Zwischen den einzelnen
> (decodierten) Kanalimpulsen ist also keine Pause.

Ach so. Ich meine, irgendwo mal eine Beschreibung gesehen zu haben,
nach der das anders aussieht.
Das bedeutet dann auch, dass man nicht so einfach alle
Empfaengerausgaenge verODERn kann, um wieder das Impulstelegramm zu
erhalten. Man muss schon das Original-Impulstelegramm nehmen oder auf
kompliziertere Art wieder rekonstruieren, wenn man am Mikrocontroller
mit nur einem Eingang (eben ICP in dem Fall) arbeiten will.

> Die Pause ist nur im Mixed-Signal vorhanden, da dort die Impulse
> nur 0,5ms breit sind, die Information steckt ja nicht in der
> Impulsbreite, sondern im Flankenabstand.

Das war mir nicht klar.

> Deine Frage suggeriert mir aber, dass du dir den oben angegebenen
> Link nicht oder nicht richtig angeschaut hast.

"nicht richtig" trifft es wohl.

Danke jedenfalls. das hat mir doch einiges an Klarheit verschafft.

von Der inoffizielle WM-Rahul (Gast)


Lesenswert?

Kann es sein, dass kein Modellbau-Empfänger-Hersteller alle
Informationen zu seinen Empfängern rausgibt? Ich finde keine Angaben
zum "kanalstream-Ausgang" meines Robbe-Empfängers. Dafür schädige ich
die Jungs aber dadurch, dass ich die Signale der Multi-Switch und
Multi-Prop-Module auswerten kann - Keine >60Euro für son Decoder mehr
ausgeben...

von Rolf Magnus (Gast)


Lesenswert?

> Ich finde keine Angaben zum "kanalstream-Ausgang" meines
> Robbe-Empfängers.

Außer der Tatsache, daß es ihn gibt, dürfte es auch nicht viel dazu zu
sagen geben.

Mittlerweile tendiere ich doch zu der Zweiprozessorlösung. So ein
Tiny2313 kostet nicht die Welt, und die Timingprobleme sind weg.
Außerdem kann ich einfach alle Kanäle einzeln aus dem Empfänger lesen
und muß ihn daher nicht modifizieren. Ich glaube, keiner meiner
Empfänger führt das Impulstelegramm schon ab Werk nach außen.
Ich hab eigentlich keine Lust, immer erst am Empfänger rumbasteln zu
müssen, um mal den Mischer dran anschließen zu können.

von Simon K. (simon) Benutzerseite


Lesenswert?

Übrigens: Selbst die heutigen Modellbauempfänger (die, die "nix"
kosten) funktionieren noch genau so.

Ich wollte meinen mal demnächst mal mit meinem Oszilloskop nach diesem
"Impulstelegramm" untersuchen.

von Der inoffizielle WM-Rahul (Gast)


Lesenswert?

>Außer der Tatsache, daß es ihn gibt, dürfte es auch nicht viel dazu >zu
sagen geben.

Gibt es ihn wirklich? Wenn ja, wo? Und wie kann ich ihn belasten?
Früher gab es ein DSC-Kabel (oder so ähnlich), das eine direkte
Verbindung zwischen Sender und Empfänger herstellte, ohne dass man
funken musste (HF-Modul musste ausgebaut werden).
Hat das was miteinander zu tun? Gibt's das noch?

von Simon K. (simon) Benutzerseite


Angehängte Dateien:

Lesenswert?

Ok. Hier die Auflösung:

Auf dem Bild sieht man einen 40MHz Empfänger von SANWA (SRC-2322RS).
Auf der Rückseite ist ein SO14 IC zu sehen. Die Bezeichnung ist leider
vom Hersteller heruntergeschliffen worden. Die Pin1 Markierung war aber
noch zu sehen.

-Pins mit ? haben irgndein komisches Signal ausgegeben, dass ich auf
die Schnelle nicht zuordnen konnte.
-Pins ohne Namen haben Low-Pegel geliefert (Bei Pin 14 hab ich einfach
mal GND drangeschrieben, weils ja meistens so ist)
-IT (=Impulstelegramm) ist zweimal wiederzufinden. Ich vermute, dass
das "IT" auf der rechten Seite (vom Betrachter aus gesehen) ein Carry
Ausgang ist. Hier ist, soweit ich das sehen kann, auch nichts
angeschlossen.

von Simon K. (simon) Benutzerseite


Angehängte Dateien:

Lesenswert?

Oszillogramm des Impulstelegramms (sollte ja nix spannendes sein), wenn
alle Regler in Neutralstellung stehen.

von Simon K. (simon) Benutzerseite


Angehängte Dateien:

Lesenswert?

Irgndein Kanal, nicht invertiert. Neutralstellung

(PS: Am Chip werden zwei der drei Kanäle invertiert, und nicht
invertiert herausgeführt. Merkwürdig ist, dass Kanal 1 die erste Flanke
des Impulstelegramms ist und Kanal 2, die dritte Flanke des ITs. Die
zweite Flanke ist immer in Neutralstellung: ton = 1,5ms)

von Simon K. (simon) Benutzerseite


Angehängte Dateien:

Lesenswert?

Und invertiert. (ist ja auch nicht mehr spannend jetzt)

von Simon K. (simon) Benutzerseite


Lesenswert?

Und dazu kommt noch das hier:

(Versehentlich falsch gepostet)

http://www.mikrocontroller.net/forum/read-1-376637.html?reload=yes#376941

Ist einfach zu warm hier im Zimmer (33°C). Ich glaub ich geh mal wo
anders hin.

von Rolf Magnus (Gast)


Lesenswert?

> Gibt es ihn wirklich? Wenn ja, wo? Und wie kann ich ihn belasten?

Sorry, hatte mich unglücklih ausgedrückt. Ich meinte, falls es ihn
gibt, ist außer dieser Tatsache nicht viel zu sagen.

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.