Hi Bharti,

Also, I'd make sure to call I2CPacket.isOwner() inside 
I2CPacket.readDone() just to make sure, and populate your local.reading 
array if the return value of isOwner yields TRUE.

Sergio


On 02/27/2012 09:34 AM, András Bíró wrote:
> 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
>
_______________________________________________
Tinyos-help mailing list
[email protected]
https://www.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to