Forum: Mikrocontroller und Digitale Elektronik Atmega88 EEPROM Problem


von St K. (motu)


Lesenswert?

Hi,
ich arbeite gerade an einem Projekt mit einem Atmega88 und wollte nun 
für einen bestimmten Zweck den EEPROM nutzen.
Und zwar sollen im EEPROM 32 Byte-Werte abgespeichert werden. Diese 
sollen dann beim Start des µC in ein Array geladen werden, also in den 
SRAM. Bei bedarf sollen dann die Werte im EEPROM geändert werden können 
und nei in das Array geladen werden.

Das Problem ist nun, dass das ganze im Simulator vom AVR-Studio super 
klappt, aber nicht im µC.
Ich hab schon gelesen, das ältere avr-lib damit wohl probleme hatte bei 
manchen µC, aber ich nutze das aktuellese winavr zum compilieren und da 
ist auch eine ziemlich aktuelle avr-lib drinne (glaub 1.6.6), weshalb 
ich das mal nicht den Fehler sehe.
1
const uint8_t EEMEM pwm_table_32[512] = {0x00,0x00,0x08,0x10,0x18,0x20,0x29,0x31,0x39,0x41,0x4A,
2
                     0x52,0x5A,0x62,0x6A,0x73,0x7B,0x83,0x8B,0x94,0x9C,
3
                     0xA4,0xAC,0xB4,0xBD,0xC5,0xCD,0xD5,0xDE,0xE6,0xEE,
4
                     0xF6,0xFF};

Das ist quasi mein EEPROM. Ich denke mal so sollte bei Adresse 0 
angefangen werden, wenn ich das Prinzip richtig verstanden habe.

1
volatile uint8_t pwm_table[32];
2
3
void getPWMTable(void){
4
  int i=0;
5
  for(i=1;i<=32;i++){
6
    eeprom_busy_wait();
7
    pwm_table[i-1] = eeprom_read_byte((uint8_t*)i);
8
  }
9
}

Hier lade ich die Werte in das Array zum arbeiten. Die funktion wird 
natürlich auch aufgerufen in main ;)

wenn ich dann mit pwm_table[x] versuche einen wWert auszugeben, dann 
funktioniert das irgendwie nich. Ich hab das ganze mal noch zu 
debug-Zwecken auf einen Atmega8 gepackt und mir die Werte über PortC 
ausgeben lassen, aber da kommt dann quasi immer nur 0xFF raus. Könnte 
mir da bitte jemand weiter helfen.

von Karl H. (kbuchegg)


Lesenswert?

St Ko schrieb:

>
1
> const uint8_t EEMEM pwm_table_32[512] =
2
> {0x00,0x00,0x08,0x10,0x18,0x20,0x29,0x31,0x39,0x41,0x4A,
3
>                      0x52,0x5A,0x62,0x6A,0x73,0x7B,0x83,0x8B,0x94,0x9C,
4
>                      0xA4,0xAC,0xB4,0xBD,0xC5,0xCD,0xD5,0xDE,0xE6,0xEE,
5
>                      0xF6,0xFF};
6
>
>
> Das ist quasi mein EEPROM. Ich denke mal so sollte bei Adresse 0
> angefangen werden,

kann sein, kann auch nicht sein.
Du kannst das aber auch alles so programmieren, das dieser Umstand nicht 
relevant ist.

> volatile uint8_t pwm_table[32];
>
> void getPWMTable(void){
>   int i=0;
>   for(i=1;i<=32;i++){

Gewöhn dir das Herumhantieren mit 1 und <= bei solchen Schleifen 
schleunigst wieder ab.
Du willst 32 Werte laden:

    for( i = 0; i < 32; i++ )
      pwm_table[i] = eeprom_read_byte( &pwm_table_32[i+1] );

aber eigentlich willst du genau soviele Werte laden, wie dein pwm_table 
Array gross ist

#define PWM_SIZE  32
volatile uint8_t pwm_table[ PWM_SIZE ];

...

   for( i = 0; i < PWM_SIZE; i++ )
     pwm_table[i] = eeprom_read_byte( &pwm_table_32[i+1] );


Bleibt nur noch die Frage, warum du nicht einfach eeprom_read_block 
benutzt? Genau dafür ist die Funktion da
1
void getPWMTable(void){
2
  eeprom_read_block( pwm_table, &pwm_table_32[1], sizeof( pwm_table ) );
3
}


> wenn ich dann mit pwm_table[x] versuche einen wWert auszugeben, dann
> funktioniert das irgendwie nich. Ich hab das ganze mal noch zu
> debug-Zwecken auf einen Atmega8 gepackt und mir die Werte über PortC
> ausgeben lassen, aber da kommt dann quasi immer nur 0xFF raus.

Hast du das EEP File auch auf den Controller übertragen?

von St K. (motu)


Lesenswert?

Ahh, ok, man muss natürlich erstmal wissen, dass man die .eep extra 
schreiben muss *grml. Hatte den EEPROM noch nie mit benutzt, aber nun 
gehts :D

Und wegen der for-schleife, das stimmt natürlich auch, ist nur durchs 
rumprobieren so unschön geworden :)
eeprom_read_block ist natürlich auch besser, manchmal is man aber auch 
wie verbohrt ^^

Auf jeden Fall vielen Dank für die schnelle Hilfe :)

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.