Forum: Mikrocontroller und Digitale Elektronik LCD Display es werden keine Buchstaben angezeigt.


von Felix N. (felix_n888)


Lesenswert?

Hallo,
Heute ist bei mir mein HD44780 LCD Display angekommen, das ich vor einen 
Monat bei Amazon bestellt habe.
Ich habe mich an dieses Tutorial gehalten: 
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

Das LCD ist richtig angeschlossen. Wenn ich denn Poti(Anschluss Vee(Oder 
bei mir V0) und dieser bei 0 Volt ist sind die Balken zusehen wenn 
dieser bei 5 Volt ist also nach rechtes gedreht, dann sind die Balken 
verschwunden.

Wenn ich mein Breadboard unter 5 Volt setzte dann erscheinen in der 
ersten Zeile die Balken ganz kräftig und verschwinden dann wieder. Das 
macht ja lcd_init(); Wenn ich diese Methode weg lasse, dann bleiben die 
Balken dauerhaft.
Aber wenn ich jetzt mit lcd_string oder lcd_data Zeichen sende werden 
diese dort nicht dargestellt.

Was mich ein bisschen verwirt ist dieses hier:
1
// 
2
// Anpassungen im makefile:
3
//    ATMega8 => MCU=atmega8 im makefile einstellen
4
//    lcd-routines.c in SRC = ... Zeile anhängen
5
//
Wo finde ich denn diese Makefile? Und was wird mit lcd-routines.c in SRC 
gemeint? Die Datei includieren?

Kann mir da einer helfen?

Lg Felix

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Felix N. schrieb:
> Wo finde ich denn diese Makefile?
Welche Toolchain verwendest du? In welcher Version?

von Felix N. (felix_n888)


Lesenswert?

Lothar M. schrieb:
> Felix N. schrieb:
> Wo finde ich denn diese Makefile?
>
> Welche Toolchain verwendest du? In welcher Version?

Ich nutzte das Atmel Studio 7. Oder was meinst du damit?

von Duckundwech (Gast)


Lesenswert?

Eigentlich sollte es dem LCD egal sein, ob Buchstaben, Zahlen oder 
irgendwelche Zeichen angezeigt werden. Probier mal die gleichen 
Einstellungen wie bei Zahlen.

Duckundwech

von Felix N. (felix_n888)


Lesenswert?

Lothar M. schrieb:
> Welche Toolchain verwendest du? In welcher Version?

Hallo nochmal,
Bin nun wieder am Rechner.
Habe grade mal geschaut und Project -> {Projekt-Name} Properties -> 
Toolchain

Eine Version kann ich nicht finden. Nutze Atmel Studio in der Version 7.

Hier mal ein Bild davon: http://prntscr.com/a9y4oh

Duckundwech schrieb:
> Eigentlich sollte es dem LCD egal sein, ob Buchstaben, Zahlen oder
> irgendwelche Zeichen angezeigt werden. Probier mal die gleichen
> Einstellungen wie bei Zahlen.
>
> Duckundwech

Hallo!
Das LCD zeigt mir nix an. Also er führt "lcd_init()" aus und dann zeigt 
er mir aber nichts an. Also wenn ich "Hallo" sende zeigt er mir nix an.

von Karl M. (Gast)


Lesenswert?

Felix,

bitte schreibe uns noch den verwendeten
a) Avr µC,
b) die Taktfrequenz und
die einzelnen angeschlossenen LCD Pins.

Pin D4 =
Pin D5 =
Pin D6 =
Pin D7 =
Pin RS =
Pin EN =
Pin RW =

Wie stellst Du den LCD Kontrast ein ?

Dann kann man Dir mal eine einfaches Testprogramm zukommen lassen.

von Felix N. (felix_n888)


Lesenswert?

Karl M. schrieb:
> Felix,
>
> bitte schreibe uns noch den verwendeten
> a) Avr µC,
> b) die Taktfrequenz und
> die einzelnen angeschlossenen LCD Pins.
>
> Pin D4 =
> Pin D5 =
> Pin D6 =
> Pin D7 =
> Pin RS =
> Pin EN =
> Pin RW =
>
> Wie stellst Du den LCD Kontrast ein ?
>
> Dann kann man Dir mal eine einfaches Testprogramm zukommen lassen.

Sorry total vergessen
Der Mikrocontroller ist der ATMega328P mit dem Ardunio Bootloader. 
Taktfrequenz ist 16 Mhz. diese stimmt auch.

LCD                Controller PIN
VSS                (Kein PIN) GND
VDD                (Kein PIN) +5 Volt
V0                 (Kein PIN) Angeschlossen über ein 10K Ohm Poti
RS                 PD4 am uC
RW                 (Kein PIN) GND
E                  PD5 am uC
D0 - D3            Nicht angeschlossen 4 - Bit Modus
D4                 PD0 am uC
D5                 PD1 am uC
D6                 PD2 am uC
D7                 PD3 am uC
A                  (Kein Pin)Auf +3,3 Volt
K                  (Kein PIN)GND

