Hi. Ich versuche gerade die impulse eines Modellbau empfängers mit einem AVR abzufragen. Jedoch habe ich das problem das bei jeder Messung die genauigkeit um +/- 1 schwankt. Hat jemand von euch erfahrung und wie habt ihr das dann gelöst? Ich arbeite mit einem Timer mit Prescaler 8 und einer Taktfrequenz von 4MHz. Beim senden der Impulse an ein Servo geht es wunderbar nur beim Empfangen hab ich eben +/- 1. Das lässt dann wiederum mein Servo zittern.
wasn +/-1? Netzlast? Henkelobsttüte nehmen... Im Ernst: Stück Program wäre nicht schlecht. sprichst Du von µs oder 10ms-Raster?
Also +/- 1 war auf meine Variable bezogen sorry. Code ist nun dabei. Also ursprünglich wollte ich jede 100µsec auswerten aber jetzt bin ich vollkommen in einem anderen Raster. Komischerweise funktioniert es so gerade. Die Variable rec_servo_1 beinhaltet die aktuelle Servoposition. Wenn diese auf 59 ist, so steht das Servo in der Mitte. Und genau diese Variable variiert eben dauernd.
Hm, ich kapier' Deinen Source nicht, aber willst Du wirklich, dass if (!(PORTC = 0b00000001)) { PORTC = 0b00000001; } Sollte das nicht evtl. if (!(PORTC == 0b00000001)) { PORTC = 0b00000001; } heissen? Kommt mehrmals vor.
Ah danke Chris, hatte ich total übersehen. Das ändern aber leider noch nichts an meinem Timing problem. Noch ne Timing frage. Wenn ich alle 100µsec einen Impuls vom Timer will dann mach ich das doch folgendermaßen. Takt = 4 000 000 Hz alle 10µsec = 100 000 Hz 4 000 000 / 100 000 = 40 Also Prescaler auf 8 und 40/8 = 5 Und Output compare auf 5 einstellen. Damit sollte ich doch jede 10µsec. einen Output Compare interrupt haben oder nicht?
> Damit sollte ich doch jede 10µsec. einen Output Compare interrupt > haben oder nicht? Ich denke schon. Beachte aber, daß du dann nicht viel in deiner Interrupt-Routine tun darfst, da nur 40 Taktzyklen zur Verfügung stehen, bevor der nächste Interrupt kommt. Davon gehen schon mal mindestens 8 nur für die Interrupt-Behandlung selbst drauf (Sprung in den Interrupt-Vektor und reti), dazu kommen nochmal 2 für's rjmp in die eigentliche Interrupt-Routine. Der Compiler generiert für diese einen Prolog, der ohne das Sichern der in der Interrupt-Routine benutzten Register schon mal 8 Taktzyklen braucht. Der Epilog am Ende braucht nochmal 7. Für jedes Register, das gesichert werden muß, kommen nochmal 4 (2 im Prolog für push und 2 im Epilog für pop) dazu. Wir sind also schon bei 25 Taktzyklen Minimum (Unter manchen Umständen können es noch zwei oder drei mehr sein), ohne daß die Interrupt-Routine überhaupt etwas tut. Ich denke, dein Problem ist, daß deine Interrupt-Routine nicht rechtzeitig fertig wird und das dein Timing durcheinanderbringt. Ich verstehe aber nicht ganz, warum du überhaupt einen Zähler nur so kurz laufen und dann einen Interrupt generieren läßt, nur um darin dann per Software zu zählen. Übrigens: Was für einen AVR verwendest du überhaupt?
Hi Magnus. Danke für die Antwort das habe ich nicht gewusst das dabei so viele Schritte verlohrengehen. Ich verwende einen Mega 8515. Naja ich denke das ist die einzigste Möglichkeit eben die Impulsdauer des Empfängers zu zählen, oder gibt es da noch eine andere Möglichkeit? Bitte beachte das dies mit 6 Empfängerkanälen zugleich funktionieren soll.
... Bitte beachte das dies mit 6 Empfängerkanälen zugleich funktionieren soll. ... keine Panik! die kommen NACHEINANDER.
Jo Axel das stimmt, aber so kann ich den Timer nicht mit einem externen Interrupt triggern bzw. ein oder ausschalten lassen da ich so sonst 6 Timer benötigen würde.
Die Idee ist, den Timer einfach durchlaufen zu lassen und sich, wenn ein Pin toggelt, den aktuellen Timerwert zu merken. Leider hat der Mega8515 keinen PCINT und nur drei INT-Eingänge, sonst könnte man die dafür nehmen. Der Input-Capture ist dafür auch gut geeignet, aber halt auch nur einmal vorhanden.
Ja wobei ich glaube das es einfach nicht wirklich genau mit 4MHz geht. Das ist zu langsam. Warscheinlich werde ich auf einen anderen Controler ausweichen und es mit 16MHz versuchen.
Innovation: Falls Du Dich traust, direkt am Empfänger zu löten, würde ich mal sehen, ob da ein 4017 (Johnson-Counter) drauf ist. Wenn dem so wäre, könntest Du Dich direkt auf die Clock- und Reset-Leitung dieses Bausteins klemmen und kannst somit mit nur zwei Leitungen alle Kanäle dekodieren.
@Markus sieh doch mal bei HanneS auf seinen Seiten nach. da wird das auch gemacht. mitm tiny15. Der läuft nur mit 1.6Mhz. Ich habe es in Basic mit 4Mhz programmiert(nicht schlagen). geht auch. Du kannst die Impulslängen der einzelnen Kanäle sammeln, kommen ja hintereinander und am Ende der Impulsfolge hast Du noch massig Zeit, die Werte umzurechnen und zu agieren, bevor die neue Impulsfolge anfängt. Die einzelnen Kanäle kannst Du mit dioden zusammenschalten, wenn Du im Empfänger nicht den Demodulatorausgang suchen willst.
Wenn man alle zusammenschaltet, hat man auch den Vorteil, input capture verwenden und dadurch ohne großen Rechenaufwand die Impulslängen taktzyklengenau ermitteln zu können.
Hallo, das mit dem zusammenschalten der Ausgänge über Dioden hatte ich auch ausprobiert, aber dummerweise schaltet mein Empfänger in dem Moment, in dem der erste Kanal wieder auf low geht, den zweiten Kaal auf high, so daß das zusammengeschaltete Signal keine Unterscheidung mehr ermöglicht hatte (war also bei 6 Kanälen in Mittelstellung 9ms auf high und 11ms auf low). Ich habe dann doch am Empfänger rumgelötet, um das Signal vor dem "auseinanderrupfen" nach aussen führen zu können und per ICP zu verarbeiten.
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.