Forum: Mikrocontroller und Digitale Elektronik LCD Display 15ms


von Stefan (Gast)


Angehängte Dateien:

Lesenswert?

Hallo


Ich habe einen AT89C2051 (8051)

Das Display ist im 4-Bit Modus (P1.4 bis P1.7 Daten)
E sitzt an P3.4 , RS sitzt an P1.3 und RW ist ständig auf Masse , 
deshalb kann ich auch kein Bussy Signal lesen.


Ich habe hier ein Programm was an P1 die Daten und das RS Signal 
ansteuern.
Und lasse zwischen jeder Operation jedemenge Zeit. Trotzdem Stellt er 
das (16x1) Display nur auf 2 Zeilen Display ein und dann kommt kein 
Zeichen.

Wenn ich aber ein Program mit Basic  (Bascom ) dann zeitgt das Display 
schön "Hallo" an .

Sind die Zeiten zu lang oder zu kurz oder was ??

Hat vieleicht jemand das KÖNNEN das einfache Programm so zu verbessern 
das es Kunktioniert.

Noch einfacher kann man eine Ansteuerung nicht mehr programmieren ODER 
???????????????????????????????


Danke

von Zeusi (Gast)


Lesenswert?

Moin,
welches LC-Display???
Wenn du einen 2051 nutzt, wieso includest du einen 1051??

Auf den ersten blick sieht alles ok aus, aber für weiteres sollten die 
beiden fragen geklärt sein,..

grüüße

von Stefan (Gast)


Lesenswert?

bis auf mehr ram und ein tymer mehr ist alles gleich , es ist die 
einzigste AT89C Datei die beim Asm 51 dabei ist .

Ich nutze ein 16x1 Display (HD44780)

Soll ich das mal mit dem Display-Reset versuchen den man per Software 
durchführen kann ?? Wären ja nur ein paar zeilen mehr im CODE

von dernixwois (Gast)


Lesenswert?

Jmp 35 ??

Mach mal Jmp 100 oder höher! Schau dir mal deine Unterlagen zum 
Speicherbereich an.

von 00h... 1Fh Registerbänke 0..3
von 20h...2Fh Bit-Adressierbarerbereich.

von 30h ... 7Fh ist zwar freier Speicher aber dort wird meistens der 
Stack hin verschoben.
Von 80h... FFh Special-Function-Register

Also von dem her sollte man keinen Sprung zur Adresse 35h machen das 
kann nichts werden.

von dernixwois (Gast)


Angehängte Dateien:

Lesenswert?

Also so! meinte ich

von Jack B. (jackbraun)


Lesenswert?

>Soll ich das mal mit dem Display-Reset versuchen den man per Software
>durchführen kann ?? Wären ja nur ein paar zeilen mehr im CODE

Das ist absolut nicht notwendig, das Display führt den Reset selbständig
aus.

Alles was Du tun mußt ist:

30h senden  (8-Bit-Bus, 1-zeiliges Display, 5x7 Punkte)

50µs warten

0Ch senden   (Display an, kein Cursor, kein Blinken)

50µs warten

01h senden   (Display clear)

1ms warten

Edit:
Mit "senden" meine ich natürlich: Daten an LCD-Port legen, Befehle
einstellen und EN-Impuls.

von C. S. (tekka)


Lesenswert?

Ich kenne mich mit 8051 Assembler leider nicht aus (nur AVR Assembler),
vondaher muss ich bei den Befehlen mehr oder weniger raten.

Allerdings stimmen da Defintiv ein paar Dinge nicht.
Verwendest du unter Bascom vorgefertigte Funktionen / Bibilotheken?
Wenn da dasselbe steht würde es mich schon arg wundern wenn das gehen 
würde,
da fehlt doch so einiges bezüglich das Ansteuerung ;)

Du sagst das du das Display über einen 4 Bit breiten Bus ansprichst -
Sendest den Befehl für dasselbige aber platt an Port 1, was nur 
Funktionieren kann wenn Port 1 Eins-zu-Eins mit dem Dataport vom Display 
verbunden ist, was ja nicht der Fall ist.

In diesem Fall hier wird das Display nur sechs mal "0000"
zu sehen kriegen und dann noch zweimal "1000" hinterher.

Damit das ganze Funktioniert musst du 2 Befehle hintereinander schicken,
die jeweils die 4 unteren und oberen Bits (Nibbles) beinhalten:

Da ich wiegesagt keine Ahnung vom 8051er Assembler habe kann
ichs dir nur generisch schreiben, sollte sich mit der Befehlstabelle
und geringfügiger Hirnleistung aber ruckzuck übersetzen lassen:
1
Schreiben:
2
3
; oberes nibble zuerst
4
a sichern (also auf´n Stack schmeissen, in ein Register kopieren, whatever)
5
a AND 00001111
6
a an Port 1 schicken
7
Pin E setzen
8
nop
9
Pin E löschen
10
11
; unteres nibble danach
12
a wiederherstellen
13
Oberes Nibble von a mit unterem Nibble tauschen (swap bei AVR)
14
a AND 00001111
15
a an Port 1 schicken
16
Pin E setzen
17
nop
18
Pin E löschen
19
20
ret

