Hallo, ich beschäftige mich momentan mit einem Temperaturlogger. Das Speichern der Werte im internen EEPROM des ATMEGA32 funktioniert schon tadellos. Da aber der Speicherplatz dieses EEPROMs etwas begrenzt ist, habe ich mir vorgenommen, die Daten in ein externes EEPROM (24c512) zu speichern. Für mich sind dies die ersten Erfahrungen mit dem I2C-Bus. Daher habe ich bis jetzt nur mit den Grundlagen beschäftigt und ein kleines Testprogramm geschrieben (angelehnt an die Lib von Peter Fleury), aber leider kann ich das folgende Problem nicht lösen. Hierzu mein kleines Programm, welches 20 Speicherzellen des EEPROMs beschreiben soll und die Werte dann aus dem EEPROM ausslesen und auf dem LCD ausgeben soll. #define F_CPU 3276800L #include <stdlib.h> #include <avr/io.h> #include <inttypes.h> #include <string.h> #include <avr/pgmspace.h> #include <util/delay.h> #include "lcd.h" #include <avr/interrupt.h> #include <avr/eeprom.h> #define BAUD 600UL #define UBRR_BAUD ((F_CPU/(16L*BAUD))-1) #include "i2cmaster.h" #define Dev24C512 0xA0 // device address of EEPROM 24C512, see datasheet int main(void) { unsigned char val, ret; int addr; char buf[10]; uint8_t i; DDRC |= (1 << DDC2) | (1<<DDC3) | (1<<DDC4) | (1<<DDC5) | (1<<DDC6); //LEDs PORTC |= (1<<PC6); //Hintergrundbeleuchtung lcd_init(LCD_DISP_ON); lcd_clrscr(); lcd_gotoxy(0,0); i2c_init(); // init I2C interface addr=0; val=0; ret = i2c_start(Dev24C512+I2C_WRITE); // set device address and write mode if ( ret ) { /* failed to issue start condition, possibly no device found */ lcd_puts("failed to issue start condition, possibly no device found.\n"); i2c_stop(); } else { //Werte in EEPROM schreiben for (i=1;i<20;i++) { addr++; val++; itoa(val,buf,10); lcd_puts(buf); ret = i2c_write( (addr/256) ); // write high address if (ret!=0) lcd_puts("ERROR"); ret = i2c_write( (addr%256) ); // write low address if (ret!=0) lcd_puts("ERROR2"); ret = i2c_write(val); // ret=0 -> Ok, ret=1 -> no ACK if (ret!=0) lcd_puts("ERROR3"); } addr=0; for (i=1;i<20;i++) { i2c_start_wait(Dev24C512+I2C_WRITE); // set device address and // write mode addr++; ret = i2c_write( (addr/256) ); // write high address ret = i2c_write( (addr%256) ); // write low address i2c_rep_start(Dev24C512+I2C_READ); // set device address and // read mode ret = i2c_readNak(); // read one byte i2c_stop(); // set stop conditon = //release bus itoa(ret,buf,10); lcd_puts(buf); } } } ______________________________________________________________________- Das Programm arbeitet ohne Fehlermeldung. Jedoch sind die Ausgaben auf dem LCD sehr merkwürdig: 123456789101112131415161718192222222222002222222222222222222210211112032 Den ersten Ausgabeteil verstehe ich selbstverständlich noch, aber dann wird es sehr rätselhaft. Ein Hardwarefehler kann ich eigentlich ausschließen. Die Pull-up Widerstände (3k3) sind verbaut. Mache ich irgendetwas in der Adressierung des Speicherortes falsch? Oder ist sonst ein Fehler versteckt? Ich habe das Programm schon mehrmals durchsucht. Leider bin ich mit meinem Latein am Ende. Für Hilfe wäre ich sehr dankbar. Gruß Jens
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.