Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: PCF8574 Ports einzeln ansteuern, Mega 128 Kategorie: I²C-Bus (von PeterS - 23.07.2010 8:37)
Als Antwort auf Re: PCF8574 Ports einzeln ansteuern, Mega 128 von Wolfgang Meinberg - 22.07.2010 23:05

> > > > > Hallo Zusammen!
> > > > >
> > > > >
> > > > > ...in der Doku zum PCF8574 hab ich gelesen, daĂ? man die Ports auch einzeln ansteuern kann (Bit)
> > > > > so wie die Ports der Mega 128, (z.B.Port_WriteBit(15,1) ). Im Forum CC2 gibt es einen Treiber fĂĽr
> > > > > der Ports. Ist dies auch bei der Mega128 möglich,  wenn ja wie?
> > > > >
> > > > > Danke fĂĽr die Hilfe!
> > > > >
> > > >
> > > > Hi,
> > > >
> > > > ich habe die Doku kurz angeschaut und nur gesehen, das man immer ein komplettes Byte an I2C
> > > > schickt. Du mu�t Dir halt einfach den Zustand aller Ports merken, und dann veränderst Du halt
> > > > nur ein Bit für den zu ändernden Port im gesendeten Byte.
> > > >
> > > > Siehe auch: http://www.mikrocontroller.net/articles/Port-Expander_PCF8574
> > > >
> > > > Gruss Peter
> > >
> > > Hallo Peter!
> > >
> > > ...danke fĂĽr die Antwort. Ich hab auch nichts weiteres dazu gefunden, man kann bei der Mega 128
> > > wohl nur ein komplettes Byte senden.
> > > Da ich Anfänger bin, könntest Du mir kurz erklären, wie ich nur ein Bit verändere.
> > > Ich  lese mit I2C_Read_ACK das Byte und will z.b.das erste Bit von 0 >1 setzen...
> > > wie mach ich das??? Evtl. kleines Demo Programm?!
> > >
> > > Bytes an den PCF8574 zu senden und zu lesen ist kein Problem, aber dafĂĽr hab ich keine Idee...
> > >
> > > Danke erstmal...
> > >
> > >
> > > GruĂ? Wolfgang
> >
> > Hallo Wolfgang,
> >
> > man kann bei I2C immer nur komplette Bytes senden, und nicht einzelne Bits. Schau Dir am besten
> > das I2C Protokoll genauer an. Links:
> >
> > http://de.wikipedia.org/wiki/I%C2%B2C
> > http://www.mikrocontroller.net/articles/I2C
> >
> > Du schickst an den PCF8574 immer ein Byte mit allen Werten fĂĽr alle 8 Portbits. Wenn Du nur einen
> > Portausgang verändern möchtest, so änderst Du auch nur das Bit an der jeweiligen Stelle in dem
> > Byte was Du schickst.
> >
> > I2C_Init(I2C_100kHz);  // I2C Bit Rate: 100 kHz - nur einmal im Programm aufrufen
> >
> > // Wert an PCF8574 schicken
> > I2C_Start();
> > I2C_Write(0x40);       // DEVICE ADDRESS : 0x40 + untere Addressbits
> > I2C_Write(portvalue);  // Bit Werte von allen 8 portbits
> > I2C_Stop();
> >
> > Du muĂ?t auf jeden Fall das I2C Protokoll verstanden haben, sonst kommst Du auf Dauer nicht
> > weiter. Es gibt in den Demoprogrammen auch ein Projekt, welches auf ein I2C EEPROM zugreift.
> > Zusammen mit dem 24C64 Datenblatt hilft das zusätzlich den Zugriff zu verstehen.
> >
> > Gruss Peter
> >
> >
> > P.S. Lautet Deine email Adresse nun "a-puetz@a.." oder "j-meinberg@a.."?  :-)
>
>
> Danke für die schnelle Antwort....ich glaube ich hab mein Problem schlecht, mi�verständlich
> beschrieben.....das Problem ist folgendes:
> Verschiedene Byte auf den PCF8574 schreiben uind lesen ist kein Problem.
>
> Ich möchte eigentlich folgendes machen:
>
> Ich schreibe ein Byte, sagen wir 00000001 zum PCF8547. Wenn dann z.B.  "Taster1" = 0
> dann soll das  vierte Bit zu "1" wechseln, die "1" des ersten Bit´s soll unverändert bleiben.
> ( 00001001)
>
> Mein Gedanke ist zuerst das Byte vom PCF8574 zu lesen, im Byte
> das 4.Bit auf "1" setzen und dann wieder in den PCF zurĂĽckzuschreiben...theoretisch...
>
> Mein Problem ist eigentlich "nur" wie verändere ich im Programm das gelesene Byte?
>
> Gelesen 00000001...."wenn  Taster1 betätigt"  dann soll vom
> gelesenen Byte das 4.Bit  "1" werden> 00001001  
>
> Danke nochmal! Werde auch mal in Deinen Links mich schlau machen!
>
> GruĂ? Wolfgang

Hallo Wolfgang,

laut Doku ist das lesen vom PCF8547 nur für Eingänge gedacht, es wird wohl nicht
funktionieren die Konfiguration der Ausgänge rücklesen zu wollen. Du mu�t Dir halt in
einer byte Variable den Zustand merken. So ändert man einzelne Bits in Bytes:

var= var|0x08; // 0x08 = 4. Bit wird gesetzt oder
var= var|(1<<3); // 4. Bit wird gesetzt

var= var&(~0x08); // 0x08 = 4. Bit wird zurĂĽckgesetzt - ausmaskieren mit dem Inversen

Ausmaskieren heiĂ?t hier ein Undieren mit allen Bits = 1, auĂ?er dem Bit was ich zurĂĽcksetzen
will. Schau Dir mal die Boolesche Algebra an und wie man in Programmiersprachen damit umgeht.

Gruss Peter


    Antwort schreiben


Antworten:

Re: PCF8574 Ports einzeln ansteuern, Mega 128 (von Wolfgang Meinberg - 23.07.2010 17:55)
    Re: PCF8574 Ports einzeln ansteuern, Mega 128 (von Manfred - 25.07.2010 19:48)