Forum: Mikrocontroller und Digitale Elektronik Atmega8 ansteuern eines digital Servos


von Patrick89 (Gast)


Lesenswert?

Hallo zusammen,

mein Ziel ist es das ich mit dem MC ein Servo ansteuern kann.
I h habe nur dazu den Artikel zum Servo angeschaut hier in Board.

http://www.mikrocontroller.net/articles/Modellbauservo_Ansteuerung

Ein paar fragen sind zwar noch offen, aber die antworten dazu kann ich 
mir selber heraussuchen.

Gehe ich richtig der Annahme das dieses Tut nur für analoge Servos 
ist???
Wenn ja, wie Steuer ich denn dann ein digitales Servo an???

Was bedeutet denn das standard Band von 1520 Mikrosekunden???

Ich habe halt noch ein paar davon:
http://www.freakware.de/p/ds610-digital-servo-bulk-version-align-hsd61001-bulk-a55664.htm

Hoffe Uhr könnt mir weiterhelfen!!!

Beste Grüße
Patrick

von david (Gast)


Lesenswert?

Patrick89 schrieb:
> Wenn ja, wie Steuer ich denn dann ein digitales Servo an???

Im allgemeinen werden digitale Servos genau so wie ein analoges 
Modellbauservo gesteuert. Falls du was Spezielles wissen möchtest oder 
Probleme hast, Modellbezeichnung des Servos angeben oder gleich 
verlinken.

von Wolfgang (Gast)


Lesenswert?

Patrick89 schrieb:
> Was bedeutet denn das standard Band von 1520 Mikrosekunden???

Das ist die Bandmitte
https://de.wikipedia.org/wiki/Servo#Ansteuerung

von Bussard (Gast)


Lesenswert?

Hallo,

Hier am Ende der Diskussion mit Bildern
Beitrag "PPM-Signal erklärung"

von Frank E. (Firma: Q3) (qualidat)


Lesenswert?

Der Vorteil digitaler Servos ist (aus eigener Erfahrung), dass sie ihre 
Position auch halten, wenn die PWM-Signale nicht regelmäßig kommen, weil 
sie ihre Position offenbar speichern.

Ich habe ein "pick by laserponter"- Projekt mit zwei Digitalservos 
gemacht, die wunderbar funktionieren, auch wenn sie im Arduino-Loop ihre 
Positionsdaten nur hin und wieder mal aus einer Funktion mit variablem 
ms-delay bekommen ...

Zusammengefasst: Das Impulpaket in sich muss nat. stimmen, aber es darf 
gerne auch längere Zeit ausfallen.

von Karl H. (kbuchegg)


Lesenswert?

Patrick89 schrieb:

> Gehe ich richtig der Annahme das dieses Tut nur für analoge Servos
> ist???
> Wenn ja, wie Steuer ich denn dann ein digitales Servo an???

Genau gleich.
Schliesslich muss man ja ein digitales Servo anstelle eines analogen 
Servos in jeder bereits verbauten Fernsteuerungsanlage im 
Modellbaubereich einfach austauschen können. Kein Hersteller kann es 
sich leisten, ausschliesslich digitale Servos auf den Markt zu bringen, 
für die man die komplette Empfangsanlage austauschen müsste.

Die Begriffe 'analog' bzw. 'digital' beziehen sich auf die interne 
Regelung des Servos. Die Ansteuerung ist identisch.

> Was bedeutet denn das standard Band von 1520 Mikrosekunden
1520 Mikrosekunden sind ~ 1.5 Millisekunden. Na, klingelts?

: Bearbeitet durch User
von Andreas R. (daybyter)


Lesenswert?

Ein Digitalservo kann oft mehr Stellimpulse pro Sekunde verarbeiten als 
ein Analogservo. Manche Digitalservo funktionieren auch nicht an 
Analogempfängern, weil sie einen anderen Mittenimpuls haben. Futaba BLS 
251 z.B. ist so eines.

von Ulli-B (Gast)


Lesenswert?

Frank E. schrieb:
> Der Vorteil digitaler Servos ist (aus eigener Erfahrung), dass sie
> ihre
> Position auch halten, wenn die PWM-Signale nicht regelmäßig kommen, weil
> sie ihre Position offenbar speichern.

Und der Nachteil ist, dass der Servo mit aller Kraft versucht die ihm 
zugeteilte Position zu erreichen. Ist dies mechanisch nicht möglich, so 
drückt der Servo bis zur Selbstzerstörung (Überhitzung).
Also aufpassen dass nichts blockiert!

Die Impulspause darf sowohl länger als auch kürzer als bei einem 
Analogservo sein.

Ulli-B

von Frickelfritze (Gast)


Lesenswert?

Karl H. schrieb:
> 1520 Mikrosekunden sind ~ 1.5 Millisekunden. Na, klingelts?

Dein Taschenrechner ist kaputt.

von Karl H. (kbuchegg)


Lesenswert?