Denn Kontrast stelle ich über ein 10K Poti ein. Linkes geht dieser auf 
GND und der rechte anschluss geht auf +5 Volt. Wenn der Poti bei 0 Ohm 
ist dann ist das Display ganz "hell" vom Kontrast her und wenn, ich nach 
rechtes drehe nimmt es ab.

von Karl M. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Felix,

hier ist dein Testprogramm mit den obigen Angaben,

nach 2 Sekunden startet eine Animation, die alle 500ms die Zeile 2 neu 
beschreibt.

von Felix N. (felix_n888)


Lesenswert?

Karl M. schrieb:
> Hallo Felix,
>
> hier ist dein Testprogramm mit den obigen Angaben,
>
> nach 2 Sekunden startet eine Animation, die alle 500ms die Zeile 2 neu
> beschreibt.

Hallo Karl.
Bei mir passiert dort nix. Das LCD bleibt Blau(wegen Blacklight). Kannst 
du denn Source Code mal schicken?

von Karl M. (Gast)


Lesenswert?

Felix,

dann teste bitte die Verkabelung und die Versorgungsspannung (+5V).
Sind auch einige 100nF zwischen Vcc-Gnd beschaltet ?

Wie lautete die Bezeichnung des LCD ?

von Felix N. (felix_n888)


Lesenswert?

Karl M. schrieb:
> Felix,
>
> dann teste bitte die Verkabelung und die Versorgungsspannung (+5V).
> Sind auch einige 100nF zwischen Vcc-Gnd beschaltet ?
>
> Wie lautete die Bezeichnung des LCD ?

Ich habe dieses LCD gekauft:
http://www.amazon.de/HD44780-Module-Display-Anzeigen-Zeichen/dp/B009GEPZRE

Die Verkabelung stimmt. Es ist kein 100 nf da zwischen

von Karl M. (Gast)


Lesenswert?

Hallo Felix,

dann setzt die 100nF am Atmel m328p und dem LCD noch ein.

Mein kleines Programm läuft auf meinem Testboard + LCD mit einem 
atmega32 wie erwartet.

Das LCD 1602A habe ich in anderen Projekten auch verbaut und sie sind 
nur etwas langsamer beim LCD Zeichnupdate.
Die LCD Routine arbeitet mit folgenden Wartezeiten für das LCD Timing:
LCD4_COMMAND_DELAY = 50  µs
LCD4_ENABLE_DELAY = 1 us
LCD4_CLR_DELAY = 2000 µs

Evtl. ist die Kabellänge zwischen LCD und m328p auch zu lang..

Bitte stelle noch einige gute Bilder ein, auf denen man auch etwas sehen 
kann. Also bitte mit Licht + Schärfe.

von Felix N. (felix_n888)


Lesenswert?

Karl M. schrieb:
> Hallo Felix,
>
> dann setzt die 100nF am Atmel m328p und dem LCD noch ein.
>
> Mein kleines Programm läuft auf meinem Testboard + LCD mit einem
> atmega32 wie erwartet.
>
> Das LCD 1602A habe ich in anderen Projekten auch verbaut und sie sind
> nur etwas langsamer beim LCD Zeichnupdate.
> Die LCD Routine arbeitet mit folgenden Wartezeiten für das LCD Timing:
> LCD4_COMMAND_DELAY = 50  µs
> LCD4_ENABLE_DELAY = 1 us
> LCD4_CLR_DELAY = 2000 µs
>
> Evtl. ist die Kabellänge zwischen LCD und m328p auch zu lang..
>
> Bitte stelle noch einige gute Bilder ein, auf denen man auch etwas sehen
> kann. Also bitte mit Licht + Schärfe.

Hallo nochmal.
Also 100NF an Vcc und GND beim Atmega328p Avcc und gnd kann weg nutze 
kein A/D. Und beim LCD ein Kondensator von Vdd(5 Volt) zu Vss(Masse)?

Bilder lade ich morgen mal hoch. Kabellänge sollte eigentlich nicht 
zulang sein (20-25 cm).

von Karl M. (Gast)


Angehängte Dateien:

Lesenswert?

Felix N. schrieb:
> Hallo nochmal.
> Also 100NF an Vcc und GND beim Atmega328p Avcc und gnd kann weg nutze
> kein A/D. Und beim LCD ein Kondensator von Vdd(5 Volt) zu Vss(Masse)?

Alle Vcc und GND, sowie Avcc und AGnd ! müssen angeschlossen werden.
Jedes Paar erhält auch immer einen 100nF Kondensator.
Aref gehört nicht an Vcc=+5V, sondern nur eine 100nF Kondensator nach 
Gnd

