Forum: Mikrocontroller und Digitale Elektronik I2CLCD Library beim kompelieren nur "undefined reference to "i2c_."


von Jan N. (jan_n497)


Lesenswert?

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.

von Marc (Gast)


Lesenswert?

Indem du entweder die richtigen Funktionsnamen verwendest, oder das 
Display an einen ic2-Bus anschließt.

von Falk B. (falk)


Lesenswert?

@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

von Raspi (Gast)


Lesenswert?


von Jan N. (jan_n497)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

Prüfe die I2C Adresse und die Pinzuordung im Quelltext.

von Falk B. (falk)


Lesenswert?


von Falk B. (falk)


Lesenswert?


von Jan N. (jan_n497)


Lesenswert?

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
von Falk B. (falk)


Lesenswert?

@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 */

von Jan N. (jan_n497)


Lesenswert?

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?

von Falk B. (falk)


Lesenswert?

@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_.""

von Jan N. (jan_n497)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@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.

von Jan N. (jan_n497)


Angehängte Dateien:

Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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.

von Frickelfritze (Gast)


Lesenswert?

Jan N. schrieb:
> Hier mal die Main Klasse:

Das ist keine Klasse.

von Jan N. (jan_n497)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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!

von Jan N. (jan_n497)


Lesenswert?

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
von Falk B. (falk)


Lesenswert?

@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?

von Jan N. (jan_n497)


Angehängte Dateien:

Lesenswert?

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

von Frickelfritze (Gast)


Lesenswert?

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.

von Jan N. (jan_n497)


Lesenswert?

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.

von Falk B. (falk)


Lesenswert?

Es fehlen die Pull-Ups für SDA und SCL!!! Dort muss an beide Signale je 
4k7 oder 10k gegen VCC!!!

von Frickelfritze (Gast)


Lesenswert?

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.

von Jan N. (jan_n497)


Lesenswert?

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

von Jan N. (jan_n497)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@ 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!!!

von Frickelfritze (Gast)


Lesenswert?

Jan N. schrieb:
> Mir wurde damals gesagt

ersetzen durch "ich habe den Applikationsempfehlungen
des Herstellers entnommen ...."

von Jan N. (jan_n497)


Lesenswert?

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
Noch kein Account? Hier anmelden.