mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik EEPROM ATmega32


Autor: Greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: crazy horse (Gast)
Datum:

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

Autor: crazy horse (Gast)
Datum:

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

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Greenhorn,

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

Otto

Autor: crazy horse (Gast)
Datum:

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

Autor: Greenhorn (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

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

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


Autor: Jörg X. (Gast)
Datum:

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

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.