mikrocontroller.net

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


Autor: Stefanie Kirchdorfer (stefanie)
Datum:

Bewertung
0 lesenswert
nicht 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!!!

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefanie Kirchdorfer (stefanie)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Michael U. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefanie Kirchdorfer (stefanie)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So sieht zb. die Funktion lcd_command aus
/*************************************************************************
Send LCD controller instruction command
Input:   instruction to send to LCD controller, see HD44780 data sheet
Returns: none
*************************************************************************/
void lcd_command(uint8_t cmd)
{
    lcd_waitbusy();
    lcd_write(cmd,0);
}

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 :-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Um es ganz klar zu sagen:

Du musst die Funktion
lcd_waitbusy();
neu schreiben.

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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 );
}


Autor: Stefanie Kirchdorfer (stefanie)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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!)



Autor: Stefanie Kirchdorfer (stefanie)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefanie Kirchdorfer (stefanie)
Datum:

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

Autor: Stefanie Kirchdorfer (stefanie)
Datum:

Bewertung
0 lesenswert
nicht 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 :-(





Autor: Stefanie Kirchdorfer (stefanie)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat den keiner einen Rat, was ich noch machen könnte?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.