www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Atmega16 - Display 16x2(Neuhold) - hd44780 kompatibel?


Autor: i-mehl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo ich habe folgedes Problem. Ich möchte Temperatur mit einem DS18s20 
messen und das Ergebnis unter anderem auf dem Display darstellen - 
soviel nur als Hintergrundinfo - also eigentlich ein ganz simple 
Aufgage.
Mein Problem ist nun dass ich die Displayansteuerung einfach aus 
AVR-Tutorial:LCD abgekupfert habe (den C-Code) und diesen zur 
Ansteuerung verwende(4bit Mode). Das funktioniert auch - jedoch nur in 
der ersten Zeile. Ich komme nicht um die Burg in die zweite. Weder indem 
ich die ddram Adresse setze noch indem ich einfach weiter Zeichen 
ausgebe. Ich weiß die zweite Zeile kommt erst bei 40......
Hat jemand vllt den Code aus dem dem AVR-Tutorial schon ausprobiert/vllt 
sogar auf dem 16x2 Display von Neuhold???

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du musst den command an den controller senden, dass er in die 2. zeile 
springen soll!

in assembler ist das

 ldi temp1, 0b11000000
 rcall lcd_command


binär= 0b11000000
Hexadezimal = 0xC0

Autor: S. H. (fat32)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wie das jetzt aber in C funktioniert, weiß ich nicht, da ich selber grad 
mit AVRs und LCDs anfange und nur in Assembler damit gearbeitet habe

Autor: i-mehl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
binär= 0b11000000
Hexadezimal = 0xC0

ist ja ein Sprung auf 0x40 b1000000. Das weiß ich schon dass das so 
funktionieren sollte - tut es aber nicht!
ein Sprung inerhalb der ersten Zeile funktioniert. ==> meine Überlegung 
es muss irgendwie ein Fehler in der initialisierung sein - aber mir 
fällt nix mehr ein!!!

Hier die Initialisierung aus AVR-Tutorial LCD
   // muss 3mal hintereinander gesendet werden zur Initialisierung
   PORT_LCD &= 0xF0;
   PORT_LCD |= 0x03;       // 0b00000011
   lcd_enable();
   PORT_LCD |= 0x03;
   lcd_enable();
   PORT_LCD |= 0x03;
   lcd_enable();

   // 4bit-Modus einstellen
   PORT_LCD |= 0x02;       // 0b00000010
   lcd_enable();
   _delay_ms(5);

   // 4Bit  2 Zeilen  5x8
   lcd_command(0x28);  // 0b00101000

   // Display ein  Cursor aus  kein Blinken
   lcd_command(0x0C);  // 0b00001100

   // inkrement / kein Scrollen
   lcd_command(0x04);  // 0b00000100

Autor: Cri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lass folgendes mal weg:

// 4bit-Modus einstellen
   PORT_LCD |= 0x02;       // 0b00000010
   lcd_enable();
   _delay_ms(5);

Autor: Ewiger LCDler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tut mir leid, es so krass sagen zu müssen, aber die C-Init des 
Tutorials, die Du verwendet hast, ist grober Unfug.

Erstmal fehlen da die (unbedingt nötigen) Pausen zwischen den drei 
gleichen Init-Befehlen, und dann bringt das "4bit-Modus einstellen" in 
der gegebenen Formulierung absolut gar nichts, weil PORT_LCD |= 2 den 
vorherigen Wert (3) gar nicht verändert.

Also versuch mal

   // muss 3mal hintereinander gesendet werden zur Initialisierung
   PORT_LCD = 0x03;       // 0b00000011
   lcd_enable();
   _delay_ms(5);
   lcd_enable();
   _delay_ms(5);
   lcd_enable();
   _delay_ms(5);

   // 4Bit  2 Zeilen  5x8
   lcd_command(0x28);  // 0b00101000

und dann weiter.

Und wenn danach das Umsetzen des Cursors auf Zeile 2 immer noch nicht 
funzt, sag nochmal Bescheid.

Autor: i-mehl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert leider immer noch nicht.