Frickelfritze schrieb:
> Karl H. schrieb:
>> 1520 Mikrosekunden sind ~ 1.5 Millisekunden. Na, klingelts?
>
> Dein Taschenrechner ist kaputt.

Sehe ich nicht ganz so. 1520 dividiert durch Tausend (Komme um 3 Stellen 
nach links verschieben) ergibt ca. 1.5
(oder störst du dich daran, dass ich grundsätzlich einen Kommapunkt 
schreibe, wie es in Programmiersprachen üblich ist?)

von Patrick89 (Gast)


Lesenswert?

Vielen Dank für eure Antworten. Ich denke das ihr mir damit gut weiter 
geholfen habt!!!

Da wir ja gerade bei den Servos sind, hätte ich zusätzlich noch ein paar 
Fragen.

Mein Projekt soll eine Flugsteuerung werden.

Wenn ich mich nicht verzählt habe, dann brauche 5 Eingänge und 9 
Ausgänge.

Ich habe einen 6 Kanal Empfänger. Diesen wurde ich gerne an einen MC 
anschließen. Der Empfänger wird vermutlich auch nur ein Servo signal 
senden.
Meine Vermutung ist nun, das ich, um es korrekt zu machen, mit 
Interrupts arbeiten muss. Richtig???

Ich glaube ich habe aber nur 2-3 Eingänge die mit Interrupts arbeiten 
können. Richtig???

Sprich wenn das so ist, dann kann keinen atmega8 nehmen oder einen 32er.

Habt ihr eine Idee wie ich nein Problem lösen kann???

von Karl H. (kbuchegg)


Lesenswert?

Patrick89 schrieb:

> Habt ihr eine Idee wie ich nein Problem lösen kann???

Sieh zu, dass du an das Summensignal deines Empfängers ran kommst oder 
besorg dir einen, der das frei Haus liefert.
Im Summensignal sind die 'Pulse' aller Servos enthalten.

von Patrick89 (Gast)


Lesenswert?

Und wenn das nicht möglich ist???

von Karl H. (kbuchegg)


Lesenswert?

Patrick89 schrieb:
> Und wenn das nicht möglich ist???

Dann hast du wohl ein Problem, so wie das aussieht.

von Frickelfritze (Gast)


Lesenswert?

Patrick89 schrieb:
> Und wenn das nicht möglich ist???

Dann ver-odere mit ein paar Gattern alle Servo Ausgänge des Empfängers
zu einem und speise damit deinen Controller.

von Patrick W (Gast)


Lesenswert?

Summensignal scheint mir dann doch das beste zu sein. Ich werde mal 
schauen ob ich einen Empfaenger auftreiben kann der Spektrum 
unterstuetzt bzw. wo man Spektrum Satelliten anschliessen kann...

von Karl H. (kbuchegg)


Lesenswert?

Frickelfritze schrieb:
> Patrick89 schrieb:
>> Und wenn das nicht möglich ist???
>
> Dann ver-odere mit ein paar Gattern alle Servo Ausgänge des Empfängers
> zu einem und speise damit deinen Controller.
Das kann funktionieren, muss aber nicht.

von Frickelfritze (Gast)


Lesenswert?

Karl H. schrieb:
> Das kann funktionieren, muss aber nicht.

Warum sollte es nicht?

von chris (Gast)


Lesenswert?

Frickelfritze schrieb:
> Warum sollte es nicht?

Ein moderner Empfänger könnte durchaus alle Servosignale gleichzeitig 
erzeugen anstatt nacheinander. Beim VerODERn käme dann nur Müll raus.

von Karl H. (kbuchegg)


Lesenswert?

Frickelfritze schrieb:
> Karl H. schrieb:
>> Das kann funktionieren, muss aber nicht.
>
> Warum sollte es nicht?

Weil gerade bei 2.4Ghz Fernsteuerungen, die auf WLAN Technik beruhen, 
noch lange nicht gesagt ist, dass sie ihre Servopulse tatsächlich 
nacheinander oder überlappend generieren. Gerade im Sinne von einer 
Erhöhung der Pulsrate an die Servos ist davon auszugehen, dass sie genau 
das nicht tun.

: Bearbeitet durch User
von Frickelfritze (Gast)


Lesenswert?

chris schrieb:
> Ein moderner Empfänger könnte durchaus alle Servosignale gleichzeitig
> erzeugen anstatt nacheinander.

Das lässt sich ja relativ leicht feststellen indem man zwei
Sevosignale gleichzeitig mit einem Oszilloskop anschaut
und beurteilt ob sie zeitmultiplex vom Sender kommen (also
nacheinander) oder nicht (also ihre Startflanke gleichzeitig kommt).

von Karl H. (kbuchegg)


Lesenswert?

Im Prinzip: ja
Ich glaube allerdings nicht, dass er ein Oszi hat.

von Patrick W (Gast)


Lesenswert?

Doch ein altes auf dem Dachboden.... aber ob das noch geht ;) Ich gehe 
mal nicht davon aus!

