EEPROM: EEPE bit auslesen scheint nicht zu funktionieren

Gast #832072
Lesenswert?

Hallo, ich hab ein kleines Problem mit meinem ATmega48 (zumindest im 
Simulator)

und zwar möcht dich ein 16bit Integer in mein EEPROM schreiben.
Zunächst hab ich das mit
1
eeprom_write_word()
 aus der eeprom.h gemacht. da wurde nur das lowByte geschrieben. dann 
hab ich die zwei byte einzeln schreiben wollen mit
1
eeprom_write_byte
. da wurde auch nur eines geschrieben, das erste nur je nach dem wierum 
ich das gemacht hab.

dann hab ichs versucht per hand zu machen, analog zum datenblatt, nur 
halt zweimal und nicht einmal:
1
  while(EECR & (1<<EEPE))
2
  ;
3
  EEARL = (uint8_t)ui16address;
4
  EEARH = (uint8_t)(ui16address>>8);
5
  EEDR = (uint8_t)ui16data;
6
  EECR |= (1<<EEMPE);
7
  EECR |= (1<<EEPE);
8
  
9
  while(EECR & (1<<EEPE))
10
  ;
11
  EEARL = (uint8_t)(ui16address-1);
12
  EEARH = (uint8_t)((ui16address-1)>>8);
13
  EEDR = (uint8_t)(ui16data>>8);
14
  EECR |= (1<<EEMPE);
15
  EECR |= (1<<EEPE);

wieder das selbe: nur das erste byte wurde geschrieben, hier das low

nachdem ich die
1
while(EECR & (1<<EEPE))
 durch
1
_delay_ms(10)
 aus der delay.h ersetzt habe hat es funktioniert.


Nun meine Frage(n): hab ich was falsch gemacht? wieso gehn dann die
1
eeprom_write_byte
 und co nicht? liegt es vllt am simulator (avr simulator)?



Schöne grüße und schon mal danke für die hilfe

Christian
Gast #832403
Lesenswert?

danke für den hinweis, bringt aber auch noch keine änderung.

dadurch das es geht wenn ich die whiles durch delays ersetze 
funktioniert, nehme ich an, dass das EEPE byte falsch ausgelesen 
wird/nicht durch die hardwaregesetzt wird. sprich: er dann nicht lange 
genug wartet.

aber trotzdem danke für alle bisherigen kommentare
#832444
Lesenswert?

Spess53 wrote:
> Es gilt generell: Beim Schreiben auf ein 16 Bit Register erst High-Byte
> dann Low-Byte. Beim Lesen eines 16-Bit-Registers erst Low-Byte dann
> High-Byte. Beim ATMega48..168 auf Seite 111 nachzulesen.
Nö, das gilt nicht generell! Eine explizite Reihenfolge bei Schreib- 
oder Lesezugriffen gilt nur bei Registern, die gepuffert sind 
(Timer/Counter-Register) oder bei denen eine Blockierung durchgeführt 
wird (ADC-Datenregister), um sicherzustellen, dass ein ausgelesener 
Inhalt konsistent ist. Bei den EEPROM-Adressregistern trifft nichts von 
beidem zu. Es würde sonst bei der Register-Beschreibung erwähnt. Weshalb 
steht die von Dir zitierte Erklärung wohl im Abschnitt über die 
Timer/Counter?
Gast #832464
Lesenswert?

>Hallo, ich hab ein kleines Problem mit meinem ATmega48 (zumindest im
>Simulator)

Wenn es im ATmega48 problemlos funktioniert, kann es nur noch
am Simulator liegen. Also immer auch mal das Programm in den uC
brennen und dort testen. Spart ne Menge Zeit wenn es im uC
dann funktioniert.

Simulatoren sind ein Stück Software.
Und Software hat immer Bugs oder Einschränkungen :(

Mein Tip: Statt simulieren, ausprobieren !
So spart man sich ne Menge Ärger.
Gast #832928
Lesenswert?

Also gut, danke für die Unterstützung, aber es hatte anscheinend einen 
anderen gund:
ich hab die while durch eine for-schleife ersetzt:
1
 bTemp = (EECR & 1<<EEPE);
2
  for(;bTemp;bTemp = (EECR & 1<<EEPE))
3
    ;
was meiner Ansicht nach das selbe ist.
Draufgekommen bin ich, weil senden über SPI und warten bis er fertig ist 
auch net funktioniert hat.

@Jörg: Das mit Simulator Version 2 hab ich auch schon drangedacht, aber 
da gibts keinen ATmega48/88, nur den ATmega48/88P. Macht das einen 
Unterschied?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren