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
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
Mit dem an gehangenen Code ist das Ergebnis ganz brauchbar! Log ist auch noch im Anhang.
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
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
Wahrscheinlich wird es übersichtlicher, wenn du in dem Programm deine Servos nebst zugehöriger Positionen als Array behandelst.
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...
Zens Uhr schrieb: > Bittesehr: http://pastebin.com/3CapXkk9 Der tut's nicht -> Heavy Load Wie wäre es hier als Anhang?
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.
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 (:
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ß
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.