Forum: Mikrocontroller und Digitale Elektronik Ports des PCF8574


von Achim S. (achims)


Lesenswert?

Hallo Gemeinde
Wenn ich das datenblatt zum PCF8574 richtig gelesen und verstanden habe, 
hat der IC 8 I/O Pins (P0 bis P7). Dies kann ich gemeinsam lesen oder 
beschreiben. Leider komme ich nicht damit nicht klar. Wenn ich z.B. nur 
den Pin 7 ein oder ausschalten will, wie mach ich das. Oder der P5. Ich 
kann sowas mit 0x40, 0x80 machen. Komme mit der berechnung nicht klar. 
Könnte mir jemand etwas helfen?
achim

von Falk B. (falk)


Lesenswert?

@ Achim Seeger (achims)

>beschreiben. Leider komme ich nicht damit nicht klar. Wenn ich z.B. nur
>den Pin 7 ein oder ausschalten will, wie mach ich das.

Mit Bitmanipulation. Dazu liest man den Wert, macht die passenende 
Bitoperation und schreibt ihn zurück. Oder man behält gleich eine Kopie 
des Werts im RAM, dann muss man nicht vorher lesen.

Für jemanden, der sich mit dem Thema Multitasking beschäftigt hat ist 
das aber eine komische Frage . . .

von Achim S. (achims)


Lesenswert?

Hallo Falk
warum komisch? betrachte mich als suchender. Es gibt viele verschiedene 
Sachen auf der welt. Da kann man nicht alles wissen. Wichtig ist, das 
man sicht traut das zu sagen. Das mit der Bitmanipulation habe ich 
gelesen. Kann aber nicht sagen sdas ich da von schlauer geworden bin. 
Sorry, nocht kapiert.
Eigentlich such ich ganz was einfaches. Für ein einfaches Programm nur 
die 0x40 usw. Will als erstes nur LED an/ausschalten, Vielleicht noch 
taster auslesen. Eins nach dem anderen.
achim

von mr. mo (Gast)


Lesenswert?

Achim Seeger schrieb:
> Kann aber nicht sagen sdas ich da von schlauer geworden bin.
> Sorry, nocht kapiert.

Falk hat die Antwort gegeben. Du liest den aktuellen Zustand der Pins 
des PCF und manipulierst nur den Pin bzw. das Bit was für dich gerade 
interessant ist und schreibst den Wert wieder zurück.

von Frank G. (frank_g53)


Lesenswert?

Hi,

aus dem Artikel zum Portexpander:
http://www.mikrocontroller.net/articles/Port-Expander_PCF8574

Stellt sich nur noch die Frage: Wie regelt man nun, ob ein Pin als Ein- 
oder Ausgang arbeiten soll? Soviel gleich vorweg: So etwas wie die 
Datenrichtungsregister des AVRs gibt es hier nicht, man muss ohne sie 
auskommen. Den Ausgangspegel der Pins definiert man über einen 
Schreibzugriff. Sendet man beispielsweise nach der Adresse gefolgt vom 
ACK des Bausteins 0xF0, so bedeutet das, dass P0:3 nun L-Pegel haben und 
P4:7 H-Pegel. Will man einige IOs als Eingänge verwenden, muss man die 
entsprechenden Ausgänge zunächst auf H-Pegel setzen, da es sich um Open 
Collektor Ausgänge handelt sind die Ausgänge somit inaktiv. Führt man 
nun einen Lesezugriff durch, so stehen im gelesenen Byte die Pegel der 
Pins.

von Falk B. (falk)


Lesenswert?

@ Achim Seeger (achims)

>warum komisch?

Weil es komisch ist, wenn jemand in der 5. Klasse fragt, wieviel 7+3 
ist.
Bitmanipulation ist das kleine 1x1 der Programmierung.

>man sicht traut das zu sagen. Das mit der Bitmanipulation habe ich
>gelesen. Kann aber nicht sagen sdas ich da von schlauer geworden bin.

