Hi, nicht vergessen die defines in der c datei anzupassen. Untertsutzt eeprom löschen,schreiben und lesen. Gruesse peter
Hi, schon 50 DL und kein comment ist der code wirklich so schlecht? ;-)
Hallo, ein paar komentare im Quellcode wären nicht schlecht. Damit man ihn verstehen kann. Gruß Peter
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
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ö
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.
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
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
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
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(;;); } /************************************************************/
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.