LCD an 8bit Bus

matthias122

Neues Mitglied
24. Aug. 2009
7
0
0
Sprachen
Hallo,

ich habe einen atmega128 an den habe ich nun ein 20x4 zeichen LCD mit einem HD44780 Controller. Leider zeigt das Display nur die erste Zeile, hell die 2. Dunkel, die 3. hell und die 4. dunkel an. Nun hab ich gelesen das man den Controller erst Initialisieren muss aber leider funktioniert das mit meinem Bascom Code nicht.
 
... Ansonsten hätte ich gesagt, stell einfach mal Deien Code hier rein damit wir mal reinsehen können. Die Initialisierung des Display macht BASCOM durch die Bibliothek und bei der Benutzung bestimmter Befehle z.B. CONFIG LCD... selbst.
Leider funktioniert das nicht bei allen Displays sondern nur bei denen die BASCOM kennt. Due hast aber die Möglichkeit die Initialisierung jederzeit selbet zu programmieren und das geht auch mit BASCOM ;)

Grüße,
Ma
 
Hier der Code
Code:
'-----------------------------------------------------------------------------------------
'name                     : lcd.bas
'copyright                : (c) 1995-2005, MCS Electronics
'purpose                  : demo: LCD, CLS, LOWERLINE, SHIFTLCD, SHIFTCURSOR, HOME
'                           CURSOR, DISPLAY
'micro                    : Mega8515
'suited for demo          : yes
'commercial addon needed  : no
'-----------------------------------------------------------------------------------------

$regfile = "m128def.dat"                                    ' specify the used micro
$crystal = 4000000                                          ' used crystal frequency
$baud = 19200                                               ' use baud rate
$hwstack = 32                                               ' default use 32 for the hardware stack
$swstack = 10                                               ' default use 10 for the SW stack
$framesize = 40                                             ' default use 40 for the frame space


'--------------------------------------------------------------

'                 (c) 1995-2005 MCS Electronics

'--------------------------------------------------------------

'  file: LCD.BAS

'  demo: LCD, CLS, LOWERLINE, SHIFTLCD, SHIFTCURSOR, HOME

'        CURSOR, DISPLAY

'--------------------------------------------------------------



'note : tested in bus mode with 4-bit on the STK200

'LCD   -   STK200

'-------------------

'D4         D4

'D5         D5

'D6         D6

'D7         D7

'WR         WR

'E          E

'RS         RS

'+5V        +5V

'GND        GND

'V0         V0

'   D0-D3 are not connected since 4 bit bus mode is used!





'Config Lcdpin = Pin , Db4 = Portb.1 , Db5 = Portb.2 , Db6 = Portb.3 , Db7 = Portb.4 , E = Portb.5 , Rs = Portb.6

Rem with the config lcdpin statement you can override the compiler settings





$lcd = &HC000

$lcdrs = &H8000

Config Lcdbus = 8



Dim A As Byte

Config Lcd = 20 * 4                                         'configure lcd screen

'other options are 16 * 2 , 16 * 4 and 20 * 4, 20 * 2 , 16 * 1a

'When you dont include this option 16 * 2 is assumed

'16 * 1a is intended for 16 character displays with split addresses over 2 lines



'$LCD = address will turn LCD into 8-bit databus mode

'       use this with uP with external RAM and/or ROM

'       because it aint need the port pins !



Cls                                                         'clear the LCD display

Lcd "Hello world."                                          'display this at the top line

Wait 1

Lowerline                                                   'select the lower line

Wait 1

Lcd "Shift this."                                           'display this at the lower line

Wait 1

For A = 1 To 10

  Shiftlcd Right                                           'shift the text to the right

  Wait 1                                                   'wait a moment

Next



For A = 1 To 10

  Shiftlcd Left                                            'shift the text to the left

  Wait 1                                                   'wait a moment

Next



Locate 2 , 1                                                'set cursor position

Lcd "*"                                                     'display this

Wait 1                                                      'wait a moment



Shiftcursor Right                                           'shift the cursor

Lcd "@"                                                     'display this

Wait 1                                                      'wait a moment



Home Upper                                                  'select line 1 and return home

Lcd "Replaced."                                             'replace the text

Wait 1                                                      'wait a moment



Cursor Off Noblink                                          'hide cursor

Wait 1                                                      'wait a moment

Cursor On Blink                                             'show cursor

Wait 1                                                      'wait a moment

Display Off                                                 'turn display off

Wait 1                                                      'wait a moment

Display On                                                  'turn display on

'-----------------NEW support for 4-line LCD------

Thirdline

Lcd "Line 3"

Fourthline

Lcd "Line 4"

Home Third                                                  'goto home on line three

Home Fourth

Home F                                                      'first letteer also works

Locate 4 , 1 : Lcd "Line 4"

