mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Adressierung 24c512 Problem


Autor: Jens (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.