Hallo, ich habe gemäß des folgenden Artikels: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung über einen Atmega32 ein HD44780 kompatibles LCD angesteuert. Es scheint auch zu funktionieren, jedoch nur teilweise. Es erscheint der Text "Test" in der 1. Zeile und der Text "Hello World!" in der zweiten Zeile. Der Text "Hello World!" ist aber am Ende nichtmehr lesbar, es sind dort nur Blöcke zu sehen. (Siehe angehängtes Bild) Habe alle Anschlüsse mehrmals kontrolliert, konnte aber keinen Fehler finden. Kann mir jemand sagen woran das liegt? Ist das Display kaputt oder muss ich irgendwelche Parameter in der lcd-routines.h anpassen? Danke für jede Hilfe!
Habe noch was rausgefunden, das Problem scheint nur in den rechten 8 Zeichen des LCD zu erscheinen. Habe mal einen längeren Text auch für die erste Zeile programmiert. Dort erscheinen nun alle rechten acht Zeichen auch so komisch als Block. Kann mir jemand das erklären? Bin für jede Hilfe dankbar!
>Kann mir jemand das erklären?
Sieht aus wie ein defektes Display.
Hm, da ja einige Zeichen richtig angezeigt werden und die Zeilen ja auch offensichtlich ordnungsgemäß angesprochen werden können, scheint die Initialisierung und auch der Anschluß der Pins richtig zu sein. Du könntest mal versuchen die Zeichen langsamer zu senden. Was ist es genau für ein LCD? Einige LCDs haben seltsame Zeichensätze. Aber das scheint nicht dein Problem zu sein... Wie sind die LCD-Pins beschaltet/verdrahtet? Hast du Pins offen? Gruß
Thomas Burns schrieb: > Habe noch was rausgefunden, > > das Problem scheint nur in den rechten 8 Zeichen des LCD zu erscheinen. > Habe mal einen längeren Text auch für die erste Zeile programmiert. > Dort erscheinen nun alle rechten acht Zeichen auch so komisch als Block. > > Kann mir jemand das erklären? > Bin für jede Hilfe dankbar! Ok, jetzt bin ich auch für ein defektes LCD :)
Ist die Busy Leitung auch angeschlossen? Wenn nicht ist die Übertragung evtl zu schnell. Oder in der Ausgabe Routine ist ein Fehler und es kommen noch undefinierte Zeichen hinterher -> Code posten.
Möglich, dass in der Software ein vierzeiliges Display eingestellt ist?
Hallo, danke erstmal an alle, die mir hier versuchen zu helfen. Das verwendete LCD ist ein Zwei-Zeilen LCD blau/weiß mit 5x8 punkten je Zeichen. Die Bezeichnung ist EA DIP162-DN3LW. Der Code sollte in Ordnung sein, er ist Original 1 zu 1 von dem im ersten Post genannten Link genommen. Das LCD wird im 4-Bit Modus betrieben, Busy bzw. RW liegt auf GND. >Du könntest mal versuchen die Zeichen langsamer zu senden. Wie mache ich das? >Möglich, dass in der Software ein vierzeiliges Display eingestellt ist? Im Code habe ich das dazu gefunden: #define LCD_DDADR_LINE1 0x00 #define LCD_DDADR_LINE2 0x40 #define LCD_DDADR_LINE3 0x10 #define LCD_DDADR_LINE4 0x50 Aber das ist nur eine Definition von Konstanten. Wie gesagt der gesamte Code ist sichtbar unter: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung Die Beschaltung der LCD ist wie im Projekt (siehe Linke im ersten Post) beschrieben: LCD-Pin 1 (VSS): GND LCD-Pin 2 (Vcc): 5V LCD-Pin 3 (Vee): über 4k7 an GND LCD-Pin 4 (RS) : PD4 am Atmega LCD-Pin 5 (RW) : GND LCD-Pin 6 (E) : PD5 am Atmega Die nächsten 4 liegen auf GND, da 4 Bit Mode: LCD-Pin 7 LCD-Pin 8 LCD-Pin 9 LCD-Pin 10 LCD-Pin 11 (DB4): PD0 am Atmega LCD-Pin 12 (DB5): PD1 am Atmega LCD-Pin 13 (DB6): PD2 am Atmega LCD-Pin 14 (DB7): PD3 am Atmega LCD-Pin 15 und LCD-Pin 16 ist LED (mit Vorwiderstand) Danke nochmals für weitere Hilfe!
Hallo, was benutzt du als Software?? AVRStudio?? ist die F_CPU richtig eingestellt?
Hallo Martin, danke erstmal. Ja benutze AVR Studio (5.0). F_CPU ist über Symbol (Porject Properties) auf 16000000 gesetzt und auch im Code in der Datei lcd-routines.h wie folgt: #ifndef F_CPU #define F_CPU 16000000 #endif
Mit AS5 kenne mich nicht nicht besonders viel aus ich habe es vor paar Tage installiert aber die Einstellung über Symbol ... soll richtig sein. Kannst du alle dateien hier posten? (h. c.)
Thomas Burns schrieb: > Hallo, > > danke erstmal an alle, die mir hier versuchen zu helfen. > Das verwendete LCD ist ein Zwei-Zeilen LCD blau/weiß mit 5x8 punkten je > Zeichen. Die Bezeichnung ist EA DIP162-DN3LW. > > Der Code sollte in Ordnung sein, er ist Original 1 zu 1 von dem im > ersten Post genannten Link genommen. Das LCD wird im 4-Bit Modus > betrieben, Busy bzw. RW liegt auf GND. > >>Du könntest mal versuchen die Zeichen langsamer zu senden. > Wie mache ich das? Nun wenn Du keine RS232 etc. verwendest, so könntest Du z.B. in der "lcd-routines.h" eine falsche Taktfrequenz einstellen, und ggf. ebenso im Studio selbst. Wenn du 8 MHz verwendest, so z.B. 16000000 (bzw. 16000000UL falls der Compiler ohne UL Probleme macht) Wenn du bereits auf 16 MHz Quarz bist, so kannst Du ja auf internen RC-Oszillator umstellen, aber pass mit den Fuses gut auf - ich will danach NICHT "verfust" lesen müssen... Wenn es ein geringes Timing-Problem war, so müsstest Du danach sinnvolle Texte lesen können. Wenn das geklappt hat, so könnte man die Delays in der selben Datei erhöhen, und die korrekte Taktfrequenz wieder eintragen. Vor einigen Monaten habe ich auf basis eines AT89S52 einen Testaufbau realisiert. Die dafür verwendeten LCD-Routinen habe ich mir aus mehreren Quellen zusammengekratzt und komplett umgestrickt. Erst mit Verwendung des Bussy-Flag (polling) lief es bei mir richtig gut. > >>Möglich, dass in der Software ein vierzeiliges Display eingestellt ist? > Im Code habe ich das dazu gefunden: > > #define LCD_DDADR_LINE1 0x00 > #define LCD_DDADR_LINE2 0x40 > #define LCD_DDADR_LINE3 0x10 > #define LCD_DDADR_LINE4 0x50 > > Aber das ist nur eine Definition von Konstanten. > > Wie gesagt der gesamte Code ist sichtbar unter: > http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung So beim überfliegen des Codes fällt mir da nix auf, wo man das genau einstellen könnte; Aber es steht ja 16 Zeichen im Code, Der Typbezeichnung nach sollte es ein 16x2 Display sein oder ? Wenn das nicht stimmen würde, dann würden eher ganze Sätze fehlen und nicht einzelne Buchstaben nicht passen. > > > Die Beschaltung der LCD ist wie im Projekt (siehe Linke im ersten Post) > beschrieben: > LCD-Pin 1 (VSS): GND > LCD-Pin 2 (Vcc): 5V > LCD-Pin 3 (Vee): über 4k7 an GND > LCD-Pin 4 (RS) : PD4 am Atmega > LCD-Pin 5 (RW) : GND > LCD-Pin 6 (E) : PD5 am Atmega > > Die nächsten 4 liegen auf GND, da 4 Bit Mode: > LCD-Pin 7 > LCD-Pin 8 > LCD-Pin 9 > LCD-Pin 10 > > LCD-Pin 11 (DB4): PD0 am Atmega > LCD-Pin 12 (DB5): PD1 am Atmega > LCD-Pin 13 (DB6): PD2 am Atmega > LCD-Pin 14 (DB7): PD3 am Atmega > > LCD-Pin 15 und LCD-Pin 16 ist LED (mit Vorwiderstand) > > Danke nochmals für weitere Hilfe! Die 4 Pins an GND müsste eine saubere Lösung sein; Bin mir nicht sicher, glaube aber dass man die zumindest zum Basteln sogar offen lassen kann. Selbst verwende ich aber 8 Bits, und dann noch ein 4-Zeiliges Display mit 2 Enables. MFG:MBP Markus
Markus B. p. schrieb: > Die 4 Pins an GND müsste eine saubere Lösung sein; > Bin mir nicht sicher, > glaube aber dass man die zumindest zum Basteln sogar offen lassen kann. hmm... Stimmt alle Pin auf GND? Ich habe immer 4 Bit Modus betrieben und alle einfach offen lassen, aber daran kann nicht liegen.
Hallo Mr. Burns, ich habe deinen Fall (aus dem Tutorial) mal nachgestellt: ATmega32 (F_CPU 7,372800) LCD 1602 an Port D (Winstar 1602B-TMI-JT#040). D0 bis D3 "in der Luft" AS5 (mit avr-toolchain-installer-3.0.0.240-win32.win32.x86, die neueste korregierte(!) delay.h extra nochmal zur Sicherheit drübergezogen, evtl. liegt darin das Problem?). Funktioniert einwandfrei. Im Anhang mal meine funktionierende Hex zum Testen. - Achtung: Eingestellt auf 1MHz interner Oszillator! - Ach ja, und ich hätte auch noch eine Frage: beim ersten compilieren kam die Fehlermeldung, eine for-Schleife in lcd-routines.c (Zeile 173) sei komisch initialisiert. Ich solle doch den Schalter "-std c99" oder "-std gnu99" benutzen - kann der gcc kein C mehr???
Martin N. schrieb: > lcd-routines.c (Zeile 173) sei komisch initialisiert. Ich solle doch den > Schalter "-std c99" oder "-std gnu99" benutzen - kann der gcc kein C > mehr??? Doch. Aber auch C hat mehrere Versionen hinter sich. Und vor C99 war so etwas
1 | for ( uint8_t i=0; i<8; i++ ) |
nicht erlaubt.
Hallo Martin N (und alle anderen, die mir hier versuchen zu helfen), ich verwende AVRStudio 5. Martin: Habe deine Hex getestet. (vorher die Fuses auf 1 MHz interner Osz. umgestellt) Dein Programm funktioniert, aber die rechten 8 Zeichen in der ersten und zweiten Zeile sind immernoch nur als Blöcke dargestellt. Woher hast du die besagte 'neueste delay.h'? Könnte es damit nochmal probieren. Ich werde es auch nochmnal mit einer Version probieren, die das Status-Bit abfragt. Evtl. die library von Peter Fleury: http://homepage.hispeed.ch/peterfleury/group__pfleury__lcd.html Hat die schon jemand getestet? Wenn das nicht klappt werde ich mir wohl ein weiteres LCD kaufen müssen um einen Fehler auszuschließen :-( Danke nochmals für eure Hilfe hier.
AS5 = AVR Studio 5 GCC-Home: http://savannah.nongnu.org/projects/avr-libc Wenn Du im AS5 den Cursor im Code über "delay.h" stellst, zeigt er dir oben den Pfad zur benutzten Datei an. Beitrag "Delay.h - Zeiten stimmen bei mir nicht"
Hallo, habe soeben mit der Library von Peter Fleury getestet. (Natürlich dafür auch den Pin RS nun korrekt angeschlossen) Das Programm funktioniert, aber wieder sind die rechten 8 Zeichen in der ersten und zweiten Zeile nur als Blöcke erkennbar. Das heißt wohl für mich, neues LCD kaufen :-( Werde euch auf dem Laufenden halten... Danke erstmal für all Eure Mühe!
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.