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
@ 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 . . .
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
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.
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.
@ 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.
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
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
> 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?
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
So weit mir bekannt, schreibt man immer den ganzen Port. Es wird halt nur das entsprechende Bit geändert, der Rest bleibt unverändert.
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
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.
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
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
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
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.
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
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
@ 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.
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.
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.
@ 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. :-(
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.