Hallo Leute,
sollte es jemanden interessieren, (vielleicht gibt es noch jemanden, der den Asuro in Assembler progt) habe ich jetzt eine Lösung für die Odometrieabfrage gefunden.
Na ja, die Routine habe ich einfach Wejas erweiterten Bibliothek entnommen (danke dafür) und in Assembler umgesetzt
Ich habe versucht den Code gut zu dokumentieren, damit man in etwa was verstehen kann.
Es wird jedes Rad für sich gezählt und zwar in einem 16 Bit Zähler.
Vielleicht gibt es jemanden, der damit was anfangen oder was verbessern kann (bin selber noch nicht lange mit Assembler dran)
Ach ja Hysterese habe ich auch benutzt
Gruß Sebastian

Code:
.include "m8def.inc"
;einzelne Bits von toogleregister zuweisen
.equ toogleflagL = 2	;Hat eine Änderung am Rad Links stattgefunden ?
.equ toogleflagR = 1	;Hat eine Änderung am Rad Rechts stattgefunden?
.equ toogle = 0		;Bit 0 von tooglereg für Rad R "0" und Rad L "1" umzuschalten 

;Register R1 bis R4 erhalten die Werte der Zähler
.def encoder_leftL = R1
.def encoder_leftH = R2
.def encoder_rightL = R3
.def encoder_rightH = R4
.def tmpi = R16 ; Universalregister für Interrupts
.def tmpi2 = R17 ;Universalregister für 16 Bit rechnen
.def tooglereg = R18	;Toogle Register, hier werden Flags zu Farbe- u. Radwechsel abgespeichert

.org 0x00
	rjmp reset		;ResetVector
.org ADCCaddr
	rjmp ADCcomplete	; ADCcomplete Interrupt Vector
	
;Anfangsfeierlichkeiten sollten mindestens folgendes enthalten

reset:
	;Stack einrichten
	ldi tmp,HIGH(RAMEND)
	out SPH,tmp
	ldi tmp,LOW(RAMEND)
	out SPL,tmp
	;Stack fertig
	;A/D Conversion
	ldi tmp,(1<< ADEN) | (1<<ADFR) | (1<<ADIE) | (1<<ADSC) | (1<<ADPS0) | (1<<ADPS1) | (1<<ADPS2)
	out ADCSRA,tmp
	ldi tmp,(1<<REFS0) | (1<<ADLAR) | (1<<MUX0)
	out ADMUX,tmp
	;A/D Conversion fertig
	sbi PORTD,PD7 ;schalte Odometrie LEDs ein
	
main:
	;Hier sollte auch mal ein Programm stehen
	;Ich lasse es einfach mal weg, damit das alles nicht zu groß wird
	rjmp main  

ADCcomplete:
	in tmpi,SREG			;lese Statusregister in tmpi ein
	push tmpi			;Rette ihn auf den Stack
	ldi tmpi2,0x00			;lade 0x00 in tmpi2(wird benutzt um 16 Bitencoder zu adieren)
	in tmpi,ADCL			;lese LOWbit ein(wird nicht benutzt)
	in tmpi,ADCH			;Lese HIGHbit ein
	sbrs tooglereg,toogle		;Wenn Bit toogle = 1 Weiter bei Rechtem Rad
	rjmp radlinks			;wenn nicht dann halt bei Links
	;Rad Rechts
	sbrs tooglereg,toogleflagR	;ist toogleflagR gesetzt? wenn ja springe zu flagRtrue
	rjmp flagRfalse			;wenn nicht springe zu flagRfalse
	;flagRtrue
	cpi tmpi,0x8C	;vergleiche mit 0x8C
	brsh ausR	;wenn größer oder gleich springe zu ausR
	ldi tmpi,0x01	;lade 0x01 in tmpi
	add encoder_rightL,tmpi;encoder_right++
	adc encoder_rightH,tmpi2;encoder_right++ mit Carry
			;debug
			;cbi PORTD,PD2	;Status LED rot an
			;sbi PORTB,PB0 ;Status LED grün an
			;ende debug
	andi tooglereg,0xFD	;Lösche toogleflagR
	rjmp ausR	;Springe zu ausR
flagRfalse:
	cpi tmpi,0xA0	;vergleiche mit 0xA0
	brlo ausR	;wenn kleiner springe zu ausR
	ldi tmpi,0x01	;lade 0x01 in tmpi
	add encoder_rightL,tmpi	;encoder_right++
	adc encoder_rightH,tmpi2;encoder_right++ mit Carry
			;debug
			;cbi PORTD,PD2 StatusLED red aus
			;sbi PORTB,PB0 StatusLED grün an
			;ende debug
	ori tooglereg,(1<<toogleflagR) ;Setze toogleflagR
ausR:
	sbi ADMUX,MUX0	;schalte Multiplexer auf linkes Rad um
	andi tooglereg,0xFE	;lösche toogleflag
	rjmp rausadc		;verlasse den Interrupt
radlinks:
	sbrs tooglereg,toogleflagL	;ist toogleflagL gesetzt? wenn ja springe zu flagtrue
	rjmp flagLfalse			;wenn nicht springe zu flagLfalse
	;flagLtrue
	cpi tmpi,0x8C			;vergleiche mit 0x8C
	brsh ausL			;wenn größer oder gleich springe zu ausL
	ldi tmpi,0x01
	add encoder_leftL,tmpi		;encoder_left++
	adc encoder_leftH,tmpi2		;encoder_left++ mit Carry
			;Debug 
			;sbi PORTD,PD2 Status LED rot an
			;cbi PORTB,PB0 Status LED grün aus
			;Ende Debug
	andi tooglereg,0xFB		;Lösche toogleflagL
	rjmp ausL			;verlasse Auswertung Rad Links
flagLfalse:
	cpi tmpi,0xA0	;vergleiche mit 0xA0
	brlo ausL	;wenn kleiner springe zu ausL
	ldi tmpi,0x01	;lade 0x01 in tmpi
	add encoder_leftL,tmpi	;encoder_left++
	adc encoder_leftH,tmpi2	;encoder_left++ mit Carry
			;Debug 
			;sbi PORTD,PD2 Status LED rot an
			;cbi PORTB,PB0 Status LED grün aus
			;ende Debug
	ori tooglereg,(1<<toogleflagL)	;setze toogleflagL
ausL:	
	cbi ADMUX,MUX0	;schalte Multiplexer auf Rechtes Rad um
	ori tooglereg,(1<<toogle) ;setze toogleflag
		
rausadc:
	pop tmpi	;Hole Wert von Stack
	out SREG,tmpi	;schreibe alten Inhalt in den Statusregister
	reti		;und tschüß