Hallo Hanno,
Das Codefragment war als Beispiel gedacht um es zu analysieren,Ich habe den Code für den Atmega8 angepasst,
die Methode zu verstehen, und dann selbst zu verwenden.
Und nicht, um es 1:1 zu übernehmen. Aber egal.
Das Beispiel hat den Anschluss des Drehgebers an den Bits 0 und 1 des Ports vorgesehen.Leider funktioniert das ganze nicht
Du hast sie jedoch an den Bits 2 und 3 angeschlossen.
Da müssen die Bits im Register noch um zwei Bits nach rechts verschoben werden, damit es funktioniert.
Also diese Methode funktioniert folgendermassen:Das mit der Tabelle verstehe ich auch nicht so ganz
Die Signale A und B des Drehgebers können genau vier verschiedene
Zustände annehmen: 00, 01, 10, 11.
Das entspricht den Binärwerten 0 bis 3.
Das Gleiche gilt natürlich auch für die "alten" Drehgeberwerte.
Zur Auswertung müssen die "neuen" und die "alten" DG-Werte miteinander verglichen werden.
Jeder der beiden Werte kann wie gesagt einen von vier verschiedenen Zuständen haben.
Der Vergleich kann also genau 4 mal 4 also 16 Kombinationen ergeben.
Für jede dieser 16 Kombinationen gilt es zu entscheiden,
ob der Zähler stehen bleibt (+0), oder ob er vorwärts (+1), oder rückwärts (-1) zählen muss.
Diese Entscheidungsmatrix ist die Tabelle dgtab.
Sie besteht aus 4 Zeilen a' 4 Spalten, enthält also 16 Werte.
Jede Zeile steht für einen "alten" DG-Zustand.
Jede Spalte steht für einen "neuen".
Der Tabelleneintrag (0 oder 1 oder -1) im Schnittpunkt
von "alter Wert" und "neuer" Wert ist der Zählerschritt,
der einfach auf den Zähler aufaddiert wird.
Wie findet das Progrämmchen den richtigen Tabelleneintrag ?
1. Es wird ein Zeiger (ZH,ZL) auf den Anfang der Tabelle gesetzt.
2. Es wird der "alte" DG-Zustand mal 4 genommen und auf den Zeiger addiert.
Der Zeiger zeigt jetzt auf den Anfang der richtigen Zeile.
3. Es wird der "neue" DG-Wert auch auf den Zeiger addiert.
Jetzt zeigt der Zeiger auch auf die richtige Spalte innerhalb der Zeile.
Der Tabellenwert (0 oder 1 oder -1), auf den der Zeiger jetzt zeigt,
wird ausgelesen (lpm) und zum Zähler addiert.
Jetzt muss nur noch der "neue"DG-Wert zum "alten DG-Wert werden,
und fertig.
Das war jetzt wirklich ausführlich, meine ich.
Diese Methode realisiert eine vollständige Auswertung des DG-Signales.
D.h. Bei einem Drehgeber mit nominal 100 Imp/Umdrehung wird eine
Umdrehung auf 400 Positionen aufgelöst.
Ich nehme an, du bist noch Einsteiger in der Assembler-Programierung.
Dann solltest dir das Beispiel ansehen, und versuchen zu verstehen,
wie es funktioniert, dann kannst du es beliebig selbst anwenden.
Nur Abtippen bringt dich nicht viel weiter.
Ich habe deinen Code etwas angepasst so das er funktionieren müßte.
Was ist das eigentlich für ein Drehgeber, den du da verwendest, und was
willst du eigentlich damit machen ?
Warum soll die LED gerade bei Zählerstand 4 leuchten ? Und nur da ?
Gruß Jan
Code:;für Atmel AtMega8 ;Signale A und B sind an PortD Bit2 und Bit3 angeschlossen ;Es wird 8 Bit weit gezählt mit dem Zähler cnt .NOLIST .INCLUDE "m8def.inc" .LIST .DEF temp = r16 .DEF cnt = r17 ;der Zähler .DEF ast = r18 ;alter Zustand Drehgeber .DEF temp2 = r19 dgstart: ldi temp,0b11000000 out ddrd,temp ;Portd 6/7 auf Ouput setzen, Rest Input in ast,portd ;einmal den aktuellen PortZustand holen andi ast,0b00001100 ;Drehgeber-Bits maskieren lsr ast ;DG-Bits in POsition 0 und 1 schieben lsr ast dgloop: in temp,portd ;aktuellen PortZustand holen andi temp, 0b00001100 ;Drehgeber-Bits maskieren lsr temp ;DB-Bits in Pos. 0 und 1 schieben lsr temp lsl ast ;*2 lsl ast ;*2 add ast,temp ;alter Zustand mal 4 plus neuer Zustand ldi ZL,low(dgtab<<1) ;Zeiger Z auf Tabellenanfang setzen ldi ZH,high(dgtab<<1) add ZL,ast ;zum Zeiger Addieren clr ast adc ZH,ast lpm ;Tabelleneintrag holen add cnt,r0 ;auf Zähler draufaddieren mov ast,temp ;neuer Zustand wird alter Zustand cpi cnt,4 ;Counter==4 ? brne dgloop ;nee ldi temp,0b10000000 ;LED schalten out portc,temp rjmp dgloop ;fertig dgtab: .db 0,1,-1,0 .db -1,0,0,1 .db 1,0,0,-1 .db 0,-1,1,0 ;Ende







Zitieren

Lesezeichen