Kann ich denn nicht einfach nur den Satelliten nehmen von Spektrum?

von Patrick W (Gast)


Lesenswert?

Oder mal anders gedacht.

Der Empfaenger gibt mir ja ein Servo Signal aus. Dieses kann mein uC ja 
Auswerten.

Wenn ich jetzt fuer jeden Kanal oder fuer 2 Kanaele einen uC nehme, die 
Daten auswerte diese dann per USART an einen Controller sende, der dann 
meine Servos steuert.

Das waere doch machbar oder???

Dann bliebe nur noch die Frage wie verdrahte ich mehrere uC's so 
miteinander....

von Bussard (Gast)


Lesenswert?

Wenn 6 Kanäle CPPM reichen, sollte der Spectrum R615X oder der Klon 
Orange R615X gehen (hab kein Spectrum).

Gruß

von Patrick W (Gast)


Lesenswert?

Vorerst sollte der reichen, aber nicht auf dauer....

Ich bin zur Zeit dabei mich einzulesen wie man ein Bussystem aufbaut.

von Karl H. (kbuchegg)


Lesenswert?

USART ist keine gute Idee.
Wenn ich genug Pins habe, dann würde ich SPI nehmen.
MISO, MOSI und CLK kommen an jeden Client und für jeden Client wird noch 
eine Select Leitung spendiert. Das macht dann bei 6 Eingängen 9 Pins für 
die Eingangsstufen am zentralen µC.

Achte darauf, dass deine Client-µC über einen Timer mit Input Capture 
verfügen. Sonst kriegst du Ärger beim Ausmessen der Pulse.

Wenn du kein Summensignal auftreiben kannst, dann würde ich hier 
ausnahmsweise zustimmen, auch wenn es meistens keine gute Idee ist, 
mehrere µC einzusetzen, wenn einer alleine auch reichen würde. Aber für 
den einen brauchst du nun mal das Summensignal. Probieren könnte man es, 
ob man es aus den Servoausgängen erzeugen kann.

von Bussard (Gast)


Lesenswert?


von Patrick W (Gast)


Lesenswert?

Und das soll funktionieren mit den paar dioden???

von Karl H. (kbuchegg)


Lesenswert?

Patrick W schrieb:
> Und das soll funktionieren mit den paar dioden???

Es kann funktionieren. Es ist ein wired-OR.
Es hängt alles davon ab, wie dein Empfänger die Servosignale generiert. 
Nacheinander oder parallel zueinander. Bei den alten Fernsteuerungen war 
es nacheinander, weil sich das ganz einfach aus dem PPM Signal ergeben 
hat, das über die Funkstrecke gegangen ist. Aber bei 2.4GHz Anlagen ist 
die Übertragung per Funk völlig anders. Bei alten Fernsteuerungen hat 
der Sender einfach das Funk-PPM Signal auf ein Schieberegister gelegt 
und an den Ausgängen sind die Servo Signale ganz von alleine richtig 
herausgefallen. Bei den GHz Anlagen geht das aber nicht mehr, hier muss 
der Empfänger die Servopulse selbst generieren. Die Frage ist nur: wie 
macht er das? Generiert er sie für n Ausgänge nacheinander oder 
generiert er alle Pulse auf den n Ausgängen parallel. Im ersten Fall 
funktionert die Dioden Lösung immer noch, sofern er eine winzige 
zeitliche Lücke zwischen den Pulsen auf den Leitungen lässt, die reicht 
um für die Input Capture Unit eine Flanke zu erzeugen.

: Bearbeitet durch User
von Bussard (Gast)


Lesenswert?

Karl H. schrieb:
> Es hängt alles davon ab, wie dein Empfänger die Servosignale generiert.
> Nacheinander oder parallel zueinander.

Tja, gute Frage. Bei den Fernsteuerungen aus dem oberen Preissegment und 
Empfängern mit relativ vielen Kanälen wechselt das je nach 
Programmierung, möglichst zeitliche versetzt, um nicht alle Servos 
gleichzeitig anzusteueren und damit die Stromversorgung zum Einknicken 
zu bringen, bei bestimmten Konstellationen gleichzeitig (für große 
Segler mehrere Querruder- oder Wölbklappenservos, bei Motormaschinen/ 
Jets 2 Höhenruderservos, die synchron laufen müssen).

Kann man nur testen oder den Empfänger kennen.

von Ulli-B (Gast)


Lesenswert?

> Im ersten Fall
> funktionert die Dioden Lösung immer noch, sofern er eine winzige
> zeitliche Lücke zwischen den Pulsen auf den Leitungen lässt, die reicht
> um für die Input Capture Unit eine Flanke zu erzeugen.

Bei den "analogen" Empfängern gab es keine Lücke zwischen den einzelnen 
Kanalimpulsen.
Man konnte sich behelfen, indem jeder zweite Kanal verodert wurde. Dann 
entsprach die Lücke der Impulslänge des 2. .. 4. .. usw. Kanals. Das 
Dumme ist nur, dass dies nur für eine ungerade Anzahl von Kanälen 
funktioniert.

