Probleme mit LCD-Ansteuerung/Atmega8

OP #705738
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
Angehängte Dateien:
#705750
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.
#705756
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.
OP #705896
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.
Gast #705983
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
OP #706610
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.
#706627
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
#706723
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
#706725
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.

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