at mega32 LCD-Problem HD 44780

Gast #896384
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
Angehängte Dateien:
Gast #896456
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.
#896634
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren