Gast
#3335043
Hallo, ich habe ein Problem mit dem Einlesen eines Encoders (Pollin: PANASONIC EVEQDBRL416B). Hardware: ATMega88 Programm: Anlehnung an Beispiel unter http://www.mikrocontroller.net/articles/Drehgeber (s. Anhang) Bei der Problemsuche sind mir folgende Punkte aufgefallen: OCR2A = (uint8_t)(XTAL2 / 64.0 * 1e-3 - 0.5) Das Register sollte doch mit einem Wert gefüllt werden, der jede Millisekunde einen Interrupt erzeugt - oder? Bei meinem Programm stimmte dies nicht. Wie kommt man auf diese Formel? Ich habe daraufhin folgenden Fix-Wert angegeben: OCR2A = (uint8_t)(15); // 1ms Begründung: Die interne Clock-Frequenz ist 1/8 der Systemclock. Mit einem Vorteiler von 64 benötigt man somit 64us bis zum nächsten Zählwert im Timer. Nach 15*64us hat man rund 1ms (mit Oszi nachgemessen). Das Hauptproblem sind aber die Berechnungen der Variablen "diff" und "enc_delta" in der Interruptroutine. Die Reihenfolge der Variable "new" in die 1. Drehrichtung ist nach meiner Meinung 0->1->2->3->0 usw. und in die andere 0->3->2->1->0. Die Differenz ist somit -1 bzw. +1. (Ausnahme: 3->0 bzw. 0->3). An dieser Stelle bin ich dann "ausgestiegen". Kann mir daher bitte jemand die Zeilen von diff = last - new; // difference last - new if( diff & 1 ){ // bit 0 = value (1) last = new; // store new as next last enc_delta += (diff & 2) - 1; // bit 1 = direction (+/-) } erklären?
