www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD ansteuern


Autor: astroscout (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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):
#define F_CPU 16000000

//Includes
#include <avr/io.h>
#include <util/delay.h>




//Funktionen Deklarieren
void init_lcd(void);
 
int main(void)
{


    _delay_ms(20);
  
  _delay_ms(20);
  
  _delay_ms(20);
  
  _delay_ms(20);
  
  

  init_lcd();  
  PORTD = 0x00;
  _delay_ms(20);
  
  

  
  
  

  DDRD = 0x10;
  _delay_us(5);
  
  PORTD = 0x14;
  _delay_us(1);
  PORTD = 0x34;
  _delay_us(1);
  PORTD = 0x14;
  PORTD = 0x11;
  _delay_us(1);
  PORTD = 0x31;
  _delay_us(1);
  PORTD = 0x11;
  _delay_us(1);
  
  
    
  

 
    while(1)
    {
    }
 
};



void init_lcd(void) {
  DDRD = 0xff;
  _delay_ms(20);
  PORTD = 0x30;
  _delay_ms(10);
  PORTD = 0x30;
  _delay_ms(10);
  PORTD = 0x30;
  _delay_ms(10);
  PORTD = 0x20;
  _delay_ms(10);
};



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.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Autor: Klaus (Gast)
Datum:

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

Autor: astroscout (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: astroscout (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für deine Antwort.
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.
Du ahst recht, ich hätte mehr dazu schreiben sollen

Trontzdem die Frage:
 init_lcd();
  PORTD = 0x00;  Warum hier den Port auf Eingang?
  _delay_ms(20);
Wo wird hier ein Port auf Eingang gesetzt??? Ich letzte leidiglich alle 
Ausgänge auf Null.
  DDRD = 0x10;  Und dann gleich Pin7 auf Ausgang, der Rest EIngang?
  _delay_us(5);
Da hat sich ich Fehler eingeschlichen. es sollte heißen PORTD = 0x10;
Danke!
  PORTD = 0x14;  Welchen Zweck erfüllt hier das Einschalten der PullUps
an einigen Leitungen?
  _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.
  PORTD = 0x10;
  _delay_us(5);
  
  PORTD = 0x12;
  _delay_us(1);
  PORTD = 0x32;
  _delay_us(1);
  PORTD = 0x12;
  
  PORTD = 0x16;
  _delay_us(1);
  PORTD = 0x36;
  _delay_us(1);
  PORTD = 0x16;
  _delay_us(1);
Ich sehe hier allerdings keine verbindung zum ASCII-Code.
Was mache ich falsch???

Autor: astroscout (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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???

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
astroscout wrote:
> Danke für deine Antwort.
>
>
> 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.
> 
> Du ahst recht, ich hätte mehr dazu schreiben sollen
>
>
>
Trontzdem die Frage:
>  init_lcd();
>   PORTD = 0x00;  Warum hier den Port auf Eingang?
>   _delay_ms(20);
> 
> Wo wird hier ein Port auf Eingang gesetzt??? Ich letzte leidiglich alle
> Ausgänge auf Null.
Sorry, da habe ich mich eindeutig verlesen...

>
>   DDRD = 0x10;  Und dann gleich Pin7 auf Ausgang, der Rest EIngang?
>   _delay_us(5);
> 
> Da hat sich ich Fehler eingeschlichen. es sollte heißen PORTD = 0x10;
> Danke!
>
>
>   PORTD = 0x14;  Welchen Zweck erfüllt hier das Einschalten der PullUps
> an einigen Leitungen?
>   _delay_us(1);
> 
> 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.
>
>   PORTD = 0x10;
>   _delay_us(5);
> 
>   PORTD = 0x12;
>   _delay_us(1);
>   PORTD = 0x32;
>   _delay_us(1);
>   PORTD = 0x12;
> 
>   PORTD = 0x16;
>   _delay_us(1);
>   PORTD = 0x36;
>   _delay_us(1);
>   PORTD = 0x16;
>   _delay_us(1);
> 
> 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

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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-Tu...

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Dieter Engelhardt (netdieter) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: astroscout (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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????

Autor: Dieter Engelhardt (netdieter) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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....

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: astrosout (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: astrosout (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.