Dann hast du ein Problem.

>Sorry, nocht kapiert.

Dann lies es noch einmal und denk drüber nach.
Viel einfacher kann man es kaum formulieren. OK, Karl Heinz kann das 
vielleicht.

>Eigentlich such ich ganz was einfaches. Für ein einfaches Programm nur
>die 0x40 usw.

FALSCH! Du willst gar nicht das Prinzip verstehen sondern nur ein paar 
magische Zahlen finden, die für dein spezielles Problem irgendwie 
funktionieren. Und genau mit DIESER untauglichen Methode stolperst du 
wahrscheinlich von  Anfang an deiner Programmiererzeit von Problem zu 
Problem. So wird das nix, nicht mal, wenn es nur um's Hobby geht.

>Will als erstes nur LED an/ausschalten, Vielleicht noch
>taster auslesen. Eins nach dem anderen.

Dann tu das. Behalte ein Kopie der Daten für den PCF im RAM. Schreibe 
dir mehrere Funktionen.

set_bit()
clear_bit()
toggle_bit()

Diese Funktionen verändern das Byte im RAM! Danach ruft man eine 
Funktion update_pcf() auf, welche das Byte aus dem RAM in den PCF 
schreibt.

Zum Lesen brauchst du get_bit()

Alle diese Funktionen arbeiten mit Bitmanipulation.

von Achim S. (achims)


Lesenswert?

Hallo Falk
danke für deine Mühe. Mache es so wie du gesagt hast. Lese es, denke 
drüber nach, versuche zu verstehen. Manche brauchen länger um auch das 
kleine 1x1 zu verstehen. Länger drüber nachdenken bedeutet nicht, es 
nicht zu verstehn, sondern es logisch zu begreifen. Das was man 
verstanden hat, kann man auch anwenden. Es gibt heute noch Leute die mit 
mir streiten, was multitasking ist. Ist ein anderes Thema.
Leider scheint das mit dem PCF 8574 und der Funktion der Pins im Netz 
sehr knapp zu sein. Habe kaum was dazu gefunden. Mache es wie üblich, 
lesen, nachdenken, probieren, begreiffen, anwenden. Wenn es nicht klapp, 
komme ich wieder zu dir fragen.
Danke
achim

von Achim S. (achims)


Lesenswert?

Hallo Falk
nach längerer Suche im Netz habe ich was dazu gefunden. Es gibt 
(magische) Zahlen, mit denen ich bestimmte Ausgänge am Port des PCF8574 
einzeln schalten kann. Habe es programmiert und es geht tatsächlich.
achim

von Stefan F. (Gast)


Lesenswert?

> Es gibt Zahlen, mit denen ich bestimmte Ausgänge am
> Port des PCF8574 einzeln schalten kann.

Das interessiert mich, wie geht das?
Ist das Datenblatt etwa unvollständig?

von Achim S. (achims)


Lesenswert?

Nein, das Datenblatt ist nicht unvollständig. Es kommt scheinbar auf das 
an was nicht so da steht. Bin gerade dabei es in ein Programm zu packen 
und meine vielen versuche zu löschen. Muss es dann noch ausgiebig 
testen. Habe jetzt zwei Versionen, ein Blinklicht einer LED und ein 
Lauflicht mit 4 LED. Stelle es morgen rein. Versprochen
achim

von Amateur (Gast)


Lesenswert?

So weit mir bekannt, schreibt man immer den ganzen Port.
Es wird halt nur das entsprechende Bit geändert, der Rest bleibt 
unverändert.

von Achim S. (achims)


Lesenswert?

