Forum: Mikrocontroller und Digitale Elektronik DIP162 2x16 LCD Display von Conrad + Fleury


von Stefanie K. (stefanie)


Lesenswert?

Hallo,
sorry für diese doofe Anfängerfrage, aber ich wollte mit der Library von 
Peter Fleury mein 2x16 LCD-Display ansteuern.

Habe in der lcd.h folgendes geändert (Rest so gelassen wie es war, auch 
lcd.c und test_lcd.c):
#define XTAL 14745600

#define LCD_CONTROLLER_KS0073 0  /**< Use 0 for HD44780 controller, 1 
for KS0073 controller */

#define LCD_LINES           2     /**< number of visible lines of the 
display */
#define LCD_DISP_LENGTH    16     /**< visibles characters per line of 
the display */
#define LCD_LINE_LENGTH  0x40     /**< internal line length of the 
display ##192 ROM fixed code 0xC0 ## ??  */
#define LCD_START_LINE1  0x00     /**<?? DDRAM address of first char of 
line 1 */
#define LCD_START_LINE2  0x40     /**<?? DDRAM address of first char of 
line 2 */
#define LCD_START_LINE3  0x14     /**<?? DDRAM address of first char of 
line 3 */
#define LCD_START_LINE4  0x54     /**<?? DDRAM address of first char of 
line 4 */
#define LCD_WRAP_LINES      0     /**<?? 0: no wrap, 1: wrap at end of 
visibile line */


#define LCD_IO_MODE      1         /**< 0: memory mapped mode, 1: IO 
port mode */
#if LCD_IO_MODE

#define LCD_PORT         PORTA        /**< port for the LCD lines   */
#define LCD_DATA0_PORT   LCD_PORT     /**< port for 4bit data bit 0 */
#define LCD_DATA1_PORT   LCD_PORT     /**< port for 4bit data bit 1 */
#define LCD_DATA2_PORT   LCD_PORT     /**< port for 4bit data bit 2 */
#define LCD_DATA3_PORT   LCD_PORT     /**< port for 4bit data bit 3 */
#define LCD_DATA0_PIN    4            /**< pin for 4bit data bit 0  */
#define LCD_DATA1_PIN    5            /**< pin for 4bit data bit 1  */
#define LCD_DATA2_PIN    6            /**< pin for 4bit data bit 2  */
#define LCD_DATA3_PIN    7            /**< pin for 4bit data bit 3  */
#define LCD_RS_PORT      PORTC     /**< port for RS line         */
#define LCD_RS_PIN       0            /**< pin  for RS line         */
#define LCD_RW_PORT      PORTD     /**< port for RW line         */
#define LCD_RW_PIN       4            /**< pin  for RW line   ## ACHTUNG 
eigentlich bei mir auf GND gelegt##  */
#define LCD_E_PORT       PORTC     /**< port for Enable line     */
#define LCD_E_PIN        1            /**< pin  for Enable line     */

Ach ja, ich verwende den ATmega128, dass hab ich auch im Makefile 
geändert. Muss ich dort auch angeben, dass ich ein JTAG ICE mkII habe??

So, beim Compilieren habe ich keine Probleme, aber wenn ich es aufspiele 
ist die erste Zeile voller schwarzer Kästchen und die 2. Zeile komplett 
weiß.

Habt ihr einen Tipp, was ich noch falsch gemacht haben könnte? Bei 
meinen "????" habe ich nichts dazu gewußt (find ich irgendwie im 
Datenblatt nicht, hab es mal angehängt, vielleicht habt ihr ja mehr 
Glück und Verstand wie ich ;-) )

DANKE SCHON MAL!!!

von Michael U. (Gast)


Lesenswert?

Hallo,

#define LCD_RW_PIN       4            /**< pin  for RW line   ## ACHTUNG
eigentlich bei mir auf GND gelegt##  */

dann geht die Lib von Peter Fleury nicht, dort wird Busy vom Display 
abgefragt!

