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