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


von Hannes Weber (Gast)


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...

von Max (Gast)


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

von Hannes Weber (Gast)


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?

von Hannes Weber (Gast)


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

von Max (Gast)


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.

von Hannes Weber (Gast)


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

von Hannes Weber (Gast)


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){}
}

von Max (Gast)


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).

von Ralf Hochhausen (Gast)


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

von Hannes Weber (Gast)


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???

von Ralf Hochhausen (Gast)


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

von Max (Gast)


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

von Günter Schuto (Gast)


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

von Hannes Weber (Gast)


Lesenswert?

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

Das bedeutet wohl, PORTA = 0x30 ?

von Ralf Hochhausen (Gast)


Lesenswert?

ja

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.