mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PCF8591 an ATTiny2313 - I2C-Bus


Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich habe schon das Forum und Google durchsucht, ich finde leider nix.

Ich habe einen A/D-Wandler PCF8591 an einen ATTiny2313 angeschlossen.
Ich bekomme aber die Werte nicht ausgelesen.

Der Bus scheint vorhanden zu sein, da schon mal "> I2C - OK <" auf dem 
Display erscheint. Allerdings erscheint die Meldung auch, wenn ich die 
Adresse #define PCF8591   0b10010000 auf #define PCF8591   0b10010011 
ändere.
Wenn ich die Masse des PCF8591 entferne, kommt "> I2C - Error <".

Aber ich bekomme immer nur die 4 Analogwerte "238,238,238,236" 
angezeigt.
Habe auch schon den IC getauscht.
Diese Werte werden allerdings auch bei "> I2C - Error <" angezeigt.

Bin echt ratlos. Das Probleme mit dem PCF8591 habe ich schon oft im 
Forum gefunden, aber leider keine Lösung....

PS: Am 1. Eingang ist ein Poit (0-5V), die anderen sind unbelegt...
    SDA & SCL sind mit PullUp-Widerständen 4,7k angeschlossen

#define PCF8591   0b10010000    // Grundadresse aus Datenblatt 

