Forum: Mikrocontroller und Digitale Elektronik RC Summensignal auswerten - seltsame Sprünge und Rückkopplungen bei bestimmten Werten


von User N. (panzerkeks) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi

ich analysiere mit einem ATtiny45 ein Summensignal aus einem R700 
Modellbauempfänger. Die Werte werden von einem anderen Controller später 
über I2C ausgelesen.

Das klappt soweit eigentlich ganz gut.

Aber: aus irgendeinem Grund habe ich etwas, was aussieht wie ein 
Wertüberlauf, und eine Art Rückkopplung von einzelnen Kanälen auf 
andere, und das nur bei bestimmten Werten. (reproduzierbar)

Hier ist der Code auf dem ATtiny45: http://pastebin.com/TCHdQs7Z
Hier ein log der Servowerte, vom anderen Controller nach dem Auslesen 
via I2C ausgegeben (Kanal 1-8, Syncpause, Impulspaket-Gesamtzeit): 
http://pastebin.com/TKi4Rjc4
Im Anhang das ganze noch mal geplottet (LibreOffice Calc ;)).

was dort passiert ist folgendes: Kanal 1 ist auf Minimum, Kanal 2-7 auf 
Mitte. Ich bewege den Hebel von Kanal 2 an der Fernsteuerung aus der 
Mitte bis Maximum und zurück (zweimal).

Man sieht, dass bei der 101. Zeile der Wert von Kanal 1 (1700µs) um etwa 
100µs fällt und danach weiter ansteigt (ich bewege den Hebel 
kontinuierlich), bis er bei etwa 1900µs nocheinmal fällt und dabei Kanal 
3 (gelb) beeinflusst. Naja, usw...

Ich vermute, dass der Fehler im Code des ATtiny 45 steckt. Der andere 
Controller liest wirklich nur alle 25ms die Bytes über I2C aus, fügt sie 
zu 16Bit-Datenworten zusammen (wenn das DataReady-Flag in Byte 1 ok ist) 
und gibt sie anschließend über die Serielle Schnittstelle an den PC aus.


Wer kann mir helfen? :/

lg

von Patrick (helipaddi)


Angehängte Dateien:

Lesenswert?

Hi,

hab mal so was ähnliches... ne... eigentlich genau das gleiche gemacht 
:D
Im Anhang ist mal mein Plot, sieht so ähnlich aus wie Deiner ;) 
Zusätzlich ist noch der Code für einen Attiny24 an gehangen. Dieser ist 
aus einer I2C Slave Lib zusammen gebastellt.

Vielleicht hilft es Dir ja! :)

Gruß,
Patrick

von Patrick (helipaddi)


Angehängte Dateien:

Lesenswert?

Mit dem an gehangenen Code ist das Ergebnis ganz brauchbar! Log ist auch 
noch im Anhang.

von User N. (panzerkeks) Benutzerseite


Lesenswert?

Hey Patrick,

ja, deine Kurve sieht doch etwas schöner aus als meine ;)
Aber für mich siehts jetzt so aus, als ob du die Kanäle einzeln aus dem 
Empfänger an verschiedene Pins des Tiny24 gehängt hast? Ich benutze ja 
das Summensignal, direkt aus dem Empfängerinneren abgegriffen. Also alle 
Kanäle übereinandergelegt auf einem Kabel.

Sieht dann so aus: (unteres Signal, ganz normaler TTL-Pegel) 
http://de.wikipedia.org/w/index.php?title=Datei:Fernsteuerungsmodulation.gif&filetimestamp=20110104212546

lg

von User N. (panzerkeks) Benutzerseite


Angehängte Dateien:

Lesenswert?

Habe den Fehler, der die Sprünge verursacht hat, finden können - Zeile 
107 war
1
uint16_t pulseTimerFraction = 5 * TCNT1 / 4;
muss aber heißen
1
uint16_t pulseTimerFraction = 4 * TCNT1 / 5;

... -.-

Jetzt fehlt mir aber noch die Fehlerquelle für die seltsamen Spikes in 
den anderen Kanälen... (siehe Anhang)

lg

von Tip (Gast)


Lesenswert?

Wahrscheinlich wird es übersichtlicher, wenn du in dem Programm deine 
Servos nebst zugehöriger Positionen als Array behandelst.

von User N. (panzerkeks) Benutzerseite


Lesenswert?

Bittesehr: http://pastebin.com/3CapXkk9
Tatsächlich ist der Code um 280 Bytes geschrumpft :P
Ändert aber leider auch nichts am Ergebnis...

Edit: Und nochmal um 720 Bytes weniger als ich gerade die Optimization 
wieder eingeschaltet habe >.< hab mich schon gewundert, warum der Code 
so groß ist...

von Helfer (Gast)


Lesenswert?

Zens Uhr schrieb:
> Bittesehr: http://pastebin.com/3CapXkk9

Der tut's nicht -> Heavy Load
Wie wäre es hier als Anhang?

von Helfer (Gast)


Lesenswert?

Im Simulator mit AVR Studio 4.13 läuft der Timer1 nicht. Entweder der 
wird beim Tiny45 (noch) nicht richtig simuliert oder da stimmt etwas mit 
dem Timer-Setup nicht.

von User N. (panzerkeks) Benutzerseite


Angehängte Dateien:

Lesenswert?

pastebin geht wieder.
Timer läuft. Sonst würde ich ja für die Kanäle immer Pulslänge 0 
bekommen. Aber wie Du im Log/den Graphen siehst, funtioniert das ja 
soweit im Prinzip ganz anständig.
Nur warum bestimmte Werte von einem Kanal andere Kanäle beeinflussen, 
ist mir nicht klar. zB im angehängten Graphen. Spannend bei diesem auch: 
Es wird bei veränderung von Kanal 4 offenbar nur Kanal 1 beeinflusst - 
bei dem Graphen, den als letztes angehängt hatte, war das anders.

Weitere Tips/Ideen?
lg (:

von User N. (panzerkeks) Benutzerseite


Lesenswert?

Weil ich gerade per Mail darauf angesprochen wurde: Ich habe das Problem 
damals gelöst:
Es war gut, die Interrupt Routinen auf je nur zwei Zeilen zu 
beschränken, und außerdem, wichtigster Punkt:
1
uint16_t pulseTimerFraction = 5 * TCNT1 / 4;
2
uint16_t pulseTime = pulseTimer * 200 + pulseTimerFraction;
muss verbessert werden zu:
1
uint16_t pulseTime = pulseTimer*200 + TCNT1 * 4 / 5;

Damit lief dann alles. I²C war nur ein bisschen langsam für meine 
Bedürfnisse ;)

Gruß

von Christoph H. (christoph_b)


Lesenswert?

hallo

Habe bald das selbe vor. Ich will das Summensignal auswerten und dann 
die Info per I2C weiterleiten. Liege ich richtig das das Summensignal an 
PB1 kommt?

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.