Hallo zusammen,
ich habe gerade eine akute Denksperre, wie es scheint, und hoffe ihr könnt mir auf die Sprünge helfen. Das ist das Setup:
Ich habe einen AtXMega32, dem ich als Userinterface einen ALPS Inkrementalgeber spendiert habe. Ich möchte damit nun die Farbe einer LED Lampe einstellen. Dazu soll man am 16bit-Farbwert für rot durch Drehen herumstellen, dann durch drücken des Gebers(Buttonfunktion) auf die nächste Farbe umschalten usw..
Die XMegas haben dieses Quadraturencoder Feature, was mit dem Eventsystem funktioniert. Es klappt echt gut, ich hab es wie in AVR1600 beschrieben aufgesetzt und nun zählt mein Timer von 0-23 die aktuelle Position des Inkrementalgebers (dieser hat 24 Rastpunkte und macht zwischen jedem dieser Punkte 4 Schritte/Transitionen).
Nun das Problem: Der Timer zählt nur von 0-23 und ich habe 16bit Werte, die ich modifizieren will, d.h. ich muss auf jeden Fall mehrere Umdrehungen machen, um den gesamten Helligkeitsbereich abzudecken, sodass man z.B. den Farbwert in 100 Schritten, also ~4-5 Umdrehungen von 0-65535 verstellen kann. Dazu muss ich also wissen, wie oft sich der Inkrementalgeber bereits in jede Richtung gedreht hat, und hier liegt die Hund begraben.
Wie soll ich die Umdrehungen mitzählen? Diese Quadraturgeschichte kann man laut AVR1600 noch durch einen weiteren Eventchannel mit einem zweiten Timer/Counter verbinden, der dann die Rotationen zählen soll. Das habe ich versucht, aber leider zählt dieser mit konfusen Schrittweiten, wenn ich im Eventsystem "Up/Down" als Modus angebe, und es ist egal in welche Richtung ich drehe, immer hinter der 0-Position wird inkrementiert, auch wenn ich zurück drehe und so von 23 nach 0 gehe. Als Interrupts hab ich auch nur den Overflow und 2 Compare Interrupts des Timers zur Verfügung, sodass ich mit dieser Momentaufnahme auch keine Aussage über die Richtung machen kann, also ob ich meine Zählvariable für die Umdrehungen inkrementieren oder dekrementieren muss. Ich überlege fast schon die Encoderauswertung händisch zu machen und auf das coole Feature zu verzichten. Die andere Möglichkeit, die mir einfiel, wäre noch die Periode des Timers zu erhöhen, also von 0-23 auf 0-100 oder so. Da aber je Rastung 4 Transitionen erkannt werden, muss ich damit aufpassen, es muss auf jeden Fall durch 4 teilbar sein.
Habt ihr eine elegante Lösung , die mir gerade nicht einfällt? Dies ist mein erster Projekt mit dem XMega, vielleicht überseh ich einfach etwas. Ansonsten ist der Prozessor großartig und auf jeden Fall meine erste Wahl gegenüber einem normalen AtMega32.
Gruß,
The_Ghost666
- - - Aktualisiert - - -
*g* Danke fürs zuhören
Ich habe meine Lösung gefunden. Ich werde den Counter für die Quadraturauswertung mit einer 5x höheren Periode/Obergrenze laufen lassen und wenn ich die Position benötige, einfach deinen Modulo Operator benutzen, und ansonsten habe ich meine 0-5 Umdrehungen Ihr wisst garnicht wie lange ich an diesem Problem saß und einfach nicht drauf kam, weil ich zu erschöpft war.
...
Lesezeichen