Forum: Projekte & Code Serieller EEPROM AT24C64


von peter (Gast)


Angehängte Dateien:

Lesenswert?

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

von peter (Gast)


Lesenswert?

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

von Peter Zimmer (Gast)


Lesenswert?

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

von Peter D. (peda)


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

von Hagen (Gast)


Lesenswert?


von Sirko Pöhlmann (Gast)


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ö

von Codered (Gast)


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.

von Dirk (Gast)


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

von Peter (Gast)


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

von Dirk (Gast)


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

von Waleed (Gast)


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(;;);
}
/************************************************************/

von pebisoft (Gast)


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

von pebisoft (Gast)


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

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.