PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : LC-Display und AT89C2051



Import-Script
27.07.2003, 19:33
Hallo! <BR> <BR>Schon seit längerer Zeit versuche ich, ein primitives LCD mit HD44780-Prozessor irgendwie unter Kontrolle zu bringen, was ich aber leider bis jetzt nicht zustande gebracht habe. <BR>Mein letzter erfolgloser Versuch bestand darin, das Display mit dem µC AT89C2051 anzusteuern. Dazu habe ich folgendes C-Programm geschrieben: <BR>&#40;an P1 hängen die Datenleitungen zum Display, an Pin_E hängt die Enable-Leitung, an Pin_RW die RW-Leitung und an Pin_RS die RS-Leitung&#41; <BR> <BR>#include &#60;intrins.h&#62; <BR> <BR>sbit Pin_E = P3^2; <BR>sbit Pin_RW = P3^3; <BR>sbit Pin_RS = P3^4; <BR> <BR>void CommandByte&#40;void&#41;; <BR>void DataByte&#40;void&#41;; <BR>void BusyDelay&#40;void&#41;; <BR> <BR>unsigned int Counter; <BR>void InitWait&#40;void&#41;; <BR>void Wait&#40;unsigned int Duration&#41;; <BR> <BR> <BR>void main&#40;void&#41; <BR>{ <BR> <BR> InitWait&#40;&#41;; <BR> <BR> Pin_RS = 0; <BR> Pin_RW = 0; <BR> Pin_E = 1; <BR> Wait&#40;150&#41;; <BR> P1 = 0x38; <BR> CommandByte&#40;&#41;; <BR> Wait&#40;41&#41;; <BR> P1 = 0x38; <BR> CommandByte&#40;&#41;; <BR> Wait&#40;1&#41;; <BR> P1 = 0x38; <BR> CommandByte&#40;&#41;; <BR> P1 = 0x0C; <BR> CommandByte&#40;&#41;; <BR> P1 = 0x01; <BR> CommandByte&#40;&#41;; <BR> <BR> P1 = 0x80; <BR> CommandByte&#40;&#41;; <BR> P1 = &#39;C&#39;; <BR> DataByte&#40;&#41;; <BR> P1 = &#39;N&#39;; <BR> DataByte&#40;&#41;; <BR> <BR> while&#40;1&#41;; <BR>} <BR> <BR>void CommandByte&#40;void&#41; <BR>{ <BR> Pin_RS = 0; <BR> _nop_&#40;&#41;; <BR> BusyDelay&#40;&#41;; <BR>} <BR> <BR>void DataByte&#40;void&#41; <BR>{ <BR> Pin_RS = 1; <BR> _nop_&#40;&#41;; <BR> BusyDelay&#40;&#41;; <BR>} <BR> <BR>void BusyDelay&#40;void&#41; <BR>{ <BR> unsigned char Busy; <BR> Pin_RW = 0; <BR> Pin_E = 0; <BR> _nop_&#40;&#41;; <BR> Pin_E = 1; <BR> _nop_&#40;&#41;; <BR> P1 = 0xFF; <BR> Pin_RW = 1; <BR> Pin_RS = 0; <BR> Pin_E = 0; <BR> _nop_&#40;&#41;; <BR> Pin_E = 1; <BR> do <BR> { <BR> do <BR> { <BR> _nop_&#40;&#41;; <BR> Busy = P1 &amp; 0x80; <BR> } while&#40;Busy != 0x00&#41;; <BR> Busy = P1 &amp; 0x80; <BR> } while&#40;Busy != 0x00&#41;; <BR> Pin_RW = 0; <BR>} <BR> <BR>void InitWait&#40;void&#41; <BR>{ <BR> TMOD = 0x02; // autoreload <BR> TH0 = 0x9C; // for 50 µs &#40;at 24 MHz&#41; <BR> TL0 = 0x9C; <BR> ET0 = 0; // enable timer 0 interrupt <BR> TR0 = 0; <BR>} <BR> <BR>void Timer0Interrupt&#40;void&#41; interrupt 1 <BR>{ <BR> Counter&#43;&#43;; <BR>} <BR> <BR>void Wait&#40;unsigned int Duration&#41; <BR>{ <BR> Counter = 0; <BR> TR0 = 1; <BR> ET0 = 1; <BR> while&#40;Counter &#60; Duration&#41;; <BR> ET0 = 0; <BR> TR0 = 0; <BR>} <BR> <BR>Habe ich da möglicherweise einen kleinen Fehler eingebaut? <img src="http://progshop.com/elektronik/diskussion/clipart/uhoh.gif" border=0> <BR> <BR>mfg <BR>cndg

Import-Script
27.07.2003, 20:10
Hi, <BR> <BR>guck mal hier im Archiv, da gibt es wahrscheinlich genau das was du suchst. <BR> <BR><a href="http://progshop.com/elektronik/diskussion/messages/6027/6447.html" target=_top>http://progshop.com/elektronik/diskussion/messages/6027/6447.html</a> <BR> <BR>Gruß, <BR>Heiner

Import-Script
27.07.2003, 21:10
Danke für den Tipp. Funktioniert aber leider trotzdem nicht. <BR> <BR>mfg <BR>cndg

Import-Script
27.07.2003, 21:15
Hi, <BR> <BR>dann kommen die üblichen Grundsatzfragen <BR>1. schwingt der Oszillator überhaupt? <BR>2. ist alles richtig verdrahtet? <BR>3. hältst du alle Timings ein? <BR>usw. <BR> <BR>Gruß, <BR>Heiner

Import-Script
27.07.2003, 21:55
An diese Fragen habe ich natürlich schon gedacht: <BR>1. Habe kein Oszilloskop, um es zu überprüfen. Bei anderen Programmen hat der Quarz aber immer funktioniert. <BR>2. Verdrahtung durchgemessen. <BR>3. Timings werden mit großem Spielraum eingehalten. <BR> <BR>mfg <BR>cndg

Import-Script
27.07.2003, 21:59
Hi, <BR> <BR>weiter geht&#39;s mit <BR>- funktioniert das Display überhaupt? <BR>- benötigt es eventuell eine negative Kontrastspannung? <BR>- ist die Kontrastspannung richtig eingestellt? <BR>- ist beim Einschalten eine Reihe dunkler Balken zu sehen? <BR>- sind schon sonst irgendwelche Reaktionen auf dem Display zu sehen? <BR> <BR>Gruß, <BR>Heiner

Import-Script
27.07.2003, 22:22
Danke für deine Ratschläge. Ich könnte vor Zorn über den Mist aus dem Fenster springen: Das einzige, was ich vergessen hatte, war, EA auf 1 zu setzen, um die Interrupt-Behandlung im µC für die Timer-Interrupts zu aktivieren. Jetzt funktioniert&#39;s und der Cursor blinkt auf dem Display. <BR> <BR>mfg <BR>cndg