Hallo,
hier ist eine kleine Überarbeitung der schon bekannten Bibliothek.
- Code aufgräumt
- Funktionen gestrafft, Variablen vereinheitlicht
- kleinere Bugs korrigiert
- Funktion zur direkten Ausgabe von Flash-Strings ergänzt
- Unterstützung von bis zu 4x20 LCDs erweitert
- Pinzuordung ist nun vollkommen frei konfigurierbar
- F_CPU muss nur einmalig definiert werden
Mangels Hardware ist der Code nur auf einem ATmega8 mit 2x16 LCD sowie
einem Billigadapter für I2C aus Fernost getestet (Arduino-kompatibel),
man müsste es mit anderen LCDs und Pinzuordnungen am PCF8574 testen. Mit
einem Steckbrett geht das flott. Einen Adapter gibt es auch bei Pollin,
allerding muss man dann die Pins im Code anpassen.
http://www.pollin.de/shop/dt/NDU4OTgxOTk-/Bausaetze_Module/Bausaetze/Bausatz_LCD_I_C_Modul.html
Der im Test verwendete Adapter kam aus China.
http://www.ebay.de/itm/IIC-I2C-TWI-SPI-Serial-Interface-Board-Module-Fur-Arduino-5V-1602-LCD-Display-hp-/141139190965?pt=Motoren_Getriebe&hash=item20dc8d24b5
Hinweis! Der Schaltausgang für die Hintergrundbeleuchtung hat KEINEN
Vorwiderstand! Wenn also das LCD keinen eingebaut hat (wie die meisten
dieses Typs!), muss man den nachrüsten. Z.B., indem man den an Stelle
des Jumpers einlötet.
Was muss man anpassen?
Die CPU Taktfrequenz in der Datei main.h
1
#define F_CPU 8000000 // CPU clock in Hz
Die Parameter des LCDs Datei i2clcd.h.
1
#define LCD_I2C_DEVICE 0x4E /**< Change this to the address of your expander */
2
#define LCD_LINES 2 /**< Enter the number of lines of your display here */
3
#define LCD_COLS 16 /**< Enter the number of columns of your display here */
4
#define LCD_LINE_MODE LCD_2LINE /**< Enter line mode your display here */
5
6
#define LCD_LINE1 0x00 /**< This should be 0x00 on all displays */
7
#define LCD_LINE2 0x40 /**< Change this to the address for line 2 on your display */
8
#define LCD_LINE3 0x40 /**< Change this to the address for line 3 on your display */
9
#define LCD_LINE4 0x60 /**< Change this to the address for line 4 on your display */
Die Pinzuordnung des I2C Adapters in der Datei i2clcd.h.
1
#define LCD_D4_PIN 4 /**< LCD-Pin D4 is connected to P4 on the PCF8574 */
2
#define LCD_D5_PIN 5 /**< LCD-Pin D5 is connected to P5 on the PCF8574 */
3
#define LCD_D6_PIN 6 /**< LCD-Pin D6 is connected to P6 on the PCF8574 */
4
#define LCD_D7_PIN 7 /**< LCD-Pin D7 is connected to P7 on the PCF8574 */
5
#define LCD_RS_PIN 0 /**< LCD-Pin RS is connected to P0 on the PCF8574 */
6
#define LCD_RW_PIN 1 /**< LCD-Pin RW is connected to P1 on the PCF8574 */
7
#define LCD_E_PIN 2 /**< LCD-Pin E is connected to P2 on the PCF8574 */
8
#define LCD_LIGHT_PIN 3 /**< LCD backlight is connected to P3 on the PCF8574, low active */
Hallo Falk
habe es getestet. Vorher habe ich die entsprechenden Teile angepasst.
Dabei habe ich den Adapter von Poll.. verwendet. CPU auf 16 MHz, 2
Zeilen 16 Zeichen und die Pins gesetzt. Abgespeichert und compiliert.
Dabei bekomme ich ca. 40 Fehlermeldungen:
Warning 34 implicit declaration of function 'i2c_init'
[-Wimplicit-function-declaration] E:\AAA
Technik\Roboter\RN-Controll\RNC
Programme\Bus_Display_101\Bus_Display_101\Bus_Display_101.c 17 2
Bus_Display_101
Warning 35 implicit declaration of function 'lcd_wait_ms'
[-Wimplicit-function-declaration] E:\AAA
Technik\Roboter\RN-Controll\RNC
Programme\Bus_Display_101\Bus_Display_101\Bus_Display_101.c 18 2
Bus_Display_101
Error 1 unknown type name 'uint8_t' E:\AAA
Technik\Roboter\RN-Controll\RNC
Programme\Bus_Display_101\Bus_Display_101\i2clcd.h 281 20
Bus_Display_101
Error 30 unknown type name 'uint8_t' E:\AAA
Technik\Roboter\RN-Controll\RNC
Programme\Bus_Display_101\Bus_Display_101\i2clcd.h 427 16
Bus_Display_101
habe ein paar reingestellt
achim
@ Achim Seeger (achims)
>habe es getestet. Vorher habe ich die entsprechenden Teile angepasst.>Dabei habe ich den Adapter von Poll.. verwendet. CPU auf 16 MHz, 2>Zeilen 16 Zeichen und die Pins gesetzt. Abgespeichert und compiliert.>Dabei bekomme ich ca. 40 Fehlermeldungen:
Wie schaffst du das immer wieder?
>Warning 34 implicit declaration of function 'i2c_init'>[-Wimplicit-function-declaration] E:\AAA>Technik\Roboter\RN-Controll\RNC>Programme\Bus_Display_101\Bus_Display_101\Bus_Display_101.c 17 2>Bus_Display_101
Du hast doch auch AVR-Studio, oder? Man muss doch einfach nur das
Projekt laden und neu compilieren. Nicht vergessen, in den
Projekteinstellungen den neuen Controllertyp einzustellen.
Aber wie ich sehe hast du (mal wieder) die Dateien zerplückt. Warum
nimmst du nicht einfach mal das Beispielprojekt so wie es ist?
Mache es ganz einfach. Nehme mir das Schaltbil des Herstellers des
Pollin Boards. Dort steht:
PCF8574 LCD Angabe Display
P0-PIN4 11 DB4
P1-PIN5 12 DB5
P2-PIN6 13 DB6
P3-PIN7 14 DB7
P4-PIN9 4 RS
P5-PIN10 5 RW
P6-PIN11 6 E
#define LCD_D4_PIN 0 /**< 0 LCD-Pin D4 is connected to P0 on the
PCF8574 */
#define LCD_D5_PIN 1 /**< 1 LCD-Pin D5 is connected to P1 on the
PCF8574 */
#define LCD_D6_PIN 2 /**< 2 LCD-Pin D6 is connected to P2 on the
PCF8574 */
#define LCD_D7_PIN 3 /**< 3 LCD-Pin D7 is connected to P3 on the
PCF8574 */
#define LCD_RS_PIN 4 /**< 4 LCD-Pin RS is connected to P4 on the
PCF8574 */
#define LCD_RW_PIN 5 /**< 5 LCD-Pin RW is connected to P5 on the
PCF8574 */
#define LCD_LIGHT_PIN 7 /**< 7 this pin is not connected */
#define LCD_E_PIN 6 /**< 6 LCD-Pin D4 is connected to P7 on the
PCF8574 */
Trage dies in das i2clcd.h ein speichere es ab, compiliere es und will
es zum Atmega schicken. Dazwischen kommen die Fehler
Deien Datein habe ich nicht zerpflückt. Du hast selber geschrieben, das
man es anpassen muss
achim
@Achim Seeger (achims)
>Trage dies in das i2clcd.h ein speichere es ab,
Soweit so gut.
> compiliere es und will>es zum Atmega schicken. Dazwischen kommen die Fehler>Deien Datein habe ich nicht zerpflückt.
Und wie erklärst du mir dann das?
Warning 34 implicit declaration of function 'i2c_init'
[-Wimplicit-function-declaration] E:\AAA
Technik\Roboter\RN-Controll\RNC
Programme\Bus_Display_101\Bus_Display_101\Bus_Display_101.c 17 2
Bus_Display_101
Die Datei Bus_Display_101.c gibt es in meinem Projekt gar nicht!
Also, was machst du da? Hast du AVR-Studio? Welche Version?
Hast du mein Projekt einfach entpackt, die Änderungen in den Dateien
gemacht un compiliert? Poste mal einen Screenshot vom AVR-Studio, wo man
die Dateien sehen kann, siehe Anhang.
Ich verwende AVR Studio6. Arbeite mit dem ATmega 32 und 16MHz. Habe
deine Datein entpackt. Ein neues Projekt aufgemacht und deine datein
eingefügt. Anschliessend die änderungen durchgeführt. Mein Prg habe ich
so gelassen wie es ist. Habe ein Bild angehängt. Es sind deine Datein.
@ Achim Seeger (achims)
>Ich verwende AVR Studio6. Arbeite mit dem ATmega 32 und 16MHz. Habe>deine Datein entpackt.
Gut.
> Ein neues Projekt aufgemacht
Warum hast du das gemacht? Warum hast du nicht einfach das EXISTIERENDE
Projekt genutzt. Soweit ich weiß kann AVR-Studio 6 auch die alten
Projekte vom AVR Studio 4 lesen und nutzen, oder?
> und deine datein>eingefügt.> Anschliessend die änderungen durchgeführt.
Gut.
> Mein Prg habe ich>so gelassen wie es ist.
Warum hast du nicht das Beispiel genutzt?
NUTZE ERST EINMAL DAS BEISPIEL UND NICHT DEIN FEHLERHAFTES PROGRAMM!
(Mein Gott, ist es denn WIRKLICH SO SCHWER?)
> Habe ein Bild angehängt. Es sind deine Datein.
Un wo ist meine main.h. und main.c?
Ich hab kein AVR-Studio 6, aber irgendwie sieht das bei dir komisch aus.
Sollten die .c und .h Datein nicht sauber getrennt in verschiedenen
Kategorien im der Projektanzeige auftauchen, so wie im alten AVR Studio
4?
So, habe alles mit deinen Datein gemacht. Deine main.h und.c. Habe die
CPU geändert und die Pins angepasst. Ergebnis gleich, nur 1 und 3 Zeile
werden die Punkte angezeigt, keine Schrift. Zeile 2 und 4 wird nichts
angezeigt. Habe dir ein Bild anghängt. Du benutzt für die Zeile 2 und 3
jeweils die Adresse 0x40?
achim
@ Achim Seeger (achims)
>So, habe alles mit deinen Datein gemacht. Deine main.h und.c. Habe die>CPU geändert und die Pins angepasst. Ergebnis gleich, nur 1 und 3 Zeile>werden die Punkte angezeigt, keine Schrift.
Achim, du hast immer noch dein altes Problem. Du kannst (oer willst)
nicht gescheit kommunizieren! Das geht schief!
Zuerst solltest du mal festhalten, dass das Projekt jetzt fehlerfrei
kompiliert. Das ist schon mal ein wichtiger Schritt, meinst du nicht?
Als 2. Schritt solltest du das Projekt mit dem 2x16 LCD, was bei dir
schon geht, probieren.
Als 3. Schritt kann man dann dein 4x16 LCD probieren.
> Zeile 2 und 4 wird nichts>angezeigt. Habe dir ein Bild anghängt. Du benutzt für die Zeile 2 und 3>jeweils die Adresse 0x40?
Mal den Kommentar dahinter gelesen? Das sind die Einstellungen für mein
2x16 LCD, da ist der Wert von Zeile 3 egal. Du musst dort deine
Anfangsadressen deines LCD reinschreiben.
Aber wenn nur Kästchen angezeigt werden, hat die Initialisierung nicht
funktioniert.
Mach erstmal den Punkt 2 von oben, Teste mit DEINEM 2x16 LCD.
Dann kann man ganz schnell testen, was mit einem langsameren CPU-Takt zu
machen ist. Ohne das Programm zu ändern solltest du einfach mal die
CLKDIV8 Fuse aktivieren, dann läuft dein Controller um Faktor 8
langsamer. Das könnte dem 4x20 LCD gefallen. Probier mal.
Und du könntest mal einen Link auf das Datenblatt deines LCDs posten,
oder das Datenblatt selber.
Es lässt sich fehlerfrei kompilieren. Hast recht damit
Das einzigste was er nicht wollte war progmem
Mit dem Display 2x16 muss ich ein wenig warten. Habe scheinbar was
verbogen beim rein oder rausziehen. Muss noch fehlersuche machen. Wenns
nicht klappt muss ich schnell was anders zusammenbauen
Sorry, was vergessen zu fragen. Wenn ich ein Display 4x20 ohne I2C an
einem Port mit 4-Bit betreibe, dann muss ich 2 mal die Daten senden, mit
nibble.
Ist das hier nicht genauso? Ich betreibe das Display mit 4 Bit über I2C.
Bei 8 Bit muss ich doch die Daten auch 2 mal übertragen?
Wenn das LCD sein eigenes Datenblatt kennt, ist mit dem Timing alles OK.
Minimale Pulsbreite für E sind 240ns, minimale Periode 1200ns. Das wird
problemlos eingehalten, denn durch den I2C ist das alles SEHR laangsam.
Die restlichen Befehlsausführungszeiten sind geringfügig kürzer als der
originale HD44780. Pinbelegung ist auch identisch.
Also sollte man mal ein Auge auf den praktischen Aufbau richten. Wie
sind die Verbindungen zwischen PCF und LCD? Steckbrett? Wackelkontakte?
Kalte Lötstellen?
@ Achim Seeger (achims)
>Das einzigste was er nicht wollte war progmem
Warum? Das include dazu ist in den Files drin.
#include <avr/pgmspace.h>
Es kann natürlich sein, dass mit dem neueren avr-gcc dort was anderes
mittlerweile genutzt wird. Ich kann mir aber nicht so recht vorstellen,
dass das alte PROGMEM gar nicht mehr gehen soll.
>Mit dem Display 2x16 muss ich ein wenig warten. Habe scheinbar was>verbogen beim rein oder rausziehen. Muss noch fehlersuche machen. Wenns>nicht klappt muss ich schnell was anders zusammenbauen
Oje.
Zum Aufbau.
Es ist kein Steckbrett. Alle Teile sind auf Platinen und nur mit
Busleitung verbunden. keine freie Verdrahtung, keine Wackelkontakte. Ori
Platine von Pollin und Nachbau mit veränderter Grösse und Bauform.
An dem 2x16 scheint was oberfaul zu sein. Wahrscheinlich erst Ersatz
beschaffen. Meine Ersatz LCd hat leider andere Bauform. Muss mir erst
was passendes einfallen lassen.
Eine Möglichkeit haben wir noch garnicht betrachtet.
Was ist wenn das PC2004 defekt ist?
achim
Falk Brunner schrieb:> Ich hab kein AVR-Studio 6, aber irgendwie sieht das bei dir komisch aus.> Sollten die .c und .h Datein nicht sauber getrennt in verschiedenen> Kategorien im der Projektanzeige auftauchen, so wie im alten AVR Studio> 4?
Benutze auch das 6er Studio.
Sieht bei mir auch so aus.
Steht alles zusammen im Solution Explorer.
Hallo Falk
es geht mir nicht um die Kabel. Könnte ich sofort dran löten.
Habe weiter gesucht und gelesen. Das mit dem nicht ini stimmt, hattest
du schon gesagt. Habe es auch gefunden, das eine übertragung bei einem
Display mit 4x20 und 4 Bit 2 mal erfolgen muss. Umschaltung mit nibble.
Die Info dazu im Netz ist aber extrem dünn. Habe mit goo.. ca 1000
Stellen gefunden, mit gerade 3 Stellen , die ein bischen dazu sagen.
Viele suchen eine Lösung. Ist das nichts für dich?
achim
@ Achim Seeger (achims)
>Habe weiter gesucht und gelesen. Das mit dem nicht ini stimmt,
Wie bitte?
> hattest>du schon gesagt. Habe es auch gefunden, das eine übertragung bei einem>Display mit 4x20 und 4 Bit 2 mal erfolgen muss. Umschaltung mit nibble.
Und was ist daran so neu? ALLE Displays dieser Art funktionieren so, der
Unterschied liegt im Wesentlichen nur in der Zuordnung der Adressen zu
den Zeilen.
Die Ausnahme sind die 4x40 LCDs, die haben zwei Controller mit zwei
getrennten E Signalen.
>Die Info dazu im Netz ist aber extrem dünn.
Ich glaub da ist eher was anderes dünn . . .
>Habe mit goo.. ca 1000>Stellen gefunden, mit gerade 3 Stellen , die ein bischen dazu sagen.>Viele suchen eine Lösung. Ist das nichts für dich?
Was denn? Das popelige 2x40 LCD zu laufen zu kriegen? Ach nö. Ist nicht
wirklich spannend. iCh behaupte mal, das LCD läuft ganz normal, wenn man
es richtig anschließt.
Ein LCD an einem Port in 4 Bit geht ohne Probleme bei mir.
Neu ist die Sache dabei, es mit I2C zu machen. Wenn es so bekannt ist
und viel Info im Netz stehen, warum finde ich so wenig dazu?
Die ganzen Tuts laufen alle an einem Port ohne I2C.
Fast alle Beispiele mit LCD am I2C laufen mit einem 2x16 Display. Das
geht auch bei mir. (Wenn ich die defekten Teile getauscht habe). Bleibt
noch das 4x20 Display am Bus.
Habe auch einige Artikel mit GLCD am Bus gesehen.
Ein richtiger Anschluss ist vorhanden. Die genaue Belegung steht in der
Datei. Die Angabe dazu auf dem Display ist auch eindeutig. Auf jeden
Fall hattest du ja schon gesagt, das ini fehlt. Werde weiter suchen.
@ Achim Seeger (achims)
>Ein LCD an einem Port in 4 Bit geht ohne Probleme bei mir.>Neu ist die Sache dabei, es mit I2C zu machen. Wenn es so bekannt ist>und viel Info im Netz stehen, warum finde ich so wenig dazu?
Mein Gott, muss man denn ALLEs erstmal im Netz finden?
>Die ganzen Tuts laufen alle an einem Port ohne I2C.
So what. Hör auf zu jammern.
>Fast alle Beispiele mit LCD am I2C laufen mit einem 2x16 Display. Das>geht auch bei mir.
Schön, dann geht auch 4x20, wenn es das Modul aus dem Datenblatt ist.
Denn das hat einen voll kompatiblem controller.
>Ein richtiger Anschluss ist vorhanden.
Wie hast du das geprüft?
Prüfe es RICHTIG. Schreib ein kleines Testprogramm, dass per I2C jede
Pin einzel und langsam wackeln lässt, so mit 1s oder so. Dann kann man
das direkt am LCD mittels DMM nachmessen.
Einfach so
1
while(1){
2
lcd_write_i2c(0x01);
3
_delay_ms(1000);
4
lcd_write_i2c(0x00);
5
_delay_ms(1000);
6
}
Dann kann man alle 8 Pins durchtesten.
> Die genaue Belegung steht in der>Datei. Die Angabe dazu auf dem Display ist auch eindeutig. Auf jeden>Fall hattest du ja schon gesagt, das ini fehlt. Werde weiter suchen.
Tja, es geht aber nicht, also ist was faul. Und das muss man
systematisch suchen, siehe Fehlersuche. Der Test oben ist ein guter
Anfang.
@Achim:
Hast Du denn auch ein 2x16 Zeichen LCD? Läuft das mit der Lib von Falk?
Normalerweise sollte auch das 4x20 Zeichen Display mit der Routine
laufen.
Da werden dann die 1. und 3. Zeile beschrieben...
@ Dennis Kaufmann (scarfaceno1)
>Hast Du denn auch ein 2x16 Zeichen LCD?
Ja.
> Läuft das mit der Lib von Falk?
Er hat's kaputt gemacht.
Beitrag "Re: I2CLCD Library für HD44780 LCDs"
Hallo,
ich habe jetzt auch versucht, diese Versionen zu verwenden, da ich mit
meinen bisherigen Bemühungen gescheitert war.
Nach dem Anpassen der Konfiguration wollte ich im Atmel Studio 6.1
compilieren und bekomme folgenden Fehler:
Da ich doch recht unerfahren bin, weis ich nicht was hier das Problem
ist. Habe versucht, im Netz was zu finden, aber ich komme nicht klar
damit, bzw. es trifft nicht mein Problem (oder mein Englisch ist einfach
zu schrott).
Wäre nett, wenn ich hier Hilfe bekomme, woran es liegt. Bis auf die
Prozessor-Frequenz (16MHz) habe ich keine Einstellungen verändert. Die
Pinbelegung stimmt mit dem Code überein, daher keine Veränderung.
So, ich habe mal das mit dem Flash ausgeklammert, so das er eine
Einfache Ausgabe geben sollte.
Aber ausser der ersten und dritten Zeile mit gefüllten Zeichen kommt
nichts.
Wie in meinem bisherigen Threat
(Beitrag "LCD an Arduino Nano via I2C") kann ich über die
Audrino-IDE und einem passenden Programm das Display ansprechen.
Es liegt also nur an dem Code, aber ich weis nicht woran es happert.
Habe auch wieder die Prozessorfrequenz auf 8MHz zurück gesetzt.
Hallo Falk
die einzelnen Pins eines PCF8574 habe ich getestet. Benutze dazu eine
kleine Platine mit 8 Taster und eine zweite Platine mit 8 LED. An beiden
kann ich die einzelnen Adressen einstellen. Mit einem kleinen Programm
wird die Kommunikation im Bus getestet und jeder Ein und Ausgang.
Gleichzeitig habe ich teilweise bis zu 5 Module unterschiedlicher Bauart
am Bus und übertrage damit teilweise auf mehrere Adressen und
Funktionen. Gehe da von aus, das der Bus geht. Wie sage ich dem Display
das ich im 4 Bit Modus arbeite?
Hallo Dennis
habe leider mein LCD 2x16 geschossen. Vorher hatte ich an der Platine
von Pol.. eine Anzeige auf dem Display. Wollte danach das Display mit
4x20 aufstecken. Bei diesem Display wird in der 1 und 3 Zeile nur das
Punktraster angezeigt (5x7). Kann machen was ich will, bekomme keine
Schrift angezeigt. Da nur die Punkte angezeigt werden, ist
wahrscheinlich keine init erfolgt. Das andere ist, wenn ich das Display
an einem Port des Kontrollers im 4 Bit verwende (ohne I2C) muss ich mit
nibble, oberste Bit und unterste Bit arbeiten - getennte übertragung.
Warum muss ich das bei I2C nicht machen? Woher weiss das Display das ich
im 4 Bit arbeite, wenn ich es vorher nicht sage? Da ich beim PCF die
D4-D7 verwende ist es 4 Bit.
Hallo Sahra
klammere progmen aus. Dann müsste es ohne fehlermeldung gehen. Nach
deiner Angabe siehst du auch nicht mehr als ich. Hatte bisher den
Eindruck (bekommen), das es nur an meinem Aufbau liegt. Triffst aber die
gleich feststellung wie ich
Es ist durchaus möglich das was kaputt geht. Ist zum Glück kein grosser
Schaden. In ein paar Tagen geht alles wieder
achim
@ Sarah S. (magicsarah)
>variable 'string_flash' must be const in order to be put into read-only >section
by means of '__attribute__((progmem))'
Da ist der neue avr-gcc scheinbar etwas pingelig. ALso so.
1
constcharstring_flash[]PROGMEM="Hello Flash!";
>Wäre nett, wenn ich hier Hilfe bekomme, woran es liegt. Bis auf die>Prozessor-Frequenz (16MHz) habe ich keine Einstellungen verändert. Die>Pinbelegung stimmt mit dem Code überein, daher keine Veränderung.
Stimmt auch die Adresse überein?
@ achimS (Gast)
>Funktionen. Gehe da von aus, das der Bus geht.
Schön, aber damit hast du nicht zwangsläufig getestet, ob die Daten für
dein PCF auch an den IOs ankommen.
> Wie sage ich dem Display>das ich im 4 Bit Modus arbeite?
Mit dem passenden Befehlen bei der Initialisierung.
>nibble, oberste Bit und unterste Bit arbeiten - getennte übertragung.>Warum muss ich das bei I2C nicht machen?
Musst du du auch, aber das steckt in der Bibliothek drin.
>Woher weiss das Display das ich>im 4 Bit arbeite, wenn ich es vorher nicht sage?
Du musst es halt vorher sagen ;-)
Beim zweiten Durchlauf kommte keine Meldungen mehr.
Aber das Ergebniss bleibt.
>> Stimmt auch die Adresse überein?>
Wie auch in meinem Ursprünglichen Threat zu lesen, habe ich die Adresse
0x27, welche über die Adruino-IDE verifiziert ist. Also daran kann es
nicht liegen. Habe alternativ auch die übliche 0x20 ausprobiert, aber
leider Fehlanzeige.
So wie ich verstanden habe, bedeutet die 1. und 3. Zeile Pixel, das die
Initiallisierung des Displays nicht vorgenommen wurde. Aber wo liegt
jetzt der Fehler.
@ Sarah S. (magicsarah)
>passing argument 3 of 'lcd_printlc_P' discards 'const' qualifier from >pointer
target type [enabled by default]
>expected 'char *' but argument is of type 'const char *'
Jaja, kann man erstmal ignorieren.
>Wie auch in meinem Ursprünglichen Threat zu lesen, habe ich die Adresse>0x27, welche über die Adruino-IDE verifiziert ist.
Was hast du denn WIE verifiert?
> Also daran kann es>nicht liegen.
MÖÖÖP! Schon falsch! Siehe Fehlersuche!
> Habe alternativ auch die übliche 0x20 ausprobiert, aber>leider Fehlanzeige.
Blinde Kuh spielen ist hier nicht zielführend. WIRKLICH messen ist
angesagt! Denn weder 0x20 noch 0x27 ist bei dem Projekt eine gültige
Adresse! Wurde in deinem Thread (nicht Threat!) ausführlich erklärt. Die
Adressen gehen von 0x40-0x4E in 2er Schritten, weil das LSB immer 0 ist.
>So wie ich verstanden habe, bedeutet die 1. und 3. Zeile Pixel, das die>Initiallisierung des Displays nicht vorgenommen wurde. Aber wo liegt>jetzt der Fehler.
Tja, Fehlersuche heißt das Zauberwort. Geht ganz einfach. Erstmal
muss man prüfen, ob man den IC ansprechen kann.
1
intmain(void)
2
{
3
charstring1[]="Hello World!";
4
5
i2c_init();
6
7
if(i2c_start(0x40)){
8
// ERROR, kein ACK auf dem Bus
9
// Fehler-LED einschalten
10
}
11
12
while(1){
13
14
}
15
}
Damit kann man SEHR EINFACH UND SCHNELL herausfinden, auf welcher
Adresse der PCF denn nun WIRKLICH angesprochen werden muss.
>Denn weder 0x20 noch 0x27 ist bei dem Projekt eine gültige>Adresse! Wurde in deinem Thread (nicht Threat!) ausführlich erklärt. Die>Adressen gehen von 0x40-0x4E in 2er Schritten, weil das LSB immer 0 ist.
Das Problem ist vermutlich mal wieder das der eine die I2C Adresse
als 7 Bit ohne RW betrachtet, und der andere (in diesem Fall Falk)
eben als 8 Bit inklusive RW (bevorzuge ich auch weils logischer ist).
0x27 x 2 = 0x4E
Hallo
habe den Code so eingegeben wie er von Falk gekommen ist. Habe das
PROGMEN auskommentiert und danach fehlerfrei Kompiliert. In den anderen
Datein habe ich 4 Zeile und 20 Zeichen eingestellt, die Pins Nr noch mal
mit den PINS des LCD verglichen. Die Adresse habe ich an de Platine und
im Programm kontrolliert. Steht in der Datei auf 0x40 und auf der
Platine auf 3xGND.
Es erscheint immer noch in der 1 und 3 Zeile das volle Punktraster. In
der Zeile 2 und 4 wird nichts dargestellt. Leider komme ich nicht
weiter. Weiss jemand Rat?
achim
@ Achim Seeger (achims)
Mensch Achim. Und täglich grüßt das Murmeltier? Du drehst dich endlos im
Kreis.
Warum hast du nicht das gemacht, was ich dir empfohlen haben? Nämlich
erstmal das funktionierende 2x16 LCD anzusteuern. DANN kannst du das
4x20 angehen.
Ein einfacher Test, ob der Zugriff auf den PCF wenigstens ansatzweise
funktioniert ist, das Licht der Hintergrundbeleuchtung periodisch ein
und aus zu schalten.
1
while(1){
2
lcd_light(true);
3
_delay_ms(1000);
4
lcd_light(false);
5
_delay_ms(1000);
6
}
So, ich habe gestern bei Pollin diese LCD bestellt. Nächtste Woche ist
es hier. Wenn ich es in weniger als 1 Stunde zum Laufen kriege, gibts
ein's auf's Maul! (Rethorisch natürlich)
Hallo Falk
mit dem Diplay 2x16 hatte ich zugriff auf den PCF und eine Ausgabe des
Textes. Stecke ich das Diplay 4x20 auf den Adapter von Poll.. erscheint
nur die erste und dritte Zeile mit den Kästechen. Auf beiden habe ich
dei Adresse 40 eingestellt.
Ja ich drehe mich im Kreis, weil ich den Unterschied nicht begreiffe,
wennich die 2 in 4 und die 16 in 20 im .. h geöndert habe könnte es
damit gehen.
Wenn es klapp, darfst due es machen, natürlich retorisch gesehen.
achim
Hallo Achim,
hab mal aus Spass ein 4*16 Zeichen Display angehängt (via
China-Adapter).
Musste nur die Adressen und Anzahl der Zeilen sowie die PROGMEM-Zeile
und einen Delay (von 2 auf 5 ms) anpassen - dann hat es funktioniert ...
Ggf. bist Du einer Eigenart des Atmel Studio (zumindest bei mir ist das
so) aufgesessen - das merkt sich scheinbar immer nur die letzte
ausgewählte Datei im "Device Programming"-Dialog. Wenn Du zuletzt die
.elf-Datei für das Eeprom ausgewählt hast und das Flashen wieder
aufrufst hat das Atmel Studio (zumindest bei mir) auch für den
Flash-Datei-Namen die .elf-Datei am Wickel - und dann siehst Du
natürlich nur die normale Display-Initialisierung (Blöcke), da kein
Programm auf den Mikrocontroller geflasht wurde sondern die
Eeprom-Datei.
Sieht man nicht, wenn der Pfad etwas länger ist ...
Gerade erst gesehen, dass die Start-Adressen der Zeilen 3 und 4 noch
nicht korrekt sind ... es muss noch jeweils 4 abgezogen werden, also:
#define LCD_LINE1 0x00 /**< This should be 0x00 on all
displays */
#define LCD_LINE2 0x40 /**< Change this to the address for
line 2 on your display */
#define LCD_LINE3 0x10 /**< Change this to the address for
line 3 on your display */
#define LCD_LINE4 0x50 /**< Change this to the address for
line 4 on your display */
@ Dieter Frohnapfel (jim_quakenbush)
>und einen Delay (von 2 auf 5 ms) anpassen - dann hat es funktioniert ...
Warum 5ms nach einem Clear? 2ms sollten laut Datenbaltt reichen? Was
passiert bei dir bei 2ms?
Hallo Falk,
bei den 2 ms wird das "H" der ersten Zeile "verschluckt. Scheinbar
reagiert mein Display etwas träge auf LCD_CLEAR.
Ich habe mich nicht wirklich herangetastet und einfach mal 5 ms
ausprobiert ... (es ist ein Optrex-Display, das hier noch "so rumlag"
:-))
Hallo Falk,
habe mal nachgeschaut - es ist ein DMC 16433.
Lt. Hersteller "Execution time(max.) when fcp or fosc is 250 kHz 15.2
ms" für ein "Clear Display". Keine Ahnung wie das Display getaktet ist
aber 5 ms scheinen auszureichen.
Hallo Dieter
habe dein Sache sofort getestet an zwei verschiedenen Adaptern. Da von
ist der eine der von Polli.. Habe auch deine Sachen geändert (adressen).
Das gleiche Ergeniss. Habe die ganzen Sachen von dir genommen.
Hast du die Belegung des Display so gelassen wie es in der Datei ist?
Bei mir ist die anders. Das gleicher Ergeniss. 1 und 3 Zeile Kästechen
sonsz nichts
achim
Hallo Achim,
hast Du den Bausatz von Pollin verwendet und selbst gelötet? Welches IC
genau ist verbaut?
Kannst Du bitte Bilder von DEINEM Expander (so wie er aktuell aussieht)
und DEINEM Anschluss an das LCD einstellen?
Bitte füge auch DEIN aktuelles Atmel-Studio-Projekt (gepackt) dazu.
Hast Du sicher die hex-Datei geflasht?
Ich habe - außer dem, was ich geschrieben habe - nichts angepasst (O.K.
ich habe noch eine 3. und 4. Zeilen-Ausgabe hinzugefügt und Delays
zwischen den Ausgaben verändert/angepasst - aber das spielt keine
Rolle).
Was bei dem Pollinadapter ein Problem sein kann, ist, dass die
Datenleitngen D0-D3 auf GND liegen. Damit haben einige LCDs Probleme im
4 Bit Modus. Normalerweise sollen die offen bleien, dorts sind meist
interne Pull-Ups dran. Man sollte mal versuchen, D0-D3 nicht an den
Adapter anzuschließen, sie werden so oder so nicht gebraucht.
Ein anders Problem könnte in der lcd_init() stecken. Dort wird nur 2ms
auf das Ende vom LCD CLEAR Kommando gewartet. Das sollte man mal
erhöhen, 100ms oder so.
MFG
Falk
Hallo Dieter
ich verwende den PCF 8574P (nicht A). Die Adresse 0x40. Ist auf dem
Pollin eingestellt. Du hast im Prg drin 0xE4. Habe beide getestet. Ohne
Erfolg. Habe zum Anfang das Display 2x16 von pol.. verwendet. Damit
wurde der Text korrekt dargestellt. Habe dann ein Display mit 4x20
aufgesteckt. Es wurde nur Zeile 1 und 3 mit Punkten angezeigt. In der
Zeile 2 und 4 war nichts zu sehen. Habe dann leider das andere Display
falsch eingesteckt. Es zeigt nichts mehr an. Hast du die Belegung so
genommen oder anders gemacht?
1
#define LCD_D4_PIN 4 /**< LCD-Pin D4 is connected to P4 on the PCF8574 */
2
#define LCD_D5_PIN 5 /**< LCD-Pin D5 is connected to P5 on the PCF8574 */
3
#define LCD_D6_PIN 6 /**< LCD-Pin D6 is connected to P6 on the PCF8574 */
4
#define LCD_D7_PIN 7 /**< LCD-Pin D7 is connected to P7 on the PCF8574 */
5
#define LCD_RS_PIN 0 /**< LCD-Pin RS is connected to P0 on the PCF8574 */
6
#define LCD_RW_PIN 1 /**< LCD-Pin RW is connected to P1 on the PCF8574 */
7
#define LCD_E_PIN 2 /**< LCD-Pin E is connected to P2 on the PCF8574 */
8
#define LCD_LIGHT_PIN 3 /**< LCD backlight is connected to P3 on the PCF8574, low active */
Hatte verschieden Sachen getestet. leider alles ohne Erfolg.
Wie muss den die Belegung richtig sein?
DB4 vom LCD -> ???
Sorry bin jetzt verwirrt
achim
Achim Seeger schrieb:> Du hast im Prg drin 0xE4.
Hallo Achim,
nein - ich habe
#define LCD_I2C_DEVICE 0x4E /**< Change this to the address of
your expander */
drin - und habe den China-Adapter im Original-Zustand belassen. Das
sollte auch für den 8574P passen, wenn Du nichts geändert hast.
Ich vermisse die Bilder un die Antworten auf meine Fragen ...
Hallo Achim,
in Deinem Programm steht "meine alte Einstellung":
#define LCD_I2C_DEVICE 0x4E /**< Change this to the address of
your expander */
#define LCD_LINES 4 /**< Enter the number of lines of your
display here */
#define LCD_COLS 16 /**< Enter the number of columns of
your display here */
#define LCD_LINE_MODE LCD_2LINE /**< Enter line mode your
display here */
#define LCD_LINE1 0x00 /**< This should be 0x00 on all
displays */
#define LCD_LINE2 0x40 /**< Change this to the address for
line 2 on your display */
#define LCD_LINE3 0x14 /**< Change this to the address for
line 3 on your display */
#define LCD_LINE4 0x54 /**< Change this to the address for
line 4 on your display */
/*@}*/
LCD_COLS muss bei Dir 20 sein
LCD_LINE3 muss bei Dir 10 sein
LCD_LINE4 muss bei Dir 50 sein
... und ich sehe immer noch keine Bilder und habe noch keine Antwort auf
meine Fragen ...
Achim Seeger schrieb:> In der zeile darunter steht 2Line. Hat das ein Einfluss?
Ja, vielleicht solltest Du mal auf ...4line umstellen - ich habe es
nicht gemacht und es hat auch funktioniert :\
... und das stimmt immer noch nicht:
LCD_LINE4 muss bei Dir 50 sein
Bilder???
@ Achim Seeger (achims)
>Mist, ich alter Trottel, habe die falsche Datei genommen, jetzt kommen>meine>sorry
Naja, wenn du immer so arbeitest, wundert mich gar nichts mehr . . .
Teste es sofort
Falk, wen wir alle perfekt wären, würde alles auf Anhieb funktionieren.
dann gäbe es keinen Hunder usw., Den Rest kennst du ja. Der letzte
perfekte Mensch ist heut vor ca 2000 Jahren augfahren, welch ein Zufall
..
Habe jetzt komplette neue Hardware verwendet. Also neuer Adapter, neuer
IC, neues Display mit 2x16. Es wird die Schrift angezeigt. Stecke ich
ein Display mit 4x20 drauf erscheint nur in der 1 und 3 Zeile die
Punkte, Zeile 2 und 4 ist nichts.
Hallo Dieter
Habe dein Programm geteste. Mit dem Display 2x16 erscheint erst Hello
World mit I2CLCD V0.11
und dann Hello Flash und Zeile 4
Stecke ich das Display 4x20 drauf und starte dein Programm ohne etwas zu
änder erscheint wieder in der 1 und 3 Zeile lauter Punkte in der 2 und 4
Zeile nichts. Vorher hatte ich die Bus Adresse geändert. Mit einer
anderen Adresse kann ich das Modul nicht ansprechen. Stelle ich die
Adresse zurück geht alles wieder.
Sorry, weiss nicht weiter
achim
@ Dieter Frohnapfel (jim_quakenbush)
>Das funktioniert natürlich nicht!! - Du musst dann ja wenigstens die>Angabe Zeilen und Spalten anpassen!
Für eine vollständige Ansteuerung ja, um nur die Initialisierung zu
testen und die zwei Reihen mit den Quadraten verschwinden zu lassen.
Falk Brunner schrieb:> Für eine vollständige Ansteuerung ja, um nur die Initialisierung zu> testen und die zwei Reihen mit den Quadraten verschwinden zu lassen.
Was soll mir das sagen?
Hallo Dieter
anbei die Fotos der neuen Hardware. Ich verwende dein Programm mit den
Einstellungen wie auf dem Bild. Dein Programm bringt die Anzeige auf dem
2x16 LCD wie geschrieben. Auf dem 4x20 nur Punkte. Habe nur die
genannten änderungen an deinem Programm vorgenommen.
achim
@Dieter Frohnapfel (jim_quakenbush)
>Was soll mir das sagen?
Der erste Schritt ist die Initialisierung, dann verschwinden die zwei
Zeilen mit den Quadraten. Da nicht mal das bisher funktioniert, muss man
hier erstmal den Fehler suchen. Hab ich schon geschrieben, gemacht wurde
es leider noch nicht.
Beitrag "Re: I2CLCD Library für HD44780 LCDs"
Hallo Falk
da das Display 2x16 geht wird es doch iniiert. Ich verwende die datein
von Peter. Hat er es vergessen? Stelle ein paar Foto rein mit der
Ansicht der Displays. Beide mit dem gleichen Prg. Daten stehen auf 4x
20.
Achim Seeger schrieb:> Dein Programm bringt die Anzeige auf dem> 2x16 LCD wie geschrieben. Auf dem 4x20 nur Punkte.
Hallo Achim,
auf den Bildern sehe ich keine Punkte. Auch kenne ich Dein aktuelles
Programm nicht.
Auf dem ersten Bild würde ich genau 4 Kabel erwarten:
GND
+5V
SCK
SCL
Da sind mehr Kabel zu sehen - wieso?
Links, z.B. BL_K3, scheinen Lötstellen nicht optimal zu sein ...
Ich kann es nicht erkennen - aber wenn Du JP1,2,3 gesetzt hast, dann ist
natürlich auch die Adresse 0x47.
Der Anschluss kommt von einen 10 polg. Flachkabel. Die Belegung erfolgt
nach RN Standard. Die Beschriftung der Stecker ist dahinter und leider
nicht zu sehen. Diese stimmt aber, da ich mit dem Display 2x16 die
gewünschte Schrift bekomme. Auf dem Bild 1407 ist in der ersten Zeile 20
Quadrate mit jeweils 5x7 Punkte, das gleich in der 3 Zeile. Die 3 Jumper
gehen nach GND. Der Anschluss links ist nur für die Beleuchtung, dabei
sind jeweils 3 Kontakte parallel geschaltet. Das Prg kennst du, es
stammt von dir. Ich arbeite mit dem Studio 6 und verwende das Programm
was du geschickt hast. Habe die Adresse 0x40 getestet, gebe ich einen
andere an, kann ich den Adapter nicht ansprechen
Achim Seeger schrieb:> Die Belegung erfolgt nach RN Standard
Kenne ich nicht, wie sieht der aus?
Achim Seeger schrieb:> und verwende das Programm was du geschickt hast.
"Mein" Programm ist auf 16 Zeichen pro Zeile eingestellt.
Ich habe keine Ahnung, was bei Dir falsch läuft. Weder kenne ich die
aktuelle Schaltung (komplett) noch das aktuell von DIR eingesetzte
Programm. Auch weiß ich nicht, ob der Pollin-Adapter (von Dir gelötet ?)
korrekt funktioniert.
Ich weiß aber, dass mit einem Billig-China-Modul alles O.K. ist.
Also muss der Fehler im Pollin-Modul, dem Display oder Deinem Programm
stecken.
Fehlersuche (nach meiner Art): Reihum austauschen und Testen ...
@Achim Seeger (achims)
>da das Display 2x16 geht wird es doch iniiert. Ich verwende die datein>von Peter. Hat er es vergessen?
Nein, wie sollte dan das 2x16 LCD laufen?
> Stelle ein paar Foto rein mit der>Ansicht der Displays. Beide mit dem gleichen Prg. Daten stehen auf 4x>20.
Und scheinbar auch 10ms Pause nach dem LCD_CLEAR. Merkwürdig. Wenn es
keine Wackelkontakte oder kalte Lötstellen sind, würde ich fast
behaupten, das LCD ist defekt.
@ Dieter Frohnapfel (jim_quakenbush)
>> Die Belegung erfolgt nach RN Standard>Kenne ich nicht, wie sieht der aus?
unwichtig, die vier Kabel zum Pollinadapter stimmen.
>"Mein" Programm ist auf 16 Zeichen pro Zeile eingestellt.
Ich auch egal. Der unterschied liegt nur in den Adressen. Die erste
Zeile ist immer gleich.
>Programm. Auch weiß ich nicht, ob der Pollin-Adapter (von Dir gelötet ?)>korrekt funktioniert.
tut er mit dem 2x16 LCD!
>Ich weiß aber, dass mit einem Billig-China-Modul alles O.K. ist.
Schön, löst aber das Problem nicht.
>Also muss der Fehler im Pollin-Modul, dem Display oder Deinem Programm>stecken.
Ach ne?
>Fehlersuche (nach meiner Art): Reihum austauschen und Testen ...
Hat er schon gemacht, wie man dem Thread entnehmen kann.
Wuensche einen recht schönen Morgen an alle,
Hallo Falk
Habe an den Pins des LCD die D0 bis D3 Masse abgeklemmt. Egal mit oder
ohne ist immer das gleiche Ergebnis. Glaube auch langsam das das LCD
defekt ist. Problem dabei ist, habe 2 verschiedene Typen mit 4x20 und
bei beiden das gleiche?
Mit init könnte stimmen. Es ist aber drin. Könnte es sein das es an der
falschen Stelle steht und nicht ausgeführt wird?
achim
@ Achim Seeger (achims)
>Habe an den Pins des LCD die D0 bis D3 Masse abgeklemmt. Egal mit oder>ohne ist immer das gleiche Ergebnis.
Mist.
> Glaube auch langsam das das LCD>defekt ist. Problem dabei ist, habe 2 verschiedene Typen mit 4x20 und>bei beiden das gleiche?
Möglich, glaub ich aber nicht so recht.
>Mit init könnte stimmen. Es ist aber drin. Könnte es sein das es an der>falschen Stelle steht und nicht ausgeführt wird?
Bitte? Jetzt wird's aber echt albern! Schau mal in den Quelltext, dort
ist lcd_init() die 2. Funktion in Main.
Hallo Dieter
das mit dem China Adapter gibt mir ganz schön zu denken. Was soll der
Unterschied sein? Eiegntlich ist die Schaltung doch ganz einfach. Einen
PCF 8574, 3x Adresse, Regler zwischen 1 bis 3, auf 15 und 16 Anschluss
LED mit Transistor vom Pin12 (P7) geschaltet. Dann noch die Belegung:
LCD PCF
4 PIN 9 P4 RS
5 PIN 10 P5 RW
6 PIN 11 P6 E
11 PIN 4 P0 DB4
12 PIN 5 P1 DB5
13 PIN 6 P2 DB6
14 PIN 7 P3 DB7
Könntest du mal vergleichen?
achim
@ Achim Seeger (achims)
>Sorry, du hattest doch selber gesagt, das erst mal init kommen muss,>damit die Quadrate weg gehen.
Ja natürlich! Init wird vom Controller auch ausgeführt, hat aber, warum
auch immer, bei dem LCD keine Wirkung. Beim 2x16 LCD wirkt es ja.
Hallo Achim,
hast Du mal das Datenblatt Deines Displays Seite 9 unten betrachtet?
Liefert Dein I2C-Modul negative Kontrast-Spannung? Lt. Schaltplan sehr
unwahrscheinlich ...
@ Dieter Frohnapfel (jim_quakenbush)
>Liefert Dein I2C-Modul negative Kontrast-Spannung?
Die Standard-LCDs brauchen keine negative Kontrastspannung. Ausserdem
SIEHT er ja die zwei Zeilen mit Kästchen, also ist das OK.
> Lt. Schaltplan sehr unwahrscheinlich ...
Sogar AUSGESCHLOSSEN!
Da keine Reaktion erfolg hier wenigstens der Grund für meine Bitte:
Achims Display ist "HD44870-kompatibel" - lt. Datenblatt werkelt da ein
ST7066. Dieser braucht eine etwas andere Initialisierung, welche ich
"eingebaut" habe.
Hätte mich schon interessiert, ob das des Rätsels Lösung ist ...
Sorry Dieter
hatte heute ein "bischen" Stress. Komme heute leider nur immer kurz an
den PC (Pikett Einsatz Kältetechnik ca 1,6 MW). Morgen früh hab ich mehr
Zeit. Ich teste auf jeden Fall.
Post kommt am Montag, noch zwei andere Displays, 2x16 und 4x20, da muss
doch was kommen.
Kleiner Zwischenbericht. Heute ist mein LCD von Pollin (Bestellnummer
120 687) angekommen. Buchsenleiste angelötet, China-Adapter angesteckt,
geht!
Wenn man dann noch die richtgen Adressen für die Zeilen und 4x20
einstellt, kann man alle vier Zeilen wunderbar beschreiben. Siehe
Anhang.
Mal sehen was dann mit dem Pollinadapter los ist.
Falk Brunner schrieb:> Heute ist mein LCD von Pollin
Hallo Falk,
prima - nur hat Achim ja (lt. Datenblatt) ein anderes Display - nämlich
ein PC2004-c (PC2004LRU-CWA-HDHQ) und das wird etwas anders
initialisiert, da ein anderer Controller verbaut ist.
@ Dieter Frohnapfel (jim_quakenbush)
>prima - nur hat Achim ja (lt. Datenblatt) ein anderes Display - nämlich>ein PC2004-c (PC2004LRU-CWA-HDHQ) und das wird etwas anders>initialisiert, da ein anderer Controller verbaut ist.
Die Unterschiede sind marginal, das PC2004 ist sogar teilweise schneller
als der originale HD44780.
Wir werden sehen. Der Achim hat mir sein LCD + Pollinadpater geschickt,
ich werde versuchen, ihn zum Leben zu erwecken.
Hallo Falk
schon mal danke für das Bild. Habe auch weitergemacht. Habe mir auch 2
Displays bestellt. Ein 2x16 und ein 4x20 von Pol.. vom Typ TC1602/1604.
Hab es eingesteckt und es ging sofort mit dem ersten Prg von Dieter.
Auch ein älteres Prg von mir hat sofort einen Text gebracht, Es spielt
auch keine Rolle was ich eingstellt hatte Zeiöe oder länge. Hat zwar
dann nicht gestimmt, aber Text kam. Alles mit einem Pollin Adapter,
verstehe es nicht
achim
@ Achim Seeger (achims)
>dann nicht gestimmt, aber Text kam. Alles mit einem Pollin Adapter,>verstehe es nicht
Möglicherweise hast du auf dem anderen Adapter einen Lötfehler oder du
hast beim Experimenieren das LCD gekillt. Sowas kommt vor.
Falk Brunner schrieb:> Der Achim hat mir sein LCD + Pollinadpater geschickt,> ich werde versuchen, ihn zum Leben zu erwecken
Hallo Falk,
was macht der Versuch? Gibt es Ergebnisse zu berichten?
Gruß
Dieter
Versuuuuch macht kluuch ;-)
Das Paket ist noch unterwegs. Bisher hab ich nur die Lib noch ein wenig
überarbeitet und getestet. Läuft jetzt ziemlich gut und auch solide.
Falk Brunner schrieb:> Der Achim hat mir sein LCD + Pollinadpater geschickt,> ich werde versuchen, ihn zum Leben zu erwecken.
Hallo Falk,
ist inzwischen etwas angekommen?
So, das Päckchen ist heute angekommen. Einstellungen in meinem Projekt
auf die Pinbelegung und Adresse vom Pollinadapter geändert, 2x16 LCD
läuft auf Anhieb. Aber das 4x20 zuckt nicht.
Pins vorsorglich nachgelötet
Alle Pins einzeln wackeln lassen, sind einwandfrei am LCD messbar
Delays zwischen den INIT-Befehlen eingefügt, bis 50ms, keine Reaktion.
D0-D3 weggebogen, damit die vom Adapter nicht auf GND gezogen werden
Hat alles nix geholfen, das LCD zuckt nicht. Es ist wohl defekt.
Anbei das überarbeitete Projekt. Ein paar kleine Fehlerkorrekturen sowie
Verbesserungen sind jetzt drin.
Hallo Falk
danke für deine Arbeit. Da habe ich wohl zuoft gesteckt. Sonst habe ich
auch keine Erklärung. Wichtig dabei ist, bin nicht zu doof dazu.
Dank noch mal
achim
Mmh.
Hallo allerseits.
In meinem Datenblatt zum TC 1602a (16x2) stehen drei Referenzwerte
der Ausführungszeiten für die entsprechenden "Fosc" Frequenzen.
Wo wird denn dieser OSC-Takt eingestellt ?
Intern?
Äussere Beschaltung?
Steht irgendwo, welcher Takt nun bei meinem LCD gerade gilt ?
Eine Angabe, dass der LCD-Controller bei
270khz 1,52ms für ein "ClearDisplay" braucht, nützt nur insofern,
als dass man sich mit den Delay-Werten langsam herantasten muss.
Aber dass kann's doch nun wirkich nicht sein.
Wenn ich mich trotz Datenblatt herantasten muss, brauche ich weniger ein
solches, sondern eher 'ne gehörige Prise Pioniersgeist.
Oder entspricht "Fosc." dem Takt von "E" ?
(...was ich etwas bezweifle...wär aber cool :)
Dem Datenblatt entnehme ich, dass "E" eine Art Übernahme-Clock ist.
Diese Fummelei mit LCD-Timings wird richtig spannend, wenn
kein Atmel,kein Pic, kein Raspberry, kein Arduino oä, sondern andere
Elektronic die Ansteuerung übernehmen soll.
(...ja, es gibt noch andere Signalgenerierende Elektronic :)
Grüsse , Chris
@ Chris (Gast)
>Wo wird denn dieser OSC-Takt eingestellt ?>Intern?
intern auf dem LCD, ist alles schon richtig eingestellt.
>Steht irgendwo, welcher Takt nun bei meinem LCD gerade gilt ?
Eben der.
>als dass man sich mit den Delay-Werten langsam herantasten muss.
Nö, nimm die Zahlen aus dem Datenblatt und gut. Das haben vor dir
Tausende von LCD-Ansteuerern gemacht.
>Wenn ich mich trotz Datenblatt herantasten muss, brauche ich weniger ein>solches, sondern eher 'ne gehörige Prise Pioniersgeist.
Lass dir Kirche im Dorf und hör auf zu jammern.
>Oder entspricht "Fosc." dem Takt von "E" ?
Nein.
>Dem Datenblatt entnehme ich, dass "E" eine Art Übernahme-Clock ist.
Ist es. Enn gleich ich es eher als Takt bezeichnen würde.
>Diese Fummelei mit LCD-Timings wird richtig spannend, wenn>kein Atmel,kein Pic, kein Raspberry, kein Arduino oä, sondern andere>Elektronic die Ansteuerung übernehmen soll.>(...ja, es gibt noch andere Signalgenerierende Elektronic :)
Sollen wir jetzt vor dir und deiner gigantischen Herausforderung
niederknien? (Mein Gott ist das albern)
@ Falk
>Nö, nimm die Zahlen aus dem Datenblatt und gut. Das haben vor dir>Tausende von LCD-Ansteuerern gemacht.
#kratz#
Das LCD kam alleine. Datenblatt bei Pollin getrennt heruntergeladen.
http://www.pollin.de/shop/dt/Nzc1OTc4OTk-/Bauelemente_Bauteile/Aktive_Bauelemente/Displays/LCD_Modul_TC1602A_09.htmlhttp://www.pollin.de/shop/downloads/D120422D.PDF
----------
Diese Zahlen gelten aber nur fur eine bestimmte Fosc-Frequenz.
Und in meinem Datenblatt sind DREI angegeben.
Und da es nur EIN Datenblatt für ALLE TC-1602 gibt,
ist es NICHT ersichtlich, welche Fosc-Frequenz von denen DREIEN
nun für DAS LCD gilt, welches VOR MIR liegt.
Selbst wenn es im Netz noch Datenblatt-Derivate gibt (es gibt sie :),
so enthalten auch diese meist 3 Spalten mit Fosc.
Es steht auch nicht auf dem Display.
(So als winzipinzige Bemerkung like : "Fosc=190khz").
Nix.
Auszug aus dem Datenblatt (obiger PDF-Download auf Seite 10):
CLR-Display bei 190khz = 2,16ms
CLR-Display bei 270khz = 1,52ms
CLR-Display bei 350khz = 1,18ms
Und welcher der 3 Takte gilt bei meinem LCD ?
EntryModeSet bei 190khz = 53µs
EntryModeSet bei 270khz = 38µs
EntryModeSet bei 350khz = 29µs
Wär da wenigstens ein Punkt über irgendeiner Spalte der anzeigt,
das diese Spalte für MEIN LCD gilt...
Jetzt sag' bloss keiner, dass für dieses Problem die einzige Lösung
das BusyFlag ist...
(An welches man ja erst drankommt nach einer gewissen Init-Phase)
(Welche nicht abläuft bei obigem Timing-Problem)
Und um den Vogel abzuschiessen:
Diese 3 Werte gelten auch nur bei einer Temperatur von 25 Grad.
Am Ende steht noch der Hinweis, dass zwischen -25 und 70 Grad
die maximale ExecutionTime 100µs beträgt.(bzw. 4,1 ms für 2 Sonderlinge)
Als Grundlage diente wohl der langsamste Fosc sowie die ungünstigste
Temperatur...
----
>Ist es. Enn gleich ich es eher als Takt bezeichnen würde.
OkOk.
Ein Takt mit Übernahmefunktion.
>Sollen wir jetzt vor dir und deiner gigantischen Herausforderung>niederknien? (Mein Gott ist das albern)
Quatsch.
Ich will so'n LCD ohne Prozessor ansteuern.
Und das issen Problem, wenn man wie ich vor obiger Hürde steht.
@Holger (Gast)
>Da ist eine RC Kombination am Display Controller.>Per Software kannst du da nichts einstellen.
Auf manchen LCD-Typen sind das SMD Bauelemente... die man
durch (ab)löten bzw. (um)löten ändern kann...
Wenn diese allerdings dicht im/am Controller sind...Shit happens.
-------
Was ist eigentlich, wenn man "E" frequenzmässig langsamer taktet?
Laut Datenblatt (Seite7) gibt es nur für die fallende Flanke von "E"
eine MAXimal-Zeit von 25ns.
Aber dürften nicht die meisten jemals gebauten Rechner
diese Flankenzeit schaffen?
Alle anderen Pins haben dann wohl in Punkto Langsamkeit keine
Beschränkung ?
Ich frage deshalb, weil es doch möglich sein müsste, langsamere
Prozessoren bzw. Controller an dieses LCD anzuschliessen.
Wenn nicht, wär das eine ganz grosse Scheisse.
Da ist ja dann der (langsamere) serielle I²c - Bus was wunderbares.
Dort kann man quasi inner Schaltung mit 'nem Draht
Bit für Bit die Commandos bzw. Daten per Hand hineintakten.
Danke fürs Durchlesen , -
(vielleicht sehe ich ja auch vor lauter Wald...)
Greetz, Chris
PS:
Beitrag "Pollin LCD TC1602 funktioniert mit eigenem Code nicht"
@ Chris (Gast)
>CLR-Display bei 190khz = 2,16ms>CLR-Display bei 270khz = 1,52ms>CLR-Display bei 350khz = 1,18ms
ja und? Nimm den langsamsten Takt an und fertig. Das LCD ist immer noch
schnell genug, um eine handvoll Daten anzuzeigen. Wenn es MAXIMAL
schnell sein soll, nimm ein gottverdammte Oszi oder Frequenzzähler und
miss an DEINEM LCD. Fertig!
>Ich will so'n LCD ohne Prozessor ansteuern.>Und das issen Problem, wenn man wie ich vor obiger Hürde steht.
Du bist und bleibst ein Jammerlappen.
>Ich frage deshalb, weil es doch möglich sein müsste, langsamere>Prozessoren bzw. Controller an dieses LCD anzuschliessen.
ja, das geht.
Ich habe Falks Code mit meinem Display (4x20) ausprobiert. Es handelt
sich um dieses: http://www.amazon.de/gp/product/B007XRHBKA (auch diverse
ebay-Quellen). Die kleine Adapterplatine mit dem I2C-Umsetzer ist von
der Firma "sainsmart". Als problematisch fiel mir auf:
1. Die Angabe "I2C Address: 0x27" muss man so deuten, dass in "i2clcd.h"
für LCD_I2C_DEVICE der doppelte Wert anzugeben ist bzw. "(0x2F << 1)".
2. Obwohl bei meinem Display eindeutig die Chip-Bezeichnung "PCF8574T"
zu lesen ist, trifft "0x27" als Adresse nicht zu, sondern "0x3F", was
eigentlich auf die Variante "PCF8574AT" hindeutet. Mein Eintrag in
"i2clcd.h" lautet nun also "#define LCD_I2C_DEVICE (0x3F << 1)".
Ansonsten bin ich zufrieden.
...Rolf
Ich hätte noch Vorschläge zu "i2clcd.h":
o Das Hauptprogramm muss, damit die Kompilation korrekt läuft, die
Zeilen
#include <stdbool.h>
#include <avr/pgmspace.h>
enthalten. Besser wäre, wenn sie nach "i2clcd.h" kämen.
o Die display-spezifischen Definitionen wie
#define LCD_LINES 4
u.a. sollten besser so aussehen:
#ifndef LCD_LINES
#define LCD_LINES 4
#endif
Damit könnte die .h-Datei unabhängig vom konkreten Projekt unverändert
bleiben und die spezifischen Definitionen woanders (z.B. in einem
Makefile) gemacht werden.
...Rolf
Hallo zusammen,
ich versuche gerade das Programm von Falk Brunner mit dem Pollin I2C-LCD
Adapter ( Bestellnummer: 810 145 ) und dem LCD-Display ( LCD-Modul
TC1602A-09; Bestellnummer: 120 422 ) bei mir zum laufen zu bekommen.
Folgendes Habe ich bisher gemacht:
- Ordner entpackt
- i2clcd unter AVR-Studio 4 geöffnet
- in der main.h die CPU Fequenz auf 16000000 geändert. Es steht jetzt
in der main.h nur
1
#define F_CPU 16000000
ist das richtig?
- i2clcd.h mit hilfe der Datenblätter des I2C - Adapter und des Displays
die Pinbelegung geändert.
1
#define LCD_D4_PIN 4 /**< LCD-Pin D4 is connected to P4 on the PCF8574 */
2
#define LCD_D5_PIN 5 /**< LCD-Pin D5 is connected to P5 on the PCF8574 */
3
#define LCD_D6_PIN 6 /**< LCD-Pin D6 is connected to P6 on the PCF8574 */
4
#define LCD_D7_PIN 7 /**< LCD-Pin D7 is connected to P7 on the PCF8574 */
5
#define LCD_RS_PIN 9 /**< LCD-Pin RS is connected to P0 on the PCF8574 */
6
#define LCD_RW_PIN 10 /**< LCD-Pin RW is connected to P1 on the PCF8574 */
7
#define LCD_E_PIN 11 /**< LCD-Pin E is connected to P2 on the PCF8574 */
8
#define LCD_LIGHT_PIN 12 /**< LCD backlight is connected to P3 on the PCF8574, low active */
- Die Adresse wie im Programmcode ist mit der Eingestellten Adresse des
i2C Adapters identisch 4E.
- main.c die Zeile char string_flash[] PROGMEM = "Hello Flash!"; in
1
charstring_flash[]="Hello Flash!";
geändert.
- kompilieren lassen
- die Datei i2clcd_clean.hex auf den ATMega32 geladen
Folge:
1. Zeile schwarze Blöcke
2. Zeile nichts
Hintergrundbeleuchtung "AUS!"
Was habe ich falsch gemacht? Ich versuche mit hilfe dieses Programm den
I2C Bus zu verstehen und das Display anzusteuern.
Ich bedanke mich für eure Hilfe und verbleibe
mit freundlichen Grüßen
Balou Baer
>#define LCD_RW_PIN 10 /**< LCD-Pin RW is connected to P1 on the >#define
LCD_E_PIN 11 /**< LCD-Pin E is connected to P2 on the PCF8574 >#define
LCD_LIGHT_PIN 12 /**< LCD backlight is connected to P3 on the
Du musst die Pinnummern vom PCF8574 angeben und NICHT die vom LCD.
>Du musst die Pinnummern vom PCF8574 angeben und NICHT die vom LCD.
Bevor du da jetzt auch wieder auf die Nase fällst:
Das war jetzt etwas missverständlich. Es muss die Portnummer sein.
Gib da jetzt bloss nicht die Nummer des Beinchens an.
holger schrieb:> Du musst die Pinnummern vom PCF8574 angeben und NICHT die vom LCD.
Dachte das Hätte ich gemacht. Denn:
RS ist Pin 4 vom Display und geht doch auf den P4, also Pin 9, des
PCF8574?
R/W ist Pin 5 vom Display und geht doch auf den P5, also Pin 10, des
PCF8574?
E ist Pin 6 vom Display und geht doch auf den P6, also Pin 11, des
PCF8574?
Bitte verbessere mich wenn ich mich täusche aber so lese ich die
Datenblätter / Zeichnungen.
Mit freundlichen Grüß
Balou Baer
Ok vom Tippen bis zum senden hast du ja noch was geschrieben ;)
also P0 bis P7 ?
Sooooo,
adressen sind falsch auf der Platine.
Display lechtet
Display zeigt 1 Sekunde lang das richtige an und dann Chinesische
zeichen ^^
aber immer hin ^^
Sorry ihr Lieben, aber ich muss noch einmal eine Frage los werden.
Nachdem ich nun die I2C Adresse des Displays herausgefunden hatte und
ich etwas mit dem Display und dem uC spielen konnte, fiehl mir auf, dass
der anzuzeigende Sting in der ersten Zeile um zwei Zeichen versetzt
angezeigt wird. Soll heißen, dass wenn ich Hallo World anzeigen lassen
will, sieht das so in Zeile 1 aus "llo World" in Zeile zwei alles kein
Problem. Wo kann ich den aus dem Datenblatt entnehmen, welches bei
meinem Display die Startadresse von der 1. Zeile ist?
Ich bedanke mich für euere Hilfe und verbleibe
mit freundlichen Grüßen
Balou Baer
Hallo :)
Ich habe mir auch mal ein LCD/I²C-Modul bei Pollin gekauft und heute
(gestern) versucht es zum Laufen zubekommen mit einem 2x16
Display(TC1602A-09) aber habe es nicht geschafft.
Es wird etwas nicht lesbares angezeigt wenn ich meinen Controller
mehrmals resetet per Taster.
Ich habe es mit der oberenen Version der Lib versucht.
Mein ATmega32 läuft auch mit 16MHz. Fusebits stimmen auch ;)
Am I2C-Bus hängt nur noch ein pcf8583(RTC) dieser Funktionier auch.
Nur hab ich das gefühl das mein pcf8574 defekt ist.
Jetzt meine Frage: Wie kann ich am besten Feststellen das der pcf8574
einen defekt hat ?
Meine 4 Displays sind auch nicht defekt habe es mit meinen alten ATmega8
gegen geprüft.
Funktioniert es den bei jemanden mit dem LCD/I²C-Modul von Pollin und
dem
Display(TC1602A-09) ?
Gute Nacht erstmal :D
LG Julz
Hallo,
Bei der Verwendung des I2C-LCD Adapters (Bestellnummer:810 145)von
Pollin gibt es einen kleinen Harken! Laut deiner Aussage verwendest du
ein blaues Display, richtig? Bei Verwendung von blauen Displays muss ein
Widerstand geändert werden, ich meine es wäre der R1. Steht leider nur
klein auf der Platine und Bedienung-/Aufbauanleitung.
Auch ist darauf zu achten, ob du schon PULLUP Widerstände in deinem
I2C-Bus nutzt. Wenn ja, dürfen die I2C Widerstände auf dem I2C-LCD
Adapter nicht eingelötet werden!
Aufgrund des falschen Widerstandes bekam ich auch keine Anzeige auf
meinem blauem Display. Selbst die Hintergrund Beleuchtung ließ sich mit
dem falschen Widerstand auch nicht einschalten. Daher prüfe bitte ob du
denn richtigen Widerstand verwendest.
Wenn du die oben genannten Sachen geprüft hast, prüfe ob du auch die
richtige I2C - Adresse ansprichst.
Solltest du weitere Fragen haben, kannst du dich gerne noch einmal
melden
Mit freundlichen Grüßen
Balou Baer
@Julius Faust (julz)
>Jetzt meine Frage: Wie kann ich am besten Feststellen das der pcf8574>einen defekt hat ?
Mit einer systematischen Fehlersuche.
Dazu muss man erstmal prüfen, ob du deinen PCF8574 auf der richtigen
Adresse ansprichst. Das geht leicht. Dann lässt man die Pins am PCF
einzeln wackeln.
1
#include<stdbool.h>
2
#include<stdint.h>
3
#include<stdlib.h>
4
#include<avr/pgmspace.h>
5
#include"main.h"
6
#include<util/delay.h>
7
#include"i2clcd.h"
8
#include"i2cmaster.h"
9
10
intmain(void)
11
{
12
chari2c_adr=0x40;// I2C Adresse für Test!
13
14
// HIER DDRX für Fehler LED auf Ausgang stellen!!!
15
16
i2c_init();
17
lcd_init();
18
19
if(i2c_start(i2c_adr)){
20
// ERROR, keine Antwort !!!
21
22
// HIER eine Fehler-LED einschalten!
23
24
while(1);Nixgehtmehr,STOP!
25
}
26
27
// einzelne Pins am PCF8674 wackeln lassen, Messung mit DMM
28
29
while(1){
30
i2c_write(0x01);// Testmuster EIN
31
_delay_ms(1000);
32
i2c_write(0x00);
33
_delay_ms(1000);// Testmuster AUS
34
}
35
}
Die Fehler-LED im Programm ergänzen und testen.
MFG
Falk
Danke schonmal für die Antworten.
@ Balou Baer (baloubaer)
Richtig ich verwende 2 Blaue Displays und 2 Grüne aber den Widerstand
hab ich nicht geändert sonder den Transistor Q1. Zur Zeit verwendete ich
die Pull-up von Board.
Die I2C-Adresse ist auch auf 0x40 eingestellt :)
@ Falk Brunner (falk)
Danke für den Link :) I2C-Adresse (siehe oben), die Jumper auf dem Board
passen auch.
Irgendetwas stimmt mit der Initialiserung für das Display noch nicht
richtig. Damit ich das Display richtig anfäng zu Laufen muss ich zur
Zeit einmal den Controller reseten, dann kann man auch etwas lesen bei
den 2 2x16
Display(TC1602A-09), die anderen 2 Display Zeigen mir nur müll an. Ich
werde mir das im Laufe der Woche ansehen wie es mit dem Display Timing
aussieht.
Leider habe ich kein Oszi oder Logic Analyzer. Also gehts nur durch
überlegen und Versuchen.
Display_Blau_X.jpg Zeigen den Programmablauft mit der Bibliothek von
oben.
Nur das Backlight würde Aktiviert
Display_Gruen1.jpg und Display_Gruen2.jpg Zeigen das Fehlverhalten.
Denke die sind auch defekt. Kann ich leider zur Zeit nicht überprüfen
-.-
LG Julz
@ Julius Faust (julz)
>Irgendetwas stimmt mit der Initialiserung für das Display noch nicht>richtig. Damit ich das Display richtig anfäng zu Laufen muss ich zur>Zeit einmal den Controller reseten, dann kann man auch etwas lesen bei>den 2 2x16
Klingt nach zu schnellem Timing. Wahscheilich hast du F_CPU im Projekt
nicht richtig eingestellt.
Internen RC-oszillator aktiv siehe Fusebits:
Low Fuse 0xE1
High Fuse 0x99
Lockbits 0x3F
Int RC osc mit 1Mhz und Start-up 6 CK + 64ms und JTAG off.
Und trotzdem hab ich das gleiche Problem.
Ich denke es liegt an Spannungseinbrüchen.
Habe mit einen Multimeter gemessen und gesehen das das Pollin ATMEL
Evaluations-Board V2.01 beim Kaltstart eine Längere Zeit benötigt den 5V
Pegel stabiel zubekommen.
Ich denke das Pollin ATMEL Evaluations-Board V2.01 umbau wird nötig.
@Julius Faust (julz)
>Und trotzdem hab ich das gleiche Problem.
Schlecht.
>Ich denke es liegt an Spannungseinbrüchen.>Habe mit einen Multimeter gemessen und gesehen das das Pollin ATMEL>Evaluations-Board V2.01 beim Kaltstart eine Längere Zeit benötigt den 5V>Pegel stabiel zubekommen.
;-)
Mit einem DMM kannst du solche SPannungseinbrüche gar nicht messen.
>Ich denke das Pollin ATMEL Evaluations-Board V2.01 umbau wird nötig.
Dieses Problem mit den Kondensatoren an den Eingängen? Solange du keine
Tasten drückst, gibt es auch keine Spannungseinbrüche. Umbauen solltest
du dennoch.
Auch ich nutze das das Board von Pollin, mit dem Displayboard und
Relaiseboard. Ich habe keine Probleme mit der Spannungsversorgungen oder
mit Spannungseinbrüchen.
Ich hatte nur ein Problem mit der I2C RTC, die nach dem Anlegen der
Versorgungsspannung selber Ca. 3 Sekunden benötigt um klar zukommen.
Habe dann direkt nach dem void Main (void){_delay_ms (5000);........}
eine 5 Sekunden Wartezeit eingebaut und seit dem habe ich keine Probleme
mehr mit der Initialisierung der i2c-Komponenten.
Die Lib von Falk ist für den PCF8574 ausgelegt. Die einzige
Gemeinsamkeit mit dem MCP23008 ist, das beides I2C Port Expander sind.
Beim MCP23008 muss man erst die Registeradresse dann den Wert schreiben,
was beim PCF8574 anscheinend nicht notwendig ist.
Ich habe die Lib von Falk auf den MCP23008 angepasst. Wenn Du die haben
willst, dann schick mir einfach ne PN.
Hallo,
mich würde mal interessieren auf wieviele usec/zeichen ihr mit dem
PCF8574 kommt.
Mit dem MCP23008 komme ich bei 400kHz I2C Taktung auf 337 usec/Zeichen.
@ Bülent C. (mirki)
>mich würde mal interessieren auf wieviele usec/zeichen ihr mit dem>PCF8574 kommt.
Wenn ich mich recht erinnere, komme ich auf eine ähnliche Größe.
Hatte ich damals mal gemessen, aber nicht aufgeschrieben 8-0
Falk Brunner schrieb:> Wenn ich mich recht erinnere, komme ich auf eine ähnliche Größe.> Hatte ich damals mal gemessen, aber nicht aufgeschrieben 8-0
Wie kamst Du dazu? der PCF8574 kann doch nur eine I2C Taktung von max.
100kHz?!
@ Bülent C. (mirki)
>> Wenn ich mich recht erinnere, komme ich auf eine ähnliche Größe.>> Hatte ich damals mal gemessen, aber nicht aufgeschrieben 8-0>Wie kamst Du dazu? der PCF8574 kann doch nur eine I2C Taktung von max.>100kHz?!
Hmm, stimmt. Hatte ich dennoch mal mit 400kHz betrieben, ging ;-)
Dennoch, wieviele Zugriffe braucht man denn für ein Zeichen? ich glaub
max. 6 oder 7 Bytes, die über I2C verschickt werden müssen, der Rest an
CPU-Last fällt kaum ins Gewicht. Macht bei 100 kHz und 9 Bit/Byte
theoretisch 1500 Zeichen/s. Wenn es real nur 500 sind, ist das auch OK.
Hi ich benutze deine Library läuft auch astrein dein Programm auf meinem
LCD aber egal was ich auch änder an meinem Programm, am Ende läuft immer
nur das was du in der main.c stehen hast ab.
Ist bestimmt ne Newbie frage, aber wie änder ich das? Main löschen
beziehungsweise überall in Kommentar setzen läuft nicht.
Wenn ich sie lösche dann meckert der Compiler setz ich alle #define
main.h in Kommentarfunktion läuft trotzdem nur dein Programm ab.
Was kann ich da machen?
//#include <stdbool.h>
//#include <stdint.h>
#include <avr/pgmspace.h>
//#include <main.h>
#define F_CPU 20000000
#include <util/delay.h>
#include <i2clcd.h>
#include <i2cmaster.h>
//char string_flash[] PROGMEM = "Hello Flash!";
void setup()
{
char string1[] = "Hello World!";
i2c_init();
lcd_init();
lcd_light(true);
lcd_print(string1);
lcd_nextline();
lcd_print("I2CLCD V0.11");
// always set all three parameters (OM/OFF) when using this command
lcd_command(LCD_DISPLAYON | LCD_CURSORON | LCD_BLINKINGON);
_delay_ms(1000);
lcd_command(LCD_CLEAR);
_delay_ms(2);
// lcd_print_P(string_flash);
// lcd_printlc_P(2, 2, string_flash);
//- Endless loop
}
void loop()
{}
Hier der Code aber leider läuft nicht der ab sondern immer der Inalt der
main.c.
Hab alle lib Dateien im Arduino Ordner Library/i2clcd entpackt und mein
Projekt mit eigenem Ordner im Arduino Hauptordner.
Nehme ich die main.h bzw. main.c weg, dann kommt folgende Fehlermeldung
vom Compiler:
Arduino: 1.0.6 (Windows 7), Board: "Arduino Uno"
i2cNuerVersuch.cpp.o: In function `setup':
C:\Program Files (x86)\Arduino/i2cNuerVersuch.ino:16: undefined
reference to `i2c_init()'
C:\Program Files (x86)\Arduino/i2cNuerVersuch.ino:17: undefined
reference to `lcd_init()'
C:\Program Files (x86)\Arduino/i2cNuerVersuch.ino:19: undefined
reference to `lcd_light(bool)'
C:\Program Files (x86)\Arduino/i2cNuerVersuch.ino:20: undefined
reference to `lcd_print(char*)'
C:\Program Files (x86)\Arduino/i2cNuerVersuch.ino:21: undefined
reference to `lcd_nextline()'
C:\Program Files (x86)\Arduino/i2cNuerVersuch.ino:22: undefined
reference to `lcd_print(char*)'
C:\Program Files (x86)\Arduino/i2cNuerVersuch.ino:25: undefined
reference to `lcd_command(unsigned char)'
C:\Program Files (x86)\Arduino/i2cNuerVersuch.ino:28: undefined
reference to `lcd_command(unsigned char)'
@ icke (Gast)
Mein lieber Arduino-Freund. Ist dir WIRKLICH klar, wie das bei Arduino
funktioniert?
Die Funktion setup() wird EINMAL beim Start aufgerufen. Danach läuft
alles in der Funktion loop() immer und immer wieder ab. Und dort steht
bei dir GAR NICHTS drin. Da muss man sich nicht wundern, wenn
irgendwelche anderen Dinge nicht ausgeführt werden.
>Nehme ich die main.h bzw. main.c weg, dann kommt folgende Fehlermeldung>vom Compiler:>Arduino: 1.0.6 (Windows 7), Board: "Arduino Uno">i2cNuerVersuch.cpp.o: In function `setup':>C:\Program Files (x86)\Arduino/i2cNuerVersuch.ino:16: undefined>reference to `i2c_init()'
Da fehlt wohl ein #include "lcd.h", damit der Compiler weiß, wo er
i2c_init() und alle anderen Funktionen finden kann.
Mit Arduino kenn ich mich im Detail nicht aus. Wenn dir jemand helfen
soll, musst du das gesamte Projekt als Zip-Archiv hier bereitstellen.
Ich weiß das die Setup nur einmal läuft reicht mir zum Test ja auch.
Die Funktionen i2c_init etc. sind doch alle in der i2cmaster.h und
i2clcd.h drin, das sollte doch reichen?
Für mich stellt sich nur die Frage WARUM läuft immer die main.c ab???
und die auch noch fehlerfrei, da ist doch auch keine lcd.h eingebunden.
Boah das hat gedauert.
Fehler gefunden.
Arduino Compiler verlangt statt .c .cpp und aus der twimaster.c und
i2clcd.c musste ich deine main.h includes löschen.
Danke für die tolle library jetzt läuft alles wie es soll.
Hi
ich habe mir das Projekt auf den PC geladen und via avrdude auf einen
AtMega8 geladen ...
Hab die Adresse des I2C angepasst und es läuft.
Hatte zwar etwas Probleme einen Zahlenwert auszugeben, da das Programm
die Zahlen immer als Buchstaben darstellen will (zumindest meiner
Erfahrung nach)
Bin jetzt über den Umweg gegangen den Zahlenwert in einen String zu
wandeln und dann ausgeben zulassen .... funktioniert ebenfalls.
Das Problem was ich mit dem Programm habe, ist dass der Prozessor sich
irgendwie Aufhängt.
Er zeigt folgendes Verhalten:
- Eine Kontroll LED zeigt mir an ob ein Timerinterrupt ausgelöst wird
oder nicht ... die LED blinkt weiterhin also nehme ich an dass die
Interrupts weiter bearbeitet werden und sich der Controller in einer
Schleife aufhängt
- Das aktuelle Bild auf dem LCD "friert" ein, nur der Coursor blinkt
noch.
Kann mir jemand helfen?
Matt S. schrieb:> - Das aktuelle Bild auf dem LCD "friert" ein, nur der Coursor blinkt> noch.
Wie kann ein Bild einfrieren? Ein Bild ist doch bereits
per Definition eingefroren. Wenn nicht, wie konnte es
sich vorher bewegen?
Ein Bild auf einem LCD 2x16 Zeilen? Wie kann das sein?
Wie sollen wir uns ein Bild von deinem Problem machen wenn
du uns an Bildern nichts zeigst?
Ein Aufbau und Schaltbild wäre - auch wenn du es nicht
glaubst - sehr nützlich um Probleme hier zu lösen.
@Mat ze:
Bitte lese dir das Datenblatt des Displays durch. Manche Displays können
nur mit 100 Hz des I2C Busses angesteuert werden.
Ich vermute Du versuchst es mit einer höheren Frequenz, wodurch das
Display, bzw der I2C Controller des Display abstürzt. Auch kann ein
Delay nach dem Senden der Informationen helfen, wenn das Display in
einer Schleife schnellen Schleife Daten empfangen soll.
Ich hoffe ich komme dir helfen.
Mit freundlichen Grüßen
Patrick Eydt
@ Rat lose Helfer, er sich immer du bist:
Durch so schnippisch und ironische Antworten, wird das Forum auch nicht
besser. Es gibt nunmal Anfänger und Profis und dein Beitrag zeigt eher
etwas von einem Anfänger.
Zudem kann auch mit I2CLEd Lob ein 4 Zeilen Display angesteuert werden,
wenn ich mich recht erinnere. Aber ich will mich jetzt nicht im die Lib
einlesen.
Also bitte etwas freundlicher und vor allem sachlicher.
@ Rat Loser Helfer
Damit dass das Bild "einfriert" meinte ich dass die Messwerte auf dem
LCD nicht mehr aktualisiert werden.
Der cursor und das blinken was in diesem Programm ohne etwas zu ändern
immer aktiviert ist, funktionieren aber weiterhin.
Das "einfrieren" nicht das korrekte deutsche wort dafür ist ist mir auch
klar, ich dachte man kann meiner schilderung folgen.
Zum Aufbau:
Controller (AtMega8) auf einer Lochrasterplatine angelötet mit ein paar
LEDs und einem KTY 81/210 dieser ist linearisiert mit einem 6k1R
Widerstand. (um irgendwelchen weiteren Kommentaren vorzubeugen der
Widerstand ist zusammengesetzt aus 2 Widerständen)
Der Display ist mit dem I2C IO-Expander fest verlötet und wurde so bei
Eba* gekauft. Angeschlossen mit Steckverbindern. Mit einem Multimeter
konnte ich den Aufbau der von "falk" eingestellt wurde verifizieren.
lediglich die Adresse musste ich anpassen.
Aber wie ich bereits schrieb die Kommunikation funktioniert prinzipiell
schon.
Ich muss wohl gestehen, dass ich mich in Deutsch nicht sehr gut
ausdrücken kann. Allerdings denke ich wenn man will kann man mich
verstehen, wenn man nicht will kann man sich solche Antworten auch
sparen.
Ich fand es nicht notwendig Bilder von dem Aufbau zu posten, da ich
diesen als Trivial empfinde / empfand.
@ Patrick Eydt
Danke für deine Hilfe das Datenblatt zu finden könnte sich als etwas
schwierig erweisen, da über Eba* gekauft und der Verkäufer das
Datenblatt selbst suchen müsste.
Allerdings hab ich den vermeindlichen Fehler gefunden, es lag wohl an
den Einstellungen des ADC.
Dieser war eingestellt auf endlose Messung via Interrupt (jedes mal wenn
eine Messung fertig ist wird ein Interrupt ausgelöst)
Habe den ADC nun so eingestellt, dass er nur noch eine Messung
durchführt wenn sie benötigt wird.
Mit dieser Einstellung lief das Programm die ganze Nacht.
Jedoch vielen Dank nochmal für deine Hilfe.
Hallo,
liest hier noch jemand mit?
Habe ein 2x16 LCD wie in Beitrag 1 angeschlossen- Alles OK.
Jetzt ein 4x20 Display. Sunstar 2004A. Der Eintrag in LCD_LINE_MODE
(LCD_2_LINE oder LCD_4LINE) wird völlig ignoriert. Was mache ich falsch?
Das Display zeigt aber alle 4 Zeilen an! Adressen 0x00; 0x40, 0x14, 0x54
Gruß
Reinhard
@ Reinhard O. (Firma: privat) (flug52)
>Jetzt ein 4x20 Display. Sunstar 2004A. Der Eintrag in LCD_LINE_MODE>(LCD_2_LINE oder LCD_4LINE) wird völlig ignoriert. Was mache ich falsch?
Gar nichts, denn der hat nicht bei allen LCDs eine Wirkung.
>Das Display zeigt aber alle 4 Zeilen an! Adressen 0x00; 0x40, 0x14, 0x54
Und wo liegt dann das Problem?
Mir ist halt nicht die Wirkungsweise von LCD_LINE_MODE klar. Das mein
Display mit Deiner Bibliothek anzeigt, ist aber schon mal toll! Habe
noch nie mit i2c gearbeitet. Habe lange gebraucht, die i2C Adresse
auszulesen...