- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: LCD 16x2 I2C adresse 0x27 und 0x3F

  1. #1
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180

    LCD 16x2 I2C adresse 0x27 und 0x3F

    Anzeige

    Powerstation Test
    kann man noch frohe weihnachten wünschen?

    schon wieder ein ganz simples problem...

    ich verwende an meinen robotern das 16x2 display, alle bisher gekauften hatten die adresse 0x27. Die neue lieferung hat aber 0x3F. Und das ist bei der bestellung nicht erkennbar ...
    edit: im "kleingedruckten" steht es manchmal drin, habe nicht drauf geachtet

    Die adressen lassen sich in dem jeweiligen bereich, also 0x2 und 0x3 durch schliessen der lötbrücken A0 bis A3 verändern. Ein wechsel von 0x2 zu 0x3 geht wohl nicht, oder?

    im code ist dann immer diese zeile: "LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);"

    lässt sich das irgendwie so einrichten, dass die adresse erstmal abgefragt und dann festgelegt wird? Sowas wie "ifndef"?
    Geändert von inka (26.12.2017 um 12:18 Uhr)
    gruß inka

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    03.09.2009
    Ort
    Berlin (Mariendorf)
    Beiträge
    1.023
    Zitat Zitat von inka Beitrag anzeigen
    das 16x2 display, alle bisher gekauften hatten die adresse 0x27. Die neue lieferung hat aber 0x3F. Und das ist bei der bestellung nicht erkennbar ...
    edit: im "kleingedruckten" steht es manchmal drin, habe nicht drauf geachtet
    .
    Vermutlich handelt es sich bei der I2C-Schnittstelle am LCD um einen PCF8574 oder eben PCF8574A. Nach allem was ich zu dieser Thematik bisher gelesen hatte, ist das eine regelmäßige Quelle von Frust. Ich kann nicht herauslesen, ob du das weißt. Der A-Typ wurde bewusst geschaffen, um den Adressraum von Portexpandern, also die maximale Anzahl gleicher Bausteine an ein-und-dem-selben I2C-Bus zu verdoppeln.

    Zitat Zitat von inka Beitrag anzeigen
    Ein wechsel von 0x2 zu 0x3 geht wohl nicht, oder?
    Nein, die Basisadresse kannst du nicht um-basteln, die ist im Silizium fest verankert.

    Zitat Zitat von inka Beitrag anzeigen
    im code ist dann immer diese zeile: "LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);"
    lässt sich das irgendwie so einrichten, dass die adresse erstmal abgefragt und dann festgelegt wird? Sowas wie "ifndef"?
    ifndef ist eine Anweisung an den Preprozessor. Damit kannst du bei der Compilierung steuern, ob die Variante ... lcd(0x27... oder ...lcd(0x3F... in das Programmfile eingebaut wird. Dann hast du eben immer genau die eine ODER die andere Display-Adresse im Code.
    Alternativ kannst du bei Programmbeginn (PowerUp) einen Jumper bzw. Taste abfragen oder eine Menüfunktion zur Umschaltung mit Speicherung der Displayvariante im EEPROM realisieren. Abhängig davon wird im Programm die eine oder die andere Befehlsvariante abgearbeitet. Das ist dann flexibler. Besser noch, wenn du die Konstante durch eine Variable ersetzt, die am Programmanfang EINMAL den passenden Wert zugewiesen bekommt, Dann wird eben ...lcd(my_lcd_address.... in den Code geschrieben und die Umschaltung kann an EINER Stelle im Programm erfolgen.
    Kommt eben drauf an, was genau du benötigst.

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    55
    Beiträge
    2.197
    In speziellen Fällen kannst du dir den I2C-Scanner umstricken, so dass er die Adresse ins Programm einfügt, die er gefunden hat.
    Das wird aber _nicht_ funktionieren, wenn du mehrere I2C-Geräte am Bus hast, weil er nicht rausfinden kann, wer was ist.
    Eventuell aber gibts da noch die Möglichkeit, beispielsweise zwischen einer RTC und nem Display-zumindest grob- zu unterscheiden, indem du auswertest, was vom jeweiligen Busteilnehmer rein kommt.
    Wackelige Geschichte, aber _kann_ funktionieren.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    so, die dritte bestellung der I2C adapter ist nun auch schiefgelaufen, weil sich die chinesen den teufel drum scheren ob man was zu der bestellung dazuschreibt oder nicht, die liefern irgendwas - und nun wiederholt teile mit der adresse 0x3F. Immerhin unschlagbar billig.
    Zitat Zitat von RoboHolIC Beitrag anzeigen
    .ifndef ist eine Anweisung an den Preprozessor. Damit kannst du bei der Compilierung steuern, ob die Variante ... lcd(0x27... oder ...lcd(0x3F... in das Programmfile eingebaut wird. Dann hast du eben immer genau die eine ODER die andere Display-Adresse im Code.
    ich würde gerne beide varianten "blind" einsetzetn und meine (geschätzt) 100 sketches jetzt nur einmal so anpassen, dass ich mir ein "modul" baue --


    jetzt sieht es in etwa so aus:


    Code:
    #include <LCD.h>
    #include <LiquidCrystal_I2C.h>
    
    
    LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    
    
    im setup():
    {
    .....
      lcd.begin(16, 2);
      lcd.clear();
      lcd.setCursor(0, 0);
      lcd.setBacklight(HIGH);
      lcd.print("xyz-sketch");
      lcd.setCursor(0, 1);
      lcd.print("xyz-sketch");
      delay(2000);
      lcd.clear();
    .....
    }


    -- der überall identisch ist und automatisch erkennt, welches I2C-modul eingesetzt ist. Wie muss ich das jetzt mit dem "#ifndef" angehen? Ich bin da - wie schon oft - ahnungslos
    greift z.b. #ifndef auf die hardware zu? Oder muss ich irgendwie einen I2C scanner im vorfeld laufen lassen?
    gruß inka

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von inka Beitrag anzeigen
    Oder muss ich irgendwie einen I2C scanner im vorfeld laufen lassen?
    Na einen ganzen Scanner braucht man nicht, es können ja nur 2 Adressen vorkommen. Du schickst einfach ein Start, die erste Adresse mit R/W Bit auf 0 und ein Stop. Kommt ein ACK, hast du das Display gefunden und du merkst dir die Adresse in einer Variable und benutzt die zukünftig. Kommt kein ACK probierst du das gleiche mit der zweiten Adresse. Kommt da auch kein ACK ist kein Display angeschlossen.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    Zitat Zitat von Klebwax Beitrag anzeigen
    Na einen ganzen Scanner braucht man nicht, es können ja nur 2 Adressen vorkommen. Du schickst einfach ein Start, die erste Adresse mit R/W Bit auf 0 und ein Stop. Kommt ein ACK, hast du das Display gefunden und du merkst dir die Adresse in einer Variable und benutzt die zukünftig. Kommt kein ACK probierst du das gleiche mit der zweiten Adresse. Kommt da auch kein ACK ist kein Display angeschlossen.MfG Klebwax
    mit start, stop und ACK meinst du auf dem I2C bus, oder? Läuft die anfrage nicht in der loop? Ich muss aber die adresse bereits vor dem setup für
    Code:
    LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    haben... Wie geht das zusammen?
    gruß inka

  7. #7
    HaWe
    Gast
    Zitat Zitat von inka Beitrag anzeigen
    mit start, stop und ACK meinst du auf dem I2C bus, oder? Läuft die anfrage nicht in der loop? Ich muss aber die adresse bereits vor dem setup für
    Code:
    LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
    haben... Wie geht das zusammen?
    Arduino hat dafür Wire() Befehle, die auch im Arduino I2C Scanner verwendet werden -
    und zum Testen von Adressen brauchst du das Display nicht initialisieren, der Scanner findet aktive I2C Geräte von alleine.

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    ich hab jetzt das hier gemacht:

    Code:
    #include <Wire.h>
    
    byte I2CAdd;
    byte I2CAdd_hex;
    byte fehler;
    boolean done = false;
    
    //0x3F = 63
    //0x27 = 39
    
    void setup()
    {
      Serial.begin(115200);
      Wire.begin();
    }
    
    void loop()
    {
      if (!done)
      {
        I2c_suche();
      }
    
      //weiterer code
    }
    
    void I2c_suche()
    {
      Wire.setClock(100000L);
      for (I2CAdd = 28; I2CAdd < 64; I2CAdd++)
      {
        Wire.beginTransmission(I2CAdd);
        fehler = Wire.endTransmission();
    
        if (fehler == 0)
        {
          Serial.print("Baustein mit Adresse 0x");
          Serial.print(I2CAdd, HEX);
          Serial.println(" gefunden!");
          I2CAdd_hex = (I2CAdd);
          Serial.println(I2CAdd_hex, HEX);
          done = true;
        }
      }
    }
    hier kann ich immerhin die "3F" ausdrucken, also ist eine übertragung in eine variable auch kein problem. Die LCD initislierung erwartet aber ein"0x3F" - wie mache ich das?

    EDIT: es funktioniert auch mit "0x27"
    Geändert von inka (14.03.2018 um 17:06 Uhr)
    gruß inka

  9. #9
    HaWe
    Gast
    Zitat Zitat von inka Beitrag anzeigen
    ich hab jetzt das hier gemacht:

    hier kann ich immerhin die "3F" ausdrucken, also ist eine übertragung in eine variable auch kein problem. Die LCD initislierung erwartet aber ein"0x3F" - wie mache ich das?

    EDIT: es funktioniert auch mit "0x27"
    1 I2C Chip kann nur 1 I2C Adresse haben, es kann also nur 1 von beiden stimmen.

  10. #10
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    76
    Beiträge
    2.180
    ich habe es natürlich an zwei verschiedenen adaptern (0x27 und 0x3F) und das nacheinander bzw. getrennt getestet

    eine idee zu "0x"?
    gruß inka

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Atmega 16x2 LCD Ansteuerung über TWI
    Von D3nni5 im Forum C - Programmierung (GCC u.a.)
    Antworten: 15
    Letzter Beitrag: 06.08.2015, 23:00
  2. 16x2 LCD mit Bascom
    Von Dunuin im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 7
    Letzter Beitrag: 20.09.2010, 16:11
  3. 16x2 LCD anschließen
    Von .:Robin:. im Forum Robby RP6
    Antworten: 9
    Letzter Beitrag: 27.03.2009, 23:27
  4. Problem mit EA DOG 16x2
    Von m_herr im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 25.07.2007, 22:31
  5. Probleme bei LCD 16x2 und Ausgabe...
    Von CapSob im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 01.12.2006, 15:12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test