Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

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)