Forum: Mikrocontroller und Digitale Elektronik ram mit pcf8574 vom display hd44870 lesen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von 6e 6f 5f 6c 69 66 65 (Gast)


Lesenswert?

jo forum, was geht?

ich hab ne frage bzgl. dem pcf8574. ich bin mir nicht sicher, aber kann 
man einzelne pins als ausgang und eingang schalten und nicht alle als 
eingang oder alle als ausgang? ich würd gern mit dem portexpander auch 
den ram von display lesen können, klappt jedoch nicht. gibt es eine 
möglichkeit dies zu schaffen, ohne rs rw am µC zusätzlich anzubinden? 
ich benutz den 4-bit modus

1
  void wait_for_bf()
2
  {
3
4
    send_instruction(RW_H, 0); // RW_H HIGH mit enable und DB4-DB7 = 0
5
    uint8_t input = get_portexpander_input(PCF8574_ADDRESS) & 0b00001000; // busy flag checken, db7 ist auf p3
6
    
7
    
8
    while( ! (input) == BF ) // BF = 0b00001000
9
        {
10
          
11
          send_instruction(RW_H, 0);
12
          input = get_portexpander_input(PCF8574_ADDRESS) & 0b00001000;
13
          
14
            
15
        }
16
}


wenn nur in der funktion _delay_us(300) steht, klappt das schreiben 
wunderbar, sobald ich den o. g. code verwende, werden falsche buchstaben 
angezeigt. ich wüsste nicht, wie ich es anders machen könnte. die input 
lese funktion des portexpander funktioniert auch, hab die getestet.

ich denke auch, dass kurzzeitig das display signale ausgibt, während der 
expander auf ausgang-modus abgeht.

die methode geht auch nicht, da geht der gleiche shit aufm display ab...
1
void wait_for_bf()
2
  {
3
4
    enable_high(RW_H, 0); // RW_H HIGH mit enable high und DB4-DB7 = 0
5
    uint8_t input = get_portexpander_input(PCF8574_ADDRESS) & 0b00001000; // busy flag checken p3 ist auf db7
6
    
7
                enable_low(RW_H, 0); // RW_H HIGH mit enable low
8
    
9
  while( ! (input) == BF ) // BF = 0b00001000
10
  {
11
          
12
           enable_high(RW_H, 0); // RW_H HIGH mit enable high und DB4-DB7 = 0
13
     input = get_portexpander_input(PCF8574_ADDRESS) & 0b00001000; // busy flag checken p3 ist auf db7
14
    
15
                 enable_low(RW_H, 0); // RW_H HIGH mit enable low
16
          
17
            
18
        }
19
}


danke für antworten, meine homies

von 6e 6f 5f 6c 69 66 65 (Gast)


Lesenswert?

jojo, ich bins wieder, scheint nicht zu gehen, hole mir daher den 
MCP23008, damit gehts

**************************

von holger (Gast)


Lesenswert?

>hole mir daher den MCP23008, damit gehts

Das geht auch mit dem pcf8574. Du bekommst es nur nicht
gebacken DB4..7 auf 1 zu setzen bevor du liest. Dann wirken
nur noch die Weak Pullups und das Display kommt
dann auch durch.

von Toxic (Gast)


Lesenswert?

holger schrieb:
> Das geht auch mit dem pcf8574.

Kann ich nur beipflichten:ist ueberhaupt kein Problem!

von Falk B. (falk)


Lesenswert?

Wie es ghen kann, sieht man hier.

Beitrag "I2CLCD Library für HD44780 LCDs"

Wie der PCF8574 alllgemein funktioniert, hier.

https://www.mikrocontroller.net/articles/Port-Expander_PCF8574

von 6e 6f 5f 6c 69 66 65 (Gast)


Lesenswert?

ne, klappt nicht, der code aus dem beitrag müsste falsch sein.

von 6e 6f 5f 6c 69 66 65 (Gast)


Lesenswert?

hab das problem erkannt. bei meinem pcf8674n ist es so, dass er, wenn 
der port gesetzt wurde, diesen nicht zurücksetzt beim lesen, sondern ihn 
so belässt.

das muss man beachten, dann sollte es auch gehen :D

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

6e 6f 5f 6c 69 66 65 schrieb:
> hab das problem erkannt. bei meinem pcf8674n ist es so, dass er, wenn
> der port gesetzt wurde, diesen nicht zurücksetzt beim lesen, sondern ihn
> so belässt.

 Warum sollte der port beim lesen zurückgesetzt werden und wieso ist
 das ein Problem ?

von Mike A. (Gast)


Lesenswert?

6e 6f 5f 6c 69 66 65 schrieb:
> jo forum, was geht?

Geht nun, oder geht nicht?

6e 6f 5f 6c 69 66 65 schrieb:
> ... bei meinem pcf8674n ist es so, dass er, wenn der port gesetzt
> wurde, diesen nicht zurücksetzt beim lesen, sondern ihn so belässt.

