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
