Hallo JanB,
Ich habe den Code für den Atmega8 angepasst,
und als Kontrolle für den Counter eine LED-Anzeige hinzugefügt.
Leider funktioniert das ganze nicht - ich habe an PORTD 6 und 7 jeweils
eine LED und beide leuchten,
mehr passiert nicht.
Das mit der Tabelle verstehe ich auch nicht so ganz--was und warum wird
damit erreicht, den alten Zustand mit 4 zu multiplizieren und zum neuen hinzuzufügen??
Was ist in den Spalten und Zeilen der Tabelle was ??
Hier mal der Code
Gruß, Hanno
Code:
;Codebeispiel zur Auswertung eins Drehgebers
;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
;Hanno Monschan 12/2004
.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
ldi temp2, 4 ;bei Zählerstand 4 soll LED leuchten-->anzeige
dgloop: in temp,portd ;aktuellen PortZustand holen
andi temp, 0b00001100 ;Drehgeber-Bits maskieren
cp temp,ast ;mit altem Zustand vergleichen
breq dgloop ;Keine Änderung -> nix machen
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
cp temp2, cnt ;wenn Counter==4
breq anzeige ;Ausgabe
rjmp dgloop ;fertig
dgtab: .db 0,1,-1,0
.db -1,0,0,1
.db 1,0,0,-1
.db 0,-1,1,0
anzeige:
ldi temp,0b10000000 ;Ausgabe an LED 7
out portd,temp
rjmp dgloop
;Ende
Lesezeichen