Doch einen solchen Empfänger gibt es von Spektrum nicht. Also ist es ein 
digitaler Empfänger. Jetzt gilt es heraus zu finden, ob die die Kanäle 
nacheinander oder gleichzeitig ausgegeben werden.

Ulli-B

von Patrick W (Gast)


Lesenswert?

Da ich leider kein Ozi habe, kann ich nur raten....

Besser gefallen wuerde mir da die Methoe mit TWI.

Ich habe mich auch schon ein bisschen eingelesen.

Klingt erst einmal recht simpel diese Loesung. Ich muss mich natuerlich 
noch genauer einlesen aber ich denke damit sollte es dann gehen...

Eine weitere Sache ist, das ich verschiedene Empfaenger anschliessen 
koennen will...

Ein paar freunde hatten auch schon interesse gezeigt. Aber wenn ich dann 
immer nur auf einen Empfaenger einschraenke, dann ist das nicht so toll 
;)

von Karl H. (kbuchegg)


Lesenswert?

Patrick W schrieb:
> Da ich leider kein Ozi habe, kann ich nur raten....
>
> Besser gefallen wuerde mir da die Methoe mit TWI.

TWI ist Overkill.
Du stellst dir das jetzt alles ein bischen zu einfach vor. Du wärst 
nicht der erste, der draufkommt, dass die Inter-µC Kommunikation dann 
doch nicht so einfach ist, wie ursprünglich gedacht.

Was brauchst du den wirklich von deinen Clients. Du willst die 
Pulslängen wissen. Dazu brauchst du keine 30 verschiedene Kommandos und 
aufwändiges Protokoll, sonder der Client soll seinen gemessenen Wert 
rausrücken. Und das so einfach und schnell wie möglich.
Client selektieren
1. Byte holen -> High Byte
2. Byte holen -> Low Byte
Client deselektieren

Einfacher und schneller als mit SPI und ein paar Select-Leitung geht das 
nicht.

: Bearbeitet durch User
von Norbert S. (norberts)


Lesenswert?

Hi,

nee Leute, ich glaube hier haben noch nicht so viele damit gearbeitet.
Das Summensignal ist schön aber wenn man nicht rankommt bringt es einem 
nichts. Das Summensignal hat übrigens normalerweise eine Pause von 300µs 
und das Servosignal wird von Flanke zu Flanke gezählt.
Also neutral ist 300µs Pause und 1200µs high.
Das machen die meisten Funken immer noch intern, wenn sie Modulbasiert 
sind also das Summensignal ist immer noch der Standard zwischen dem µC 
des Senders und dem HF-Teil. Da allerdings invertiert.
Aus dem Empfänger (von 40MHz Multiplex, Simprop bis hin zu aktuellen 
2,4GHz Chinesen) kommen dann die Servosignale nacheinander und in der 
richtigen Reihenfolge heraus.
Hier habe ich gerade einen FrSKY Empfänger, der macht zwischen den 
Signalen sogar noch netterweise 60µs Pause. So ein Frame kommt alle 
17,5ms.
Da müsste man nichtmal Ints bemühen und könnte pollen. Verarbeitung dann 
nach dem letzten Signal. Ich will gerade sowas ähnliches machen und ich 
glaube damit mache ich mich einfach vom Acker.
Das geht natürlich auch eleganter mit PCINTs aber eben nicht mit einem 
Mega8 oder 16, die haben das noch nicht.
Die Krücke Verodern würde mit der 60µs Pause auch gehen, wäre aber ja 
gar nicht nötig.
-----
Schleife:
Warten bis Kanal 1 low (falls schon angefangen)
Warten bis Kanal 1 high
Timer nullen
Warten bis Kanal 1 low
Kanal_1_Zeit = Timer

Warten bis Kanal 2 high
Timer nullen
Warten bis Kanal 2 low
Kanal_2_Zeit = Timer
.
.
.
Warten bis Kanal n low
Kanal_n_Zeit = Timer

Dann Werte verhackstücken und wieder nacheinander ausgeben, ähnlich wie 
oben.
Das ist grausiger Stil und man lässt bei mehr als 3-4 Kanälen jeden 
zweiten Frame aus. Die Servos interessiert das aber nicht und wenn man 
das per PWM wieder ausgeben will, also mehr in Richtung Echtzeit, hat 
man nicht zuviele Ressourcen oder fängt sich Probleme mit 
Überschneidungen der Signale ein, wenn man die Signale per OCR manuell 
ausgeben will.
Bei 8 Kanälen ist der Frame einfach irgendwann voll.
Als Fehlerkompensation kann man bei jedem Kanal noch aus der Warterei 
aussteigen wenn die Zeit nicht mehr realistisch ist.