Hallo Gemeinde
wie versprochen kommt jetzt der Code:
1
/* Bus1.c 26.02.2014 16:38:59 Author: AS */ 
2
3
4
#ifndef F_CPU                   // CPU-Takt definieren
5
#define F_CPU 16000000          // definiere ihn auf 16MHz
6
#endif
7
8
#include <util/delay.h>         // Einbinden der .h Datei
9
#include "i2cmaster.h"          // i2cmaster.h, twimaster.c einbinden
10
11
unsigned char adr1_w = 0x40;    // Schreib Adresse
12
unsigned char adr1_r = 0x41;    // Lese Adresse
13
14
int main(void)                  // Beginn Programm
15
  {  
16
    i2c_init();                 // I2C Bus initieren
17
    while(1) 
18
      {                         // Hauptschleife
19
        i2c_start(adr1_w);      // Starte Lesezugriff
20
        i2c_write(0xe0);        // Schreibe I2C, LED 4 an
21
        _delay_ms(1000);        // 1000ms warten
22
        i2c_write(0xff);     // Alle Pins des PCF auf 1 dadurch LED aus
23
        _delay_ms(1000);        // 1000ms warten  
24
      }
25
    i2c_stop();
26
    return(0);
27
  }
Es wurde mit AVR Studio 6 erstellt und an einem Modul mit PCF8574 
getestet. Dabei ist die Belegung:
P0 bis P3 - Taster 1 bis 4
P4 bis P7 - LED 1 bis 4
Nicht vergessen die beiden Datein einzubinden. Falls jemand Interesse 
hat, kann ich ihm den ganzen Artikel mit Erklärung schicken.
Suche im Gegenzug einen Code für den PCF8591. Hat da jemand was für 
mich?
achim

von Pete K. (pete77)


Lesenswert?

Achim Seeger schrieb:
> #ifndef F_CPU                   // CPU-Takt definieren
> #define F_CPU 16000000          // definiere ihn auf 16MHz
> #endif
>


Allein das ist schon ein no-go.

Lerne Verstehen wie es funktioniert. Das ist nicht so schwer.

und das hier:
    i2c_stop();
    return(0);

kann man sich sparen. Warum wohl?

Achim Seeger schrieb:
> Suche im Gegenzug einen Code für den PCF8591. Hat da jemand was für
> mich?

Und was ist die nächste/übernächste Frage?

Nicht für ungut, aber etwas mehr Grundlagenkompetenz kann nicht schaden.

von Achim S. (achims)


Lesenswert?

Es steht dir absolut frei im Netz was eigenes zu suchen oder zu 
schreiben. Da es nicht soviel Info im Netz gibt, kannst du es nutzen 
oder nicht. Infos über den PCF 8591 sind noch weniger zu finden oder gar 
ein Beispiel in C.
achim

von chris (Gast)


Lesenswert?

Achim Seeger schrieb:
> Da es nicht soviel Info im Netz gibt, kannst du es nutzen
> oder nicht.

echt witzig :)


Achim Seeger schrieb:
> Infos über den PCF 8591 sind noch weniger zu finden

hier steht alles drin, was man wissen muss, also wo liegt das Problem?

www.nxp.com/documents/data_sheet/PCF8591.pdf

von chris (Gast)


Lesenswert?

Achim Seeger schrieb:
> i2c_write(0xe0);        // Schreibe I2C, LED 4 an

achja noch was:

wenn schon Kommentare im Code, dann bitte doch auch richtige.
0xE0 entspricht 0b1110 0000
damit ist also nicht nur LED4 an, sondern auch noch alles mögliche ander

Bitte beschäftige dich, wie oben gesagt, doch mal mit Bitmanipulation, 
anstatt hier irgendwas zusammenzupfuschen

von Ronny S. (duselbaer)


Lesenswert?

Wo sind denn jetzt die Magic Numbers, um einzelne Bits zu schalten, ohne 
die anderen zu verändern? Bislang hast Du nur das was im Datenblatt 
steht gepostet.

von Achim S. (achims)


Lesenswert?

