Hallo,
Zum Verständnis:
Mein Code funktioniert aber ich wollte ihn weiter optimieren/kürzen.
Das Codeschnipsel um das es geht ist eine Ausgabe eines Strings auf das
LCD.
Einmal vom Programmspeicher und einmal vom SRAM.
Der Z-Pointer zeigt auf den Speicher - mit 0 endet der String.
Erst mal der funktionierende Code:
1 | LCD_string: lpm accu,z+
|
2 | tst accu ;ab hier gleich
|
3 | breq LCD_end
|
4 | rcall LCD_data
|
5 | rjmp pc-4
|
6 |
|
7 | LCD_stringram:
|
8 | ld accu,z+
|
9 | tst accu ;mit diesem Segment
|
10 | breq LCD_end
|
11 | rcall LCD_data
|
12 | rjmp pc-4
|
13 |
|
14 | LCD_end: ret
|
Der einzige Unterschied ist der Befehl lpm zu ld.
Meine Idee war dass ich ein Flag setze um zu unterscheiden von wo ich
den String lese.
1 | LCD_string:
|
2 | sbrc flags,ram
|
3 | ld accu,z+
|
4 | sbrs flags,ram
|
5 | lpm accu,z+
|
6 | tst accu
|
7 | breq LCD_end
|
8 | rcall LCD_data
|
9 | rjmp LCD_string
|
10 | LCD_end:
|
11 | ret
|
zum testen habe ich ein string in der ersten Zeile mit flags,ram gesetzt
und die 2.te Zeile ohne.
1 | LCD_ausgabe:
|
2 | cursor,0,0 ;cursor auf erste stelle und 1 zeile
|
3 | ldi zl,low(tempcopy) ;lade Z-pointer auf Tempcopy im SRAM
|
4 | ldi zh,high(tempcopy) ;
|
5 | sbr flags,ram ;flag setzen
|
6 | rcall LCD_string ;Ausgabe Sram - LCD
|
7 | cursor,0,1 ;cursor auf erste stelle und zweite zeile
|
8 | ldi zl,low(Time_error*2) ;lade Z-pointer auf text im Programmspeicer
|
9 | ldi zh,high(Time_error*2) ;
|
10 | cbr flags,ram ;flag setzen
|
11 | rcall LCD_string ;Ausgabe SRAM - LCD
|
12 | ret
|
Die zweite Zeile funktioniert richtig....die erste nicht... Warum ?!?
Danke im Vorraus