Forum: Mikrocontroller und Digitale Elektronik EEPROM ATmega32


von Greenhorn (Gast)


Lesenswert?

Hallo,

ich hoffe jemand kann mir die Frage schnell beantworten. Warum gibt er 
mir immer 0xFF aus?

************************************************************************ 
***************
                                   Definitionen:
************************************************************************ 
***************/
#ifndef F_CPU
#define F_CPU  4000000
#endif
/*********************************************************************** 
****************
                                   Bibliotheken:
************************************************************************ 
***************/
#include <avr/io.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/interrupt.h>
#include <util/delay.h>
/*********************************************************************** 
****************
                                   Globale Variablen:
************************************************************************ 
***************/
unsigned int i=0;

/*********************************************************************** 
****************
                                   Funktion: EEPROM-Werte speichern
************************************************************************ 
***************/
void eeprom_write()
{
while(EECR & (1<<EEWE))
     {
   }
EEAR =0;
EEDR =49;
EECR|=(1<<EEMWE) | (0<<EEWE);
EECR|=(1<<EEWE);
}
/*********************************************************************** 
****************
                                   Funktion: EEPROM-Werte speichern
************************************************************************ 
***************/
void eeprom_read()
{
while(EECR & (1<<EEWE))
     {
   }
EEAR =0;
EECR|=(1<<EERE);
i=EEDR;
}
/*********************************************************************** 
****************
                                   Funktion: RS232-Senden
************************************************************************ 
***************/
void rs232_senden()
{
UBRRH=0;
UBRRL=12;
UCSRB=(1<<TXEN);
UCSRB=(1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0) | (1<<USBS);
while(!(UCSRA & (1<<UDRE)))
     {
   }
UDR=i;
_delay_ms(50);
}
/*********************************************************************** 
****************
                                   Main-Funktion:
************************************************************************ 
***************/
int main(void)
{
eeprom_write();
while(1)
{
eeprom_read();
rs232_senden();
}
return 0;
}

von crazy horse (Gast)


Lesenswert?

habe jetzt keine Lust zu suchen, aber hier mal ein Ausschnitt aus dem 
Listuíng eines Compilers (und das funktioniert!), damit solltest du es 
leicht finden.

                 __EEPROMRDB:
000088 99e1        SBIC EECR,EEWE
000089 cffe        RJMP __EEPROMRDB
00008a 93ff        PUSH R31
00008b b7ff        IN   R31,SREG
00008c 94f8        CLI
00008d bbae        OUT  EEARL,R26
00008e bbbf        OUT  EEARH,R27
00008f 9ae0        SBI  EECR,EERE
000090 b3ed        IN   R30,EEDR
000091 bfff        OUT  SREG,R31
000092 91ff        POP  R31
000093 9508        RET

                 __EEPROMWRB:
000094 99e1        SBIC EECR,EEWE
000095 cffe        RJMP __EEPROMWRB
000096 b79f        IN   R25,SREG
000097 94f8        CLI
000098 bbae        OUT  EEARL,R26
000099 bbbf        OUT  EEARH,R27
00009a 9ae0        SBI  EECR,EERE
00009b b38d        IN   R24,EEDR
00009c 17e8        CP   R30,R24
00009d f019        BREQ __EEPROMWRB0
00009e bbed        OUT  EEDR,R30
00009f 9ae2        SBI  EECR,EEMWE
0000a0 9ae1        SBI  EECR,EEWE
                 __EEPROMWRB0:
0000a1 bf9f        OUT  SREG,R25
0000a2 9508        RET

von crazy horse (Gast)


Lesenswert?

Und ansonsten solltest du ganz schnell deinen Programmierstil umstellen:
z.B.
void eeprom_read()
dort übergibt man Adresse und bekommt auch das Ergebnis zurück.

unsigned char eprom_read (unsigned in adresse){
.
.
return value;
}

i=EEDR;
sowas geht gar :-)

Sieht so aus, als hättest du deine ersten Programmierversuche in Basic 
unternommen? :-), keinen Streit bitte.

von Otto (Gast)


Lesenswert?

Hallo Greenhorn,

hast Du denn etwas anderes als FF reingeschrieben?
Defaultmäßig steht alle Zellen auf diesem Wert.

Otto

von crazy horse (Gast)


Lesenswert?

Und noch als letztes: das hatte jetzt nichts mit deinem eigentlichen 
Problem zu tun, das liegt tatsächlich an der Schreib- oder Leseroutine. 
Ich bin mir sicher, du findest es selbst.

von Greenhorn (Gast)


Lesenswert?

Hallo,

merkwürdiger weise funktioniert das Programm wenn ich den 
Optimierungsgrad verändere. Auf 02 klappt es, auf 00 leider nicht.

von Karl H. (kbuchegg)


Lesenswert?

Das hier

> EECR|=(1<<EEMWE) | (0<<EEWE);

setzt EEWE nicht auf 0

Ein Bit wird gesetzt indem man mit der Bitnummer ver-oder-t
Ein Bit wird gelöscht, indem mit mit der invertierten
Bitmaske ver-und-et.

  EECR |= 1 << EEWE;        // setzt das EEWE Bit
  EECR &= ~( 1 << EEWE );   // löscht das EEWE Bit


von Jörg X. (Gast)


Lesenswert?

... und in der USART-Sende-Funktion ist ein Schreibfehler drin: du 
willst wahrscheinlich UCSRB und UCSR_C_ initialisieren!
wie wärs, wenn du die Funkitonen aus dem Tut. (genau, der komische Link 
oben links, "AVR-GCC-Tutorial" ;-) ) übernimmst/nachbaust ?

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.