Für mich geht das jedenfalls wunderbar so wie beschrieben, da ich mit 
der Reaktionszeit überhaupt kein Problem habe und genau weiß, was der 
Empfänger macht.
Bei bestimmten Anwendungen kann so ein Delay von 50-100ms aber schon 
eine Rolle spielen.
Bei Heckservos für Helis oder der Lenkung für Glattbahner ist es schon 
ein Unterschied, ob das Servo schnell oder superschnell ist und das 
liegt in dieser Grössenordnung.
Flugregelung geht in diese Richtung aber bei der Fragestellung mache ich 
mir da wenig Sorgen, das wird sowieso nichts.

Schön, daß wir mal drüber gesprochen haben.
Ich wollte das eigentlich jetzt mit den PCINTs machen und hatte mich 
schon auf das herumgeprokel mit den Registern "gefreut" aber nun mache 
ich das so banal und schmutzig per Polling und warten.
Unelegant aber das verstehe ich auch in ein paar Monaten wieder auf 
Anhieb und für die meisten Zwecke reicht es locker.

Gruß,
Norbert

von Patrick W (Gast)


Lesenswert?

Norbert S. schrieb:
> Flugregelung geht in diese Richtung aber bei der Fragestellung mache ich
> mir da wenig Sorgen, das wird sowieso nichts.

Was meinst du damit???


Ich habe mir jetzt SPI genauer angeschaut. Ich denke das ich das 
verwenden werde.

So als grobe Zusammenfassung was meine verstanden zu haben:

Master MOSI auf die Slaves MOSI

Master MISO auf die Slaves MISO

Master SCK auf die Slaves SCK

Master irgend ein Port auf die Slaves SS

Im Master und in den Slaves die ISR aktivieren und die entsprechenden 
Routinen dafuer schreiben.

Der Master selektiert dann einen Slave indem er Portx (der mit dem Port 
SS vom Slave verbunden ist) von High auf Low zieht.

Danach sendet der Master ein Byte an den Slave. Der Slave arbeitet dann 
seine ISR ab und sendet noch in dieser Methode ein Byte an den Master.

Danach kommt dann der naechste Slave an die Reihe.

Was passiert eigentlich, wenn sich ein Slave mal aufhaengt oder einfach 
laenger braucht als angenommen?
Kann man die Transaktion dann auch vorzeitig beenden?

von Patrick W (Gast)


Lesenswert?

Sorry hatte vergessen zu schreiben, das nachdem der Slave das Byte an 
den Master gesendet hat, springt der Master in seine ISR und macht da 
was.

Danach kann dann ein anderer Slave bedient werden.

von Norbert S. (norberts)


Lesenswert?

Patrick W schrieb:
> Norbert S. schrieb:
>> Flugregelung geht in diese Richtung aber bei der Fragestellung mache ich
>> mir da wenig Sorgen, das wird sowieso nichts.
>
> Was meinst du damit???

Hi,

Damit meine ich, daß Du eine Flugregelung wenn es z.B. um einen 
Multicopter geht, vermutlich nicht hinbekommen wirst.
Das ist nicht böse gemeint aber das lese ich an der Fragestellung ab.

Patrick W schrieb:
> Was passiert eigentlich, wenn sich ein Slave mal aufhaengt oder einfach
> laenger braucht als angenommen?
> Kann man die Transaktion dann auch vorzeitig beenden?

Natürlich kann man, muß man sogar.
Daß Dir der Begriff "Timeout" scheinbar nicht geläufig ist, ist so ein 
Indiz.
Das ist simples Handwerkszeug um sowas auf die Beine zu stellen.
Wenn Du Dir das jetzt erst noch alles erarbeiten musst, ist eine 
"Flugsteuerung" noch in ganz weiter Ferne.

Wie gesagt, ist nicht böse gemeint. Ich hab mich auch schon oft mit 
Projekten übernommen aber auf dem Weg dahin eine Menge gelernt.
Auch das kann Spaß machen und ein Erfolgserlebnis sein.

Gruß,
Norbert

von Patrick W (Gast)


Lesenswert?

Nun ich bin mir sicher das ich mich nicht uebernehmen werde.
Und selbst wenn doch, ich stelle hier nur ganz normale Fragen auf die 
ich eine Antwort erhalten moechte.

Nicht boese gemeint ist schoen und gut, nur leider liegt es nur im 
Ermessen desjenigen der gemeint ist ;)

Ich steh da drueber, weil ich solche Aussagen schon des oefteren gehoert 
habe und immer mit dem gleichen Resultat... Am Ende habe ich es doch 
geschafft ;)


Nun gut ich moechte an dieser Stelle jeden bitten nicht mehr mit solchen 
Aussagen zu kommen. Auf diese kann ich verzichten und sie helfen auch 
keinen Weiter.... Sorry Norbert, ist halt nicht boese gemeint ;)

von Norbert S. (norberts)


Lesenswert?

Hi,

Vielleicht schreibst Du mal, was Du denn da bauen willst.
Mehrere µC hernehmen und sich dafür die Kommunikation antun ist 
jedenfalls erstmal nicht das Mittel der Wahl, nur weil man die normalen 
Mittel nicht beherrscht.

Und natürlich bist Du Dir sicher, daß Du Dich nicht übernimmst. Das ist 
man immer solange, bis man es selber merkt (oder auch nicht).
Lass Dich nicht aufhalten.

Die Servogeschichte per SPI oder was auch immer auf mehrere Controller 
zu verteilen ist jedenfalls eine üble Krücke, die mehr Probleme schafft 
als sie löst.

Was spräche denn dagegen, es so banal zu machen, wie ich vorgeschlagen 
habe?

Und nochwas: Wenn ich hier schon lange Texte schreibe, dann nehme ich 
mir auch heraus, Deine Ansätze zu kritisieren.
Oft ist der Ansatz schon Quatsch und das muß man sagen dürfen.
Du hast ja leider nicht erzählt, was Du da vor hast.
Wenn Du aber keine Kritik hören willt und nur noch Tipps, wie Du die 
unsinnige Kommunikation hingefrickelt bekommst, dann kannst Du Deine 
Zeit gerne alleine in diesen Schwachsinn versenken.
Ich wundere mich, daß ich der Erste bin, der hier mal etwas deutlicher 
wird.

Gruß,
Norbert

von Wolfgang (Gast)


Lesenswert?

Patrick W schrieb:
> Da ich leider kein Ozi habe, kann ich nur raten....

Ein kleine Logikanalysator, wie es ihn bei Ebay schon für 7€ gibt, würde 
völlig reichen. (z.B. 141803548716)

von Patrick W (Gast)


Lesenswert?

Nun ich will einen Flugkontroller entwickeln. Dieser Controller hat 
mehrere Modis in denen er bspw. die Motoren und die Winkel steuert in 
der die Motoren zeigen. Ein anderer Modi waere eine ganz normal Flaeche.

Das jetzt genau zu beschreiben wie was wann und wo funktioniert waere zu 
viel.

Gut, daher habe ich 5 Kanaele die von dem Empfaenger kommen. Diese 
Kanaele sind dann auf entsprechende uC's verteilt die mit das Signal 
holen, zwischenspeichern und an den Master weiterleiten wenn diese dazu 
aufgefordert werden.

Die Aufgabe des Masters ist einfach die Servos und die Motoren zu 
steuern und zwar genau so wie ich es brauche.

Es ist aber nicht nur die Weiterleitung der Servosignals etc. es werden 
auch noch einige Entscheidungen getroffen die fuer das Flugverhalten 
wichtig sind.

Diese sind aber hier nicht relevant.

Warum will es nicht so wie du machen? Ganz einfach, es klingt fuer mich 
verwirrend. Das einzige was ich noch behalten habe ist, "Die Kruecke 
verdrehen" glaube ich.

Ich moechte das so haben, das ich eigentlich jeden stinknormalen 
Empfaenger anschliessen kann und es geht.

Deswegen will ich mir die ganzen Servosignale holen, diese dann zu 
meinem eigentlichen Flightcontroller senden, dieser wertet diese Daten 
dann aus und macht was immer er damit machen soll...

Die Sachen die ich mache, will ich immer so machen, das Teile der 
breiten Masse sie verwenden koennen. Erst wenn ich das geschafft habe, 
bin zih zu frieden.

Ich sehe jetzt auch keinen Grund warum das nicht klappen sollte mit den 
mehreren uC's.

von Norbert S. (norberts)


Lesenswert?

Hi,

Wenn meine simple Methode (primitiver geht es nicht) für Dich schon 
verwirrend ist dann viel Spaß.

Berichte mal wie das dann fliegt.

Gruß,
Norbert

von Patrick W (Gast)


Lesenswert?

Ich vermute einfach mal das du einen schlechten Tag gehabt hast heute...

Wie gesagt auf solche Antworten kann ich gerne verzichten!!!!

Ich moechte dich deswegen auch bitten mir nicht mehr zu "helfen"...

Bitte hab Verstaendnis dafuer. Danke.

von Forist (Gast)


Lesenswert?

Patrick W schrieb:
> Danke.

Wenn sich die Dankbarkeit dermaßen in Grenzen hält, kannst du dir diese 
Art von "Danke" auch gerne sparen.

von Patrick W (Gast)


Lesenswert?

Koennte man sich vielleicht mal wieder auf das Thema konzentrieren???

Zusammenfassung:

- Summensignal ist erstmal aussen vor. Spaeter vielleicht als zusatz.
- SPI klingt fuer mich jetzt erstmal am besten da es sich "recht 
einfach"
  entwickeln laesst. Zudem gefaellt mir die Logik ganz gut. Ein Master,
  mehrere Slaves. Die Slaves capturen die Signale vom Empfaenger und 
geben
  diese dann an den Master weiter der dann entscheidet was er mit den
  Signalen anfangen soll...

