Forum: Mikrocontroller und Digitale Elektronik Servo Signal messen funktioniert nciht


von Patrick (helipaddi)


Lesenswert?

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

von P. S. (Gast)


Lesenswert?

Auch dir ist, wie den hunderten Anderen vor dir, die keinen oder keinen 
lauffaehigen Code posten, beim besten Willen nicht zu helfen.

von P. S. (Gast)


Lesenswert?

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?

von Patrick (helipaddi)


Angehängte Dateien:

Lesenswert?

Okay, Code ist im Anhang! Hab es mal auf das nötigste beschränkt. Ist 
aber auch kein Geheimnis was da passiert ;)

von Patrick (helipaddi)


Lesenswert?

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...

von P. S. (Gast)


Lesenswert?

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.

von Patrick (helipaddi)


Lesenswert?

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!

von STK500-Besitzer (Gast)


Lesenswert?

>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.

von Patrick (helipaddi)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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.

von Patrick (helipaddi)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

Patrick Franken schrieb:

> Die Vermutung hatte ich auch schon! Aber das wäre wirklich Pech,

Nö.
Das ist einfach nur besch... programmiert.

von Patrick (helipaddi)


Lesenswert?

Dann mach doch einen besseren Vorschlag :D

von Karl H. (kbuchegg)


Lesenswert?

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.

von Kluchscheißernder N. (kluchscheisser)


Lesenswert?

Servoimpulse würde ich auch auf Plausiblität prüfen, also zu lange und 
zu kurze Impulse verwerfen.

von Patrick (helipaddi)


Lesenswert?

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...

von Karl H. (kbuchegg)


Lesenswert?

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
Noch kein Account? Hier anmelden.