Forum: Mikrocontroller und Digitale Elektronik Probleme mit LCD-Ansteuerung/Atmega8


von Steffen K. (steffen3)


Angehängte Dateien:

Lesenswert?

Hallo,

vor einiger Zeit schaffte ich mir ein "myAVR Board 2 USB" und das 
dazugehörige LCD-Addon an.
Die Beispiel-Programme, sowie einige eigene Programme funktionieren 
einwandfrei.
Jetzt versuche ich, jedoch vergeblich, Werte von Variablen auf dem LCD 
auszugeben.
Als Grundlage für meine Versuche dient mir das Tutorial 
"AVR-GCC-Tutorial" dieser Seite.
Dieser Code lässt sich auch kompilieren und auf den Mikrocontroller 
Atmega8 übertragen, als Entwicklungsumgebung verwende ich "AVR Studio 
4".
Leider passiert danach nichts mehr, es ist lediglich die erste Zeile 
komplett schwarz.

Die anderen Beiträge in diversen Foren halfen mir leider nicht weiter.

Da ich nicht weiter weiß, hoffe ich, dass jemand mir sagen kann wie ich 
den im Anhang befindlichen Code ändern muss, damit die Anzeige den Wert 
korrekt wiedergibt.

Mit freundlichen Grüssen
steffen3

von Karl H. (kbuchegg)


Lesenswert?

Kein Wunder.
Dieser Code geht fix davon aus, dass die Datenleitungen
zum LCD am Ausgabeport an den Pins 0 bis 3 hängen.
Das tun sie aber in deiner Beschaltung nicht. Die Daten-
leitungen hängen an den Pins 4 bis 7.

Das wirst du umschreiben müssen.

von Falk B. (falk)


Lesenswert?

@ Steffen Kreutzberg (steffen3)

>Leider passiert danach nichts mehr, es ist lediglich die erste Zeile
>komplett schwarz.

Klar, der Code geht davon aus, dass die Bit 0..3 für den Datenbus 
verwendet werden, nicht 4..7. Frei wählbar sind nur RS und E.

MFG
Falk

P.S. Deine Ansteuerung der Hintergrundbeleuchtung ist auch sehr gewagt.

von Karl H. (kbuchegg)


Lesenswert?

Für lcd_data würde das dann so aussehen
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 & 0x0F;
13
  temp2 = temp2 << 4;
14
  LCD_PORT &= 0x0F;
15
  LCD_PORT |= temp2;
16
17
  lcd_enable();
18
  _delay_us(42);
19
}

lcd_command muss ebenfalls geändert werden. Aber das
lasse ich als Übung für den angehenden Programmierer.

von Steffen K. (steffen3)


Lesenswert?

Herzlichen Dank für die schnellen Antworten.

von Steffen K. (steffen3)


Lesenswert?

so, die Funktion
1
void lcd_data(unsigned char temp1)
 habe ich wie oben beschrieben umgeschreiben,
die Funktion
1
void lcd_command(unsigned char temp1)
habe ich folgendermaßen umgeschrieben aber es funktioniert nicht
1
void lcd_command(unsigned char temp1)
2
{
3
   unsigned char temp2=temp1;
4
   LCD_PORT &= ~(1<<LCD_RS); 
5
   temp1=temp1 & 0xF0;
6
   LCD_PORT &= 0x0F;
7
   LCD_PORT |=temp1;
8
   lcd_enable();
9
10
   temp2=temp2 & 0xFO;
11
   temp2 =temp2 <<4;
12
   LCD_PORT &= 0x0F;
13
   LCD_PORT |=temp2;
14
   lcd_enable();
15
16
   _delay_us(42);
17
}

Ich wäre dankbar wenn man mir nochmals helfen kann.

von Jörg X. (Gast)


Lesenswert?

