Guten Tag, Nach langer Zeit habe ich wieder angefangen die Controllor's zu Programmieren. Und habe mir ein 20x4 LCD Display gekauft. Dieses hat ein I2C denn YwRobot Arduino LCM1602 IIC V1. Der Controllor ist der PCF8574T ein SMD Chip. Ich habe im Forum diese Libary für HD44780 gefunden: Beitrag "I2CLCD Library für HD44780 LCDs" Nachdem ich die Files in mein Projekt gepackt habe und die Taktfrequenz auf 16 Mhz angepasst habe wollte ich es, ausprobieren. Beim Kompelieren kommt jedoch nur: undefine reference to 'ic2_write' ic2_stop, ic2_start_wait, ic2_readNak, ic2_stop, ic2_init Und am Ende dann halt Id returned 1 exit status. Soweit ich weis kommt undefine reference nur wenn der Complair die Klassen im Linker nicht findet oder? Weis aber nicht wirklich wie ich diesen Fehler beheben soll. Kann mir da einer helfen? Jan Niehes.
Indem du entweder die richtigen Funktionsnamen verwendest, oder das Display an einen ic2-Bus anschließt.
@Jan Niehes (jan_n497) >ein SMD Chip. Ich habe im Forum diese Libary für HD44780 gefunden: >Beitrag "I2CLCD Library für HD44780 LCDs" Nimm lieber die hier, da sind noch ein paar Verbesserungen drin. Beitrag "Re: I2CLCD Library für HD44780 LCDs" >Soweit ich weis kommt undefine reference nur wenn der Complair die >Klassen im Linker nicht findet oder? Weis aber nicht wirklich wie ich >diesen Fehler beheben soll. 1.) ALLE Quelltexte müssen im Projektverzeichnis liehen 2.) ALLE Quelltexte müssen in der IDE zum Projekt hinzugefügt werden
Falk B. schrieb: > Nimm lieber die hier, da sind noch ein paar Verbesserungen drin. > > Beitrag "Re: I2CLCD Library für HD44780 LCDs" Danke. Das Komplieren geht nun. Aber auch mit der anderen Libary kommt nix auf meinen Display an. SCL ist am A5 Pin und SDA ist am A4 Pin. GND und ACC sind auch angeschlossen. Doch auf dem Display erscheint nix. Ich habe die Main Klasse so gelassen also mit "Hallo Achmin Pool** ...." gelassen. Kontrast am LCD ist auch hoch genug. Nutze ihr denn Atmega328p.
Prüfe die I2C Adresse und die Pinzuordung im Quelltext.
Falk B. schrieb: > Beitrag "Re: I2CLCD Library für HD44780 LCDs" Es ist komisch. Egal welche Addresse ich anspreche ob 0x00, 0x40, 0x99, 0xFF es geht nie die Fehler LED an. //EDIT. Ich habe dieses LCD mit einer Arduino Libary ausprobiert dort funktioniert das LCD. Die Anschluss Belegung am PCF ist richtig. Auch die Adresse ist richtig 0x27. Hier das aus dem Arduino:
1 | #include <Wire.h> |
2 | #include <LiquidCrystal_I2C.h> |
3 | |
4 | LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE); |
5 | |
6 | void setup() { |
7 | lcd.begin(20, 4); |
8 | for(int i = 0; i< 3; i++) |
9 | { |
10 | lcd.backlight(); |
11 | delay(250); |
12 | lcd.noBacklight(); |
13 | delay(250); |
14 | } |
15 | lcd.backlight(); |
16 | |
17 | lcd.setCursor(0,0); |
18 | lcd.print("Init!"); |
19 | lcd.setCursor(0,1); |
20 | lcd.print("Source gen"); |
21 | lcd.setCursor(0,2); |
22 | lcd.print("by Test"); |
23 | lcd.setCursor(0,3); |
24 | lcd.print("Version 1"); |
25 | } |
26 | |
27 | void loop() {} |
:
Bearbeitet durch User
@Jan Niehes (jan_n497) >Es ist komisch. Egal welche Addresse ich anspreche ob 0x00, 0x40, 0x99, >0xFF es geht nie die Fehler LED an. Dann stimmt was nicht. Es kann nur EINE Adresse richtig sein. >//EDIT. Ich habe dieses LCD mit einer Arduino Libary ausprobiert dort >funktioniert das LCD. Die Anschluss Belegung am PCF ist richtig. Auch >die Adresse ist richtig 0x27. Hier ist die Stolperfalle. 0x27 ist eine 7-Bit I2C Adresse. Meine Lib arbeitet aber mit einer 8-Bit Adresse hier also 0x27x2 = 0x4E
1 | #define LCD_I2C_DEVICE 0x4E /**< 8 bit address of port expander, bit#0 must be zero */ |
Falk B. schrieb: >>Es ist komisch. Egal welche Addresse ich anspreche ob 0x00, 0x40, 0x99, >>0xFF es geht nie die Fehler LED an. > > Dann stimmt was nicht. Es kann nur EINE Adresse richtig sein. > >>//EDIT. Ich habe dieses LCD mit einer Arduino Libary ausprobiert dort >>funktioniert das LCD. Die Anschluss Belegung am PCF ist richtig. Auch >>die Adresse ist richtig 0x27. > > Hier ist die Stolperfalle. 0x27 ist eine 7-Bit I2C Adresse. Meine Lib > arbeitet aber mit einer 8-Bit Adresse hier also 0x27x2 = 0x4E > #define LCD_I2C_DEVICE 0x4E /**< 8 bit address of port > expander, bit#0 must be zero */ Zur "Eine Adresse richtig sein". Irgendwie funktioniert da was nicht wenn ich ich eine Zweite LED anschließe. Und ein else einfüge und dann die Zweite LED damit einschalten will. Klappt es nicht. 0x4E hat nix geändert. Ne andere Frage ich habe die i2clcd.aps, i2clcd.aws, i2clcd.c, i2clcd.h, i2cmaster.c, main.c und die twinmaster.c Datei in mein Projekt verschoben. Das LCD ist aufjeden Fall nicht defekt denn das Funktioniert ja unter Arduino. Aber irgendwie passiert dort nix. Die Installation ist doch so alle Datein einfach reinpacken. Oder muss man da noch mehr machen?
@Jan Niehes (jan_n497) >Zur "Eine Adresse richtig sein". Irgendwie funktioniert da was nicht >wenn ich ich eine Zweite LED anschließe. Und ein else einfüge und dann >die Zweite LED damit einschalten will. Klappt es nicht. Wo denn? Ich seh nix? >Ne andere Frage ich habe die i2clcd.aps, i2clcd.aws, Die nicht, das sind die Projektdateien vom AVR-Studio. > i2clcd.c, i2clcd.h, >i2cmaster.c, main.c und die twinmaster.c Datei in mein Projekt >verschoben. Die schon. > Das LCD ist aufjeden Fall nicht defekt denn das Funktioniert >ja unter Arduino. Aber irgendwie passiert dort nix. Wo dort? Mit welcher IDE (Integrated development environment) arbeitst du? Atmelstudio? > Die Installation ist >doch so alle Datein einfach reinpacken. Oder muss man da noch mehr >machen? Schrieb ich das nicht schon? Beitrag "Re: I2CLCD Library beim kompelieren nur "undefined reference to "i2c_.""
Falk B. schrieb: > Wo denn? Ich seh nix?
1 | if(i2c_start(0x27)) { |
2 | PORTB |= (1<<ERROR_LED); |
3 | while(1); |
4 | }else{ |
5 | PORTB |= (1<<NORMAL_LED); |
6 | } |
Keine der beiden leuchtet Falk B. schrieb: > Wo dort? Mit welcher IDE (Integrated development environment) arbeitst > du? Atmelstudio? Ich arbeite mit dem Atmelstudio 7. Das LCD habe ich schon ein bisschen Länger hier rum fliegen. Und habe es damals mit einer Libaray für die Arduino IDE dort kann ich das LCD auch ansteuern. Und wenn ich andere Adressen abfrage wie 0x00, oder 0x20, 0x29 ... dann leuchtet auch keine der LCD's. Auf der Rückseite meines LCD steht J204A
@Jan Niehes (jan_n497) >if(i2c_start(0x27)) { > PORTB |= (1<<ERROR_LED); > while(1); >}else{ > PORTB |= (1<<NORMAL_LED); >} >Keine der beiden leuchtet Dann läuft das Programm nicht auf deinem Controller. Oder du hast vergessen, die Ports als Ausgang zu konfigurieren. >Ich arbeite mit dem Atmelstudio 7. Hast du die Dateien im Projekt-Expolorer zum Projekt hinzugefügt? Mach mal einen Screenshot.
Falk B. schrieb: > Dann läuft das Programm nicht auf deinem Controller. Oder du hast > vergessen, die Ports als Ausgang zu konfigurieren. Hier mal die Main Klasse: Falk B. schrieb: > Mach mal einen Screenshot. Klar Bitte: http://prntscr.com/b4qvz5
@ Jan Niehes (jan_n497) >Hier mal die Main Klasse: Du hast gar keine Klassen, weil das stinknormales C ist. >Klar Bitte: http://prntscr.com/b4qvz5 Sieht alles OK aus. Komisch. Lädst du auch des richtige Hex-File in deinen Controller? Prüfe das mal. Schalte mal an Anfang beide LEDs ein, 1s Pause, dann erst den I2C-Test.
Falk B. schrieb: > Sieht alles OK aus. Komisch. Lädst du auch des richtige Hex-File in > deinen Controller? Prüfe das mal. Schalte mal an Anfang beide LEDs ein, > 1s Pause, dann erst den I2C-Test. Sehr intessant. Wenn ich dort lcd_init(); Scheint der Controllor dort hängen zu bleiben. Wenn ich lcd_init(); weg lasse und dann die LED's einschalte und dann gehen sie an bleiben ne 1 sekunde an. Gehen dann wieder aus. Und dann kommt die Abfrage egal auf 0x27 oder 0x4E. Sie bleiben dann wieder beide aus. So sieht der neue Code aus: http://prntscr.com/b4r2y5
Wenn beide aus bleiben, dann bleibt die Funktion i2c_start hängen. Das kann aber eigentlich nicht passieren, die Funktion kehrt immer wieder zurück, eagl ob sich ein IC meldet oder nicht!
Falk B. schrieb: > Wenn beide aus bleiben, dann bleibt die Funktion i2c_start hängen. Das > kann aber eigentlich nicht passieren, die Funktion kehrt immer wieder > zurück, eagl ob sich ein IC meldet oder nicht!
1 | // wait until transmission completed |
2 | while(!(TWCR & (1<<TWINT))); |
Dort bleibt ehr hängen. Ich schalten vorher die Grüne ein. Und danach die Rote. Aber die Rote bleibt aus. Wenn ich diesen beiden while schleifen ausnehmen. Und es nochmal teste mit 0x27 und 0x4E. dann bleibt auch die Rote Error Lampe vom main Code an. Also die in der if abfrage kommt.
:
Bearbeitet durch User
@Jan Niehes (jan_n497) >// wait until transmission completed >while(!(TWCR & (1<<TWINT))); >Dort bleibt ehr hängen. Woher weißt du das? Hast du einen Debugger? >Wenn ich diesen beiden while schleifen ausnehmen. Das ist nicht sinnvoll!! Die Zeile hat ihre Funktion! Hast du am I2C Bus die Pull-Up widerstände dran? Was hängt an den I2C Pins?
Falk B. schrieb: > Woher weißt du das? Hast du einen Debugger? Habe ich doch geschrieben vor der while Schleife habe ich die Rote LED mit PORTB |= (1<<3) eingeschaltet und nach der schleife wollte ich die Grüne einschalten. Die Grüne ist aber nicht angegangen. Also kann es nur an diese Zeile liegen. Falk B. schrieb: > as ist nicht sinnvoll!! Die Zeile hat ihre Funktion! Mir bewusst. Falk B. schrieb: > Hast du am I2C Bus die Pull-Up widerstände dran? Was hängt an den I2C > Pins? An SCL geht an ca. 15 cm Pin zu Buchse Kabel von mein Boardboard zum SCL Anschluss am YwRobot. An SDA geht auch ein ca. 15 cm Pin zu Buchse von mein Boardboard zum SDA Anschluss meines YwRobot Ich habe mal ein Bild von der Verkablung hochgeladen. Gelb ist SCL. Grün ist SDA
Jan N. schrieb: > Ich habe mal ein Bild von der Verkablung hochgeladen. Na super. Das alte Lied. Keine Abblock Cs an den Vcc Pins. Wann werden es die Menschen lernen das umzusetzen was die Hersteller empfehlen? Die Kondensatoren für den Quarz sind auch völlig falsch platziert.
Frickelfritze schrieb: > Na super. Das alte Lied. Keine Abblock Cs an den Vcc Pins. > > Wann werden es die Menschen lernen das umzusetzen was die > Hersteller empfehlen? 100 NF an GND zu VCC und 100 NF an AGND und AVCC Frickelfritze schrieb: > Die Kondensatoren für den Quarz sind auch völlig falsch > platziert. Was meinst du damit? Die 22pF Kondensatoren sind auf Masse vor dem Quarz. Dann kommt der 16 Mhz Quards an die 2 Pins am MCU.
Es fehlen die Pull-Ups für SDA und SCL!!! Dort muss an beide Signale je 4k7 oder 10k gegen VCC!!!
Jan N. schrieb: > 100 NF an GND zu VCC und 100 NF an AGND und AVCC Ich sehe nur ein C von ARef nach GND Zeige mir die anderen, auf einem Foto auf dem man wirklich was erkennt. Quarz Cs gehören an die Masse des Prozessors, nicht irgendwo and Masse. Masse ist nicht Mase.
Falk B. schrieb: > Es fehlen die Pull-Ups für SDA und SCL!!! Dort muss an beide Signale je > 4k7 oder 10k gegen VCC!!! Vielen dank. Ich habe 10k Widerstände vom Pin auf VCC gezogen, und dann dort noch das Kabel zum I2C Controllor genommen. Nun wird auf dem LCD alles dargestellt. Die Anschließung ist doch so richtig: http://prntscr.com/b4rvlf
Frickelfritze schrieb: > Zeige mir die anderen, auf einem Foto auf dem man > wirklich was erkennt. > > Quarz Cs gehören an die Masse des Prozessors, nicht > irgendwo and Masse. Masse ist nicht Mase. Mit "100 NF an GND zu VCC und 100 NF an AGND und AVCC" Meinte ich ich habe sie hinzugefügt. Okay das mit denn Quarzen wusste ich garnicht. Mir wurde damals gesagt einfach auf Masse legen. Danke dir auch
@ Jan Niehes (jan_n497) >Vielen dank. Ich habe 10k Widerstände vom Pin auf VCC gezogen, und dann >dort noch das Kabel zum I2C Controllor genommen. Nun wird auf dem LCD >alles dargestellt. Halelulja!!! >Die Anschließung ist doch so richtig: http://prntscr.com/b4rvlf Diese Darstellung ist irreführend! Denn SDA/SCL werden NICHT direkt an +5V angeschlossen, sondern über Pull-Up Widerstande!!!
Jan N. schrieb: > Mir wurde damals gesagt ersetzen durch "ich habe den Applikationsempfehlungen des Herstellers entnommen ...."
Falk B. schrieb: > +5V angeschlossen, sondern über Pull-Up Widerstande!!! Ja sie sind aber dazwischen. Und nicht direkt an 5 Volt.
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.