mikrocontroller.net

Forum: Compiler & IDEs LCD_Initialisierung


Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe folgendes Problem:

Initialisierung des Display (Controller HD44780) funktioniert nicht.

Folgender Code sollte einen blinkenden Cursor ausgeben:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/lcdvorlage.h>
#include <util/delay.h>


#define F_CPU 16000000
int main(void)
{
DDRA = 0xFF;
//Step 1 -Time until the modul has initialized itself internally
_delay_ms(50);
//Step 2 -set 8 bit mode
PORTA |= (1 << PA6); //Enable-Pin High
PORTA = 0b00000011;  //8-Bit
PORTA &= ~(1<<PA6);  //Enable-Pin Low

_delay_ms(5);
PORTA |= (1 << PA6); //Enable-Pin High
PORTA = 0b00000011;  //8-Bit
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_us(160);

PORTA |= (1 << PA6); //Enable-Pin High
PORTA = 0b00000011;  //8-Bit
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_us(160);
//Step3 -set 4 bit mode
PORTA |= (1 << PA6); //Enable-Pin High
PORTA = 0b00000010;  //4-Bit Modus - MSB
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_ms(5);
PORTA |= (1 << PA6); //Enable-Pin High
PORTA = 0b00000010;  //4-Bit Modus - LSB
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_ms(5);
//Step4 -select the connected display
PORTA |= (1 << PA6); //Enable-Pin High
PORTA = 0b00101000;  //4-Bit Modus . LSB
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_ms(5);
//Step5 -Activate the display, turn on the cursor, turn on blinking
PORTA |= (1 << PA6); //Enable-Pin High
PORTA = 0b00001111;  //Display AN, Cursor AN - MSB
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_ms(5);
PORTA |= (1 << PA6); //Enable-Pin High
PORTA = 0b00001111;  //Display AN, Cursor AN - LSB
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_ms(5);



while(1);
}

Vielleicht kann mir jemand sagen wo das Problem liegt?! Danke

Autor: Manfred B. (vorbeigeschlendert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es gibt hier dutzende 
IchKannMeinLCDNichtAnsteuernBinIchZuBlödOderWasBitteSchreibtMeinenCodeLö 
stMeinProblem-Beitrag

Suckfunktion: http://www.mikrocontroller.net/search

Mahlzeit
<°)))o><

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Manfred B. (vorbeigeschlendert)
> Mahlzeit
Jetzt schon? ;-)


> PORTA |= (1 << PA6); //Enable-Pin High
> PORTA = 0b00000010;  //4-Bit Modus - MSB
> PORTA &= ~(1<<PA6);  //Enable-Pin Low
Zeichne mal die Bitmuster vom Port A auf (Logikanalyzer, Oszi oder Blatt 
Papier). Dann siehst du, dass der Enable schon in der 2. Zeile wieder 
zurückgesetzt wird. Deine Kommandos kommen nie beim LCD an.

Das könnte schon helfen:
 PORTA = 0b00000010;  //4-Bit Modus - MSB
 PORTA |= (1 << PA6); //Enable-Pin High
 PORTA &= ~(1<<PA6);  //Enable-Pin Low

Autor: OlIvEr (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PA6 ist vermutlich auch schon falsch. Ich tippe auf PA5. While Schleife 
sieht auch nicht glücklich aus!
Es fehlen einfach die Grundlagen. AVR-GCC-Tutorial mal gründlich 
durchlesen, vor allem das Kapitel LCD-Ansteuerung hilft hier besonders 
weiter.

Cheers

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wärs nicht besser so:
PORTA |= (1 << PA6); //Enable-Pin High
PORTA = 0b01000011;  //8-Bit
PORTA &= ~(1<<PA6);  //Enable-Pin Low

Autor: Hannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber es tut sich auch so nichts

Autor: ich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bitte nochmal in die Grundlagen gucken, dann den Sinn von Enable 
verstehen und dann das eben geschriebene nochmal überdenken.

Es wär nicht besser so, weil so nicht geht -> siehe der Sinn des 
Enable-Signals.

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Bei wieviel MHz tut sich denn nix ?
Bei mir (16MHz) stehen da nicht jede Menge NOPs
im Code, ohne die das LCD nur Schrott anzeigt.

Edit: Lothar, Du hast ja sooo recht, jetzt seh ichs auch.

Gruss,
Michael

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@  Michael Appelt (micha54)
> Du hast ja sooo recht...
Ja, ich weiß, aber womit? ;-)

