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 xh
l 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
Lesezeichen