void main()
{
  unsigned char ret;
  char Buffer[10];

  lcd_ini();
  lcd_gotopos (1, 1);
  lcd_writetext ("Analog-INPUT");

  i2c_init();                                // init I2C interface

  ret= i2c_start(PCF8591+I2C_WRITE);    // set device address and write mode     
  if (ret) {
    i2c_stop;
    lcd_gotopos (4, 1);
      lcd_writetext ("> I2C - Error <");
  }else{
    lcd_gotopos (4, 1);
       lcd_writetext 

    i2c_write(0b01000100);       // Kontrollbyte:    Bit 7 = immer 1
                                 // Analog Out enable=false   Bit 6
                                 // 4 Kanäle, 0..5V        Bit 4&5
                                 // Autoincrement Flag an    Bit 3
                                 // Kanal Null selektiert    Bit 2
                                 // Null auf Start- D/A-Wandler Bit 0&1
    i2c_write(0b00000000);   // wenn OUT an, dann 0=0Volt, 255=5Volt
    i2c_stop;  
  }                        

  while(1) 
   {           
       // Daten lesen
    i2c_start;                     
    i2c_write(PCF8591+I2C_READ);          //Leseadresse senden
    ret= i2c_readAck; // Analog 0
              lcd_writetext (itoa( ret, Buffer, 10 ));
       lcd_writetext (",");
                 ret =i2c_readAck; // Analog 1
       lcd_writetext (itoa( ret, Buffer, 10 ));
       lcd_writetext (",");
    ret =i2c_readAck; // Analog 2
       lcd_writetext (itoa( ret, Buffer, 10 ));
       lcd_writetext (",");
    ret =i2c_readNak; // Analog 3
       lcd_writetext (itoa( ret, Buffer, 10 ));
       i2c_stop;  
   
  _delay_ms(500);
  lcd_gotopos (2, 1);
  lcd_writetext ("                ");
  _delay_ms(200);
   return 0;                 // 
}

Autor: Jörg G. (joergderxte)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo hast du die Adress-pins des pcf angeschlossen? (Ich kann im 
Datenblatt - das hast du doch auch gelesen? - nichts finden, was dafür 
spricht die nicht anzuschließen).
Dieser Kommentar ist unnötig verwirrend:
    i2c_write(0b01000100);
// Kontrollbyte:    Bit 7 = immer 1 -> Besser: bit7 ist ungenutzt
// Analog Out enable=false   Bit 6  -> Du schaltest es aber an
// 4 Kanäle, 0..5V        Bit 4&5
// Autoincrement Flag an    Bit 3   -> Das ist aber bit 2, Bit 3 ist auch ungenutzt
// Kanal Null selektiert    Bit 2
// Null auf Start- D/A-Wandler Bit 0&1 -> Tippfehler?
Ich würde sowas bevorzugen:
#define PCF8591_ANA_OUT (1<<6)

#define PCF8591_SINGLE 0
#define PCF8591_3DIFF (1<<4)
#define PCF8591_1DIFF_2SINGLE (2<<4)
#define PCF8591_2DIFF (3<<4)

#define PCF8591_AUTOINCR (1<<2)

#define PCF8591_ADCHANNEL(_n) ((_n) & 3)

//...
    i2c_write( PCF8591_ANA_OUT
             | PCF8591_SINGLE
             | PCF8591_AUTOINCR
             | PCF8591_ADCHANNEL(0) );
// ...

Außerdem misst der PCF während dem Auslesen (Im Datenblatt unter 'A/D 
Conversion'ist sogar ein Bild davon). Um deine 4 Kanäle zu lesen, musst 
du demnach 5 Bytes lesen (oder besser: ein Dummybyte nach der 
Initialisierung).
hth, Jörg

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die 3 Adress-Pins liegen auf Masse, somit sollte die Adresse 0b10010000 
eigentlich stimmen.

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, habe einen Fehler gefunden...
bem Auslesen hatte ich
ret= i2c_readAck;
, es muß aber
ret= i2c_readAck();
 geschrieben werden, sonst zeigt es wirre Zahlen.

Allerdings steht jetzt 4 x 255 da, obwohl am AIN0 nur ca. 3V anliegen.

Habe zum Test mal ein EEprom dazugeschalten. Aber der ausgelesene Wert 
ist auch 255 statt 09...
// EEPROM 24C16
//==============
  ret= i2c_start(EEPROM24C16+I2C_WRITE);    // set device address and write mode     
  if (ret) {
    // Fehler
    i2c_stop;
    lcd_gotopos (4, 1);
      lcd_writetext ("> I2C - Error <");
  }else{
    lcd_gotopos (4, 1);
       lcd_writetext ("> I2C - OK <"); 
    
// Daten schreiben
    i2c_write(0x00);   // Start-Adresse       
    i2c_write(0x09);   // Daten 
    i2c_stop;  

// Datel lesen
    i2c_start_wait(EEPROM24C16+I2C_WRITE);
    i2c_write(0x00);   // Start-Adresse   

    i2c_rep_start(EEPROM24C16+I2C_READ);
    ret =i2c_readNak();  // Daten
    i2c_stop; 

    lcd_gotopos (3, 1);
       lcd_writetext (itoa( ret, Buffer, 10 ));
  }   

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Habe zum Test mal ein EEprom dazugeschalten. Aber der ausgelesene Wert
>ist auch 255 statt 09...

Ein EEPROM benötigt Zeit für die Programmierung.
So 10-20ms warten nach i2cstop ist eine Lösung.
Oder Acknowledge Polling anwenden.

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, ich habe jetzt nach jedem i2C_stop 50ms Wartezeit.
Aber immer noch 255.
Wie kann ich testen, ob der Bus funktioniert ???

Sind die Ports am Prozessor egal ???
Ich habe SCL an PB1 und SDA an PB0, ist auch so in der i2cmaster.s 
eingetragen.
Der Prozessor läuft mit intern 4 MHZ

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Wie kann ich testen, ob der Bus funktioniert ???

Osci oder Logikanalyzer.

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, wenn man sowas hätte   ;-)

Autor: M. B. (freiberger77)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, FEHLER gefunden...
habe im BUS alle Adressen durchlaufen lassen, die richtigen Adressen 
wurden gefunden...

Der Fehler war klein aber fein...

Hatte überall i2c_stop;   statt i2c_stop();
Was so ein paar Klammern ausmachen...

Danke trotzdem

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.