@  Hannes (Gast)
> aber es tut sich auch so nichts
Ein wenig noch aufs Datenblatt schauen, das Timing des Enable-Signals 
sollte natürlich schon eingehalten werden (Bild). Michael hat das auch 
bemerkt:
> ... jede Menge NOPs im Code ...

Autor: Michael Appelt (micha54)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

na überleg mal:

PORTA |= (1 << PA6); //Enable-Pin High
PORTA = 0b00000011;  //8-Bit -----> Enable wieder LOW, oder
PORTA &= ~(1<<PA6);  //Enable-Pin Low

Gruss,
Michael

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@ Michael Appelt
> na überleg mal:
>
> PORTA |= (1 << PA6); //Enable-Pin High
> PORTA = 0b00000011;  //8-Bit -----> Enable wieder LOW, oder
> PORTA &= ~(1<<PA6);  //Enable-Pin Low
Meinst du mich?
Das hatte ich doch in meinem ersten Post schon geschrieben...


@ Hannes
>wärs nicht besser so:
>PORTA |= (1 << PA6); //Enable-Pin High
>PORTA = 0b01000011;  //8-Bit
>PORTA &= ~(1<<PA6);  //Enable-Pin Low
Nirgendwo im DB wird geschrieben, dass sich die Daten während 
Enable=High ändern müssen. Es ist nur verlangt, dass sie eine bestimmte 
Zeit vor der fallenden Flanke von Enable stabil sind (Data-Setup min 
80ns und Data-Hold min 10ns). Es spricht also nichts dagegen, die Daten 
schon vorher anzulegen.

Dann probiers mal so:
 PORTA = 0b00000010;  //4-Bit Modus - MSB
 PORTA |= (1 << PA6); //Enable-Pin High
 _delay_ms(1);
 PORTA &= ~(1<<PA6);  //Enable-Pin Low
 _delay_ms(5);

Autor: Lars (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habs jetzt folgendermaßen probiert:

#include <inttypes.h>
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/lcdvorlage.h>
#include <util/delay.h>


#define F_CPU 16000000
int main(void)
{
DDRA = 0xFF;
//Step 1 -Time until the modul has initialized itself internally
_delay_ms(50);
//Step 2 -set 8 bit mode

PORTA = 0b00000011;  //8-Bit
PORTA |= (1 << PA6); //Enable-Pin High
_delay_ms(1);
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_ms(5);

PORTA = 0b00000011;  //8-Bit
PORTA |= (1 << PA6); //Enable-Pin High
_delay_us(160);
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_us(100);

PORTA = 0b00000011;  //8-Bit
PORTA |= (1 << PA6); //Enable-Pin High
_delay_us(160);
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_us(100);

//Step3 -set 4 bit mode
PORTA = 0b00000010;  //4-Bit Modus - MSB
PORTA |= (1 << PA6); //Enable-Pin High
_delay_ms(1);
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_ms(5);

/*PORTA = 0b00000010;  //4-Bit Modus - LSB
PORTA |= (1 << PA6); //Enable-Pin High
_delay_ms(1);
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_ms(5);*/

//Step4 -select the connected display
PORTA = 0b00101000;  //4-Bit Modus - LSB
PORTA |= (1 << PA6); //Enable-Pin High
_delay_ms(1);
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_ms(5);

//Step5 -Activate the display, turn on the cursor, turn on blinking
PORTA = 0b00001111;  //Display AN, Cursor AN - MSB
PORTA |= (1 << PA6); //Enable-Pin High
_delay_ms(1);
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_ms(5);

/*PORTA = 0b00001111;  //Display AN, Cursor AN - LSB
PORTA |= (1 << PA6); //Enable-Pin High
_delay_ms(1);
PORTA &= ~(1<<PA6);  //Enable-Pin Low
_delay_ms(5);*/

while(1);
}

tut sich aber noch immer nichts, liegts vielleicht daran dass ich im 4 
bit modes arbeite, da muss ich mir ja zuerst das höherwertige Nibble 
holen und dann das niederwertige, kann dass sein, wie sieht dass dann 
aus?

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.