Forum: Mikrocontroller und Digitale Elektronik LC Display Ansteuerung


von Patrick F. (patrick_f)


Lesenswert?

Hallo,

erst einmal möchte ich mich vorstellen.

Mein Name ist Patrick und ich bin 20 Jahre alt. Momentan absolviere ich 
noch eine Ausbildung im Beruf "Elektroniker für Geräte und Systeme".

Ich habe mir von der Berufsschule aus ein Mikrokontrollerboard, welches 
zum herum experimentieren dienen soll, gekauft :)
Nun möchte ich das LC Display in Assembler ansteuern. Programmiert wird 
in uVision 4 (Keil Compiler) und gebrannt mit Atmel Flip. Habe mich 
schon informiert, wie das alles geht mit den Warteschleifen und den 
Init-Codes usw.
Aber erst einmal hier ein paar Daten:

uC: Atmel T89C51CC01 @ 12MHz
LCD Controller: KS0070B
LC Display: 162C (16Characters x 2 lines)
Portbelegung:

RW     = Ground (sprich: nur schreiben/ kein lesen)
RS     = P2.6
Enable = P2.4
DB7    = P2.3
DB6    = P2.2
DB5    = P2.1
DB4    = P2.0   (sprich: 4-Bit Mode)

Initialisierung laut Datenblatt:

1. Power ON
2. mehr als 15ms warten, nachdem die Beitrebsspannung von 4,5V erreicht 
ist
3. "Function-Set" senden
4. mehr als 4,1ms warten
5. "Function-Set" senden
6. mehr als 100us warten
7. Function-Set senden
8. Display OFF
9. Display Clear
10. Entry Mode Set

Soweit so gut.
Leider bekomme ich die Initialisierung nicht hin!
Das erste Problem ist die Warteschleife. Ich weiß nicht wie ich die 
Warteschleife programmieren soll. Man kann den Timer dafür verwenden 
soweit ich weiß, aber dafür muss man wiederrum wissen wie lang ein 
Maschinenzyklus geht,.... Ich wäre sehr dankbar wenn ich mir mit der 
Warteschleife schon einmal helfen könntet.

Falls ihr noch fragen habt, einfach schreien.

Ich hoffe das waren alle wichtigen Daten und ich habe nichts vergessen.

von faustian (Gast)


Lesenswert?

Du kannst:

-folgendermassen eine Warteschleife einstellen:

--einfach eine solche Warteschleife mit einem beliebigen aber bekannten 
Wert erstellen, darum eine Endlosschleife und in dieser nach jedem 
Durchgang der Warteschleife einen Pin togglen, und die Periodendauer 
dort mit dem Oszilloskop oder einem Frequenzmesser messen. Notfalls kann 
man da mit einem kleinen Aktivlautsprecher und einer Stimmgabel auch was 
improvisieren.

--Wenn Du Assemblersprache benutzt, Anweisungen zaehlen. Ein klassischer 
MCS51- wie dein AT89C51irgendnevariante es vermutlich ist - ist ein 
Zwoelftakter, macht Quarz in Hertz durch zwoelf Anweisungen pro Sekunde. 
Ein paar Anweisungen brauchen die doppelte bis vierfache Zeit (bedingte 
Verzweigungen, wie man sie am Ende einer Schleife oft findet, zum 
Beispiel) - da kannst Du in eine Referenzwerk schauen (Datenblatt, 
Programmierhandbuch...) oder die Ungenauigkeit in Kauf nehmen, da ein 
HD44780 und kompatibel auch mit etwas laengeren Delays klarkommt.

--Wenn Du C benutzt, sieh Dir den generierten Assemblercode an, siehe 
dort


oder


-Eben den Timer benutzen, dieser taktet ebenfalls immer auf die Zwoelf.

oder


-Wissen dass eine "naiv geschriebene" for-Schleife abwaerts mit einem 
long-iterator so an die 20 bis 30 Anweisungen pro Durchlauf kostet (Du 
musst viermal subtrahieren, achtmal den akkumulator be/entladen, viermal 
vergleichen (bzw mit ORL die bytes zusammenpappen um damit den Sprung zu 
steuern), und dann einen bedingten Sprung machen, schon bist Du bei 20 
;). Einfach 200% Sicherheitsfaktor dran und ans nächste Problem. Viel 
kleineroptimieren wird das wohl auch der C Compiler nicht koennen.

von Patrick (Gast)


Angehängte Dateien:

Lesenswert?

ok ich werde es morgen versuchen, den Timer bis 255 zählen zu lassen, 
dann das Timer Overflow Flag an einen Pin ausgeben und diesen dann mit 
einem Oszilloskop anschauen.
Ich denke so hast du es gemeint.
Ich werde mich dann noch einmal melden, danke.
Anbei noch ein Bild, damit ihr/ du noch eine Ahnung habt in welche 
Richtung das ganze geht.

von Dirk (Gast)


Lesenswert?

bzgl. 8051 Timer und Delays findest Du hier schöne Beispiele in 
Assembler incl. Berechnung:

http://www.the-crankshaft.info/2009/08/8051-microcontroller-topic-index.html

und dort speziell Kapitel 3.3 und 9.

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.