Forum: Mikrocontroller und Digitale Elektronik Busy-Flag des LCDs lesen


von Markus Wittmer (Gast)


Lesenswert?

hoi zäme
ich habe das avr-tutorial von mikrocontroller gelesen und möchte mal
selbst versuchen, ein lcd anzusteuern. mir ist aber nicht klar, wie ich
das busy-flag des lcd's auslesen kann. wenn ich RW auf 1 setzte
- an welchem pin des displays kann ich dann das busy-flag lesen und
- wie kann ich das busy-flag lesen, wenn ich zuvor bei meinem atmel die
pins als ausgänge festgelegt habe, welche die pins RW, RS, E und DB0 bis
DB7 des displays ansteuern? auf denen kann ich dann doch nicht lesen,
sonst wäre die definition im datenrichtungsfeld doch überflüssig!!!
markus

von Nik Bamert (Gast)


Lesenswert?

hoi

1)Wenn ich RW auf 1 setzte
- an welchem pin des displays kann ich dann das busy-flag lesen und

http://www.geocities.com/dinceraydin/lcd/commands.htm
DB7 = busyflag

2)wie kann ich das busy-flag lesen, wenn ich zuvor bei meinem atmel
die
pins als ausgänge festgelegt habe, welche die pins RW, RS, E und DB0
bis
DB7 des displays ansteuern? auf denen kann ich dann doch nicht lesen,
sonst wäre die definition im datenrichtungsfeld doch überflüssig!!!

Die Definition ist nicht überflüssig, du musst bloss die pins auf
eingang schalten, wenn du das busyflag lesen möchtest.

fröhlichi feschtteg(bin au schwiizer:P)

nik

tschuldigung wegen meiner Rechtschreibung, ist schon spät;-)

von Nik Bamert (Gast)


Lesenswert?

ah ja ich hab einfach mal angenommen, du sprichst von einem lcd mit
einem hd44780 oder kompatiblen controller...

von jornbyte (Gast)


Lesenswert?

Der Anschluss vom Busy-Flag-Pin wird im DB genannt, meist Pin6 oder
Pin7. Um das Lesen zu können musste den Ausgang des Ports natürlich auf
Eingang schalten und danach (wenn gelesen) wieder zurück auf Ausgang.
Die paar Befehle sollten doch noch ins Proggi reinpassen.

von hans dieter (Gast)


Lesenswert?

es kann aber sein, dass das busy-flag bei nach einigen Kommandos nicht
zur verfügung steht (init z.B.)

von pumann (Gast)


Lesenswert?

beim 'init' wirds noch nicht gebraucht, aber anschliessend solltest du
es immer abfragen, bevor du die nächsten daten schickst.
habe auch schon so'n display gehabt, welches beim timing langsamer war
als andere versuchskaninchen - damals 'nen wolf gesucht, mit busy-flag
wars dann aber erledigt.

... und gleichfalls schöne weihnachtsgrüsse, an alle hier

von Markus Wittmer (Gast)


Lesenswert?

vielen dank an alle... (c:

von Markus Wittmer (Gast)


Lesenswert?

hab nun doch noch eine frage dazu. auf der oben verlinkten seite steht:
>   1.  Set R/W Pin of the LCD HIGH(read from the LCD)
>   2. Select the instruction register by setting RS pin LOW
>   3. Enable the LCD by Setting the enable pin HIGH
>   4. The most significant bit of the LCD data bus is the state of the
busy flag(1=Busy,0=ready to accept instructions/data).The other bits
hold the current value of the address counter.
>
>*This is a 1-micro-second instruction.

muss ich nun 1 us warten, bis das busyflag anliegt? hab nämlich im
datenblatt von "LCD 162C" gelesen, dass die "Execution Time" bei
diesem display bei 0 mikrosek. liegt um das busy-flag zu lesen. ich
stelle mir vor, um trotzdem auf der sicheren seite zu stehen in
folgender art zu programmieren. ich nehme an, dass ich punkt 1, 2 und 3
alle gleichzeitig ausführen kann, oder?

   ldi tmp, 0b110xxxxx  ;  es gilt: RS (PB5)=0; RW (PB6)=1; E (PB7)=1
   out DDRB, tmp        ;

muss ich nun hier 1 mikrosekunde warten, (und bei gewissen displays,
z.B beim "LCD 162C" gar nicht) bis das busyflag am display anliegt?
wie mach ich das bei einem uC mit 1 MHz, einfach mit einer "nop"
anweisung? (und wenn das programm auf einen schnelleren nC übertragen
wird, könnte hier ein fehler entstehen, weil das busyflag noch gar
nicht anlag???)

von pumann (Gast)


Lesenswert?

... nicht gleichzeitig rs, r/w und enable mit 'out ddrx, register'
ausgeben - funktioniert bei den meisten lcds nicht. beim hd44780 werden
die anliegenden daten mit fallender flanke von enable übernommen, so wie
beim folgendem codeschnipsel:
1
busy_flag:
2
  ldi  temp,0b00000000          ;port a ist eingang
3
  out  ddra,temp
4
5
        cbi  portd,rs    ;befehl wird gesendet
6
        sbi  portd,rw    ;setze lcd in lesemodus
7
        sbi  portd,e      ;spreche lcd an
8
9
    nop
10
    nop
11
    nop
12
13
        sbic    pina,bf            ;lcd bereit?
14
        rjmp    busy_flag             ;nein, wiederhole
15
16
  cbi  portd,e      ;disable lcd
17
18
  ret                             ;lcd bereit

halte dich da auch mit an das datenblatt des lcd-controllers, hilft dir
da bestimmt auch weiter (der vom lcd ist eventuell etwas spärlich
ausgefallen).

... und frage das busy-flag trotzdem ab, denn wenn du mal das display
wechselst hast du vielleicht probleme

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.