Forum: Mikrocontroller und Digitale Elektronik EEProm lesen funktioniert nicht


von A. B. (developer_x)


Lesenswert?

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

von A. B. (developer_x)


Lesenswert?

Hat jemand eine Idee was ich falsch mache? Liegt es vielleicht daran 
dass ich eine falsche Adresse zum Auslesen eines Bytes aus dem EEPROM 
verwende?

Wie erhalte ich denn die Adresse um "daten" aus dem eeseg zu lesen?

von A. B. (developer_x)


Lesenswert?

Problem gelöst:

Ich habe ganz vergessen die HEX Datei für den EEPROM auf den Chip zu 
laden!

Wichtig:
Erst den Programmspeicher flashen, dann den EEPROM, ansonsten wird der 
EEPROM immer leer sein.

von Gad Z. (gad)


Lesenswert?

Hallo K.R.
na der beitrag war ja bisher ein Selbstgespräch :-)
Aber trotzdem erfolgreich...

Aber wieso erst flahen und dann Eeprom laden?
Ich habe meinen Atmel schun gefühlt hundert Mal geflashed und nie ein 
Eeprom drüber gebügelt und trotzdem sind alle Parameter noch vorhanden.
Es gibt aber beim AVR Studio irgendwo ein Hacken damit der Eprom bei 
Device löschen nicht mit gelöscht wird.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

K. R. schrieb:
> Wichtig:
> Erst den Programmspeicher flashen, dann den EEPROM, ansonsten wird der
> EEPROM immer leer sein.

 Nein.

von Gad Z. (gad)


Lesenswert?

Marc deine Antwort sagt das gleiche wie meine, nur viel kürzer :-)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Gad Zinkler schrieb:
> Marc deine Antwort sagt das gleiche wie meine, nur viel kürzer :-)

 Jahrelang mit meiner Frau trainiert...

von Thomas (kosmos)


Lesenswert?

Du kannst deine EEPROM Daten auch im Code unter .eseg schreiben dann 
wird es gleich mit geflashed mindestens im Avr-Studio.

.ESEG ;* Data table:
.db 0x46 ;data00 = F
.db 0x52 ;data01 = R
.db 0x4F ;data02 = O
.db 0x48 ;data03 = H
.db 0x45 ;data04 = E

.eseg
Data: .db 0x6f, 0x06, 0xab, 0x8f, 0xc6, 0xcd, 0xed, 0x07, 0xef, 0xcf, 
0x01, 0x02, 0x03, 0x04, 0x05, 0x06im Quelltext steht?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.