Hallo, ich habe hier ein Problem welches ich zunächst völlig unterschätzt habe. Und zwar muss ich 4 Drehimpulsgeber an einen Mega32 angeschlossen werden. Es soll möglichst nur 1 Interrupt verwendet werden. Eine reine Softwarelösung habe ich bis jetzt nicht zufriedenstellen hinbekommen, weshalb ich jetzt eher zu mehr Hardware tendiere. Wie macht man das am günstigsten? Sollte man einen zusätzlichen Controller verwenden? Ein CPLD ? Ober gibt es gar etwas fertiges? Die Impulsgeber haben 30 N/U und werden von Hand betätigt, also max. 1U/s.
Das klingt interessant. Auf den Mega32 bin ich nicht festgelegt. Der Mega169 unterstützt Interrupt on Pin Change wenn ich mich richtig entsinne. Kannst du genauer sagen was du mir "Interrupt Maske auf den Port mit den Drehencodern" meinst? Du meinst dann vermutlich 8 Interrupts auf die 4 Drehcoder legen und dann jeweils auf die rising Flanken an A und B reagieren?
Ok hab ich noch nie gemacht aber wieso nicht. Hast du oder sonst jemand ein C Programm zur Hand in dem das geamcht wurde? Vielen Dank schon mal für die bisherige Hilfe
das geht ohne interrupt, benutze einfach einen d flipflop und schließe die beiden drehgeber bei q und t an. das speichert der ff den letzten zustand. so hatte ich es gemacht, läuft super
Von dieser Möglichkeit habe ich un auch schon öfter gelesen. Jedoch verstehte ich die Funktion nicht wirklich. Meinen Ausführungen liegt das Timing Diagramm im Anhang zu Grunde. Ich gehe jetzt davon aus dass der DIG in Position 1 steht. An A ist der Takt des FFs angeschlossen. Jetzt drehe ich gegen den Uhrzeigersinn weiter auf Position 2. Dann passiert am FF doch gar nichts, da nur eine fallende Flanke ankommt. drehe ich jetzt wieder im Uhrzeigersinn zurück auf 1 bekommt ich eine high Flanke und das FF schaltet 0 auf Q. Jetzt stehe ich wieder am Anfang, habe aber nur 1 Signal bekommen? Wo ist mein Denkfehler?
Drehimpulsgeber per Interrupt auswerten, ist ein großer Fehler, wegen dem Prellen! Details, wie man es richtig macht, unter: http://www.dse-faq.elektronik-kompendium.de/dse-faq.htm#F.29
Hallo Thomas, über das Auslesen von Drehimpulsgebern habe ich mir auch lange den Kopf zerbrochen. Mit Hilfe von Peter Danneggers großartigem Grundlagenthread ist es mir dann gelungen, das Problem perfekt mit minimalem Ressourcenverbrauch zu lösen: http://www.mikrocontroller.net/forum/read-4-37992.html#new In dem Thread steht leider einiger Müll, aber die wertvollen Teile lassen sich bei aufmerksamem Lesen aber gut extrahieren. Ich habe die Routine in Assembler übernommen und steuere zum Test nur die Pulsbreite des PWM. Mit dem Beispiel kann man auch die Auswirkung unterschiedlicher Abtastraten testen. Bei mir hat sich eine Abtastrate von ca. 1 kHz bewährt. Ich kann keinerlei Prellen feststellen. Ein Erweitern auf 4 Drehimpulsgeber sollte den Controller nicht stressen. Gruß Michael
Habe mich auch viel mit dem Thema beschäftigt. Per Interrupt von einem Port IO funktioniert es definitiv nie so ganz einwandfrei. Daher bin ich auch auf die Lösung mit einem Timerinterrupt / Polling gekommen. Im Timerinterrupt wird dann eine ganz kleine State-Machine aufgerufen um herauszufinden, ob der Inkrementalgeber bewegt wurde und in welche Richtung. Hier ist die Doku / Source Code in C zu einem Projekt wo ich das verwendet habe (ab Seite 33 im PDF File): http://www.circuitcellar.com/renesas/winners/Entries/H3210.zip Projekt homepage: http://www.circuitcellar.com/renesas/winners/3210.htm
@Thomas "Eine reine Softwarelösung habe ich bis jetzt nicht zufriedenstellen hinbekommen" Dann hast Du bestimmt noch nicht das hier probiert: http://www.mikrocontroller.net/attachment.php/87902/ENCODE.C Peter
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.