Das geht nicht, wenn RW fest auf GND liegt...

Wurde aber vor kurzem erst hier diskutiert.

Gruß aus Berlin
Michael

von Stefanie K. (stefanie)


Lesenswert?

OK, ich such mich grad nochmal durch die Suche durch (hab ich zwar vor 
meinem Betrag schon etwas, hab nur den wichtigen anscheindend übersehen 
:-()

Aber gibt es vielleicht eine leichte Abänderung im Code oder kann ich 
einen Pseudo LCD_RW_PIN der fest auf GND liegt angeben?

von Michael U. (Gast)


Lesenswert?

Hallo,

ich ahbe die lib selbst nie benutzt, kann also nicht sagen, obe es nur 
eine leichte Änderung ist...

Ich glaube auch nicht, daß ein Pseudo LCD_RW_PIN den Display-Anschluß 
R/W auf H schalten kann, damit das Busy-Flag gelesen werden kann...

Man kann diese Displays mit RW auf GND betreiben, dann kann eben nicht 
vom Display gelesen werden. Die Ansteuerung muß dann eben statt das 
Busy-Flag abzufragen, eine entsprechend lange Zeit warten, bis das 
Display mit seinen internen Sachen sicher fertig ist, bevor was neues 
gesendet wird.
Die Zeiten stehen im Datenblatt des Controllers, die jeweiligen Abfragen 
auf Busy müßten dann in der Lib durch passende Wartezeiten ersetzt 
werden.

Gruß aus Berlin
Michael

von Karl H. (kbuchegg)


Lesenswert?

> kann also nicht sagen, obe es nur
> eine leichte Änderung ist...

Yep. Das ist nicht weiter schlimm. Die Abfrage des
Busy-Flags hat Peter schön sauber in einer Funktion
konzentriert. Die dortige Abfrage durch einen delay
ersetzen und das Ding sollte laufen.

von Stefanie K. (stefanie)


Lesenswert?

@Karl heinz Buchegger
Sorry, ich stell mich total doof, aber könntest du mir zeigen, wie das 
geht? Ich hab es schon versucht, aber ich versteh einfach nicht, wo ich 
es überall ändern muss!

von Karl H. (kbuchegg)


Lesenswert?

So sieht zb. die Funktion lcd_command aus
1
/*************************************************************************
2
Send LCD controller instruction command
3
Input:   instruction to send to LCD controller, see HD44780 data sheet
4
Returns: none
5
*************************************************************************/
6
void lcd_command(uint8_t cmd)
7
{
8
    lcd_waitbusy();
9
    lcd_write(cmd,0);
10
}

Und jetzt rate mal, wie die Funktion heist, die die Ausgabe
solange verzögert, bis das Busy Flag ok sagt.
Genau.
Und diese Funktion beraubst du ihres Inhalts und fügst eine
Warteschleife ein (wobei du vorzugsweise die delay-Funktionalität
von den gcc-Funktionen benutzt. Fertig.

Manchmal frag ich mich schon, wie wir das früher gemacht haben :-)

von Karl H. (kbuchegg)


Lesenswert?

Um es ganz klar zu sagen:

Du musst die Funktion
lcd_waitbusy();
neu schreiben.

von Markus (Gast)


Lesenswert?

Hallo!

Ich hab schon mal die Fleury-Lib mit einer Delay routine bstückt 
(anstatt des waitbusy...

Hab da nix anderes gemacht als eine for-Schleife reingebastelt.

Bei meinem Display dauern fast alle funktionen max. 40µs (außer CLRSCR 
und HOME) drum hab ich mich dafür entschieden, einfach die 40µs zu 
warten, da ich das CLRSCR oder HOME sowieso nicht verwende - 
funktioniert recht gut!

also hier nun der modifizierte code:

static uint8_t lcd_waitbusy(void)
{
  int i;
  for (i=0;i<WAIT_DELAY_CYCLES;i++) ;
  return 0;
}

in der header-Datei musst du noch die Zeile

#define WAIT_DELAY_CYCLES    ((XTAL * 40)/1000000)/4

einfügen...

Hoff ich konnt dir weiterhelfen.

lg

Markus

von Karl heinz B. (kbucheg)


Lesenswert?

> static uint8_t lcd_waitbusy(void)
> {
>   int i;
>   for (i=0;i<WAIT_DELAY_CYCLES;i++) ;
>   return 0;
> }

Was denkst du wird dir der Optimizer vom Compiler
aus dieser Schleife machen?

Dafür gibt es in delay.h eigene Funktionen!

#ifndef F_CPU
#define F_CPU 1000000
#endif

#include <util/delay.h>

....

static uint8_t lcd_waitbusy(void)
{
  _delay_us( 40 );
}


von Stefanie K. (stefanie)


Lesenswert?

Hallo,
vielen Dank für die Hilfe!! Nun ist es so, dass ich Buchstaben erkennen 
auf dem Display kann, aber ich sehe nicht, was die mit meiner Ausgabe zu 
tun haben sollen.
Es sind ziemlich viele Leerstellen drin und jedes mal wenn ich Reset 
drücke, steht was anderes drin.

Ich habe meine Datenleitungen richtig angeschlossen und auch den 
Speicherbereich des Display nach den Angaben des Herstellers eingesetzt.

Hat wer einen Tipp dazu??

von Karl heinz B. (kbucheg)


Lesenswert?

Programm ?

> Es sind ziemlich viele Leerstellen drin und jedes mal wenn ich Reset
> drücke, steht was anderes drin.

Vor allem das letztere klingt eher nach einem Wackelkontakt.
Du könntest auch mal versuchen, das Timing etwas zahmer
einzustellen. Anstatt der 40 mal 50 µs oder höher einstellen.
(Aber auf die Beschränkung beim delay achten!)



von Stefanie K. (stefanie)


Lesenswert?

Hab mal alle möglichen Zeiten versucht, hat aber nichts geholfen.
Ich hab ein kleines Video mit dem Foto von dem Fehler gemacht, ist 
vielleicht einfacher als es zu beschreiben.
Der Code ist Original der von Peter Fleury, nur dass ich dem RW-Pin 
einen normalen Pin auf meiner Expansionleiste gegeben habe und den dann 
auf GND gelegt (grüne Klemme). Ist das falsch?
Ach ja, und natürlich die lcd_waitbusy(void) umgeschrieben.

Die LCD-Ausgabe sollte lauten:
LCD Test Line 1
Line 2

ich habe auch an PD2 einen Taster, so wie Peter Fleury, wüsste nicht, 
was noch falsch sein könnte.

von Stefanie K. (stefanie)


Lesenswert?

Oh, es klappt irgendwie nicht ein .AVI-Datei anzuhängen :-(

von Stefanie K. (stefanie)


Lesenswert?

Na dann, schreib ich mal ein Paar Ausgaben ab (sie ist jedesmal 
anders!!):

LTtR Le:C  R1  :
 tn1 e*CF n1: :C

Reset:
 sLRT*e:L  R   1
 tn1 e*C  n1: :C

Reset:
 sLRT*e:L  R   1
 tn1 e:CTt tLR:C

Reset:
 sLRToe:LTLR Le1
 tn1 e:CT2n1Le:C

Reset:
 sLRToe: sLR oe1
 tn1 e:tTt1 Lec:

Delay time hier war 44us!
umso länger ich die Zeit eingestellt habe, umso weniger Zeichen habe ich 
gesehen.
Ich hab auch schon die Fkt lcd-clrscr() rausgetan, da die max. 1.64msec 
braucht, hat aber auch nichts geholfen :-(





von Stefanie K. (stefanie)


Lesenswert?

Hat den keiner einen Rat, was ich noch machen könnte?

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.