Andy11jj,

nee, Assembler ist nur unübersichtlich, wenn man unübersichtlich schreibt ! Guck' mal: Die Neuberechnung der Schwellwerte kannst Du doch locker in je eine Prozedur auslagern. Z.B.

Code:
/* 
PROZEDUR UPDATE_SCHWELLE_LINKS

*/

UPDATE_SCHWELLE_LINKS
	push r25
	in r25,SREG
	push xl
	push xh

; Messung links signalisieren
	cbi PORTB, 1 	; LEDs an PORTB.1 und PORTB.2 aussschalten
	cbi PORTB, 2
	rcall Wait1		; Pause mit LEDs dunkel
	sbi PORTB, 1	; LED an PORTB.1 einschalten
	rcall Wait3		; Pause mit LED hell
	cbi PORTB, 1	; LED an PORTB.1 ausschalten

; Messung durchführen. Messwert des linken LDR auf weißem Untergrund steht 
; in Register WeissWertLinks 
	rcall StartADConChanel0_8bit ; 
    in xl, ADCH		; Schwarzmesswert nach xl

; Mittelwert von Weiss- und Schwarzwert bilden
	clr xh			; 
	add xl,WeissWertLinks ; 2-Byte Addition ausführen
	adc xh,xh		; Übertrag nach xh berücksichtigen
	lsr xh			; Division durch 2 entspricht Rechtsschieben um ein Bit
	ror xl			; neuer Schwellwert links steht jetzt in xl

; neuen Schwellwert nach SchwelleLinks verschieben
	mov SchwelleLinks,xl

	pop xh
	pop xl
	out SREG,r25
	pop r25
	ret

;*************************************
Analog kannst Du das auch für Mitte und Rechts machen. Weil hier xhl verwendet werden, sparst Du Dir eine Menge Jongliererei mit den Registern (das kommt davon, wenn man .defs arbeitet ). Durch das Auslagern in Prozeduren, bei denen Du die benutzten Register sauber (mit "push" und "pop") sichern kannst, brauchst Du Dir keine Sorgen zu machen, dass Du aus Versehen mal ein mit ".def" belegtes Register überschreibst.

Die Stelle, die jetzt so unübersichtlich aussieht, wird dann ganz übersichtlich:

Code:
; TEIL4...................START.......................
; Falls neue Messung vorgesehen dann mache sie zuerst
	sbic PIND, 2                ;Überprüfe PIND.0
	rjmp Hauptprogramm          ; Wenn PIND.0 = 1 (Taster nicht betätigt) -> keine Messung
	
; Taster betätigt -> Messung
; zuerst die WeissWerte messen
	rcall StartADConChanel0_8bit            ;Messe linken LDR bei weißem Untergrund
	in WeissWertLinks, ADCH
	rcall StartADConChanel1_8bit            ;Messe mittleren LDR bei weißem Untergrund
	in WeissWertMitte, ADCH
	rcall StartADConChanel2_8bit            ;Messe rechten LDR bei weißem Untergrund
	in WeissWertRechts, ADCH
; jetzt die neuen SchwellWerte berechnen
	rcall UPDATE_SCHWELLE_LINKS				; Schwellwert Links fertig
	rcall UPDATE_SCHWELLE_MITTE				; Schwellwert Mitte fertig
	rcall UPDATE_SCHWELLE_RECHTS			; Schwellwert Rechts fertig

rjmp Hauptprogramm                    ; ...und wieder von vorne
Es kann sein, dass Dein Problem damit zu tun hat, dass Du den Inhalt von SREG nicht sicherst. Nur keine Bange vor "push" und "pop" !

Ciao,

mare_crisium