Serieller EEPROM AT24C64

Gast #102409
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ö
Gast #102411
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
Gast #102412
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
Gast #102413
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
Gast #102414
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(;;);
}
/************************************************************/
Gast #102415
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

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.