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.
Analog kannst Du das auch für Mitte und Rechts machen. Weil hier xhCode:/* 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 ;*************************************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:
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"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!
Ciao,
mare_crisium







Zitieren

Lesezeichen