Hallo, Ich habe einen LCD-Display mit LCM1602 IIC V1 und PCF8574AT. Ich habe es richtig angesteckt am Atmega (über einen Arduino) Die verwendete Bibliothek ist i2clcd.h und i2cmaster.h Aber ich finde einfach nicht die richtige Adresse weder 0x4E oder sonst was, was ich fand scheint zu funktionieren Weiß jemand weiter?
:
Bearbeitet durch User
Hi Grevak, hast Du dir die Basis 7Bit I2C Adresse ausgelesen und auch nachgesehen, welche der dann möglichen 8 I2C Adressen Du gesetzt hast ?
Man kann lustiges Adressraten spielen, oder in Tabelle 5 nachsehen: http://www.nxp.com/documents/data_sheet/PCF8574_PCF8574A.pdf
Grevak D. schrieb: > Aber ich finde einfach nicht die richtige Adresse weder 0x4E oder sonst > was, Was steht denn im Datenblatt, was hast Du denn schon probiert? sdfghjkil
Ich bin mir nicht sicher, aber ich habe in einem Datenblatt nachgeschaut vom PCF8574A (ich weiß nicht ob das dasselbe ist wie der PCF8574AT) und habe da gesehen, dass die Basis so aussieht: 0111 0000 - 0111 1110 Also 0x70, 0x72, 0x74, 0x76, 0x78, 0x7A, 0x7C, 0x7E Hab alle durchprobiert, nichts passiert
Es kommt auch darauf an, ob dein Ardu*dingens 7bit oder 8bit Adressen haben möchte. Siehe Tabelle 5.
Manchmal werden die I2C Adressen 1 Bit geschoben angegeben. Ich habe wenig Lust, deine Bibliotheken zu suchen und zu forschen. Am einfachsten ist es, wenn du einfach mal mit 0x38, 0x39 usw probierst.
Hi Grevak, warum probieren ? Welchen Pegel haben nun A2 bis A0? Dann setzt man diese Werte hier ein und legt los: 0b0111|A2|A1|A0
Karl M. schrieb: > 0b0111|A2|A1|A0 Grevak D. schrieb: > 0b0111|A1|A2|A3 funktioniert auch nicht Was soll das sein? Anstatt A2,A1 oder A0 ist eine 0 oder 1 zu schreiben, "|" dient nur als optischer Trenner. Diese Werte sind direkt abhängig von der beschaltet des Chips! Das weiss doch keiner von uns. 0b0111|A2|A1|A0
Karl M. schrieb: > Karl M. schrieb: >> 0b0111|A2|A1|A0 > > Grevak D. schrieb: >> 0b0111|A1|A2|A3 funktioniert auch nicht > > Was soll das sein? > > Anstatt A2,A1 oder A0 ist eine 0 oder 1 zu schreiben, "|" dient nur als > optischer Trenner. > > Diese Werte sind direkt abhängig von der beschaltet des Chips! > Das weiss doch keiner von uns. > > 0b0111|A2|A1|A0 Ja, ich habe die natürlich mit 0 und 1 ersetzt und ich habe auch A2 A1 und A0 und nicht 1 2 3 gemeint
https://forum.arduino.cc/index.php?topic=320188.0 Möglicherweise findet sich dort die Lösung. Entweder im letzten Beitrag, oder in den links im vorletzten.
Im letzten Link arbeiten die mit Sketches. Ich arbeite aber mit C
Hallo, Vielleicht zeigst Du mal ein wenig Code und ein Bild von Deinem Aufbau. Kann manchmal helfen ? Gruß Frank
Das ist mein Code
1 | #include <stdbool.h> |
2 | #include <avr/pgmspace.h> |
3 | #include "i2clcd.h" |
4 | #include "i2cmaster.h" |
5 | |
6 | int main() { |
7 | i2c_init(); |
8 | lcd_init(); |
9 | |
10 | lcd_command(LCD_DISPLAYON | LCD_CURSORON | LCD_BLINKINGON); |
11 | lcd_light(true); |
12 | |
13 | lcd_printlc_P(1, 1, PSTR("Hello World")); |
14 | }
|
Die Lib ist angehängt Ein I2C Scanner sagt, es ist 0x3F, aber es funktioniert nicht Durch die Verschiebung um 1 Bit vermute ich mal 0x7E, aber das funktioniert auch nicht
:
Bearbeitet durch User
Karl M. schrieb: > Hallo Grevak, > > stimmt denn die Pinnbelegung PCF8574A zu LCD ? Das habe ich jetzt auch überlegt, denn unter einem Sketch geht 0x3F also 0x7E Also muss die Pinbelegung falsch sein. Wie finde ich das heraus?
Ins Datenblatt schauen und ausmessen ? Grevak D. schrieb: > Also muss die Pinbelegung falsch sein. Wie finde ich das heraus? Dann bitte die lcd.h überprüfen.
Wie messe ich das aus? Tut mir Leid, ich bin Anfänger Also ich habe das versucht und habe folgendes getan: P0 = 4 // RS P1 = 5 // RW P2 = 6 // EN P3 = 7 // BL P4 = 9 // D4 P5 = 10 // D5 P6 = 11 // D6 P7 = 12 // D7 Und es klappt nicht
:
Bearbeitet durch User
Leute wir reden über I2C da muss gar nichts an den Verbindungen zwischen pic und lcd gemessen werden. Das einzige was hier noch falsch sein kann, ist der Anschluss des I2C an den uC. Deshalb mal ein Bild vom Schaltungsaufbau und die Pinbelegung. Also wo der I2C vom Pic an den uC geht. Gruß Frank
:
Bearbeitet durch User
Grevak D. schrieb: > Wie messe ich das aus? Tut mir Leid, ich bin Anfänger Schreibe Dir erst einmal die Pinbelegung des LCD und des PCF8574A auf ein Papier gegenüber. Von LCD benötigst Du auch noch diverse Angaben, wie die Zeilen- und Zeichenanzahl. So ein LCD hat eine Anschlussleiste, diese kann 14,16 Pins haben. Siehe: www.sprut.de/electronic/lcd/ unter "zweireihiger 14- oder 16-poliger Steckverbinder" nach. Dann schreibe die Zeilen auf ein Papier: RS -- PCF8574A Pin ? R/W -- PCF8574A Pin ? E -- PCF8574A Pin ? D0 -- nicht belegt D1 -- nicht belegt D2 -- nicht belegt D3 -- nicht belegt D4 -- PCF8574A Pin ? D5 -- PCF8574A Pin ? D6 -- PCF8574A Pin ? D7 -- PCF8574A Pin ? Dann nimm ein Ohmmeter im 0-200Ohm Bereich und ergänze die PCF8574A Pin-Bezeichnungen. Dies trage bitte in die lcd4.h ein.
Frank L. schrieb: > Leute wir reden über I2C da muss gar nichts an den Verbindungen zwischen > pic und lcd gemessen werden. > > Das einzige was hier noch falsch sein kann, ist der Anschluss des I2C an > den uC. > > Deshalb mal ein Bild vom Schaltungsaufbau und die Pinbelegung. Also wo > der I2C vom Pic an den uC geht. > Gruß > Frank Ich darf mal lachen, hast Du schon mal eine I2C PCF8574A LCD Adapter aufgebaut? Natürlich ist die Pinzuordnung für die anschließende LCD Initialisierung unabdingbar. Des weiteren ist ein ein Atmel AVR µC.
Ich habe das jetzt mit den Pins gerafft. Sie sind richtig angeschlossen und ich habe sie auch richtig in die Header eingetragen und dennoch klappt es nicht P0 = 4 // RS P1 = 5 // RW P2 = 6 // EN P3 = 7 // BL P4 = 9 // D4 P5 = 10 // D5 P6 = 11 // D6 P7 = 12 // D7 Das stimmt mit dem Datenblatt überein und auch mit der Belegung auf dem I2C Woran könnte es noch liegen?
:
Bearbeitet durch User
I2C Welche I2C Pullup sind installiert und wie hoch ist der I2C Mastertakt? Ich nutze meine eigenes LCD4 zu I2C Interface, damit könnte ich ein Testprogramm für einen bekannten Atmel µC mit bekannter Taktrate schreiben. Was ist das für ein LCD? Hast Du eine genaue Bezeichnung? Anzahl der Zeilen und Zeichen? Hast Du ein Datenblatt? Bitte mach mal sehr gute Bilder im PNG Format vom Aufbau.
Sollte es das sein? https://www.elektroda.pl/rtvforum/topic2960838.html Pullups vorhanden? 100kHz I2C Takt? Dann würde ich erst einmal versuchen das Backlight an P3 zu schalten und den Rest ignorieren.
Hier sind die Bilder. Leider habe ich diese Informationen nicht, da es sich um ein ganzes Set gehandelt hat (Chinaware) und wir das von unserer Schule bekommen haben Das Backlight ist an P3 Beim Sketch, welcher funktionierte (bei dem C Header funktioniert das nicht) waren die Pins so: en rw rs d4 d5 d6 d7 bl 2, 1, 0, 4, 5, 6, 7, 3 Laut Datenblatt müssten die aber so: P0 = 4 // RS P1 = 5 // RW P2 = 6 // EN P3 = 7 // BL P4 = 9 // D4 P5 = 10 // D5 P6 = 11 // D6 P7 = 12 // D7 Was auch nicht funktioniert Das ist seltsam... Bei meinem Lehrer, welcher einen PCF8574 und nicht die A Version hat funktioniert die Bibliothek schon von sich aus
:
Bearbeitet durch User
Grevak D. schrieb: > Bei meinem Lehrer, welcher einen PCF8574 und nicht die A Version hat > funktioniert die Bibliothek schon von sich aus PCF8574 und PCF8574A haben unterschiedliche Basisdressen. Standard sind 0x27 und 0x3F. Wenn Du einen Arduino hast, setze den I2C-Scanner ein und gut.
Habe ich und die Adresse habe ich geändert. Jedoch klappt es denoch nicht
Wie ist Deine Platine an den µC angeschlossen? Der Frage, ob Du Pullup-Widerstände für den I2C-Bus einsetzt, bist Du bislang geschickt ausgewichen. Ohne die funktioniert aber der I2C-Bus nicht.
erstmal i2c überprüfen; abwechselnd 0xff 0x00 mit 1000ms-delay senden und gucken, ob die pins schalten. Dann gehts weiter.
Grevak D. schrieb: > Habe ich und die Adresse habe ich geändert. Jedoch klappt es > denoch nicht Auf der selben Hardware?
Ich habe die internen Pullup Widerstände an SDA und SCL aktiviert. Es klappt nicht
Grevak D. schrieb: > Ich habe die internen Pullup Widerstände an SDA und SCL aktiviert. Es > klappt nicht Das könnte schon nicht reichen, wie sehen die Pegel auf dem Bus aus? Normalerweise verwendet man dort 4,7k. Mit den internen Pull-ups bezweifel ich das du damit die Eingänge tatsächlich hochzeihen kannst.
ES KLAPPT!!! Danke! Ich habe die falschen Pullup Widerstände aktiviert^^
Grevak D. schrieb: > Ich habe die falschen Pullup Widerstände aktiviert^^ Und jetzt klappt es mit den Internen? Damit wird es aber bei höheren Geschwindigkeiten Probleme geben, nimm externe Niederohmigere.
... auf die Idee, PullUp- Widerstände für I2C mittels internen Widerständen zu realisieten bin ich nie gekommen, da viel zu hoxhohmig. PullUp Woderstände=2,2k.... und alles ist grün.
Hallo Grevak D. schrieb: > Ich habe die falschen Pullup Widerstände aktiviert^^ Hilf uns bitte auch, welche > falschen Pullup Widerstände aktiviert wurden aktiviert? Und was sind die Richtigen - wie wurden die aktiviert? Die Mitleser, so wie ich, möchten es immer ganz genau wissen.
Karl M. schrieb: > Und was sind die Richtigen - wie wurden die aktiviert? Wahrscheinlich die, die zum richtigen Pin gehören.
Ingo L. schrieb: > Karl M. schrieb: >> Und was sind die Richtigen - wie wurden die aktiviert? > Wahrscheinlich die, die zum richtigen Pin gehören. Wie ist das gemeint?
Ich werde dann niederohmige nehmen. Mann muss im DDRC Register, also SDA und SCL (AD4 und AD5) , die Pins auf 0 Stellen also Eingang und dann mittels PORTC auf 1. Dann sind die Pullups aktiviert
Grevak Denak schrieb: > Ich werde dann niederohmige nehmen. > > Mann muss im DDRC Register, also SDA und SCL (AD4 und AD5) , die Pins > auf 0 Stellen also Eingang und dann mittels PORTC auf 1. > > Dann sind die Pullups aktiviert UPDATE: Wenn man sich dazu entschließt die internen Pullups zu verwenden ist es wichtig zuerst diese zu aktivieren, bevor man den LCD initialisiert, ansonsten funktioniert es nicht
@ Grevak Denak (xorda) >Wenn man sich dazu entschließt die internen Pullups zu verwenden ist es >wichtig zuerst diese zu aktivieren, bevor man den LCD initialisiert, >ansonsten funktioniert es nicht Wer hätte DAS gedacht? Ist trotzdem Murks, der nur an guten Tagen bei Vollmond funktioniert. Externe Pull-Ups mit 2-10k Ohm und gut. Die muss man auch nicht einschalten, "nur" richtig anlöten.
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.