I2CLCD Library beim kompelieren nur "undefined reference to "i2c_."

OP #4579892
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.
#4579898
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
OP #4579903
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.
OP #4579961
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() {}
#4580130
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 */
OP #4580183
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?
#4580189
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_.""
OP #4580209
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
#4580218
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.
OP #4580250
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
OP #4580272
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.
#4580287
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?
OP #4580298
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
Angehängte Dateien:
Gast #4580310
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.
OP #4580311
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.
Gast #4580320
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.
OP #4580327
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
#4580330
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!!!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren