Hallo, ich arbeite mit einem ATMega32 und dem Display EA DOGM128W-6. Irgendwie bin ich zu blöd einen String "BOOT" in der Bootloadersection (ab 0x7c00)an eine Funktion zu geben. Hier der relevante Auszug aus dem LSS File:
1 | char *text = "BOOT"; |
2 | boot_display(text); |
3 | 7cd6: 80 e3 ldi r24, 0x30 ; 48 |
4 | 7cd8: 94 e0 ldi r25, 0x04 ; 4 |
5 | 7cda: 0e 94 d9 3e call 0x7db2 ; 0x7db2 <boot_display> |
6 | |
7 | display_char('y'); |
8 | 7cde: 89 e7 ldi r24, 0x79 ; 121 |
9 | 7ce0: 0e 94 a1 3e call 0x7d42 ; 0x7d42 <display_char> |
10 | 7ce4: ff cf rjmp .-2 ; 0x7ce4 <main+0x22> |
11 | |
12 | .... |
13 | |
14 | |
15 | void boot_display(char *str) |
16 | { |
17 | 7db2: 0f 93 push r16 |
18 | 7db4: 1f 93 push r17 |
19 | 7db6: 8c 01 movw r16, r24 |
20 | |
21 | display_char(str[0]); |
22 | 7db8: fc 01 movw r30, r24 |
23 | 7dba: 80 81 ld r24, Z |
24 | 7dbc: 0e 94 a1 3e call 0x7d42 ; 0x7d42 <display_char> |
25 | display_char(str[1]); |
26 | 7dc0: f8 01 movw r30, r16 |
27 | 7dc2: 81 81 ldd r24, Z+1 ; 0x01 |
28 | 7dc4: 0e 94 a1 3e call 0x7d42 ; 0x7d42 <display_char> |
29 | display_char(str[2]); |
30 | 7dc8: f8 01 movw r30, r16 |
31 | 7dca: 82 81 ldd r24, Z+2 ; 0x02 |
32 | 7dcc: 0e 94 a1 3e call 0x7d42 ; 0x7d42 <display_char> |
33 | display_char(str[3]); |
34 | 7dd0: f8 01 movw r30, r16 |
35 | 7dd2: 83 81 ldd r24, Z+3 ; 0x03 |
36 | 7dd4: 0e 94 a1 3e call 0x7d42 ; 0x7d42 <display_char> |
37 | } |
Das "y" wird einwandfrei auf dem Display ausgegeben. Der Text "BOOT" wird nur "OT" ausgegeben. Die beiden letzten ZEichen fehlen immer. Sieht jemand woran das liegt? Wenn ich anstatt display_char(str[0]); display_char('B'); und display_char(str[1]); display_char('O'); und display_char(str[2]); display_char('O'); und display_char(str[3]); display_char('T'); schriebe, dann funktioniert es. Also muss es an der übergabe des Textes per Pointer an boot_display(char *str) ein Problem geben. Was macht diese Zeile: 7dba: 80 81 ld r24, Z und woher kommt "Z"? Ich hoffe jemand kann mir da weiterhelfen... Danke!! Max