Für Timings und Befehle empfehle ich dir Google anzuwerfen und dir das 
Datenblatt
für den HD44780 rauszusuchen, da findest du auf Seite 46/47 nochmal die
genauen Werte für den Controller in Form eines Diagramms zusammen mit
den Befehlsworten, also sehr praktisch das ganze.

Allerdings würde ich bezüglich des Controllers nochmal genau gucken,
oft heißt es nur "HD44780 compatible", dann sind Chips alá KS0070
und Konsorten verbaut, in dem die Timings nochmal nen Tick variieren 
können.

Im Prinzip schadet es aber nicht zulange zu warten,
mein 8x2 Display ist anfangs auch mit Timings im
100er-ms-Bereich gelaufen, viel schlimmer gehts also kaum.

PS: Ein Fragezeichen pro Frage reicht!

von Stefan (Gast)


Lesenswert?

Guten Tag

Vielen Dank für die gute Hilfe.

Ich habe das Programm von Bascom genommen und habe Basom einfach nur 
einen "A" ausgeben lassen und habe dann die *.hex File deasembliert und 
habe mir den Maschinen-Code angeschaut.

Jetzt habe ich einfach an Port 1 die Bit-Muster

00110000
00110000
00110000
00100000
00100000
10000000
00000000
11100000
00000000
01100000

---ZEICHEN "A" = 01000001----
0100 1000
0001 1000

Und jetzt kann ich das Progra,mm so ändern das ich nur noch die Zeichen 
im Assembler angebe und mir sie dann per Programm so umrechne das ich 
sie ins Akkumulatorregister schreiben kann und sie dann per SWAP Befehl 
nach jedem SENDEN die NIBBEL vertausche und dadurch ein kürzeres und 
besser Strukturiertes Programm bekomme. Ich konnte noch so viele 
Programme von Assemblerbücher abschreiben, die haben alle nichts 
gebracht , nur das Basic Programm von Bascom was ich in maschinensprache 
umgewandelt habe hat mir gezeigt welche Bitmuster ich nacheinander 
senden muss. Kann ich ein in Bascom assemblierter Code auch so schon 
irgendwo in Assembler sehen oder muss ich das erst mit einem 
Disassembler machen ??.

von Jack B. (jackbraun)


Lesenswert?

> Kann ich ein in Bascom assemblierter Code auch so schon
>irgendwo in Assembler sehen oder muss ich das erst mit einem
>Disassembler machen ??.

Bascom kann nur den Maschinencode anzeigen. Aber man kann das Hexfile
im AVR-Studio disassemblieren.

von STS (Gast)


Lesenswert?

Also ich mache grundsätzlich einen Softreset, weil der Hardreset nur 
funktioniert, wenn die Anstiegszeit von VSS ausreichend schnell ist.


void LCD_init (void)
{
  wait (FUENFUNDZWANZIGMSEK);//100 ms
  wait (FUENFUNDZWANZIGMSEK);
  wait (FUENFUNDZWANZIGMSEK);
  wait (FUENFUNDZWANZIGMSEK);

  LCD_Kom (0x33); //Softreset
  LCD_Kom (0x32); //4 Bit Modus

  LCD_Kom (0x28); //4 Bit Modus, 2 Line, 5 x 7
  LCD_Kom (0x0C); //Dis on, Cursor off, Blink off, Dis on/off
  LCD_Kom (0x06); //Inc, no shift, entry mode
  LCD_Kom (0x14); //cursor move, right, cursor/display shift
  LCD_Kom (0x01); //Clear
}

//für HD44780-U-Controller (Hitachi oder kompatibel)

von STS (Gast)


Lesenswert?

Sorry, muß VCC heißen!

von dernixwois (Gast)


Angehängte Dateien:

Lesenswert?

@Stefan

Vielleicht hilft dir das hier weiter.

AUSG  equ P5  ;Der Port 5 heißt jetzt AUSG


P5 müsstest umtaufen in P1 und Hardwaremäßig müstest umverdrahten, weil 
nur über das untere Nibble gesendet wird oder du schreibst alles um.

P1.0  - D4
P1.1  - D5
P1.2  - D6
P1.3  - D7

P1.4  - EN  (ENABLE)
P1.5  - R / W
P1.6  - RS

Ich hatte damals nur einen Port benutzt d.h. dein Enable P3.4 muss dann 
auf P1.4 Hardwarmäßig.

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.