Forum: Mikrocontroller und Digitale Elektronik LCD ansteuern


von astroscout (Gast)


Lesenswert?

Hallo,
ich weiß, dieses Thema wurde hier im Forum schon mehfach behandelt und 
es gibt diverse Tutorials dazu, aber ich komme hier einfach nicht 
weiter.
Ich versuche schon seit einiger Zeit das LCD-Modul TC1602A-09 von Pollin 
auf dem AVR Addon Board zum laufen zu kriegen, aber bisher leider ohne 
Erfolg :-)

Hier mal mein Programm (ich weiß, der Code ist unnötig lang und 
schrecklich, aber will es erstmal zu laufen bekommen, devor ich den Code 
aufräume):
1
#define F_CPU 16000000
2
3
//Includes
4
#include <avr/io.h>
5
#include <util/delay.h>
6
7
8
9
10
//Funktionen Deklarieren
11
void init_lcd(void);
12
 
13
int main(void)
14
{
15
16
17
    _delay_ms(20);
18
  
19
  _delay_ms(20);
20
  
21
  _delay_ms(20);
22
  
23
  _delay_ms(20);
24
  
25
  
26
27
  init_lcd();  
28
  PORTD = 0x00;
29
  _delay_ms(20);
30
  
31
  
32
33
  
34
  
35
  
36
37
  DDRD = 0x10;
38
  _delay_us(5);
39
  
40
  PORTD = 0x14;
41
  _delay_us(1);
42
  PORTD = 0x34;
43
  _delay_us(1);
44
  PORTD = 0x14;
45
  PORTD = 0x11;
46
  _delay_us(1);
47
  PORTD = 0x31;
48
  _delay_us(1);
49
  PORTD = 0x11;
50
  _delay_us(1);
51
  
52
  
53
    
54
  
55
56
 
57
    while(1)
58
    {
59
    }
60
 
61
};
62
63
64
65
void init_lcd(void) {
66
  DDRD = 0xff;
67
  _delay_ms(20);
68
  PORTD = 0x30;
69
  _delay_ms(10);
70
  PORTD = 0x30;
71
  _delay_ms(10);
72
  PORTD = 0x30;
73
  _delay_ms(10);
74
  PORTD = 0x20;
75
  _delay_ms(10);
76
};


Der Code soll erstmal einfach nur ein A auf dem Display anzeigen.
Das Display zeigt mir nach dem Programmstart aber immer nur einen weißes 
Feld und den blinkenden cursor an; wenn ich den Mikrokontroller resette, 
kommt ein weiteres weißes feld hinzu.
Was mache ich falsch???

Ich hoffe ihr könnt mir weiterelfen.

von holger (Gast)


Lesenswert?

Dein Code ist Schrott. Nicht eine Zeile wo die Steuerleitungen
des LCD auch nur irgendwie benutzt werden.

So macht man das:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#LCD-Ansteuerung

von Klaus (Gast)


Lesenswert?

Ohne dass ich jetzt alles durchsehe, ABER
Wo steht der Code für das gewünschte "A" ?
Muss doch 0x41 sein.

von astroscout (Gast)


Lesenswert?

Erstmal Danke für Eure Antworten.
@holger:
Das LCD ist an Port D angeschlossen. Die Steuerleitungen werden also 
Permanaetn angesprochen. Das ganze ist so verdrahtet wie es in dem 
Tutorial von dir drin steht.

@Klaus:
Der letzte Block im Mian-Programm ist für die Darstellung des A 
zuständig.
Das Display arbeitet im 4 bit Modus. Um nun ein A darzustellen muss ich 
doch die 65 (dezimal) übertragen, d.h. erst das highbyte und dann das 
lowbyte. Um das ganze zu übernehmen muss ich ein fallende flanke an E 
erzeugen.
Dies müsste doch eigendlich mit meinem Code passieren, oder??

von Michael U. (amiga)


Lesenswert?

Hallo,

wie soll das jemand aus Deinem Code erraten?
Kein Hinweis, an welchem Pin welche Displayleitung liegt, kein Hinweis, 
welcher Controller auf dem Display ist (ich werde nicht bei Pollin nach 
dem Display suchen gehen).
Keinerlei Kommentar, was Deiner Meinung nach in den Programmzeilen so 
passieren soll.

Trontzdem die Frage:
 init_lcd();
  PORTD = 0x00;  Warum hier den Port auf Eingang?
  _delay_ms(20);

  DDRD = 0x10;  Und dann gleich Pin7 auf Ausgang, der Rest EIngang?
  _delay_us(5);

  PORTD = 0x14;  Welchen Zweck erfüllt hier das Einschalten der PullUps 
an einigen Leitungen?
  _delay_us(1);

Gruß aus Berlin
Michael

von astroscout (Gast)


Lesenswert?

