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
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
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
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.
>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.
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!
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 ??.
> 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.
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)
@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.