Ich hab den Code aus RN_wissen schon ein wenig angepaßt. Die ISR wird bei mir nicht in festen Abständen angesprungen, sondern nur wenn ein PCINT auftritt. Wenn das vorzeigbar ist und ich entsprechende Kommentare eingefügt habe, werd ich ihn mal in meinem Blog zeigen.
Der ATtiny24 hat 2 Ports. PortA und PortB. Alle Pins eines Ports können einen zugehörigen Pin Change Interrupt auslösen. Also PinA.x kann PCINT0 und PinB.x PCINT1 auslösen. Im Maskenregister wird bestimmt, welche Pins tatsächlich scharf sind.
Ich beschränke mich nur auf PortA. Das klappt schon mit gewissen Einschränkungen. Wenn das ausgetestet ist kommt ein zweiter Encoder an PortB.
Der PCINT wird bei fallender und bei steigender Flanke ausgelöst. Die beiden Signale vom Doppelfototransistor lösen also in einer Periode vier Interrupts aus. Jedesmal werden also die Statusse (Stati ??) des Quadratursignals ausgewertet.
Ich erhalte damit Werte, die der doppelten Schlitzfrequenz entspricht, da der Algorithmus bei gültigen Übergängen immer Eins addiert, wenn beide Pins low und beide Pins high sind.
Bisherige Tests sind recht plausiebel. Da ich aber noch in Versuchen stecke, alles mit etwas Vorsicht genießen.
Ich denke gerade darüber nach, einen zweiten Tiny einzusetzen, nur um den Motor zu steuern und mit zusätzlicher Lichtschranke die Quadraturauswertung zu überprüfen.
Zur Anzeige benutze ich SW-UART mit 115000 Baud. Weil es aber trotzdem Timingprobleme gibt, speichere ich jede Sekunde die Werte ab (zB 4 Meßwerte) und lasse sie danach jede Sekunde ausgeben (ohne daß eine Messung läuft)
Der Tiny könnte auch SPI was wesentlich schneller wäre als UART. TWI hat er auch. SW-SPI hab ich schon testweise ausprobiert - gut und einfach.
Im Algorithmus wird mit 4 multipliziert. Das habe ich mit zweimal SHIFT LEFT ersetzt.
EDIT Multiplikation geht natürlich auch ohne HW Unterstützung. einfach x * y in Bascom schreiben - ist langsamer als shift.
Gruß
Searcher
Lesezeichen