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


von i-mehl (Gast)


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???

von S. H. (fat32)


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

von S. H. (fat32)


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

von i-mehl (Gast)


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

von Cri (Gast)


Lesenswert?

Lass folgendes mal weg:

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

von Ewiger LCDler (Gast)


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.

von i-mehl (Gast)


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

von Cri (Gast)


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

von Cri (Gast)


Lesenswert?

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

von i-mehl (Gast)


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!

von Cri (Gast)


Angehängte Dateien:

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

von i-mehl (Gast)


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

von UBoot-Stocki (Gast)


Lesenswert?

Hi,

arbeite im Moment auch mit einem LCD Display. Ich habe auch die 
init-Sequenz aus dem Tutorial. Ich verwende folgende 2 Funktionen:
1
void lcd_home1(void) // Cursor auf Stelle 1
2
{
3
   lcd_send(0x80,1);
4
} 
5
6
void lcd_home2(void) // Cursor auf Stelle 1 Zeile 2
7
{
8
   lcd_send(0xC0,1);
9
}

funktioniert bei mir einwandfrei.

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

Gruß

Andreas

von i-mehl (Gast)


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!

von i-mehl (Gast)


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

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.