Danke für deine Antwort.
1
Hallo,
2
3
wie soll das jemand aus Deinem Code erraten?
4
Kein Hinweis, an welchem Pin welche Displayleitung liegt, kein Hinweis,
5
welcher Controller auf dem Display ist (ich werde nicht bei Pollin nach
6
dem Display suchen gehen).
7
Keinerlei Kommentar, was Deiner Meinung nach in den Programmzeilen so
8
passieren soll.
Du ahst recht, ich hätte mehr dazu schreiben sollen

1
Trontzdem die Frage:
2
 init_lcd();
3
  PORTD = 0x00;  Warum hier den Port auf Eingang?
4
  _delay_ms(20);
Wo wird hier ein Port auf Eingang gesetzt??? Ich letzte leidiglich alle 
Ausgänge auf Null.
1
  DDRD = 0x10;  Und dann gleich Pin7 auf Ausgang, der Rest EIngang?
2
  _delay_us(5);
Da hat sich ich Fehler eingeschlichen. es sollte heißen PORTD = 0x10;
Danke!
1
  PORTD = 0x14;  Welchen Zweck erfüllt hier das Einschalten der PullUps
2
an einigen Leitungen?
3
  _delay_us(1);
Wieso PullUps???


Nachdem ich den einen Fehler nun behoben habe, bekomme ich endlich 
Zeichen dargestellt. Das Display zeicht mit ein großes O an.

Wenn ich nun aber den Code folgendermaßen ändere, bekomme ich ein / 
Dargestellt.
1
  PORTD = 0x10;
2
  _delay_us(5);
3
  
4
  PORTD = 0x12;
5
  _delay_us(1);
6
  PORTD = 0x32;
7
  _delay_us(1);
8
  PORTD = 0x12;
9
  
10
  PORTD = 0x16;
11
  _delay_us(1);
12
  PORTD = 0x36;
13
  _delay_us(1);
14
  PORTD = 0x16;
15
  _delay_us(1);
Ich sehe hier allerdings keine verbindung zum ASCII-Code.
Was mache ich falsch???

von astroscout (Gast)


Lesenswert?

Ich hab jetzt nochmal ein wenig rumgespeilt und dabei ist mir dann 
aufgefallen, dass das Low-Byte vom Display immer als F erkannt wird.
Ich vermute mal, das besteht ein Problem mit den Zeiten???
Woran kann das liegen???

von Michael U. (amiga)


Lesenswert?

astroscout wrote:
> Danke für deine Antwort.
>
>
1
> Hallo,
2
> 
3
> wie soll das jemand aus Deinem Code erraten?
4
> Kein Hinweis, an welchem Pin welche Displayleitung liegt, kein Hinweis,
5
> welcher Controller auf dem Display ist (ich werde nicht bei Pollin nach
6
> dem Display suchen gehen).
7
> Keinerlei Kommentar, was Deiner Meinung nach in den Programmzeilen so
8
> passieren soll.
9
>
> Du ahst recht, ich hätte mehr dazu schreiben sollen
>
>
>
1
Trontzdem die Frage:
2
>  init_lcd();
3
>   PORTD = 0x00;  Warum hier den Port auf Eingang?
4
>   _delay_ms(20);
5
>
> Wo wird hier ein Port auf Eingang gesetzt??? Ich letzte leidiglich alle
> Ausgänge auf Null.
Sorry, da habe ich mich eindeutig verlesen...

>
1
>   DDRD = 0x10;  Und dann gleich Pin7 auf Ausgang, der Rest EIngang?
2
>   _delay_us(5);
3
>
> Da hat sich ich Fehler eingeschlichen. es sollte heißen PORTD = 0x10;
> Danke!
>
>
1
>   PORTD = 0x14;  Welchen Zweck erfüllt hier das Einschalten der PullUps
2
> an einigen Leitungen?
3
>   _delay_us(1);
4
>
> Wieso PullUps???

