www.mikrocontroller.net

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


Autor: Steffen K. (steffen3)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für lcd_data würde das dann so aussehen
void lcd_data(unsigned char temp1)
{
  unsigned char temp2=temp1;

  LCD_PORT |= (1<<LCD_RS);

  temp1 = temp1 & 0xF0;
  LCD_PORT &= 0x0F;
  LCD_PORT |= temp1;
  lcd_enable();

  temp2 = temp2 & 0x0F;
  temp2 = temp2 << 4;
  LCD_PORT &= 0x0F;
  LCD_PORT |= temp2;

  lcd_enable();
  _delay_us(42);
}

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

Autor: Steffen K. (steffen3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Herzlichen Dank für die schnellen Antworten.

Autor: Steffen K. (steffen3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
so, die Funktion
void lcd_data(unsigned char temp1)
 habe ich wie oben beschrieben umgeschreiben,
die Funktion
void lcd_command(unsigned char temp1)
habe ich folgendermaßen umgeschrieben aber es funktioniert nicht
void lcd_command(unsigned char temp1)
{
   unsigned char temp2=temp1;
   LCD_PORT &= ~(1<<LCD_RS); 
   temp1=temp1 & 0xF0;
   LCD_PORT &= 0x0F;
   LCD_PORT |=temp1;
   lcd_enable();

   temp2=temp2 & 0xFO;
   temp2 =temp2 <<4;
   LCD_PORT &= 0x0F;
   LCD_PORT |=temp2;
   lcd_enable();

   _delay_us(42);
}

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

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
void lcd_command(unsigned char temp1)
{
   unsigned char temp2=temp1;
   LCD_PORT &= ~(1<<LCD_RS); 
   temp1=temp1 & 0xF0;
   LCD_PORT &= 0x0F;
   LCD_PORT |=temp1;
   lcd_enable();

   temp2=temp2 & 0xFO;// Vertausche mal
   temp2 =temp2 <<4;  // diese Zeilen...
   LCD_PORT &= 0x0F;
   LCD_PORT |=temp2;
   lcd_enable();

   _delay_us(42);
}

blöder fehler ;)

hth. Jörg

Autor: Steffen K. (steffen3)
Datum:

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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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++.
void lcd_init(void)
{
  LCD_DDR=LCD_DDR |0x0F |(1<<LCD_RS) |(1<<LCD_EN);
  _delay_ms(15);
  LCD_PORT &=0x0F;
  LCD_PORT |= 0x30;
  LCD_PORT &= ~(1<<LCD_RS);
  lcd_enable();
  _delay_ms(5);
  lcd_enable();  
  _delay_ms(1);
  lcd_enable();
  _delay_ms(1);

  LCD_PORT &= 0x0F;
  LCD_PORT |=0x20;
  lcd_enable();

  lcd_command(0x28);
  lcd_command(0x0C);
  lcd_command(0x06);
  lcd_clear();
}

Sollte jetzt laufen.

MfG
Falk

Autor: Steffen K. (steffen3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nochmals danke jetzt funktionierts.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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.
void lcd_init(void)
{
  LCD_DDR=LCD_DDR |0xF0 |(1<<LCD_RS) |(1<<LCD_EN);
  _delay_ms(15);
  LCD_PORT &=0x0F;
  LCD_PORT |= 0x30;
  LCD_PORT &= ~(1<<LCD_RS);
  lcd_enable();
  _delay_ms(5);
  lcd_enable();  
  _delay_ms(1);
  lcd_enable();
  _delay_ms(1);

  LCD_PORT &= 0x0F;
  LCD_PORT |=0x20;
  lcd_enable();

  lcd_command(0x28);
  lcd_command(0x0C);
  lcd_command(0x06);
  lcd_clear();
}

MfG
Falk

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Steffen K. (steffen3)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für die zahlreichen hilfen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.