Forum: Mikrocontroller und Digitale Elektronik at mega32 LCD-Problem HD 44780


von anemby (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
erst mal ein Danke vorweg für alle, die sich mit meinem Post 
beschäftigen.

Folgende Hardware habe ich hier:
- ein at mega32, 1 MHz Takt
- ein LCD-Modul 2x16 mit HD 44780 Kontroller (EA DIP162-D)

Angeschlossen ist das Display an PortB.

PB0  RS
PB1  R/W
PB2  E

PB4  D4(D0 für 4 Bit Modus)
PB5  D5(D1 für 4 Bit Modus)
PB6  D6(D2 für 4 Bit Modus)
PB7  D7(D3 für 4 Bit Modus)


Die Hardware ist ausgiebig getestet und zu 100% funktionsfähig.

Jetzt zu meinem Problem. Ich sitze schon seit 5 Tagen dran und hab es 
noch nicht geschafft
kontrolliert ein Zeichen auf dem Display darzustellen.
Irgendwas mache ich wohl falsch aber ich komm nicht drauf.
Das Tutorial habe ich auch von oben bis unten durch gearbeitet,
hat mich aber nicht weiter gebracht.

Ich poste hier mal 3 Versuche von mir, vielleicht kann mir irgendwer 
weiterhelfen.

Danke
anemby

von kschwi (Gast)


Lesenswert?

Mal so ganz auf die schnelle:
Du scheinst WinAVR zu nutzen. Warum nimmst du nicht einfach das Beispiel 
stdiodemo aus der WinAVR installation? Dort gibt es sehr gut 
struturiertes 4-Bit LCD Programm, dass auch schon funktioniert und 
dokumentiert ist.

Bei div. LCD gibt es trotz gleichen Controllers unterschiedliches 
Verhalten, wenn man in der SW mit dem Timing "pfuscht". Das ist in dem 
Beispiel schon bereinigt und geht auch mit "langsamen" Displays.

Nichts und niemand nimmt dir die Möglichkeit, dann noch deine weitere SW 
zu entwickeln, aber LCDs sind schon soooooooo oft der Stein des 
Anstosses gewesen, dass die eigene SW-Entwicklung nicht mehr lohnt.

von anemby (Gast)


Lesenswert?

Danke aber die Demo scheint mir auch nicht weiter zu helfen, da dort das 
BUSYFLAG genutzt wird, ich das aber nicht zur Verfügung habe bei meinem 
Display.

von David M. (md2k7)


Lesenswert?

Hallo,

ich bezweifle, dass jemand hier die Geduld hat, alle 3 von dir 
hochgeladenen Versionen durchzuackern. Tipp fürs nächste Mal: beschränke 
dich auf eine C-Datei, und lade sie auch in .c hoch, dann wird es auch 
vom Forum angezeigt und man muss nicht runterladen und entpacken.

Was mir beim 1. Blick so auffällt: Du hast die Datenleitungen des LCDs 
auf die oberen 4 bit des Ports gehängt. Die meisten LCD-Funktionen 
inklusive das Tutorium hier auf der Seite verwenden dazu aber die 
unteren Portbits. Falls du trotzdem die oberen Bits verwenden willst, 
musst du die Daten bei der entsprechenden Funktion 4 bit nach links 
schieben.

Aus deiner "LCDsteuerung.c":
1
void lcd_data(unsigned char temp1)
2
{
3
  unsigned char temp2=temp1;
4
5
  LCD_PORT |= (1<<LCD_RS);
6
7
  temp1=temp1 >> 4;
8
  temp1=temp1 & 0x0F;
9
  LCD_PORT &= 0xF0;
10
  LCD_PORT |= temp1;
11
  lcd_enable();
12
13
  temp2=temp2 & 0x0F;
14
  LCD_PORT &= 0xF0;
15
  LCD_PORT |= temp2;
16
  lcd_enable();
17
18
  _delay_us(42);
19
}

Korrekt für deine Belegung wäre sowas:
1
void lcd_data(unsigned char temp1)
2
{
3
  unsigned char temp2=temp1;
4
5
  LCD_PORT |= (1<<LCD_RS);
6
7
  temp1=temp1 & 0xF0;
8
  LCD_PORT &= 0x0F;
9
  LCD_PORT |= temp1;
10
  lcd_enable();
11
12
  temp2=temp2 << 4;
13
  LCD_PORT &= 0x0F;
14
  LCD_PORT |= temp2;
15
  lcd_enable();
16
17
  _delay_us(42);
18
}

Oder du machst dir das Leben einfach und hängst die Datenbits auf die 
Portbits 0-3.

Gruß,
David

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.