Das ist nicht nur bei deinem  PCF8574 so.
Wenn du dir im Datenblatt unter 8.2.2 das vereinfachte Schaltbild eines 
Portpins anguckst, siehst du auch, warum das Lesen überhaupt keinen 
Einfluss auf die Ausgabe hat.

von 6e 6f 5f 6c 69 66 65 (Gast)


Lesenswert?

ja, kein plan, fand das schon komisch, weil dachte schon, dass wenn man 
etwas auf eingang schaltet, dass die vorherige Spanung eben nicht mehr 
da ist.

leider klappt es immer noch nicht. aber eine frage, was ich nicht 
verstehe, wenn der pcf die ausgänge beim lesen auf high schaltet, dann 
gibt es doch einen kurzschluss, wenn das display die ausgangsspannung 
ausgibt?

toll ist es doch nicht?

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

6e 6f 5f 6c 69 66 65 schrieb:
> leider klappt es immer noch nicht. aber eine frage, was ich nicht
> verstehe, wenn der pcf die ausgänge beim lesen auf high schaltet, dann
> gibt es doch einen kurzschluss, wenn das display die ausgangsspannung
> ausgibt?

 Die Ausgänge werden beim lesen nicht High, sondern hochohmig - aber
 dazu muss man sie erst als Eingang schalten - einen Ausgang kann
 man nicht lesen, wohl aber den Portzustand, d.h. den dazugehörigen
 Ausgaberegister.

: Bearbeitet durch User
von 6e 6f 5f 6c 69 66 65 (Gast)


Lesenswert?

also, wie ich es beim PCF8574 verstanden habe, ist es so, dass man 
entweder liest oder schreibt. beim schreiben werden die PCF Pins 
gesetzt. Beim Lesen gibt es den aktuellen Wert vom Port zurück. Beim PCF 
gibt es doch keine Register, in die man schreiben kann, oder?

holger schrieb:
> Das geht auch mit dem pcf8574. Du bekommst es nur nicht
> gebacken DB4..7 auf 1 zu setzen bevor du liest. Dann wirken
> nur noch die Weak Pullups und das Display kommt
> dann auch durch.


Ich verstehe das mit den weak pullups nicht. Wenn ich DB4-DB7 ENABLE und 
RW high setze, dann kommt ja eine Spannung vom Display erstmal aus. So 
ist doch für eine gewisse Zeitdauer ein Kurzschluss vorhanden?

von holger (Gast)


Lesenswert?

>Ich verstehe das mit den weak pullups nicht. Wenn ich DB4-DB7 ENABLE und
>RW high setze, dann kommt ja eine Spannung vom Display erstmal aus. So
>ist doch für eine gewisse Zeitdauer ein Kurzschluss vorhanden?

Der PCF8574 hat keine Push Pull Ausgänge. Es sind quasi
Open Collector mit Pullups dran. Bei Low Signal kann er
einige mA gegen Masse schalten. Bei High wirken nur noch
die Pullups und dort kommen nur ein paar uA raus.
Es wird also keinen Kurzschluss geben wenn man die Ausgänge
des PCF8574 auf High legt und gleichzeitig einen Ausgang
(hier das Display) anlegt.

von 6e 6f 5f 6c 69 66 65 (Gast)


Lesenswert?

Eine Frage, was passiert, wenn der Port auf 0 V gesetzt wurde und aber 
z. B. eine Spannung vom Display da ist? Wird der Strom blockiert?

von 6e 6f 5f 6c 69 66 65 (Gast)


Lesenswert?

Und wie wird eine Spannung am port erkannt, wenn ich z. B. lese?

von holger (Gast)


Lesenswert?

>Eine Frage, was passiert, wenn der Port auf 0 V gesetzt wurde und aber
>z. B. eine Spannung vom Display da ist? Wird der Strom blockiert?

Dann hast du deinen Kurzschluss. Das musst du vermeiden.

von 6e 6f 5f 6c 69 66 65 (Gast)


Lesenswert?

Also, ist es richtig, wenn ich z. B. einen Pin am Port vom PCF8457 HIGH 
setze, dann wird ja der Transistor geschlossen, sodass der Strom 
sozusagen von Vcc über den Pullup zum Gerät fließen kann. Wenn ich den 
öffne den Transitor, dann fließt der Strom über Kollektor zur Masse und 
am Port ist die Spannung 0, ist das richtig?

von 6e 6f 5f 6c 69 66 65 (Gast)


Lesenswert?

> dann fließt der Strom über Kollektor zur Masse und
> am Port ist die Spannung 0, ist das richtig?


am Pin meine ich



Großen Dank für die Aufklärung

von 6e 6f 5f 6c 69 66 65 (Gast)


Angehängte Dateien:

Lesenswert?

Hier ist ein Bild vom open-collector

von 6e 6f 5f 6c 69 66 65 (Gast)


Angehängte Dateien:

Lesenswert?

ich hab mal die Fälle gemalt.

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.