Wait 1
 
Hallo,
nicht nur ein Controller, sondern vielleicht deren zwei.
Dann muß jeder am Anfang separat initialisiert werden und - jetzt kommts -
jeder hat eventuell sogar noch seinen eigenen Enable-Pin zu bedienen.
Also, Zeile 1 und 3 Controller 1 mit Enable1
Zeile 2 und 4 Controller 2 mit Enable2.
Jetzt hat man einen Anhaltspunkt zum Programmieren.
:close_tema:


Viel Spaß
Gruß von Oskar01
 
Hallo matthias122,

sag mir doch bitte noch, welches Display Du genau hast? Gibt es von dem Display ein Datenblatt?

Hast Du in den Compiler-Settings der BASCOM IDE Einstellungen für das LCD Display eingegeben? Wenn ja wie sehen die aus?

Grüße,
Markus
 
also soweit ich das sehe haben beide Controller nur eine Enable leitung. Ich habe ein EA W204B-NLW LCD von Electronic Assembly
 
Hallo,

ich hab mir mal das Datenblatt von EA angesehen. Das Display hat nur einen
Enable also auch nur einen Controller. Soweit OK.

Hast Du die Kontrastspannung schon mal verstellt ? Das ist an Pin3 Vee
(0..0,5V). Die hatte ich mal bei neem Display falsch und ich hab probiert
und probiert und trotzdem war eine Zeile Schwarz und die andere Weiß :D
Kennst Du das irgendwoher ? Wie ich dann an der Kontrastspannung
rumgespielt habe (Poti verstellt) kamen auch auf einmal Zeichen :rolleyes:
Ist jetzt mal so ein Tip von mir.

Sonst steht auf Seite 3 der Befehlssatz und das es ein normaler HD44780
sein soll. Pinbelegung ist auf Seite 2.

Und hier der Link ... Datenblatt Characterdisplays BlueLine
4x20 - 4,75mm - 98x60mm - EA W204B-NLW Bild

Gruß
Dino
 
Sooodele :rolleyes:

Ich würde es mal mit folgender Initialisierung probieren:

Code:
$regfile = "m128def.dat"                                    ' specify the used micro
$crystal = 4000000                                          ' used crystal frequency
$baud = 19200                                               ' use baud rate

Config Lcdpin = Pin , Db4 = Portx.x , Db5 = Porty.y , Db6 = Portz.z , Db7 = Portu.u , E = Portv.v , Rs = Portw.w 

Config Lcd = 20 * 4 
Config Lcdbus = 4

Cls

Locate 1 , 1 : Lcd "Zeile 1"
Locate 2 , 4 : Lcd "Zeile 2"
Locate 3 , 8 : Lcd "Zeile 3"
Locate 4 , 12 : Lcd "Zeile 4"

Do
Loop

Natürlich musst Du noch für u.u, v.v, w.w usw. die richtigen PIN's setzen.
Sollte meiner Meinung nach funktionieren :D

Grüße,
Markus
 
Mit dem Code von der Elektroniekrseite habe ich nun in der ersten Zeile ein A stehen. So es funktioniert soweit alles aber es muss doch auch ne einfachere möglichkeit geben das Display im Bus Modus anzusteuern?danke für die Hilfe.
 
Funktioniert mein Code oder was erscheint auf dem Display? Hat das mal jemand versucht?

Grüße,
Ma
 
also ich möchte das LCD über den external memory bus ansteuern also im 8 bit modus im 4 bit modus läuft alles soweit.
 
Hi Matthias,

also ich möchte das LCD über den external memory bus ansteuern also im 8 bit modus im 4 bit modus läuft alles soweit.
:confused: Hä ?
Meinst Du den Bus beim Mega128 an den man externes SRAM anschließen
kann ? Meinst Du wirklich das das vom Timing her paßt ? Wieviel Waitstates
möchtest du denn einfügen damit der µC langsam genug für das Display ist ?

Wenn Du wirklich das vorhast was ich vermute wird das nicht hinhauen :(

EDIT: Selbst bei dem schnellsten SRAM was ich gefunden habe (HY628400-55
512kx8Bit mit 55ns Zugriffszeit) werde ich wohl laut Datenblatt des Mega128
bei 16MHz CPU-Takt noch Waitstates einfügen dürfen.

Gruß
Dino
 
Nochmal Hallo,

Lese dir den Lehrgang http://www.dieelektronikerseite.de/uC Ecke/Lections/LCD-Module - Der AVR hat viel zu sagen.htm einmal durch. Da wird die Initialisierung weiter unten näher erklärt.
hab ich mir auch mal angesehen. Ist ne normale Anschaltung am Port eines
Mega8. Nix mit Speicherbus.

Man sucht sich einen Port aus der einem genehm ist, packt das LCD dran und
stellt im BASCOM ein welche Pins man denn verwendet hat. Kein Hexenwerk ;)

