Guten Morgen Community, es geht mal wieder um die Messung eines R/C Servosignals ;)Der MC (Attiny44) soll das gemessene Signal als 8bit Integer über den I2C Bus zur verfügung stellen. Dazu habe ich das Signal an einen PCINT angeschlossen und diesen auf steigende Flanke eingestellt. Wenn jetzt das HIGH Signal kommt schaltet der Interrupt auch fallende Flanke um und speichert den Wert des frei laufenden Timer0. Wenn das Signal wieder auf LOW geht, wird der Interrupt wieder ausgelöst und gibt die Messung (tStop-tStart) auf dem UART aus. Das ganze fuktioniert sehr gut! Jetzt soll der Wert aber nicht ausgegeben werden, sondern beim TWI bzw. USI Interrupt an den Master gesendet werden. Da dies ca. mit 25hz passieren soll und ich noch keinen Master habe, habe ich einfach den Timer1 genommen und diesen auf die gewünschten 25hz eingestellt um das ganze zu simulieren. Dieser sendet dann bei überlauf den letzen gemessenen Wert. Die dann gemessenen Werte sind erst richtig aber nach ein paar Sekunden kommt nur noch mist raus. Zwischendurch geht es auch immer mal wieder... Könnt ihr mir vielleicht helfen? Kann mir nicht genau vorstellen wo das Problem herkommt... Eventuell könnte ich auch ein paar Stücke aus dem Code einfügen. Schonmal danke für eure Hilfe! Gruß, Patrick
Auch dir ist, wie den hunderten Anderen vor dir, die keinen oder keinen lauffaehigen Code posten, beim besten Willen nicht zu helfen.
Patrick Franken schrieb: > Wenn das Signal wieder auf LOW geht, wird der > Interrupt wieder ausgelöst und gibt die Messung (tStop-tStart) auf dem > UART aus. Dass tStop auch kleiner sein kann als tStart, weil zwischen beiden der Ueberlauf sein kann, hast du aber bedacht?
Okay, Code ist im Anhang! Hab es mal auf das nötigste beschränkt. Ist aber auch kein Geheimnis was da passiert ;)
Peter Stegemann schrieb: > Dass tStop auch kleiner sein kann als tStart, weil zwischen beiden der > Ueberlauf sein kann, hast du aber bedacht? Ist mir gerade beim schreiben auch eingefallen :D Aber es scheint zu funktionieren...
Patrick Franken schrieb: > Peter Stegemann schrieb: >> Dass tStop auch kleiner sein kann als tStart, weil zwischen beiden der >> Ueberlauf sein kann, hast du aber bedacht? > Ist mir gerade beim schreiben auch eingefallen :D Aber es scheint zu > funktionieren... Tut es doch nicht, sonst haettest du ja nicht hier gepostet :-) Fixe den Fehler doch schonmal.
Naja, die Messung mit SOFORTIGER Ausgabe (siehe Quellcode) funktioniert ja... ^^ Wie wirdet ihr die Messung den ander realisieren? In Zukunft sollen auch mehrere Kanäle gleichzeitig gemessen werden. Das wäre mit dieser Lösung möglich!
>Dass tStop auch kleiner sein kann als tStart, weil zwischen beiden der >Ueberlauf sein kann, hast du aber bedacht? Sofern das zu messende Signal kürzer als zwei Überläufe ist, braucht man das nicht beachten. Das hängt mit dem beschränkten Zahlenraum zusammen. @Patrick: Wenn ich die PCINT-Funktion richtig in Erinnerung habe, dann kann man dort keine Flankenrichtung einstellen. ISC00 und ISC01 beeinflussen INT1, keinen PCINT. Um PWM zu vermessen benutzt man besser das Input-Capture-Modul des Timer 1. Um es zusammen zu fassen: Dein Programm funktioniert höchstens, weil du ein anderes gepostet hast.
STK500-Besitzer schrieb: > Wenn ich die PCINT-Funktion richtig in Erinnerung habe, dann kann man > dort keine Flankenrichtung einstellen. > ISC00 und ISC01 beeinflussen INT1, keinen PCINT. Hm... Habe mir gerade nochmal 9.2 vom Datasheet durchgelesen. Der PCINT triggert bei jedem Flankenwechsel. Daher ist mein umschalten des INT0 überflüssig ;) Aber das messen funktioniert trotz dem! Noch der Ausschnitt ausm Datasheet: "The pin change interrupt PCI0 will trigger if any enabled PCINT7...0 pin toggles." STK500-Besitzer schrieb: > Dein Programm funktioniert höchstens, weil du ein anderes gepostet hast. :D Es funktioniert teilweise... Bin übrigends im Moment auf einem Atmega168 am probieren, da ich diesen auf einer Testplatine habe. Daher nicht wundern wenn ein paar Register nicht mit dem Attiny44 übereinstimmen!
Patrick Franken schrieb: > Hm... Habe mir gerade nochmal 9.2 vom Datasheet durchgelesen. Der PCINT > triggert bei jedem Flankenwechsel. Daher ist mein umschalten des INT0 > überflüssig ;) Aber das messen funktioniert trotz dem! Aber nur dann, wenn du zufällig auf die steigende Flanke mit dem start und auf die fallende Flanke mit dem end synchronisierst. Sobald du eine Flanke verpasst, zb dadurch dass dein Programm in der Zwischenzeit anderweitig beschäftigt ist und die Interrupts abgeschaltet hat (*), verlierst du die Synchronisierung. Dein Programm denkt es vermisst den Puls während es in Wirklichkeit die Pause zwischen den Pulsen vermisst. Aber das ist in Wirklichkeit ja kein Problem. Wenn dre Interrupt aufgerufen wird, schaust du dir einfach den Pin an. Ist er 1, dann muss der Interrupt wegen einer steigenden Flanke ausgelöst worden sein. Ist der Pin 0, dann war eine fallende Flanke die Ursache. (*) Es kann natürlich auch mal sein, dass eine ISR etwas länger dauert. zb weil man dort drinnen UART Ausgaben macht. Während eine ISR läuft, sind Interrupts generell gesperrt, und wenn man dann natürlich eine Flanke am Servosignal verpasst, dann ist das bitter.
Karl heinz Buchegger schrieb: > (*) Es kann natürlich auch mal sein, dass eine ISR etwas länger dauert. > zb weil man dort drinnen UART Ausgaben macht. Während eine ISR läuft, > sind Interrupts generell gesperrt, und wenn man dann natürlich eine > Flanke am Servosignal verpasst, dann ist das bitter. Die Vermutung hatte ich auch schon! Aber das wäre wirklich Pech, dafür kommt das Problem zu oft vor. Heute Abend werde ich mal ein paar Messungen posten! Aber das mit der Flanke verpassen durch den Interupt könnte gut sein. Werde deinen Vorschlag mal umsetzen und den Status des Pins auslesen!
Patrick Franken schrieb: > Die Vermutung hatte ich auch schon! Aber das wäre wirklich Pech, Nö. Das ist einfach nur besch... programmiert.
Patrick Franken schrieb: > Dann mach doch einen besseren Vorschlag :D Hab ich doch schon. Siehe Beitrag "Re: Servo Signal messen funktioniert nciht" der Mittelteil. Du toggelst. Ich stelle fest welche Flanke tatsächlich vorliegt. Du bist darauf angewiesen keine Flanke zu verlieren. Ich kann eindutig identifizieren für welche Flanke die ISR aufgerufen wird.
Servoimpulse würde ich auch auf Plausiblität prüfen, also zu lange und zu kurze Impulse verwerfen.
Karl heinz Buchegger schrieb: > Du toggelst. Ich stelle fest welche Flanke tatsächlich vorliegt. > Du bist darauf angewiesen keine Flanke zu verlieren. Ich kann eindutig > identifizieren für welche Flanke die ISR aufgerufen wird. Achs, das meinst du! Werde das heute Abend auf jeden Fall mal einbauen. Danke für den Tipp! Kluchscheißer Kluchscheißer schrieb: > Servoimpulse würde ich auch auf Plausiblität prüfen, also zu lange und > zu kurze Impulse verwerfen. Wenn die Idee von Karl Heinz funktioniert, sollte das überflüssig sein...
Patrick Franken schrieb: > Wenn die Idee von Karl Heinz funktioniert, sollte das überflüssig > sein... Schaden tuts nicht. Ausserdem vermeidet es falsche Messwerte, wenn du das Kabel vom Empfänger absteckts und neu aufsteckst :-)
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.