Re: PCF8591 Kategorie: I²C-Bus (von martin binder - 3.05.2002 14:04) | |
Als Antwort auf PCF8591 von Andre - 3.05.2002 10:35
| |
> Hallo > Hat jemand schon mal den PCF8591 Analog Baustein ausgelesen. Ich will die vier analog Eingänge lesen, schaffe es leider nicht. Wer hat eine routine dafür ? Ich bitte um Hilfe !!! > Gruss > Andre > Hallo, habe schon mal eine Routine geschrieben, ist eigentlich recht einfach. Den Treiber hab ich PCFA getauft, hier ist er: //****************************************************************** //* Treiberbibliothek für PCF8591 * //* * //* Author : Martin Binder * //* Version : 1.0 * //* Datum : 24. Juni 2001 * //* Geändert : 24. Juni 2001 * //* Getestet : ja * //* Benötigt : i2c.c2 * //****************************************************************** // Control - Byte Werte : 0 a b b 0 c d d * // a .... analog output enable (1 = EIN) * // bb ... Input prog. mode 00..4 Eingänge * // 01..3 differential-Eingänge * // 10..2 single, 2 differential * // 11..2 differential-Eingänge * // c .... Auto Increment (wenn 1 wird nächster Eingang gewählt) * // dd ... A/D-Kanalnummer 00 = 0, 01 = 1, 10 = 2, 11 = 3 * //****************************************************************** byte data; // Analogausgangswert an PCF senden //---------------------------------------------------- function aout(byte addr,byte contr,byte data) //addr.0-7(PCF8591) //---------------------------------------------------- { addr=addr*2 + 0x90; // 1001xxxr binär capture; i2c.start(addr); // Erstes Byte, schreiben, LSB = 0 i2c.write(contr); // Zweites byte, Control i2c.write(data); // Drittes Byte, Analogwert 00-FF (0-256) i2c.stop(); release; sleep 8; } // Analogeingangswert von PCF empfangen //---------------------------------------------------- function ain(byte addr) returns byte //---------------------------------------------------- { addr=addr*2 + 0x90; capture; i2c.start(addr+1); // erstes Byte, lesen, LSB = 1 data = i2c.readlast(); // Analogeingang wurde mit CONTR selektiert i2c.stop(); release; sleep 8; return data; } //********************************************* Treibereinbindung wie üblich, siehe TWBS und andere. Das Aufrufen im Hauptprogramm geht dann etwa so vor sich : ... //********************************************* byte i; // PCF- Adresse im System int digi; // Ausgangswert int ain0, ain1, ain2, ain3; // Eingangswerte // ... ( hier i und digi korrekt setzen ) pcfa.aout(i, 0x44, digi); // output on, increment on ain1 = pcfa.ain(i); // liest erst Wert 1, dann 0,1,2,3 ain0 = pcfa.ain(i); // dann Wert 0.. ain1 = pcfa.ain(i); // dann Wert 1... ain2 = pcfa.ain(i); // dann Wert 2... ain3 = pcfa.ain(i); // dann Wert 3 //********************************************* ... Warum beim Increment die Reihenfolge der Eingänge nicht stimmt, ist mir ein Rätsel. Aber wie oben beschrieben klappts ganz gut bei mir. Habe sechs PCF8591 - ICs am Bus hängen, die ich auf diese Weise ansteuere. Schönes Weekend und viel spa�... Martin | |
Antwort schreiben Antworten: Re: PCF8591 (von Andre - 4.05.2002 14:46) Re: PCF8591 (von martin binder - 6.05.2002 14:43) Re: PCF8591 (von Andre - 3.05.2002 16:34) Re: PCF8591 (von Andre - 3.05.2002 15:42) |