www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik LCD an ATmega128 anschließen...


Autor: Hannes Weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
SChönen guten Tag!
Ich habe hier ein STK300 mit einem ATmega128. Nun soll ich da ein LCD 
anschließen und ansteuern können. Auf dem LCD ist ein HD44780! Ich habe 
gelesen, was programmiert und es geht einfach nichts! :-( Das LCD ist 
aber funktionsfähig! Mit dem Enable, RS und RW verstehe ich ja! Aber wie 
sage ich dem Mikrocontroller, dass ein LCD angeschlossen ist! Beim 
ATmega128 muss ich ja den Externen Speicher benutzen und das LCD halt 
wie einen Speicher ansprechen! Aber wie??? Ich will erstmal einfach nur 
einen Buchstaben auf dem LCD stehen sehen und ich wäre schon glücklich! 
Das ganze programmiere ich in C, da es einfacher sein soll!
Danke für eure Hilfe...

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du brauchst es dem µC gar nicht sagen. Nimm einfach irgendwelche PORTS 
und weise die richtigen Bits zu.
Damit meine ich, dass das LCD nicht an der Speicherschnittstelle hängen 
muß.
Wie die richtigen Ansteuerung funktioniert steht im Datenblatt des LCD 
Controllers. Da ist auch schon in einem Ablauf erklärt wie das Display 
richtig initialisert werden muß. Der Fehler liegt bestimmt in der Init. 
! Auf dieser Seite findest auch einige Beispiele zum LCD.
Max

Autor: Hannes Weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
LCD - µC
PA0 - Data0
PA1 - Data1
PA2 - Data2
PA3 - Data3
PA4 - Data4
PA5 - Data5
PA6 - Data6
PA7 - Data7
PC6 - RegSel
PC7 - Enable

So ist es laut Schaltplan! Ich müsste an PortA Befehle setzen und dann 
das LCD auf Enable stellen, dass sich das LCD den Befehl abholt und 
verarbeitet! Ich habe eine Wartezeit eingebaut, um mich erstmal nicht um 
das BusyFlag zu kümmern! Es passiert aber nichts! Muss ich da noch dem 
LCD eine Adresse zuordnen?

Autor: Hannes Weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
µC -  LCD
------------
PA0 - Data0
PA1 - Data1
PA2 - Data2
PA3 - Data3
PA4 - Data4
PA5 - Data5
PA6 - Data6
PA7 - Data7
PC6 - RegSel
PC7 - Enable?

*PA0 -> PortA Pin0

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
R/W liegt hoffentlich an GND.
Vielleicht ist das Timing nicht ganz richtig, auch das findet man im 
Datenblatt sehr gut beschrieben.
Zeig doch mal deinen Code.

Autor: Hannes Weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
HEADER-DATEI

//Bitmasken
#define BIT7 0x80
#define BIT6 0x40
#define BIT5 0x20
#define BIT4 0x10
#define BIT3 0x08
#define BIT2 0x04
#define BIT1 0x02
#define BIT0 0x01

//LCD-Befehlsmasken
#define LCD_ON        0x0F
#define LCD_CURS_ON      0x0D
#define LCD_OFF        0x08
#define LCD_HOME      0x02
#define LCD_CLEAR      0x01
#define LCD_NEW_LINE    0xC0
#define LCD_FUNCTION_SET  0x38
#define LCD_MODE_SET    0x06

//LCD enable/disable high/low
#define LCD_ENABLE  PORTC |= BIT7  //LCD enable
#define LCD_DISABLE PORTC &= ~BIT7 //LCD disable

//RegisterSelect (RS)
#define LCD_READ_DATA PORTC |= BIT6  //Daten lesen
#define LCD_READ_CMD  PORTC &= ~BIT6  //Befehle lesen

Autor: Hannes Weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <iom128v.h>
#include "lcd_sr.h"

void wait(void)
{
  int temp1;
  int temp2;
  int temp3;
  for(temp1=0;temp1<255;temp1++)
  {
    for(temp2=0;temp2<255;temp2++)
    {
      for(temp3=0;temp3<20;temp3++)
    {
    }
    }
  }
}

void main(void)
{
  PORTA=0xFF;
  PORTC=0xFF;
  LCD_READ_CMD;

  wait();// warten bis komplette Spannung anliegt

  // 3 mal schalten
  LCD_ENABLE;
  wait();
  LCD_DISABLE;
  wait();
  LCD_ENABLE;
  wait();
  LCD_DISABLE;
  wait();
  LCD_ENABLE;

  //Init
  wait();
  LCD_DISABLE;
  PORTA=LCD_FUNCTION_SET;
  LCD_ENABLE;
  wait();
  LCD_DISABLE;
  PORTA=LCD_MODE_SET;
  LCD_ENABLE;
  wait();
  LCD_DISABLE;
  PORTA=LCD_ON;
  LCD_ENABLE;
  wait();
  LCD_DISABLE;

  // endlos
  while(1){}
}

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du hast vergessen die PORTS A und C auf Ausgang zu setzen.
also nach
void main(void)
{
DDRA=0xFF;
DDRC=0xFF;

PORTA=....
.
.
.
Wait() muß mit Sicherheit nicht so lange sein, oder wie hast du die 
Werte gewählt?(sollte aber auch mit diesen Werten gehen).

Autor: Ralf Hochhausen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

habe mir nicht den ganzen Quellcode angesehen. Habe aber hier im Forum 
mal gelesen, dass Warteschleifen, die auf diese Art programmiert werden 
je nach Einstellung des Compilers weg optimiert werden. Vielleicht 
solltest Du im Assembler-Code mal nachsehen, ob die Warteschleifen dort 
auch vorhanden sind?

Gruß,

Ralf

Autor: Hannes Weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja, die Ports waren nicht auf Ausgang! danke...
Die Warteschleife funzt! Habe mal vor jedem wait eine LED leuchten 
lassen und es hat hat ordentlich gewartet!

Muss ich die Pins des LCD noch adressieren???

Autor: Ralf Hochhausen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

laut Datenblatt des LCD-Controllers muß während der ersten 3 Enable 
Impulse an den Datenleitungen folendes anliegen:

DB7 = 0
DB6 = 0
DB5 = 1
DB4 = 1
DB3 = 0
DB2 = 0
DB1 = 0
DB0 = 0

Das fehlt bei Dir glaube ich.

Gruß,

Ralf

Autor: Max (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was meinst du mit adressieren???
Schalte LCD auf Daten, Zeichen in PORTA schreiben und enablen.
Schreib doch auch mal ein Zeichen und überprüf den Kontrast. Vielleicht 
funzt es ja schon und du siehst es garnicht!
Max

Autor: Günter Schuto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum nicht mal einen Blick in das Datenblatt werfen !?
Das beantwortet alle Fragen. Inkl. der Init-Sequenz

www.hte.com/uconline/ecp/44780.pdf

Autor: Hannes Weber (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
DB7 = 0
DB6 = 0
DB5 = 1
DB4 = 1
DB3 = 0
DB2 = 0
DB1 = 0
DB0 = 0

Das bedeutet wohl, PORTA = 0x30 ?

Autor: Ralf Hochhausen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja

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.