www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega88 EEPROM Problem


Autor: St Ko (motu)
Datum:

Bewertung
0 lesenswert
nicht 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.
const uint8_t EEMEM pwm_table_32[512] = {0x00,0x00,0x08,0x10,0x18,0x20,0x29,0x31,0x39,0x41,0x4A,
                     0x52,0x5A,0x62,0x6A,0x73,0x7B,0x83,0x8B,0x94,0x9C,
                     0xA4,0xAC,0xB4,0xBD,0xC5,0xCD,0xD5,0xDE,0xE6,0xEE,
                     0xF6,0xFF};

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

volatile uint8_t pwm_table[32];

void getPWMTable(void){
  int i=0;
  for(i=1;i<=32;i++){
    eeprom_busy_wait();
    pwm_table[i-1] = eeprom_read_byte((uint8_t*)i);
  }
}

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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
St Ko schrieb:

>
> const uint8_t EEMEM pwm_table_32[512] =
> {0x00,0x00,0x08,0x10,0x18,0x20,0x29,0x31,0x39,0x41,0x4A,
>                      0x52,0x5A,0x62,0x6A,0x73,0x7B,0x83,0x8B,0x94,0x9C,
>                      0xA4,0xAC,0xB4,0xBD,0xC5,0xCD,0xD5,0xDE,0xE6,0xEE,
>                      0xF6,0xFF};
> 
>
> 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
void getPWMTable(void){
  eeprom_read_block( pwm_table, &pwm_table_32[1], sizeof( pwm_table ) );
}


> 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?

Autor: St Ko (motu)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.