Das Datenblatt habe ich vor mir zu liegen. Damit arbeite ich. Da stehn 
zwar viel Info drin, so wie Bauart, Grenzdaten, Betriebsdaten usw. 
Leider nur nicht was ich für mein Projekt brauche.
Wenn ich auf dieser Seite den PCF8591 eingebe, kommen ca 2 Seiten mit 
Info, im Zeitraum bis ca. 2004 zurück. Viele der angegeben Stellen sind 
nicht mehr erreichbar. Ein andere Teil fragt nach Hilfe zu dem IC an. 
Ein anderer Teil arbeitet mit Basic, ASM oder Pascal. Da bleibt nicht 
viel übrig. Auch bei Goo.. sieht es nicht viel besser aus.
Diese seite soll doch sein um Hilfe zu geben, nicht um jede Erkenntnis 
ins Bodenlose zu stossen.
achim

von Achim S. (achims)


Lesenswert?

Beende das Thema, könnt den Code nutzen oder nicht. Für Hinweise zu 
fehlern  bin ich dankbar und nehme die Ratschläge gern an und lerne.
Schönen abend noch

von Falk B. (falk)


Lesenswert?

@ Achim Seeger (achims)

>nach längerer Suche im Netz habe ich was dazu gefunden. Es gibt
>(magische) Zahlen, mit denen ich bestimmte Ausgänge am Port des PCF8574
>einzeln schalten kann. Habe es programmiert und es geht tatsächlich.

>So weit mir bekannt, schreibt man immer den ganzen Port.
>Es wird halt nur das entsprechende Bit geändert, der Rest bleibt
>unverändert.

Und was bitte habe ich dir versucht lang und breit zu erklären?
Irgendwie glaube ich, dass Programmieren für dich das falsche Hobby ist.

von Stefan F. (Gast)


Lesenswert?

Wo sind denn nun die magischen Codes zum Setzen einzelner Bits? Ich sehe 
sie immer noch weder im Datenblatt noch in dem Programm. Das Programm 
sendet ein ganzes Bytes und beeinflusst daher bis zu 8 Bits auf einen 
Schlag.

von Peter D. (peda)


Lesenswert?

Falk Brunner schrieb:
> Dazu liest man den Wert, macht die passenende
> Bitoperation und schreibt ihn zurück.

Vorsicht!
Wenn Eingänge/Ausgänge gemischt, geht das in die Hose.
Damit klaut man einer gedrückten Taste den Pullup und sie bleibt auf 
ewig gedrückt.

Falk Brunner schrieb:
> Oder man behält gleich eine Kopie
> des Werts im RAM

Ist daher der sichere Weg.

von Falk B. (falk)


Lesenswert?

@ Stefan us (stefanus)

>Wo sind denn nun die magischen Codes zum Setzen einzelner Bits? Ich sehe
>sie immer noch weder im Datenblatt noch in dem Programm. Das Programm
>sendet ein ganzes Bytes und beeinflusst daher bis zu 8 Bits auf einen
>Schlag.

Eben. Das eigentliche Ziel, nämlich das INDIVIDUELLE Schalten einzelner 
Ausgänge in klarer Form durch Bitmanipulation wurde verfehlt. :-(

von Achim S. (achims)


Lesenswert?

Danke Peter, endlich ein ruhiges Wort.
Es war der erste Versuch zum Bus. Mein Modul sollte laufen, Adressen 
testen usw. Dabei bin ich zufällig auf diese Adressen gestossen und habe 
es getestet. Für viele ist der Bus ein riesen Problem. Auch der Hinweis 
auf die vielen Artikel im Netz helfen nicht wirklich weiter. Zu 
unkonkret oder immer das selbe.
Behalte die Sache im Auge. Bin gerade an den Tastern dran. Diesmal mit 
Bitmanipulation (für die anderen gemeint-Hobby und so)
Auch das mit dem RAM werde ich machen. Eines nach dem anderen.
achim

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.