Forum: Mikrocontroller und Digitale Elektronik EEPWriteWord Probleme


von iGast (Gast)


Lesenswert?

Hallo,

beschäftige mich gerade mit dem EEProm des Atmega32 und nutze dabei das 
AVR GCC Tutorial. Leider habe ich nun ein Problem. Lesen und Schreiben 
von Bytes in das EEProm immer in die nächst höhere Adresse ist kein 
Problem.

Nun möchte ich aber ein Word nutzen und habe dazu den Quellcode wie 
folgt geändert:
1
#include <avr/io.h>
2
#include <avr/eeprom.h>
3
4
uint16_t adresse=0;
5
uint16_t wert=0;
6
int test;
7
8
int main(void)
9
{
10
    DDRA=0x00;
11
DDRB=0xff;
12
  
13
  // Byte aus dem EEPROM lesen
14
  uint8_t EEPReadWord(uint16_t addr)
15
  {
16
    return eeprom_read_word((uint8_t *)addr);
17
  }
18
  
19
  // Byte in das EEPROM schreiben
20
  void EEPWriteWord(uint16_t addr, uint16_t val)
21
  {
22
    eeprom_write_word((uint8_t *)addr, val);
23
  }
24
  
25
    
26
  while(1)
27
    {  
28
      
29
    if ( PINA & (1<<PINA1))
30
    {
31
      EEPWriteWord(adresse,wert);
32
      
33
      wert++;
34
    }
35
    
36
    if ( PINA & (1<<PINA0))
37
    {
38
      
39
      PORTB=EEPReadWord(adresse);
40
      
41
      adresse++;
42
      
43
    }     
44
    }
45
  return 0;
46
}

Wenn ich nun Debugge mit der Simulation, dann bleibt das Programm beim 
schreiben hängen. Im Dissasembly Fenster springt er Programmcursor nun 
zwischen den beiden Befehelen hin und her:

00000082  SBIC 0x1C,1    Skip if bit in I/O register cleared
--- No source file 
-------------------------------------------------------------
00000083  RJMP PC-0x0001    Relative jump

Was ist in meinem Code falsch?

Und wenn ich z.B. die <avr/eeprom.h> einbinde, wo finde ich dann den 
Quellcode mit den Funktionen?

: Bearbeitet durch User
von Chris (Gast)


Lesenswert?

also bei EEPReadWord() ein uint8_t zurück zu geben ist nicht so klug...

von Oliver (Gast)


Lesenswert?

Mir allem nötigen Respekt glaube ich dir kein Wort.

Der oben gezeigten Code wird kein C-Compiler dieser Welt kompilieren. 
Bis zum Debugger bist du damit nie gekommen.

Oliver

von iGast (Gast)


Lesenswert?

Er läuft bis zur der gezeigten Stelle. Warum sollte er nicht laufen?
Okay habe EEPReadWord() auf uint16_t geändert. Es erscheint weiterhin 
das Dissambly Fenster und der Programmzeiger springt zischen den beiden 
Anweisungen.

00000082  SBIC 0x1C,1    Skip if bit in I/O register cleared
00000083  RJMP PC-0x0001    Relative jump

von Karl H. (kbuchegg)


Lesenswert?

Der gcc akzeptiert eingebettete Funktionen.

Was ich mich aber gerade frage:
Kann der Simulator eigentlich das EEPROM korrekt simulieren?
1
SBIC 0x1C,1
0x1C ist auf dem Mega32 das Register EECR, mit dem die Steuerung des 
EEPROM gemacht wird.

von iGast (Gast)


Lesenswert?

Wenn ich es mit EEPWriteByte mache und alles angepasst ist, läuft es 
ohne Probleme.

Also dachte ich wenn Byte geht, muss es mit Word ähnlich funktionieren.

Ich möchte später im EEProm ein uint16_t Wert ablegen. Um die 
Schreibzyklen im EEProm zu erhöhen sollen diese immer an einem anderen 
Speicherort abgelegt werden.

von iGast (Gast)


Lesenswert?

Hallo,

hat keiner eine Erklärung?

Oder wie macht Ihr das mit Word Daten im EEProm?

von Stefan E. (sternst)


Lesenswert?

iGast schrieb:
> und der Programmzeiger springt zischen den beiden
> Anweisungen.

Wenn der Simulator auch das zeitliche Verhalten des EEPROM simuliert, 
dann wird er auch etliche Male hin und her springen, bevor es 
weitergeht. Setze mal einen Breakpoint dahinter und lass den Simulator 
dann frei laufen.

von Steffen (Gast)


Lesenswert?

iGast schrieb:
> int main(void)
> {
>
>   // Byte aus dem EEPROM lesen
>   uint8_t EEPReadWord(uint16_t addr)
>   {
>     return eeprom_read_word((uint8_t *)addr);
>   }
>
>   // Byte in das EEPROM schreiben
>   void EEPWriteWord(uint16_t addr, uint16_t val)
>   {
>     eeprom_write_word((uint8_t *)addr, val);
>   }
>

Was hast das im Main zu suchen?

von iGast (Gast)


Lesenswert?

hallo, danke für die Antwort. wo empfiehlst du den einen breakpoint du 
wie ptogrammiert man diesen?

von iGast (Gast)


Lesenswert?

Habe das Programm zum Testen in der Main stehen. Es ist ausschließlich 
eine Testroutine

von Steffen (Gast)


Lesenswert?

iGast schrieb:
> Habe das Programm zum Testen in der Main stehen. Es ist ausschließlich
> eine Testroutine

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM

von iGast (Gast)


Lesenswert?

Steffen schrieb:
>> Habe das Programm zum Testen in der Main stehen. Es ist ausschließlich
>> eine Testroutine
>
> http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#EEPROM

Hallo,

habe ich was überlesen im Tutorial?

Vielleicht gibt mir jemand eine Erleuchtung in dieser dunklen Jahreszeit

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.