> Bilder lade ich morgen mal hoch. Kabellänge sollte eigentlich nicht
> zulang sein (20-25 cm).

Doch werden sie sein.

Hier ist eine weiteres Programm, mit anderem Timing:

LCD4_ENABLE_DELAY = 10 us
LCD4_COMMAND_DELAY = 100  µs
LCD4_CLR_DELAY = 5000 µs

von Felix N. (felix_n888)


Lesenswert?

Karl M. schrieb:
> Hallo Felix,
>
> dann setzt die 100nF am Atmel m328p und dem LCD noch ein.
>
> Mein kleines Programm läuft auf meinem Testboard + LCD mit einem
> atmega32 wie erwartet.
>
> Das LCD 1602A habe ich in anderen Projekten auch verbaut und sie sind
> nur etwas langsamer beim LCD Zeichnupdate.
> Die LCD Routine arbeitet mit folgenden Wartezeiten für das LCD Timing:
> LCD4_COMMAND_DELAY = 50  µs
> LCD4_ENABLE_DELAY = 1 us
> LCD4_CLR_DELAY = 2000 µs
>
> Evtl. ist die Kabellänge zwischen LCD und m328p auch zu lang..
>
> Bitte stelle noch einige gute Bilder ein, auf denen man auch etwas sehen
> kann. Also bitte mit Licht + Schärfe.

Hallo nochmal.
Also 100NF an Vcc und GND beim Atmega328p Avcc und gnd kann weg nutze 
kein A/D. Und beim LCD ein Kondensator von Vdd(5 Volt) zu Vss(Masse)?

Bilder lade ich morgen mal hoch. Kabellänge sollte eigentlich nicht 
zulang sein (20-25 cm).

Karl M. schrieb:
> LCD4_ENABLE_DELAY = 10 us
> LCD4_COMMAND_DELAY = 100  µs
> LCD4_CLR_DELAY = 5000 µs

Bin gerade am anderen Rechner. Probiere es morgen alles aus. Glaube 
sogar das ich an machen stellen statt _delay_us() _delay_ms() 
geschrieben habe. Kann es sein das die Init Phase dann zulange dauert?

Habe aber keine kürzen Kabel.

von Felix N. (felix_n888)


Angehängte Dateien:

Lesenswert?

Hallo,
Ich habe deine andere .hex File auch ausprobiert. Funktioniert nicht. 
Ich weis nicht ob es entscheiden ist aber, wenn ich das LCD unter Strom 
setzte kommt nur die erste Zeile mit denn Schwarzen Balken hervor. Die 
Zweite Zeile nicht.

Ich habe mal einige Bilder angehangen mit Beschreibung.

Ich habe auch mal meine lcd-routines.h und c und main.c Datei 
angehangen.

Mfg Felix.(Danke für eure Geduld!)

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Felix N. schrieb:
> Also 100NF an Vcc und GND beim Atmega328p Avcc und gnd kann weg nutze
> kein A/D.

Es ist vollkommen egal, ob Du A/D benutzt oder nicht. Vcc und AVcc 
benötigen je 100nF nach Masse. Wenn Du A/D nicht nutzt, kannst Du 
höchstens den 100nF an AREF geschaltet nach GND weglassen - schadet aber 
auch nicht.

Also: Mind. 2 x 100nF am ATmega sind Pflicht. Es gab hier schon zig 
Threads, wo es genau an diesen beiden fehlenden Kerkos lag. Du willst 
nicht der 1001ste sein :-)

: Bearbeitet durch Moderator
von Olaf K. (korky2)


Lesenswert?

Felix N. schrieb:
> Ich habe mal einige Bilder angehangen mit Beschreibung.

Sieht doch gut aus :-) Dreh mal am Poti. Vielleicht kommt dann etwas.

In dem letzten Bild steht, dass PD3 auch nach DB5 geht. Genau wie PD1?

von Felix N. (felix_n888)


Lesenswert?

Olaf K. schrieb:
> Felix N. schrieb:
>> Ich habe mal einige Bilder angehangen mit Beschreibung.
>
> Sieht doch gut aus :-) Dreh mal am Poti. Vielleicht kommt dann etwas.
>
> In dem letzten Bild steht, dass PD3 auch nach DB5 geht. Genau wie PD1?

Sorry, verschrieben PD3 geht an DB7. Wenn ich am Poti drehe ändert sich 
nur der Kontrast aber es wird nichts sichtbar.

Frank M. schrieb:
> Es ist vollkommen egal, ob Du A/D benutzt oder nicht. Vcc und AVcc
> benötigen je 100nF nach Masse. Wenn Du A/D nicht nutzt, kannst Du
> höchstens den 100nF an AREF geschaltet nach GND weglassen - schadet aber
> auch nicht.
>
> Also: Mind. 2 x 100nF am ATmega sind Pflicht. Es gab hier schon zig
> Threads, wo es genau an diesen beiden fehlenden Kerkos lag. Du willst
> nicht der 1001ste sein :-)

