Hallo,
ich kämpte gerade mit einem LCD Display (HD44780), das im 4-Bit Modus an
einen ATMEGA8 angeschlossen ist.
Verwendet wird die Lib von Peter Fleury.
Pinbelegung Display:
1 GND
2 +5 Volt
3 GND
4 PC4 (RS)
5 PC5 (RW)
6 PB0 (Enable)
11 PC0 (Data0)
12 PC1 (Data1)
13 PC2 (Data2)
14 PC3 (Data3)
Ausschnitt aus der lcd.h
1
#define XTAL 16000000 /**< clock frequency in Hz, used to calculate delay timer */
2
3
4
/**
5
* @name Definition for LCD controller type
6
* Use 0 for HD44780 controller, change to 1 for displays with KS0073 controller.
7
*/
8
#define LCD_CONTROLLER_KS0073 0 /**< Use 0 for HD44780 controller, 1 for KS0073 controller */
9
10
/**
11
* @name Definitions for Display Size
12
* Change these definitions to adapt setting to your display
13
*/
14
#define LCD_LINES 2 /**< number of visible lines of the display */
15
#define LCD_DISP_LENGTH 16 /**< visibles characters per line of the display */
16
#define LCD_LINE_LENGTH 0x40 /**< internal line length of the display */
17
#define LCD_START_LINE1 0x00 /**< DDRAM address of first char of line 1 */
18
#define LCD_START_LINE2 0x40 /**< DDRAM address of first char of line 2 */
19
#define LCD_START_LINE3 0x14 /**< DDRAM address of first char of line 3 */
20
#define LCD_START_LINE4 0x54 /**< DDRAM address of first char of line 4 */
21
#define LCD_WRAP_LINES 0 /**< 0: no wrap, 1: wrap at end of visibile line */
willy schrieb:> Hat mir da jmd einen Tipp? (Oszilloskop vorhanden.)
Mit welcher Taktfrequenz läuft dein Prozessor wirklich?
Du könntest z.B. einen Pin togglen und die Zeit per delay-Funktion
festlegen und nachmessen.
>ISR (TIMER1_COMPA_vect)>{> x++;> PORTB ^= (1<<PB2);>}>>Problem: Das Display zeigt undefiniertes Zeug an (Cursor blinkt meist).>Hat mir da jmd einen Tipp? (Oszilloskop vorhanden.)
Lass das wackeln am PORTB im Timer Interrupt mal sein.
>11 PC0 (Data0)>12 PC1 (Data1)>13 PC2 (Data2)>14 PC3 (Data3)
Beim 4 Bit Mode werden übrigends die oberen Datenleitungen
DB4..7 angeschlossen. Nicht die unteren.
>Db4 - 7 wurden verwendet, es ist nur die beschriftung falch sry
Dann wird es der übliche Dünnpfiff sein:
Falsch angeschlossen.
Kurzschlüsse.
Leitung nicht verbunden.
Such dir was aus.
wahrscheinlich hat er vergessen die nich verwendeten daten pins am
display high oder low zu pullen (bin mir gerade nicht sicher was da hin
muss). die floaten also immer schön durch die gegend und somit wär auch
der müll erklärt.
kontrast/hintergrundbeleuchtung scheinen auch nicht angeschlossen zu
sein, schätze ich mal.
ich, nicht du schrieb:> wahrscheinlich hat er vergessen die nich verwendeten daten pins am> display high oder low zu pullen (bin mir gerade nicht sicher was da hin> muss). die floaten also immer schön durch die gegend und somit wär auch> der müll erklärt.
Seit Jahren sind bei allen von mir verwendeten LCDs Pulldown-Widerstände
verbaut, offene Eingänge D0 bis D3 sind somit wohl nicht das Problem.
Du hast einen 16 MHz Quartz dran, hast du auch das Fuse-Bit für den
Clock-Teiler drin? Wenn ja dann musst du F_CPU durch 8 teilen…oder du
nimmst das Fuse-Bit raus. Hast du schon das Toggeln versucht und die
Zeit ausgemessen? Was kam dabei rum? Wie sind die anderen Fuse-Bits? Den
Watchdog auch ausgemacht? Immerhin setzt du ihn nicht zurück wenn ich
das richtig gesehen hab.
Lass dir doch mal direkt nach der LCD Init was auf dem Display anzeigen
und starte dann erst die andere Peripherie. Dann weisst du sofort, ob es
an der Verkabelung liegt oder an einem Konflikt auf den I/O Pins.
Eigentlich ist Peter Fleurys Bibliothek nämlich ziemlich narrensicher.
Falls übrigens der Takt nicht stimmt, ist das hier nicht so schlimm,
denn wir haben ja 16MHz angegeben, bei z.B. 8Mhz müsste es trotzdem
gehen, wenn auch langsamer.
ich, nicht du schrieb:> wahrscheinlich hat er vergessen die nich verwendeten daten pins am> display high oder low zu pullen (bin mir gerade nicht sicher was da hin> muss). die floaten also immer schön durch die gegend und somit wär auch> der müll erklärt.
Zeig mir mal die Application-Note oder das Datenblatt in dem drin steht,
dass man die nicht offen lassen kann.
Ich lasse DB0...DB3 immer offen und habe damit noch nie Probleme gehabt.
Wie auch, wenn die unteren vier Bits garnicht gebraucht werden.
Hmm:
http://www.mikrocontroller.net/articles/HD44780
Da steht auch offen lassen drin.
Und im Datenblatt vom HD444780U von Hitachi sind im Schaltungs-Beispiel
für 4 Bit die DB0...DB3 Leitungen nicht zu sehen, was auch wieder
andeutet, dass man die ignorieren kann.
Rudolph schrieb:> Und im Datenblatt vom HD444780U von Hitachi sind im Schaltungs-Beispiel> für 4 Bit die DB0...DB3 Leitungen nicht zu sehen, was auch wieder> andeutet, dass man die ignorieren kann.
Da braucht man nicht irgendwie rumzudeuteln.
Bei der Pin-Beschreibung zu DB0..DB3 im Datenblatt steht "These pins are
not used during 4-bit operation.". Ist das nicht klar genug?
Kurzer Einwurf mit Halbwissen:
Wenn die serielle Übertragung funktioniert, also im Terminal seriell das
uart_puts("alles initialisiert..."); ankommt, dann sollte doch mit dem
CPU-Takt alles richtg sein!?
Mit Pin3 des LCD auf GND wirst du nicht viel sehen. Ein Poti wie im
Datenblatt erhöht den Kontrast enorm.
Hast du schon die UART-Ausgabe angeschaut?
Also auf meinem Testboard funktioniert LCD und UART einwandfrei.
Die laufende Zahl gibst du allerdings auf den LCD nicht aus, nur über
UART.
willy schrieb:> Die Ausgabe am Oszi findet ihr im Anhang. Ich lese da 1,6 Mhz, hm.
Was auch immer der ganze eingeblendete Zahlensalat soll - mit den 1.6MHz
liegst du richtig.
Um damit etwas anfangen zu können, solltest du verraten, wie du die
Compileroptimierung eingestellt hast.
Besser wäre noch, die Optimierung mit '-O1' auf '1' zu stellen und ein
aussagekräftiges Delay (z.B. 1000µs) in die Schleife zu setzen.
Da hat Hubert G. Recht, Pin3 an GND := nicht gut!
Besser Poti zwischen +5V und GND, Mittelabzweig auf Pin3.
Solange dran drehen bis die schwarzen Balken im Display so gerade eben
verschwinden.
Der Fehler liegt sicher nicht in deinem Code. Bei mir funktioniert es.
Entweder lädst du konsequent ein falschen File oder du hast einen
HW-Fehler.
Die Fuses mit ff und D9 sind richtig.