Hi,

I do not understand what you mean. Yes, the address is 7 bit but the last r/w 
bit is also sent with the address to make it 8 bit.  So 0x20 will be 0x40 for 
write right?

I am a little confused how we understand the address byte. According the 
PCF8591 datasheet, the address byte format is :

1001 A2 A1 A0 R/W 

So this would make the address to be 90/91 if A2, A1, A0 = 000 or 92/93 if A2 
A1 A0 = 001.

However this does not work. For one chip it works for 48, 49.

Do you understand this? Thanks

BG
________________________________________
From: András Bíró [[email protected]]
Sent: Tuesday, February 28, 2012 1:34 AM
To: #BHARTI GOEL#
Cc: [email protected]
Subject: Re: [Tinyos-help] Reading two PCF8591 chips over I2C bus

Hi,

I think that code shouldn't work with one sensor eighter. The
I2CPacket interface only needs the 7 bit address, whithout the
read/~write bit. So your address for the 0x40/0x41 chip is 0x20.

Andris

On Mon, Feb 27, 2012 at 6:10 PM, #BHARTI GOEL# <[email protected]> wrote:
> Hi,
>
> I am trying to interface PCF8591 chips over I2C bus with an iris mote to get
> pressure sensor reading. When I use one chip, my program is working. However
> when I add one more chip , it stops after taking one reading. I am not sure
> what the problem is. I am reading the 2 chips in sequence one after the
> other. I am using Atm128I2CMasterC as the master device for both the chips.
> Here is my code. Thanks a lot
>
> #include <I2C.h>
> #include "Timer.h"
> #include "bed.h"
>
> module BedC @safe() {
>     uses {
>         interface Boot;
>         interface Leds;
>         interface Timer<TMilli>;
>         //I2C
>         interface Resource as I2CResource;
>         interface I2CPacket<TI2CBasicAddr> as I2CPacket1;
>         interface I2CPacket<TI2CBasicAddr> as I2CPacket2;
>         // RADIO COMMUNICATION
>         interface AMSend;
>         interface SplitControl as RadioControl;
>
>     }
> }
>
> implementation {
>
>     message_t sendBuf;
>     bool sendBusy = FALSE;
>     bed_t local;
>     uint8_t getDataCommand;
>     uint8_t* readData;
>     bool isReadyToSend = FALSE;
>     uint8_t prevData[NREADINGS];
>     //bool isDetection = FALSE;
>
>
>     event void Boot.booted() {
>         local.id = TOS_NODE_ID;
>         call RadioControl.start();
>     }
>
>     event void RadioControl.startDone(error_t error) {
>
>         call Timer.startPeriodic(3000);
>     }
>
>     event void RadioControl.stopDone(error_t error) {
>     }
>
>     task void sendData() {
>         if (!sendBusy && sizeof local <= call AMSend.maxPayloadLength()) {
>             memcpy(call AMSend.getPayload(&sendBuf, sizeof(local)), &local,
> sizeof local);
>             if (call AMSend.send(AM_BROADCAST_ADDR, &sendBuf, sizeof local)
> == SUCCESS) {
>                 sendBusy = TRUE;
>                 local.count++;
>             }
>         }
>     }
>
>     event void Timer.fired() {
>         if(isReadyToSend) {
>             call Leds.led0Toggle();                 //red
>             post sendData();
>             isReadyToSend = FALSE;
>         } else {
>             call Leds.led2Toggle();                 //yellow
>             call I2CResource.request();
>         }
>     }
>
>     event void I2CResource.granted() {
>         getDataCommand = 0x43;
>         if(call I2CPacket1.write(I2C_START | I2C_STOP, 0x48, 1,
> (uint8_t*)(&getDataCommand)) == SUCCESS) {
>
>         }
>     }
>
>     async event void I2CPacket1.writeDone(error_t success, uint16_t addr,
> uint8_t length, uint8_t* data) {
>         if(call I2CPacket1.read(I2C_START | I2C_STOP, 0x49, 4,
> (uint8_t*)(&readData)) == SUCCESS) {
>
>         }
>     }
>
>     async event void I2CPacket1.readDone(error_t success, uint16_t addr,
> uint8_t length, uint8_t* data) {
>
>         if(success == SUCCESS) {
>             local.reading[0] = readData[0];
>             local.reading[1] = readData[1];
>             local.reading[2] = readData[2];
>             local.reading[3] = readData[3];
>             //call Leds.led1Toggle();  //green
>
>
>         }
>         if(call I2CPacket2.write(I2C_START | I2C_STOP, 0x40, 1,
> (uint8_t*)(&getDataCommand)) == SUCCESS) {
>
>         }
>     }
>
>     async event void I2CPacket2.writeDone(error_t success, uint16_t addr,
> uint8_t length, uint8_t* data) {
>         if(call I2CPacket2.read(I2C_START | I2C_STOP, 0x41, 4,
> (uint8_t*)(&readData)) == SUCCESS) {
>
>         }
>     }
>
>
>         async event void I2CPacket2.readDone(error_t success, uint16_t addr,
> uint8_t length, uint8_t* data) {
>
>         if(success == SUCCESS) {
>             local.reading[4] = readData[0];
>             local.reading[5] = readData[1];
>             local.reading[6] = readData[2];
>             local.reading[7] = readData[3];
>             isReadyToSend = TRUE;
>             call I2CResource.release();
>
>         }
>
>
>         }
>
>
>     event void AMSend.sendDone(message_t* msg, error_t error) {
>         call Leds.led1Toggle();  //green
>         sendBusy = FALSE;
>     }
>
> }
>
> --------------------------------------------------------------////
>
> configuration BedAppC { }
>
> implementation
> {
>     components BedC, MainC, LedsC, ActiveMessageC,
>     new TimerMilliC(), new Atm128I2CMasterC() as Atm128I2CMasterC, new
> AMSenderC(AM_BED);
>
>     BedC.Boot -> MainC;
>     BedC.Leds -> LedsC;
>     BedC.I2CResource -> Atm128I2CMasterC;
>     BedC.I2CPacket1 -> Atm128I2CMasterC;
>     BedC.I2CPacket2 -> Atm128I2CMasterC;
>     BedC.Timer -> TimerMilliC;
>     BedC.AMSend -> AMSenderC;
>     BedC.RadioControl -> ActiveMessageC;
> }
>
>
> regards
> Bharti
>
>
> _______________________________________________
> Tinyos-help mailing list
> [email protected]
> https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help



_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to