Forum: Mikrocontroller und Digitale Elektronik Adressierung 24c512 Problem


von Jens (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.