1
void lcd_command(unsigned char temp1)
2
{
3
   unsigned char temp2=temp1;
4
   LCD_PORT &= ~(1<<LCD_RS); 
5
   temp1=temp1 & 0xF0;
6
   LCD_PORT &= 0x0F;
7
   LCD_PORT |=temp1;
8
   lcd_enable();
9
10
   temp2=temp2 & 0xFO;// Vertausche mal
11
   temp2 =temp2 <<4;  // diese Zeilen...
12
   LCD_PORT &= 0x0F;
13
   LCD_PORT |=temp2;
14
   lcd_enable();
15
16
   _delay_us(42);
17
}

blöder fehler ;)

hth. Jörg

von Steffen K. (steffen3)


Lesenswert?

danke erst mal.habe die beiden so geändert.
1
temp2 =temp2 <<4; 
2
temp2=temp2 & 0xFO;  
3
LCD_PORT &= 0x0F;
4
LCD_PORT |=temp2;
5
lcd_enable();
funktioniert aber immer noch nicht, jetzt frage ich mich ob ich in diese 
Methode
1
public void lcd-init(void)
nicht auch anpassen muss, so langsam weiß ich nicht mehr weiter.

von Falk B. (falk)


Lesenswert?

@  Steffen Kreutzberg (steffen3)

>danke erst mal.habe die beiden so geändert.

Passt.

>funktioniert aber immer noch nicht, jetzt frage ich mich ob ich in diese
>Methode

>public void lcd-init(void)

Ja, ist aber keine Methode, sondern eine ganz normale Funktion. Wir 
machen hier "nur" C, kein C++.
1
void lcd_init(void)
2
{
3
  LCD_DDR=LCD_DDR |0x0F |(1<<LCD_RS) |(1<<LCD_EN);
4
  _delay_ms(15);
5
  LCD_PORT &=0x0F;
6
  LCD_PORT |= 0x30;
7
  LCD_PORT &= ~(1<<LCD_RS);
8
  lcd_enable();
9
  _delay_ms(5);
10
  lcd_enable();  
11
  _delay_ms(1);
12
  lcd_enable();
13
  _delay_ms(1);
14
15
  LCD_PORT &= 0x0F;
16
  LCD_PORT |=0x20;
17
  lcd_enable();
18
19
  lcd_command(0x28);
20
  lcd_command(0x0C);
21
  lcd_command(0x06);
22
  lcd_clear();
23
}

Sollte jetzt laufen.

MfG
Falk

von Steffen K. (steffen3)


Lesenswert?

nochmals danke jetzt funktionierts.

von Falk B. (falk)


Lesenswert?

@ Steffen Kreutzberg (steffen3)

>nochmals danke jetzt funktionierts.

Dahast du aber Glück gehabt, ist noch ein Fehler drin :-(

So ist es jetzt hoffentlich richtig.
1
void lcd_init(void)
2
{
3
  LCD_DDR=LCD_DDR |0xF0 |(1<<LCD_RS) |(1<<LCD_EN);
4
  _delay_ms(15);
5
  LCD_PORT &=0x0F;
6
  LCD_PORT |= 0x30;
7
  LCD_PORT &= ~(1<<LCD_RS);
8
  lcd_enable();
9
  _delay_ms(5);
10
  lcd_enable();  
11
  _delay_ms(1);
12
  lcd_enable();
13
  _delay_ms(1);
14
15
  LCD_PORT &= 0x0F;
16
  LCD_PORT |=0x20;
17
  lcd_enable();
18
19
  lcd_command(0x28);
20
  lcd_command(0x0C);
21
  lcd_command(0x06);
22
  lcd_clear();
23
}

MfG
Falk

von Karl H. (kbuchegg)


Lesenswert?

In solchen Fällen mach ich folgendes.


Ich hol mir für AVR-Studio die Hapsim Erweiterung
http://www.helmix.at/hapsim/
und konfiguriere mir dort mal ein LCD.

Und dann steppe ich im Code in einzelschritten durch
und sehe im Simulator nach, ob alle Pins ihren Zustand
so ändern wie ich das haben will.


PS: Wenn alles nichts fruchtet: Hol dir die LCD-Library
vom Peter Fleury. Die ist auch bei den Datenpins frei
konfigurierbar.

von Steffen K. (steffen3)


Lesenswert?

danke für die zahlreichen hilfen.

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.