Meine jetztig Initialisierung:

   unsigned char temp3 = 50;

   while(temp3 != 0)
   {
      _delay_ms(5.0);  // 5ms = 250ms warten
      temp3 = temp3 - 1;
   }

   PORTA = 0x03;       // 0b00000011
   lcd_enable();
   _delay_ms(5);
   lcd_enable();
   _delay_ms(5);
   lcd_enable();
   _delay_ms(5);

   // 4Bit  2 Zeilen  5x8
   lcd_command(0x28);  // 0b00101000

   // Display ein  Cursor aus  kein Blinken
   //lcd_command(0x0C);  // 0b00001100

   // inkrement / kein Scrollen
   //lcd_command(0x04);  // 0b00000100


Ich komme immer noch nicht in die zweite Zeile - wenn ich im ddram ewig 
weiterschreibe überschreibe ich mir irgendwann wieder die erste Zeile, 
aber die zweite bleibt leer!
Vllt hat jemand noch einen Tipp

Autor: Cri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
PORTA = 0x03;       // 0b00000011
   lcd_enable();
   _delay_ms(5);
   lcd_enable();
   _delay_ms(5);
   lcd_enable();
   _delay_ms(5);

Hier musst du schon zwischen den einzelnen Loops den Befehl ausgeben! 
Außerdem muss 0x30 geschrieben werden!

unsigned char i=3;

do{
   PORTA = 0x30;       // 0b00000011
   lcd_enable();
   _delay_ms(5);
}while(--i);

Weiters würd ich drauf achten ob RS (bevor du Befehle sendest)wirklich 
Null ist. Ansonsten schickst du Daten und keine Befehle (Datenblatt)!

Lg und good luck

Autor: Cri (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
0x30 weil du ja den 4Bit Modus willst. Zuerst wird also das higher 
nibble(halbes Byte) gesendet und dann das low nibble

Autor: i-mehl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Funktioniert irgendwie immer noch nicht - hab da gerade noch eine andere 
Überlegung: müssten wenn ich die Kontrastspannung nach oben drehe nicht 
beide Zeilen schwarz werden?
Bei mir wird es nur die erste!

Autor: Cri (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
naja... die zweite zeile qürde ein wenig (bis mittel) sichtbar werden.

Du kannst am Port net nur die Daten anlegen. Falls PortA 8Bit breit ist 
(ka ahnung da ich keine megas proge) musst du die Daten schieben. Ich 
stell dir mal mein LCD File rein. Kannst mal gucken wie das für den 4Bit 
mode funzt.

Lg

Autor: i-mehl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich weiß nicht ob ich deinen Hinweis jetzt richtig verstehe aber 
wenn du damit meinst dass ich jedes Byte in zwei Nibble (Big Endian) 
zerteilen muss um dem Display die Daten zu schicken - dass hab ich/das 
Programm schon gemacht indem ich das Byte um <<4 shifte!

Ich bin inzwischen der Meinung dass mein Display einfach defekt ist und 
ich werde mein Glück am Wochenende mit nem anderen versuchen!
Falls jemandem natürlich sonst noch einen sachdienlicher Hinweis hat bin 
ich auf jeden Fall dankbar.

lg

Autor: UBoot-Stocki (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

arbeite im Moment auch mit einem LCD Display. Ich habe auch die 
init-Sequenz aus dem Tutorial. Ich verwende folgende 2 Funktionen:
void lcd_home1(void) // Cursor auf Stelle 1
{
   lcd_send(0x80,1);
} 

void lcd_home2(void) // Cursor auf Stelle 1 Zeile 2
{
   lcd_send(0xC0,1);
}

funktioniert bei mir einwandfrei.

Einziger Unterschied: Das Display selbst: Ich habe ein "2-zeiliges 
LC-Display mit integriertem Controller KS0066 (HD44780 kompatibel)."

Gruß

Andreas

Autor: i-mehl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zur Lösung meines Problems:

Es war schlicht und einfach mein Display kaputt!!! Ärger
Neues Display rein - und siehe da in der zweiten Zeile steht was!

Autor: i-mehl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zur Lösung meines Problems:

Es war schlicht und einfach mein Display kaputt!!! Ärger
Neues Display rein - und siehe da in der zweiten Zeile steht was!

Danke trotzdem an alle für Eure Antworten!!! lg

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.