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
voidinit_lcd(void);
12
13
intmain(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
voidinit_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.
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??
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
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???
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???
> 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
>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.
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
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
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
@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????
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
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....
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
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
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.
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.
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 :-)
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