mikrocontroller.net

Forum: Projekte & Code Serieller EEPROM AT24C64


Autor: peter (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
nicht vergessen die defines in der c datei anzupassen.
Untertsutzt eeprom löschen,schreiben und lesen.
Gruesse
peter

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
schon 50 DL und kein comment ist der code wirklich so schlecht? ;-)

Autor: Peter Zimmer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ein paar komentare im Quellcode wären nicht schlecht. Damit man ihn
verstehen kann.
Gruß
Peter

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einen EEPROM braucht man nicht löschen, das verkürzt nur die Anzahl der
Schreibzyklen.

Dagegen sollte man aber das blockweise Lesen und Schreiben ausführen,
das spart nämlich ne Menge Zeit.

Z.B. siehe hier:

http://www.specs.de/~danni/appl/soft/c51/eeprom/index.htm


Peter

Autor: Hagen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Sirko Pöhlmann (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich sehe das da ein Großteil in Assembler läuft, und Pollingverfahren
nutze ich auch, eventuell kann mir einer von euch im M&E Forum
weiterhelfen.
Ansonsten Admin bitte löschen, ist kein konstruktiver Beitag...
byPö

Autor: Codered (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich möchte mit einem AVR 90S8535 ein I2C-EEPROM Typ 24C64 ansteueren.
Wie muss ich die beiden Chips verbinden?
Gibt es hier jemand der einen C-Code dafür schon hat.
Ich programmiere mit dem CodeVisionAVR.

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Peter,

ich verstehe nicht ganz in welcher Weise Deine defines geändert werden
müssen. Ich bekomme Fehlermeldungen zu PORTB, PINB, DDRB...

Hast Du den Code evtl. als kommentierte Version??

Gruß

Dirk

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
also PORTB steht für die Adresse des Portes wo der EEPROM angeschlossen
ist. PINB für die Eingangsdaten und DDRB für die
EIN/AUSgangsregister(beim Imagecraft compiler, bei anderen sind die
NAmen vielleicht anders). SCL ist der Pin für den Clock und SDA der für
die Daten. SCLFreq für 8 MHZ wäre dann 80 statt wie im Quellcode 40 bei
16 MHz. In READ und WRITE ist die Adresse des EEPROMS mit drinnen(im
Beispiel Adresse 0b000).
Gruss
Peter

Autor: Dirk (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

dann habe ich alles richtig abgeändert, aber irgendwie bekomme ich das
nicht hin :-(

Ich benutze ein C32 EEPROM, aber das wird doch genau wie das C64 EEPROM
adressiert. Ich arbeite übrigens mit dem WinAVR C Compiler. Bisher habe
ich nur mit den Peter Fleury Biblitheken ein 512 Byte EEPROM zum laufen
bekommen. Ein großes will einfach nicht...

Gruß

Dirk

Autor: Waleed (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo all,
ich versuche die ganze Zeit, mit Hilfe von Peters Programm einen eeprom
zu beschreiben und davon auszulesen, es hat aber leider nicht geklapt,
hat jemand vielleicht eine Idee, wie man das macht.
Ich benutze also AVR AT90s8515 und den seriellen EEPROM 24C32A
es wäre sehr gut,wenn jemand ein Test Programm dafür hat.
Das ist das Programm:
/*******************************************************/
#include <avr/io.h>

typedef unsigned char byte;
typedef unsigned int word;

#define PORTOut PORTB
#define PORTIn PINB
#define PORTDirection DDRB

#define SCL 0x02
#define SDA 0x04

//entspricht 400 KHz bei 16 MHz Prozessortakt
#define SCLFreq 40

//für EEPROM mit Adresse 000
#define WRITE 0xA0
#define READ 0xA1
int WriteEEPROM(unsigned char data, unsigned short addr);
unsigned char ReadEEPROM(short addr);
void EraseEEPROM(void);
void WaitHalfCycle(void);
char GetAck(void);
void StartEEPROM(void);
void StopEEPROM(void);
int WriteByteEEPROM(unsigned char data);
unsigned char ReadByteEEPROM(void);
void delay (unsigned int);
/**************************************************************/
void WaitHalfCycle(void){
int x;

for(x=0;x<(SCLFreq/2);x++);
}
/*************************************************************/
char GetAck(){
int status=1;
WaitHalfCycle();
PORTDirection &= ~SDA;
PORTOut &= ~SCL;
WaitHalfCycle();
PORTOut |= SCL;
if((PORTIn & SDA) == 0){
status=0;
}
PORTOut &=~ SCL;
WaitHalfCycle();
PORTDirection |= SDA;
return status;
}
/****************************************************************/
void StartEEPROM(void){
PORTOut |= SDA;
PORTOut |= SCL;
WaitHalfCycle();
PORTOut &= ~ SDA;
WaitHalfCycle();
}
/*****************************************************************/
void StopEEPROM(void){
int x;
PORTOut &= ~SDA;
PORTOut |= SCL;
WaitHalfCycle();
PORTOut |= SDA;
for(x=0;x<=250;x++){
WaitHalfCycle();}
}
/*****************************************************************/
int WriteByteEEPROM(unsigned char data){
int x;

for(x=0;x<=7;x++){
PORTOut &=~ SCL;
WaitHalfCycle();
switch(((data << x)& 0x80)){
 case 0x00:
  PORTOut &= ~SDA;
 break;
 case 0x80:
 PORTOut |= SDA;
 break;
 }
PORTOut |= SCL;
WaitHalfCycle();
}
return(GetAck());
}
/*************************************************************/
unsigned char ReadByteEEPROM(){
int x;
unsigned char data=0x00;

for(x=0;x<=7;x++){
PORTOut &=~ SCL;
WaitHalfCycle();
PORTOut |= SCL;
WaitHalfCycle();

if((PORTIn & SDA) == 0x00){
data &= ~0x01;
}
else data |= 0x01;
if(x<7){
data=(data << 1) ;}
}
GetAck();
return(data);
}
/*************************************************************/
int WriteEEPROM(unsigned char data, unsigned short addr){
int status=1;
PORTDirection |= SCL;
PORTDirection |= SDA;
StartEEPROM();
status  = WriteByteEEPROM(WRITE);
status += WriteByteEEPROM(0x1F & (addr>>8));
status += WriteByteEEPROM(0xFF & addr);
status += WriteByteEEPROM(data);
StopEEPROM();
if(status == 0){
return (0);
}
else return (1);
}
/**************************************************************/
unsigned char ReadEEPROM(short addr){
int status =1;
unsigned char data;
PORTDirection |= SCL;
PORTDirection |= SDA;
StartEEPROM();
status  = WriteByteEEPROM(WRITE);
status += WriteByteEEPROM(0x1F & (addr>>8));
status += WriteByteEEPROM(0xFF & addr);
StartEEPROM();
status  += WriteByteEEPROM(READ);
PORTDirection &= ~SDA;
data = ReadByteEEPROM();
StopEEPROM();

return (data);
}
/*************************************************************/
void EraseEEPROM(void){
short x;
for(x=0x0000;x<=0x1FFF;x++){
if(WriteEEPROM(0xFF,x)!=0){break;}
}
}
/************************************************************/
/*Time delay sub_routine*/
void delay(unsigned int time){
unsigned int i=0,j=0;
for (i=0;i < time;++i)
for (j=0;j < 2000;++j);
}
/************************************************************/
int main(void){
DDRA=0xff;
unsigned char waleed=0;
WriteEEPROM(0b10101010,0x0000);//Byte 0x0000 beschreiben
waleed=ReadEEPROM(0x0000);//und wieder auslesen
outp(waleed,PORTA);//dann auf PORTA präsentieren!!
for(;;);
}
/************************************************************/

Autor: pebisoft (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo, peter, kannst du bitte mal eien fertige version für den 24c64
schreiben. da du den entwurf gemacht hast, weisst du vielleicht auch
warum es bei uns nicht geht. wäre dir dankbar. wäre froh, wenn ich mein
i2c eeprom 24c256 beschreiben könnte. danke
mfg pebisoft

Autor: pebisoft (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo peter, bei mir geht das beschreiben auf einen 24c256 noch nicht.
kannst du dich noch einmal melden für die fehlersuche.
oder hast du das programm noch einmal geändert.
mfg pebisoft

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.