LCD an ATmega128 anschließen...

Gast #21247
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...
Gast #21248
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
Gast #21249
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?
Gast #21250
µ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
Gast #21251
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.
Gast #21252
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
Gast #21253
#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){}
}
Gast #21254
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).
Gast #21255
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
Gast #21256
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???
Gast #21257
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
Gast #21258
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
Gast #21259
Warum nicht mal einen Blick in das Datenblatt werfen !?
Das beantwortet alle Fragen. Inkl. der Init-Sequenz

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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.