Liebes Forum, ich habe einen ATmega32 und habe ein Programm mit Assembler geschrieben. Ich will aus meinem EEprom das erste von 8 Bytes laden, und an PortD ausgeben. Doch leider wird an PortD ständig 0b11111111 ausgegeben, kann mir jemand sagen warum?
1 | .include "m32def.inc" ; Definitionsdatei |
2 | |
3 | .cseg // Programm Code für den Flash Speicher |
4 | |
5 | // Deklaration von Konstanten ////////////////////////////////////// |
6 | .equ anim_res = 8 |
7 | |
8 | // Definitionen //////////////////////////////////////////////////// |
9 | .def Count1 = R16 |
10 | |
11 | .def WaitCount1 = R17 |
12 | .def CharAddr1 = R18 |
13 | .def CharAddr2 = R19 |
14 | .def AnimCount = R23 |
15 | |
16 | .def Xc = R20 |
17 | .def Yc = R21 |
18 | .def Zc = R22 |
19 | |
20 | // Stackpointer initialisieren |
21 | LDI R16, low(RAMEND) |
22 | OUT SPL, R16 |
23 | LDI R16, high(RAMEND) |
24 | OUT SPH, R16 |
25 | |
26 | // Hauptroutine //////////////////////////////////////////////////// |
27 | MAIN: |
28 | |
29 | // Chip initialisieren |
30 | RCALL INIT |
31 | |
32 | // Starte Animationsschleife |
33 | RCALL ANIMATION_LOOP |
34 | |
35 | RJMP MAIN |
36 | // ////////////////////////////////////////////////////////////////// |
37 | |
38 | // Initialisierung ///////////////////////////////////////////////// |
39 | INIT: |
40 | |
41 | // I/O Port Richtung definieren |
42 | LDI R16, 0xFF |
43 | OUT DDRA, R16 |
44 | OUT DDRB, R16 |
45 | OUT DDRC, R16 |
46 | OUT DDRD, R16 |
47 | |
48 | // EEPROM Zeiger Adresse resetten |
49 | LDI CharAddr1,high(daten) ; Z-Zeiger laden |
50 | LDI CharAddr2,low(daten) |
51 | |
52 | // Z Byte löschen |
53 | LDI Zc,0b00000000 |
54 | |
55 | RET |
56 | // ////////////////////////////////////////////////////////////////// |
57 | |
58 | // ANIMATION_LOOP /////////////////////////////////////////////// |
59 | ANIMATION_LOOP: |
60 | RCALL Display_CHAR |
61 | RJMP ANIMATION_LOOP |
62 | |
63 | // Zeige Symbol an |
64 | DISPLAY_CHAR: |
65 | // Y-Coordinate zurücksetzen |
66 | RCALL RESET_Y_COORD |
67 | RCALL RESET_X_COORD |
68 | |
69 | LDI AnimCount,anim_res |
70 | DISPLAY_CHAR_sub1: |
71 | // LOAD_Z_Byte |
72 | RCALL LOAD_Z_BYTE |
73 | |
74 | // Warte 10 µS |
75 | RCALL Wait_10_muS |
76 | ;LDI Zc,0b00000000 |
77 | |
78 | // Bewege X Coordinate um 1 |
79 | RCALL NEXT_X_COORD |
80 | |
81 | DEC AnimCount |
82 | BRNE DISPLAY_CHAR_sub1 |
83 | RET |
84 | |
85 | // Lade Z_Byte aus EEProm Char |
86 | LOAD_Z_BYTE: |
87 | SBIC EECR,EEWE ; prüfe ob der vorherige Schreibzugriff |
88 | ; beendet ist |
89 | RJMP LOAD_Z_BYTE ; nein, nochmal prüfen |
90 | |
91 | OUT EEARH, CharAddr1 ; Adresse laden |
92 | OUT EEARL, CharAddr2 |
93 | SBI EECR, EERE ; Lesevorgang aktivieren |
94 | IN Zc, EEDR ; Daten in Z-Byte ablegen |
95 | OUT PORTD, Zc |
96 | RET |
97 | |
98 | // ////////////////////////////////////////////////////////////////// |
99 | // ... |
100 | ///////////////////////////////////////////////////////////////////// |
101 | |
102 | .eseg // Daten der 8x8 Chars für das 2D Animationssystem |
103 | daten: |
104 | .db 0b00011000 |
105 | .db 0b00100100 |
106 | .db 0b01000010 |
107 | .db 0b10000001 |
108 | .db 0b10000001 |
109 | .db 0b01000010 |
110 | .db 0b00100100 |
111 | .db 0b00011000 |
Danke für eure Hilfe, m.f.G.: Developer_x