Die größten Hürden beim LCD ...
1. Kontrastspannung paßt nicht => man sieht nix
2. Timing paßt nicht => man sieht auch nix oder nur manchmal was.
3. Der Controller ist "kompatibel" :D aber nicht kompatibel genug
=> Controller-Datenblatt lesen (Timing, Initialisierung, Befehle)
4. Man hat sich verdrahtet ;) => LCD-Datenblatt lesen

Ist aber alles kein Hexenwerk ;)

Gruß
Dino
 
An einem Bussystem betreibe ich ein LCD noch am BasicBeetle. Aber das hilft hier dann wohl auch nicht wirklich weiter :(
 
An einem Bussystem betreibe ich ein LCD noch am BasicBeetle. Aber das hilft hier dann wohl auch nicht wirklich weiter :(
Aber das ist ein I2C-Bus und kein Speicher-Bus. Außerdem bedienst Du da ja
nen IO-Baustein am I2C so wie du die Pins auch am Prozessor bedienen
würdest. Man hat das Timing also selber im Programm in der Hand.

Beim Speicherbus ist das Timing von der Anzahl der Waitstates und der
Zugriffsprozedur auf SRAM abhängig. Und ein LCD ist eben kein SRAM.
Vor allem bei der Geschwindigkeit nicht.

Bei nem ZX-Spectrum mit 2,5MHz CPU-Takt und mit Z80 (keine RISC-CPU)
sieht das Timing ganz anders aus. Da mag das noch gehen aber bei nem
ATmega mit 16MHz und als RISC-CPU hat man da wenig Chancen. Außer man
läßt den Prozessor auf 1MHz laufen. Das will aber wohl keiner nur damit man
das LCD am Speicherbus betreiben kann :D

Gruß
Dino
 
Das LCD wird am Beetle am parallen Erweiterungsbus betrieben. Weist also starke Ähnlichkeit mit einem Speicherbus auf. Nur das hier, anstatt 16 Adressleitungen, nur 8 Bit für die Adressse verwendet werden (respektive bis zu 256 Erweiterungsmodule).

Was das Timing des LCDs angeht, ist dies schon ein ziemliches Problem. Am Beetle muss man den Erweiterungsbus mit dem WAITS-Befehl auf min. 42µS runterfahren. So lange benötigen die Displays in der Regel. Einige Befehle wie Display löschen brauchen sogar 1,64mS.

Ich werde für den Beetle demnächst noch einen Lehrgang auf meiner Seite veröffentlichen.

Es gibt aber noch die Möglichkeit, das Busy-Flag abzufragen. Dann ist die Zugriffszeit evtl. um einiges schneller. Das erfordert aber gleich wieder einiges mehr an Programmierarbeit.
 
Hallo,

Das LCD wird am Beetle am parallen Erweiterungsbus betrieben. Weist also starke Ähnlichkeit mit einem Speicherbus auf. Nur das hier, anstatt 16 Adressleitungen, nur 8 Bit für die Adressse verwendet werden (respektive bis zu 256 Erweiterungsmodule).

CPU162.GIF

ich war mal so frei und hab die Grafik von deiner Seite hier her verlinkt.
Dann ist wenigstens jedem soweit klar worum es geht ;)
Ich hoffe mal es ist dir recht ...

Also wir sprechen von dem User-Bus auf der rechten oberen Seite mit den
8 Adressleitungen und 8 Datenleitungen. Sieht im großen und Ganzen aus
wie der I/O-Bereich von nem Z80 und wird in deinem Fall wohl von der
Software (dem Interpreter/Betriebssystem) simuliert so als ob es sich um
einen normale IO-Bus handelt. Beim Z80 hätte man jetzt noch nen IOREQ
um einen gültigen IO-Zugriff zu kennzeichnen. Bei dir sind lediglich die RD und
WR vorhanden da es sowieso nur IO ist.

Wenn man nur mit ner kurzen Befehlssequenz im Betriebssystem den Bus
bedient ist man trotz Softwaresteuerung natürlich im IO-Timing immer noch
schneller als nen Z80 mit seinen 2,5MHz. Also sozusagen Burst-Betrieb.
Um das für ein LCD erträglich zu machen müßte man das Bus-Timing
linear strecken. Dann wird die Programmierung im Betriebssystem aber
ziemlich kompliziert weil die Bus-Steuerung zwischen den anderen Tasks
eingeschachtelt läuft. Also sozusagen Multitasking. Es ist schon ein Kreuz
mit den schnellen Prozessoren :D :rolleyes:

Nun sind also die Fakten auf dem Tisch. Jetzt fehlt nur noch die Lösung ...

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)