Hat sich durch meinen Fehler von oben ergeben, vergiß es einfach... ;-(

> Nachdem ich den einen Fehler nun behoben habe, bekomme ich endlich
> Zeichen dargestellt. Das Display zeicht mit ein großes O an.
>
> Wenn ich nun aber den Code folgendermaßen ändere, bekomme ich ein /
> Dargestellt.
>
1
>   PORTD = 0x10;
2
>   _delay_us(5);
3
> 
4
>   PORTD = 0x12;
5
>   _delay_us(1);
6
>   PORTD = 0x32;
7
>   _delay_us(1);
8
>   PORTD = 0x12;
9
> 
10
>   PORTD = 0x16;
11
>   _delay_us(1);
12
>   PORTD = 0x36;
13
>   _delay_us(1);
14
>   PORTD = 0x16;
15
>   _delay_us(1);
16
>
> Ich sehe hier allerdings keine verbindung zum ASCII-Code.
> Was mache ich falsch???

Ich sehe leider irgendwie immernoch keine Verbindug zwischen Deinen 
Bitmustern und den zugehörigen Display-Leitungen...

Meine Glaskugel ist defekt (wie bei fast allen Forum-Teilnehmer hier).

Gruß aus Berlin
Michael

von holger (Gast)


Lesenswert?

>Ich vermute mal, das besteht ein Problem mit den Zeiten???

Ich vermute mal das dein Display immer noch
im 8 Bit Modus arbeitet. Kein Wunder da die
Initialisierung ja auch immer noch Schrott ist.

von ich (Gast)


Lesenswert?

Um das mal klar auszudrücken lieber astroscout. Die wackelst immer nur 
an den Datenleitungen rum !!!!!!!!!!!!!!!!!!!!!!!!!!

Um ein Display zu steuern brauch man aber auch Steuerleitungen !!!!!

Davon sind exakt 000000000  im ganzen Code. Das kann so nicht 
funktionieren und es steht so auch bestimmt nicht im Tutorial 
beschrieben.
Einfach mal durchlesen ...

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#LCD-Ansteuerung

von Peter D. (peda)


Lesenswert?

astroscout wrote:
> Hier mal mein Programm (ich weiß, der Code ist unnötig lang und
> schrecklich, aber will es erstmal zu laufen bekommen, devor ich den Code
> aufräume):

Man kann sich das Leben künstlich schwer machen.

Man könnte aber auch einfach mal in andere Codes reinschauen, wie die 
das machen.
Ein sehr einfacher und übersichtlicher Code steht z.B. hier:

Beitrag "Re: LCD nicht nur für einen Port in C"


Wenn man dann weiß, wies läuft, kann man eigene Experimente machen. Ich 
bezweifle aber, daß sich das lohnt.


Peter

von Dieter E. (netdieter) Benutzerseite


Lesenswert?

Du würdest Dir das leben auch um einiges leichter machen wenn Du mit 
#define arbeiten würdest.

Lerne doch erst mal strukturiertes Programmieren.

Aber weiterhin viel Spaß,

Dieter

von astroscout (Gast)


Lesenswert?

@Holger: Ja, da hast du recht. Das Problem scheint in der 
Initialisierung des Displays zu liegen, nur wo????

@ich(Gast): Es sind Steuerleitungen angeschlossen. ich hab am Port D 4 
Datenleitugnen und die Steuerleitugnen RS und E angeschlossen. R/W liegt 
zur Zeit noch auch Masse. (So ist es übrigens auch in dem 
Tutorial!!!!!!)

@Dieter Engelhardt: Ich habe ja eben bereits gesagt, dass mein Code 
reines Chaos ist. Solange aber noch nichts wirklich funktioniert, 
benutze ich meistens die "Chaosversion". Wenn ich dann wirklich wei0 wie 
das ganze abläuft, dann räume ich meinen Code auch auf und strukturiere 
ihn!!!!!

Mein Problem liegt definitiv in der Initialiserung. Das Display schaltet 
nicht in den 4-bit-Modus um.
Muss ich bei den Initialisierungsbefehlen auch eine Flanke auf E geben, 
oder wo könnte mein fehler liegen????

von Dieter E. (netdieter) Benutzerseite


Lesenswert?

astroscout wrote:
> @Dieter Engelhardt: Ich habe ja eben bereits gesagt, dass mein Code
> reines Chaos ist. Solange aber noch nichts wirklich funktioniert,
> benutze ich meistens die "Chaosversion". Wenn ich dann wirklich wei0 wie
> das ganze abläuft, dann räume ich meinen Code auch auf und strukturiere
> ihn!!!!!

Aus meiner langjährigen Erfahrung als Software-Entwickler weis ich, dass 
genau dieses Vorgehen am Ende mehr Zeit und Geld kostet, als wenn man 
sich vor dem kodieren etwas Zeit nimmt und über die Programmstruktur 
nachdenkt. Dazu gehört auch, dass man Konstanten einen sprechenden Namen 
verpasst, denn das erleichtert das Verstäntniss des Codes. Auch für 
einem selbst.

Und das Märchen vom Kode aufräumen, glaubst Du doch selbst nicht ;-)

Verstehe das bitte nicht als Kritik, sondern als Hilfestellung.

Dieter

von ich (Gast)


Lesenswert?

Oh du heilige Glaskugel sag mir bitte wie die einzelnen Leitungen 
angeschlossen sind, ich beschwöre dich. Leider konnte ich auch nicht in 
der Beschreibung des Problems erkennen ob 4 bit oder 8 bit oh meine 
heilige Glaskugel ich danke dir und muss doch dem Ersteller den Vorwurf 
machen, dass man ihm erst alle Informationen aus der Nase ziehen muss. 
Oh du Glaskugel was würde ich nur ohne dich machen....