Ich werde erstmal diesen Ansatz weiter verfolgen.

von Wolfgang (Gast)


Lesenswert?

Patrick W schrieb:
> Die Slaves capturen die Signale vom Empfaenger und
> geben diese dann an den Master weiter der dann entscheidet was er mit den
> Signalen anfangen soll...

So funktioniert SPI nicht. Nicht ohne Grund wird zwischen Master und 
Slave unterschieden. Richtig müssten die Slaves die Pulsdauern messen 
und der Master holt die Messergebnisse bei den Slaves ab.

von Karl H. (kbuchegg)


Lesenswert?

Patrick W schrieb:

> So als grobe Zusammenfassung was meine verstanden zu haben:
>
> Master MOSI auf die Slaves MOSI
>
> Master MISO auf die Slaves MISO
>
> Master SCK auf die Slaves SCK
>
> Master irgend ein Port auf die Slaves SS
>
> Im Master und in den Slaves die ISR aktivieren und die entsprechenden
> Routinen dafuer schreiben.
>
> Der Master selektiert dann einen Slave indem er Portx (der mit dem Port
> SS vom Slave verbunden ist) von High auf Low zieht.

Ja

> Danach sendet der Master ein Byte an den Slave. Der Slave arbeitet dann
> seine ISR ab und sendet noch in dieser Methode ein Byte an den Master.

Ein Slave kann bei SPI nicht von sich aus senden.
DIe Begriffe Senden und Empfangen sind bei SPI etwas missverständlich. 
SPI ist ein Byteaustausch. Beide, Master und Slave sind gleichzeitig 
Sender und Empfänger. Ein Slave kann von sich aus überhaupt nichts tun.

SPI

> Was passiert eigentlich, wenn sich ein Slave mal aufhaengt oder einfach
> laenger braucht als angenommen?
> Kann man die Transaktion dann auch vorzeitig beenden?

Du brauchst nichts vorzeitig beenden. Der Master zieht sein Ding durch, 
egal ob der Slave bereit ist oder nicht.

von Patrick W (Gast)


Lesenswert?

Stimmt, das mit dem Senden und Empfangen ist wirklich ein wenig 
missvertstaendlich.

Wie darf ich mir den Ablauf grob vorstellen?

Master legt SS Leitung auf Low -> Master sendet Byte an den Slave -> 
Slave fuehrt seine ISR aus -> Slave sendet Byte an den Master -> Master 
fuehrt seine ISR aus -> Master legt SS Leitung auf High -> Fortfahren 
mit dem naechsten Slave.

So wuerde ich mir das jetzt vorstellen wie die Kommunikation ablaeuft.

Oder werden die Bytes gleichzeitig vom Master und Slave uebertragen?

von Ulli-B (Gast)


Lesenswert?

Patrick W schrieb:
> Koennte man sich vielleicht mal wieder auf das Thema
> konzentrieren???
>
> Zusammenfassung:
>
> - Summensignal ist erstmal aussen vor. Spaeter vielleicht als zusatz.
> - SPI klingt fuer mich jetzt erstmal am besten da es sich "recht
> einfach"
>   entwickeln laesst. Zudem gefaellt mir die Logik ganz gut. Ein Master,
>   mehrere Slaves. Die Slaves capturen die Signale vom Empfaenger und
> geben
>   diese dann an den Master weiter der dann entscheidet was er mit den
>   Signalen anfangen soll...
>
> Ich werde erstmal diesen Ansatz weiter verfolgen.

Ich würde Dir folgenden Ansatz empfehlen:
Such dir einen Mikrocontroller aus, schliesse eine LED an und lasse 
diese im Sekundentakt blinken. Dann weisst du, dass die Quarzfrequenz 
mit der im Programm verwendeten Frequenz überein stimmt.
Dann verbinde den MC mit einem Empfängerausgang (zB Kanal 1) sowie einem 
Servo. Werte die Impulse aus und gebe sie 1:1an den Servo weiter.
Schliesse noch einen zweiten Kanal vom Empfænger und einen zweiten Servo 
an. Werte jetzt beide Kanäle aus und gebe sie weiter an die Servos. Die 
Servosignale müssen ohne merkliche Verzögerung und ruckelfrei an den 
Servos an kommen.

Wenn du das dann hin bekommen hast, dann kannst du dir die meisten 
deiner Fragen selbst beantworten.
Und dann kannst du dir auch überlegen, ob es Sinn macht, mehrere MC zu 
verwenden.

Ulli-B

von Karl H. (kbuchegg)


Lesenswert?

Patrick W schrieb:

> Oder werden die Bytes gleichzeitig vom Master und Slave uebertragen?

Während 1 Byte vom Master zum Slave geht, geht 1 Byte vom Slave zum 
Master

