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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.