von Peter D. (peda)


Lesenswert?

Dieter Engelhardt wrote:

> Aus meiner langjährigen Erfahrung als Software-Entwickler weis ich, dass
> genau dieses Vorgehen am Ende mehr Zeit und Geld kostet, als wenn man
> sich vor dem kodieren etwas Zeit nimmt und über die Programmstruktur
> nachdenkt.

Insbesondere, daß man sich überlegt, welche Funktionen aufeinander 
aufbauen.

Hier beim LCD im 4-bit Mode ist das die "Sende Nibble" Funktion, auf die 
baut alles andere auf.
Und besonders die Initialisierung!
Wenn die nicht funktioniert, kann es nicht gehen!


> Dazu gehört auch, dass man Konstanten einen sprechenden Namen
> verpasst, denn das erleichtert das Verstäntniss des Codes. Auch für
> einem selbst.

Insbesondere, da man doch im AVR-GCC jeden Portpin super übersichtlich 
als Bitvariable definieren kann.


> Und das Märchen vom Kode aufräumen, glaubst Du doch selbst nicht ;-)

Aufräumen tut ein Programmmierer nie.
Wenn er solchen unübersichtlichen Code schreibt, dann versteht er ihn 
nach einem Jahr selber nicht mehr. Er schmeißt ihn dann weg und fängt 
(hoffentlich) strukturierter nochmal an.


Peter

von Peter D. (peda)


Lesenswert?

astroscout wrote:
> @Dieter Engelhardt: Ich habe ja eben bereits gesagt, dass mein Code
> reines Chaos ist.

Auch ohne daß Du es sagst, war das jedem klar wie Kloßbrühe.


> Solange aber noch nichts wirklich funktioniert,
> benutze ich meistens die "Chaosversion".

Nein, umgekehrt wird ein Schuh draus.
Es funktioniert deshalb nicht, weil es nur Chaos ist.
Also weg damit und überlegt anfangen.


Peter

von ... .. (docean) Benutzerseite


Lesenswert?


von Gast (Gast)


Lesenswert?

Also mal folgendes:
Toll, du schaltest die die Datenleitungen. Schon mal etwas. Davor musst 
du aber dem Display noch mitteilen was es damit machen soll. Dazu muss 
R/S entweder High oder Low sein. Dazu muss das Display auch wissen, wann 
es die Infos der Datenleitungen lesen kann. Dazu wird E benutzt. Erst E 
auf High, danach die Daten setzen und dann mit E auf Low setzen. Damit 
übernimmt das Display die gesendeten Informationen.

Dein oben geposteter Code ändert nur dauernd die Datenleitungen. Damit 
alleine kann das Display nichts anfangen. Du musst R/S und E auch 
benutzen.

von astrosout (Gast)


Lesenswert?

Danke für Eure Antworten.

@... ... (docean):
Ich were mir das ganze mal anschauen, villeicht komme ich damit weiter

@Gast (Gast): Ich benutze die Steuerleitugnen. Diese sind wie oben 
Bereits beschrieben alle an dem PORTD zusammen mit 4 Datenleitungen 
angeschlossen. Die fallen Flanke an E benutze ich auch bereits.

von astrosout (Gast)


Lesenswert?

Ich hab gestern, nachdem ich festgestellt hab, dass die ansteuerung im 
4-bit-Modus nicht funktioniert, das ganze mit meinem Evaluationsboard so 
gesteckt, dass ich eine 8 bit ansteurung realisieren kann. Dabei habe 
ich leider übersehen, dass tiny2313 nur einen PORTD mit 7 
herausgeführten Pins besitzt.
Hab das Problem dann behoben und es funktioniert jetzt alles mit meinem 
"Chaos"-Programm.
ich werde den Code jetzt mal ein wenig aufräumen und ihn euch dann bei 
gelegenheit mal posten :-)

von Peter D. (peda)


Lesenswert?

astrosout wrote:
> Ich hab gestern, nachdem ich festgestellt hab, dass die ansteuerung im
> 4-bit-Modus nicht funktioniert,

Nö, die Ansteuerung im 4-Bit Modus funktionert einwandfrei.
Was nicht funktioniert ist Deine Ansteuerung.


> Hab das Problem dann behoben und es funktioniert jetzt alles mit meinem
> "Chaos"-Programm.

Nö, Du hast garnichts behoben.
Der Unterschied ist nur, daß ein LCD nach dem Einschalten bereits im 
8Bit-Modus ist.
8Bit funktioniert daher (irgendwie) auch, wenn man die Initialisierung 
völlig vergeigt.


Du hast nur vor dem Problem den Kopf in den Sand gesteckt. So wirst Du 
schnell den Spaß am Programmieren verlieren und aufgeben.


Peter

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.