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