Hallo Frank. 100nf von avcc auf gnd genau das gleich bei vcc und gnd und 
auch noch 100 nf von aref auf agnd. Zwischen vss und vdd ist auch noch 
einer.

von Jan L. (ranzcopter)


Lesenswert?

...da liegt ein UNO herum, der als "Netzteil" benutzt wird?
Das erste, was ich testen würde, falls ich die grundsätzliche Funktion 
des LCD sicherstellen möchte: LCD an UNO anschliessen (Tutorials dazu 
gibt's genügend), und "offizielles" LCD-Beispiel (z.B "HelloWorld") per 
IDE ausprobieren.

Danach sollte man dann zumindest wissen, ob das LCD tut, und kann sich 
den Abblock-Cs und/oder fremden HEX-Files usw. zuwenden...

: Bearbeitet durch User
von Karl M. (Gast)


Lesenswert?

Hallo,

das Testprogramm ist für diese Pingelegung ausgelegt.
1
LCD                Controller PIN
2
VSS                (Kein PIN) GND
3
VDD                (Kein PIN) +5 Volt
4
V0                 (Kein PIN) Angeschlossen über ein 10K Ohm Poti
5
RS                 PD4 am uC
6
RW                 (Kein PIN) GND
7
E                  PD5 am uC
8
D0 - D3            Nicht angeschlossen 4 - Bit Modus
9
D4                 PD0 am uC
10
D5                 PD1 am uC
11
D6                 PD2 am uC
12
D7                 PD3 am uC
13
A                  (Kein Pin)Auf +3,3 Volt
14
K                  (Kein PIN)GND

Stimmt die nun noch?

von Felix N. (felix_n888)


Lesenswert?

Jan L. schrieb:
> ...da liegt ein UNO herum, der als "Netzteil" benutzt wird?
> Das erste, was ich testen würde, falls ich die grundsätzliche Funktion
> des LCD sicherstellen möchte: LCD an UNO anschliessen (Tutorials dazu
> gibt's genügend), und "offizielles" LCD-Beispiel (z.B "HelloWorld") per
> IDE ausprobieren.
>
> Danach sollte man dann zumindest wissen, ob das LCD tut, und kann sich
> den Abblock-Cs und/oder fremden HEX-Files usw. zuwenden...

Das LCD funktioniert. Ich habe das LCD Tutorial im Arduino getestet. 
Dort wird alles dargestellt.

Ein "Offizielles" LCD Beispiel für denn atmega328p kann ich nicht 
finden. Kennst du da eines?

Karl M. schrieb:
> Stimmt die nun noch?

Ja diese stimmen.

: Bearbeitet durch User
von Jan L. (ranzcopter)


Lesenswert?

Felix N. schrieb:
> Das LCD funktioniert. Ich habe das LCD Tutorial im Arduino getestet.
> Dort wird alles dargestellt.
>
> Ein "Offizielles" LCD Beispiel für denn atmega328p kann ich nicht
> finden. Kennst du da eines?

damit meinte ich die standardmässig installierten (LCD-)Beispiele der 
Arduino-IDE, um das mit dem UNO zu testen - scheint ja demnach zu 
funktionieren.
Oben hast du geschrieben, dass du beim Standalone-Atmega328 auch den 
Arduino-Bootloader drauf hast - dann wäre es evtl. das einfachste, wenn 
du den UNO benutzt, um den exakt selben Sketch auf deine 
Breadboard-Schaltung zu schieben:
https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard

von Pete K. (pete77)


Lesenswert?

Kann es sein, dass Du Dein UNO flasht, aber nicht das Teil auf dem 
Steckbrett?

von Felix N. (felix_n888)


Lesenswert?

Jan L. schrieb:
> damit meinte ich die standardmässig installierten (LCD-)Beispiele der
> Arduino-IDE, um das mit dem UNO zu testen - scheint ja demnach zu
> funktionieren.
> Oben hast du geschrieben, dass du beim Standalone-Atmega328 auch den
> Arduino-Bootloader drauf hast - dann wäre es evtl. das einfachste, wenn
> du den UNO benutzt, um den exakt selben Sketch auf deine
> Breadboard-Schaltung zu schieben:
> https://www.arduino.cc/en/Tutorial/ArduinoToBreadboard

Pete K. schrieb:
> Kann es sein, dass Du Dein UNO flasht, aber nicht das Teil auf dem
> Steckbrett?

Mein UNO Board flasht das ganze auf denn Chip. Der Chip sitzt auf denn 
Breadboard. Ich nutze das Atmel Studio weil ich bereits Vorkenntnisse in 
C habe.
Ich würde auch gerne das Atmel Studio weiter benutzen.

von Pete K. (pete77)


Lesenswert?

Felix N. schrieb:
> Mein UNO Board flasht das ganze auf denn Chip. Der Chip sitzt auf denn
> Breadboard.

Hmm, dann lass doch mal eine LED auf dem Steckbrett nebenher blinken. 
Bei jedem Flashen ein andere Rhythmus (1 sek, 2 sek etc.).

von Felix N. (felix_n888)


Lesenswert?

Pete K. schrieb:
> Hmm, dann lass doch mal eine LED auf dem Steckbrett nebenher blinken.
> Bei jedem Flashen ein andere Rhythmus (1 sek, 2 sek etc.).

Okay mache ich aber, was auf was willst du hinaus?

von Pete K. (pete77)


Lesenswert?

Felix N. schrieb:
> Das LCD funktioniert. Ich habe das LCD Tutorial im Arduino getestet.
> Dort wird alles dargestellt.

Dann hast Du ja kein Software-Problem, sondern musst nur den 
Controller-Typ umstellen und neu flashen.

von Pete K. (pete77)


Lesenswert?

Entweder der Controller funktioniert nicht oder das Flashen klappt 
nicht.

von Felix N. (felix_n888)


Lesenswert?

Pete K. schrieb:
> Entweder der Controller funktioniert nicht oder das Flashen klappt
> nicht.

Der Controller funktioniert. Wenn ich die Rythmus auf 500ms einstelle 
wegen:
An - Delay(500) - Aus - Delay(500) = 1 sec. Dann blinkt diese ein mal in 
der Sekunde. Wenn ich das auf 2000 stelle dann ist sie 2 sekunden an und 
2 sekunden dann wieder aus.

Also das funktioniert. Das Flashen klappt auch seit 2 Monaten 
Problemlos.

Pete K. schrieb:
> Dann hast Du ja kein Software-Problem, sondern musst nur den
> Controller-Typ umstellen und neu flashen.

Was meinst du mit Controller-Typ umstellen?

Hier mal ein Bild vom Atmel Studio: http://prntscr.com/aacxdu

: Bearbeitet durch User
von Pete K. (pete77)


Lesenswert?

Schon mit kürzeren Kabeln versucht?

von W.S. (Gast)


Lesenswert?

Felix N. schrieb:
> Aber wenn ich jetzt mit lcd_string oder lcd_data Zeichen sende werden
> diese dort nicht dargestellt.

Welch ein Trauerspiel mit inzwischen mehr als 2 Dutzend Beiträgen und 
immer noch ohne jegliche Lösunf - ja nicht einmal mit dem geringsten 
systematischen Vorgehen.

Also:
Laß du erstmal das LCD weg und schreib dir ein oder mehrere kleine 
Testprogramme.

Hast du nen funktionablen seriellen Port an deinem µC, den du vom PC aus 
per Terminalprogramm erreichen kannst?

Wenn ja: dann kannst du alle Testroutinen zusammenfassen.

Sonst:
1. Testprogramm: die 4 Datenbits von 0 bis 15 durchzählen und ausgeben. 
Mit Oszi angucken. Auch prüfen, ob die anderen Portpins nicht in 
Mitleidenschaft gezogen werden.

2. Test zuerst RS, dann E, dann R/W einzeln wackeln lassen, 
oszillografieren und ebenfalls nachschauen, ob alle anderen Portpins so 
bleiben wie sie sollen

Damit hättest du erstmal abgetestet, ob das, was du mit dem LCD 
überhaupt anstellen willst, an den Pins richtig ankommt.

3. Schreib dir passende Low-Level-Funktionen zum Setzen und Löschen der 
Steuersignale (RS, E, R/W) und der 4 bit breiten Datenausgabe. Und 
probiere sie aus.

4. Guck in die Doku zum Controller und programmiere deine Setup-Routine 
und die Zeichenausgabe-Routine selber. Damit du weißt, was tatsächlich 
abgeht. Normalerweise funktioniert das Display ab da tadellos.

W.S.

von Pete K. (pete77)


Lesenswert?

W.S. schrieb:
> Welch ein Trauerspiel mit inzwischen mehr als 2 Dutzend Beiträgen und
> immer noch ohne jegliche Lösunf

Nun ja, auf dem UNO funktioniert das LCD ja. Hatte ich zumindest so 
verstanden.

: Bearbeitet durch User
von Felix N. (felix_n888)


Lesenswert?

Pete K. schrieb:
> Nun ja, auf dem UNO funktioniert das LCD ja. Hatte ich zumindest so
> verstanden.

Okay, ich kann jetzt zu 100 % sagen. Das ich was falsch mache mit dem 
Code Beispiel von Avr-gcc vom Mikrocontroller.net.

Ich habe mal im Internet nach "LCD Tutorial Atmega328p" gesucht und 
dieses gefunden: 
http://web.alfredstate.edu/weimandn/programming/lcd/ATmega328/LCD_code_gcc_4d.html

Dort funktioniert es das Display zu beschreiben.

Ich werde die Ports mal Manual setzten.

von W.A. (Gast)


Lesenswert?

Felix N. schrieb:
> Also 100NF an Vcc und GND beim Atmega328p Avcc und gnd kann weg nutze
> kein A/D.

Der AVCC heißt nur so, damit er sich von VCC unterscheidet. Ob du A/D 
benutzt oder nicht, spielt keine Rolle. Da hängen auch andere Ports mit 
dran.

von Felix N. (felix_n888)


Lesenswert?

W.A. schrieb:
> Der AVCC heißt nur so, damit er sich von VCC unterscheidet. Ob du A/D
> benutzt oder nicht, spielt keine Rolle. Da hängen auch andere Ports mit
> dran.

Der ist auch mit Storm versorgt

von Schimmelreiter (Gast)


Lesenswert?

Felix N. schrieb:
> Der ist auch mit Storm versorgt

Ich auch. Storm hat mich geschaffen.

von Wolfgang (Gast)


Lesenswert?

Felix N. schrieb:
> Ein "Offizielles" LCD Beispiel für denn atmega328p kann ich nicht
> finden. Kennst du da eines?

Auf IMHO jedem Arduino mit ATmega328p läuft das Hello-World-Beispiel der 
Arduino LCD Library. Warum sollte es gerade auf deinem ATmega328p nicht 
laufen?

von Felix N. (felix_n888)


Lesenswert?

Wolfgang schrieb:
> Auf IMHO jedem Arduino mit ATmega328p läuft das Hello-World-Beispiel der
> Arduino LCD Library. Warum sollte es gerade auf deinem ATmega328p nicht
> laufen?

Das Hello World Beispiel von der Arduino IDE : 
https://www.arduino.cc/en/Tutorial/HelloWorld
Funktioniert ja auch.

Aber dieses funktioniert nicht:
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung#Siehe_auch

Und ich weis nicht wieso.

von Jens (Gast)


Lesenswert?

Hallo,

ich habe grad  mal kurz in deine Soircen geschaut. So wie es aussieht 
sind die falsch.
Vielleicht habe ich auch was übersehen. Wie gesagt ich habe nur kurz 
rein geschaut.

Meiner Meinung nach setzt du die Steuersignale nicht richtig.
Du verwendest die Funktion lcd_data('irgendwas'); Da wird das Zeichen 
auf den Port geschoben aber die Daten werden nicht vom LCD übernommen, 
da du das E Signal nicht richtig bedienst.
Das kann so nichts werden. Vergleich mal die Source und vor allem 
beschäftige dich VORHER nochmal wie du die Daten richtig an das Display 
senden musst. Also wofür sind die Daten, Kommandos und so weiter.

Vor allem solltest du deine main ändern.  Du musst erst deinen Cursor 
setzten und dann das richtige Datum auf die Adresse schreiben. Dann wird 
es auch angezeigt.

Gruß, Jens

von Felix N. (felix_n888)


Lesenswert?

Jens schrieb:
> Hallo,
>
> ich habe grad  mal kurz in deine Soircen geschaut. So wie es aussieht
> sind die falsch.
> Vielleicht habe ich auch was übersehen. Wie gesagt ich habe nur kurz
> rein geschaut.
>
> Meiner Meinung nach setzt du die Steuersignale nicht richtig.
> Du verwendest die Funktion lcd_data('irgendwas'); Da wird das Zeichen
> auf den Port geschoben aber die Daten werden nicht vom LCD übernommen,
> da du das E Signal nicht richtig bedienst.
> Das kann so nichts werden. Vergleich mal die Source und vor allem
> beschäftige dich VORHER nochmal wie du die Daten richtig an das Display
> senden musst. Also wofür sind die Daten, Kommandos und so weiter.
>
> Vor allem solltest du deine main ändern.  Du musst erst deinen Cursor
> setzten und dann das richtige Datum auf die Adresse schreiben. Dann wird
> es auch angezeigt.
>
> Gruß, Jens

Hallo Jens,
Werde ich morgen mal machen.
Übrings der Code ist der von dem Tutorial von Mikrocontroller.net nur 
ohne die Kommentare

Muss man RS auf High setzten dann senden und dann wieder auf low 
setzten?

: Bearbeitet durch User
von Pete K. (pete77)


Lesenswert?

Felix N. schrieb:
> Muss man RS auf High setzten dann senden und dann wieder auf low
> setzten?

Steht alles im Datenblatt zu Deinem LCD bzw. Controller.

von Stefan F. (Gast)


Lesenswert?

RS setzt du auf Low, bevor du ein Kommando sendest.
Und du setzt es auf High, bevor du Daten (Text) sendest.

Deine Fotos vom Zustand vor und nach der initialisierung lässt vermuten, 
dass die Initialisierung klappt. Nur das Senden von Text nicht. Schau 
also mal genau hin, was du mit der RS Leitung machst.

Du könntest an RS und E zwei Leuchtdioden anschließen und das Timing 
viiiiiiieeeel langsamer machen. Dann kannst du mit bloßen Auge sehen, ob 
diese beiden Steuerleitungen richtig bedient werden.

Dem Display ist ja ziemlich egal, wie schnell oder langsam es 
angesteuert wird - solange es nicht zu schnell ist.

von Karl M. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Felix,

Du hast zwei Testprogramm mit unterschiedlichem Timing,

Wenn diese laufen, ist deine Hardware in Ordnung.
Somit würde ich alle Bauteile und Steckverbinder neu stecken und dann 
die Verbindung mit einem DMM über eine Durchgangsprüfung (Ohm) 
verifizieren.

Hier ist ein weiteres für den Atmega328p @16MHz, ich habe das Timing 
noch weiter verlangsamt.

DataSetupTime    = 10 µs
EnableTime       = 10 µs
CommandDelayTime = 150 µs
ClearDelayTime   = 5000 µs

Und folgende Pins im 4Bit Modus definiert:
Lcd4Bit D4 = pd0 (PORTD)
Lcd4Bit D5 = pd1 (PORTD)
Lcd4Bit D6 = pd2 (PORTD)
Lcd4Bit D7 = pd3 (PORTD)
Lcd4Bit RS = pd4 (PORTD)
Lcd4Bit EN = pd5 (PORTD)

von Felix N. (felix_n888)


Lesenswert?

Karl M. schrieb:
> Hallo Felix,
>
> Du hast zwei Testprogramm mit unterschiedlichem Timing,
>
> Wenn diese laufen, ist deine Hardware in Ordnung.
> Somit würde ich alle Bauteile und Steckverbinder neu stecken und dann
> die Verbindung mit einem DMM über eine Durchgangsprüfung (Ohm)
> verifizieren.
>
> Hier ist ein weiteres für den Atmega328p @16MHz, ich habe das Timing
> noch weiter verlangsamt.
>
> DataSetupTime    = 10 µs
> EnableTime       = 10 µs
> CommandDelayTime = 150 µs
> ClearDelayTime   = 5000 µs
>
> Und folgende Pins im 4Bit Modus definiert:
> Lcd4Bit D4 = pd0 (PORTD)
> Lcd4Bit D5 = pd1 (PORTD)
> Lcd4Bit D6 = pd2 (PORTD)
> Lcd4Bit D7 = pd3 (PORTD)
> Lcd4Bit RS = pd4 (PORTD)
> Lcd4Bit EN = pd5 (PORTD)

Hallo Karl.
Dieses Testprogramm funktioniert leider auch nicht. Die Balken werden 
angezeigt und verschwinden kurz danach wieder(init) dann  kommt aber 
kein Text.

Mit diesen Beispiel: 
http://web.alfredstate.edu/weimandn/programming/lcd/ATmega328/LCD_code_gcc_4d.html

Funktioniert es Problemlos. Ich kann aber kein Unterschied zwischen 
lcd_out und lcd_write_4 finden.

mfg felix.

: Bearbeitet durch User
von Karl M. (Gast)


Lesenswert?

Nun,

lcd_write_4(bdata) schreibt ein Nibbel - 4Bit - auf das LCD, wobei die 
LCD Pinanordnung und die jeweils verwendeten Port hier frei wählbar 
sind.

So wie bei meiner Bibliothek auch.

lcd_out(data) aus
# 
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/LCD-Ansteuerung

hingegen, schreibt das Nibbel an eine feste Bitstelle von Port 
>LCD_PORT< mit einer festgelegten Reihenfolge.

Ich schreib ja schon es liegt an der Kabellänge !

Wenn meine korrekten Testprogramm bei dir nicht laufen, dann liegt es an 
deiner Hardware.

Erst wenn, z.B. das letzte Testprogramm mit nochmal verlängertem Timing, 
bei Dir funktioniert, würde ich mich an das schreiben einer eigenen LCD 
Bibliothek machen.

Der Autor von
# 
http://web.alfredstate.edu/weimandn/programming/lcd/ATmega328/LCD_code_gcc_4d.html

hat schon das Datenblatt gelesen und sich auch Gedanken über das Timing 
des EN Signals gemacht.
1
void lcd_write_4(uint8_t theByte) {
2
// : more code
3
4
// write the data
5
                                                    // 'Address set-up time' (40 nS)
6
    lcd_E_port |= (1<<lcd_E_bit);                   // Enable pin high
7
    _delay_us(1);                                   // implement 'Data set-up time' (80 nS) and 'Enable pulse width' (230 nS)
8
    lcd_E_port &= ~(1<<lcd_E_bit);                  // Enable pin low
9
    _delay_us(1);                                   // implement 'Data hold time' (10 nS) and 'Enable cycle time' (500 nS)
10
}

In den übergeordneten Funktionen wird z.B. mit 80µs Data-Setuptime 
gearbeitet.
Siehe
1
_delay_us(80);

von Karl M. (Gast)


Angehängte Dateien:

Lesenswert?

Hallo Felix,

ich habe nun testweise das Timing aus diesem Beitrag:

http://web.alfredstate.edu/weimandn/programming/lcd/ATmega328/LCD_code_gcc_4d.html

in mein Programm übertragen und die LCD 4Bit Assembler-Lib entsprechend 
angepasst.

Ich bin mal gespannt, was deine Hardware nun macht !
1
Lcd4 ResetDelay1 = 10 ms
2
Lcd4 ResetDelay2 = 200 µs
3
Lcd4 ResetDelay3 = 200 µs
4
5
Lcd4 EnableDelay = 1 µs
6
Lcd4 CommandDelay = 80 µs
7
Lcd4 ClearDelay = 4 ms

von Felix N. (felix_n888)


Lesenswert?

Es ist scheinbar wirklich der Controller im Ar*** gewesen. Nachdem ich 
die Kabel gegen Max: 10cm lange Draht brücken ausgetauscht hatte. Und 
ein neuen Controller von meinen anderen 3 genommen habe. Funktioniert es 
Problemlos.

Aber wodurch kann man so ein Controller zerstören. Der ist mir zwar das 
ein oder andere mal runter gefallen aber vieles andere(PWM, LED, etc...) 
Funktioniert ja.

Gut der hat jetzt ca. 2 Monate alles mit gemacht. Staubsauger, 
Runterfallen, Pins verbogen. Weis ja nicht wie die Lebens dauer aussieht 
von so einen uC

@Karl .M

Also deine anderen Tests funktionieren nun auch. Kannst du trotzdem mal 
dein Source Code hochladen?

//EDIT: Der controller scheint wohl er ein anderes Problem zu haben. 
Denn ich ich LEDs an die Port d hänge funktionieren die auch problemlos

: Bearbeitet durch User
von Petra (Gast)


Lesenswert?

Der wird eines langsamen ESD Tod gestorben sein.

von Pete K. (pete77)


Lesenswert?

Vielleicht lag es doch an den zu langen Kabeln?

von Thomas F. (igel)


Lesenswert?

Felix N. schrieb:
> Gut der hat jetzt ca. 2 Monate alles mit gemacht. Staubsauger,

Du nimmst den zum Staubsaugen? Jetzt bin ich aber interessiert wie man 
das macht;-)

> Runterfallen, Pins verbogen. Weis ja nicht wie die Lebens dauer aussieht
> von so einen uC.

Die Atmegas sind eigentlich sehr robust. Ich habe hier welche die seit 
ca. 8 Jahren im Dauerbetrieb laufen. Kaputt habe ich noch nie einen 
bekommen.

Eigentlich wurde schon alles gesagt:
Leitungslänge bei Displays so kurz wie möglich.
Ansteuerzeiten des Enable-Impuls variieren.

von Karl M. (Gast)


Lesenswert?

Hallo,

mir ist auch schon mal ein atmega an einem Eingangs-Pin kaputt gegangen.

Dort war der 1-Wire Ein-/Ausgang eines seriellen Bootladers (Fastboot 
2.0). Davor eine einfache Pegelanpassung RS232 Pegel Tx/ RX auf den 
1-Wire Ein-/Ausgang.
Fehleranalyse war damals am Prototyp:
Es muss die negativen Spannungen des RS232 gewesen sein, als die ext. 
Clamp Diode, um negative Spannungen ab-/umzuleiten, sich gelöst hatte.

von Ralf G. (ralg)


Lesenswert?

Felix N. schrieb:
> Es ist scheinbar wirklich der Controller im Ar*** gewesen.

:-/

Ich würde ihm nochmal eine Chance geben.
Bei 'Steckbrett' fällt mir vorher noch ein:
- Kabelbruch
- schlechte Kontakte

von Felix N. (felix_n888)


Lesenswert?

Ralf G. schrieb:
> Ich würde ihm nochmal eine Chance geben.
> Bei 'Steckbrett' fällt mir vorher noch ein:
> - Kabelbruch
> - schlechte Kontakte

Ich werde ich veruschen mal zu "retten"

Thomas F. schrieb:
> Du nimmst den zum Staubsaugen? Jetzt bin ich aber interessiert wie man
> das macht;-)

Habe ihn mehrmals beim Staubsaugen aufgesaugt.

Pete K. schrieb:
> Vielleicht lag es doch an den zu langen Kabeln?

Ne, bei denn anderen Controller waren die Kabel 20-25 cm lang kein 
Problem. Funktionierte alles super.

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.