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!!!
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
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?
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
> 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.
@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!
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 :-)
Um es ganz klar zu sagen: Du musst die Funktion lcd_waitbusy(); neu schreiben.
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
> 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 ); }
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??
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!)
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.
Oh, es klappt irgendwie nicht ein .AVI-Datei anzuhängen :-(
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 :-(
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.