Stell dir vor, du und dein Kumpel sitzen sich gegenüber.
Jeder hat einen Zettel vor sich, auf dem jeder einen Bytewert 
aufschreiben kann. Auf dein Kommando hin (du bist der Master) nimmt 
jeder seinen Zettel mit der rechten Hand und schiebt ihn zum Gegenüber 
rüber, der ihn mit der linken Hand entgegen nimmt.
Wichtig dabei: dein Kumpel kann sich nicht wehren! Wenn du das Kommando 
gibst, dann werden die Zettel ausgetauscht. Egal ob dein Kumpel fertig 
ist oder nicht.

Deshalb kann es hier auch kein Timeout geben. Denn wenn der Master 
seinen Bytetransfer anstösst, dann kommt von der Gegenstelle 1 Byte 
rein. Ob du die weitere Bearbeitung im Master mittels Interrupt machen 
willst oder nicht, ist Ansichtssache. Wenn du SPI full speed fährst, 
dann dauert die Übertragung von 8 Bit gerade einmal 16 Prozessor 
Taktzyklen. Das kann man mittels Polling erwarten.

Wenn dir die Pulsinformation als ein Wert zwischen 0 und 255 reicht (256 
mögliche Positionen) dann braucht es da überhaupt keine Sonderbehandlung 
oder Interrupts. Der Slave stellt seinen ermittelten Wert, sobald er ihn 
hat, einfach in sein SPDR Register und der Master holt sich diesen vom 
Slave bei seiner nächsten Abfragerunde, ohne dass sich der Slave weiter 
darum kümmern muss. Vergleichbar damit, dass dein Kumpel sofort nach 
Erhalt deines Zettels seinen Messwert auf den Zettel schreibt damit du 
den Wert sofort kriegst wenn du den nächsten Zetteltausch anleierst.
Lediglich wenn da für ein Datenpaket mehr als 1 Byte ausgetauscht werden 
muss (High Byte / Low Byte bei 16 Bit Werten) ist eine Behandlung 
mittels Interrupt durch den Slave vernünftig. Vergleichbar damit, dass 
dein Kumpel erst mal auf den Zettel schauen muss um zu wissen, welches 
Byte du jetzt eigentlich von ihm wissen willst.

Aus dem Bauch raus würde ich sagen, dass wenn man die Knüppelbewegung an 
einem Fernsteuersender in 256 Abstufungen auflöst (auf Trimmweg nicht 
vergessen!) dann sollte das eigentlich reichen. So fein kann kein Mensch 
seine Hand führen. Aber das ist nur IMHO und man müsste es ausprobieren.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Ulli-B schrieb:

> Ich würde Dir folgenden Ansatz empfehlen:

Ich unterstütze diesen Vorschlag, auch wenn er bei der Auswertung von im 
Endeffekt 5 Empfänger Ausgängen dann in Schwierigkeiten kommen kann. 
Aber erst mal ein wenig Erfahrung sammeln schadet nie.

Im Moment sieht es auch für mich danach aus, dass sich der TO hier etwas 
vorgenommen hat, was noch ein paar Nummern zu gross für ihn ist. Und der 
Einsatz mehrerer Prozessoren verkompliziert die Dinge insofern, weil 
dann eben noch eine Kommunikationsebene mit dazu kommt, die man nicht 
hat, wenn alles auf einem Prozessor läuft. Auch wenn es hier das Problem 
lösen würde, dass er nicht genügend Input Capture Einheiten auf seinem 
zentralen µC für alle 5 Kanäle hat.

von Norbert S. (norberts)


Angehängte Dateien:

Lesenswert?

Hi,

ich glaube PCINT wurde schonmal erwähnt.
Anbei das woran ich gerade frickel.

Die Kanäle werden mit PCINTs eingelesen in Pc_int1 und 2.
Dazu nutze ich den freilaufenden Timer2 weil mir das reicht.
Die Auflösung ist mit 16µs nicht prickelnd aber +/-31 Schritte reichen 
mir locker.
Das geht natürlich viel besser mit nem 16bit Timer wenn man will.

Die Ausgabe für das Servo ist noch schlimmer mit dem Overflow von Timer1 
aber auch das reicht mir, da das Servo nur 3 feste Positionen anfahren 
soll.
Da kommt noch einiges dazu aber das werden einfache Schaltfunkionen oder 
Motorregelungen per PWM, wo mir die Auflösung der eingelesenen Kanäle 
wiederum reicht.

Der Teil mit den PCINTS dürfte aber erstmal erklären, wie man die 
Signale bulletproof mit einem µC einliest.
Hätte ich mir das per Hardware nicht verbaut, könnte man das mit Timer1 
nahezu jitterfrei einlesen.
Ausgabe jitterfrei geht dann aber eigentlich nur per PWM und da ist bei 
der M88-Familie schnell Feierabend oder man trickst extrem herum.

Wollte ich sowas für ein Bastelprojekt machen müssen, würde ich das 
Problem mit Hardware bewerfen. Bei einem Mega640 hat man 16bit PWM mehr 
als genug.

Gruß,
Norbert

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.