Hi,

I see one serious problem: you didn't allocate memory for readData.
By the way, what version of tinyos are you using? There was some
serious problem with i2cRead on AVR with tinyos-2.1.1 (and older), but
it's seems to work all right with svn (most problems was in
Atm128I2CMasterPacketP.nc, it's probably enough to replace the
/tos/chips/atm128/i2c directory with  newer version, but I'm not sure)

Andris

2012/2/29 #BHARTI GOEL# <[email protected]>:
> Hey,
>
> Thanks a lot. I now understand the address part. But even after the change, 
> it does not work. It sends the sensor reading just once over the radio. The 
> Base station blinks once and then stops. I do not understand this? I have 
> wired both the device to the Atm128I2CMasterC.
>
> I have also taken Sergio's advice to call the isOwner() as well. The LEDs 
> inside readDone() also just blink the first time to send the data and then 
> stop. What could be causing this? Here is the updated code. Thanks a lot.
>
> --------------------------------------------------------------------------
> 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;
> }
> ------------------------------------------------------------------------------
>
> #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 = 0x43;
>        uint8_t chipnumber =1;
>        uint8_t* readData;
>        bool isReadyToSend = FALSE;
>        uint8_t prevData[NREADINGS];
>
>
>        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) {
>                        isReadyToSend = FALSE;
>                        post sendData();
>
>                } else {
>
>                call Leds.led1Toggle();  //green
>                call I2CResource.request();
>
>                }
>        }
>
>        event void I2CResource.granted() {
>                call I2CPacket1.write(I2C_START | I2C_STOP, 0x48, 1, 
> (uint8_t*)(&getDataCommand));
>        }
>
>        async event void I2CPacket1.writeDone(error_t success, uint16_t addr, 
> uint8_t length, uint8_t* data) {
>                call I2CPacket1.read(I2C_START | I2C_STOP, 0x48, 4, 
> (uint8_t*)(&readData));
>
>        }
>
>        async event void I2CPacket1.readDone(error_t success, uint16_t addr, 
> uint8_t length, uint8_t* data) {
>
>        if ( call I2CResource.isOwner() == TRUE) {
>                if(success == SUCCESS) {
>                        local.reading[0] = readData[0];
>                        local.reading[1] = readData[1];
>                        local.reading[2] = readData[2];
>                        local.reading[3] = readData[3];
>                }
>                chipnumber++;
>                call Leds.led2Toggle();  //yellow
>                call I2CPacket2.write(I2C_START | I2C_STOP, 0x49, 1, 
> (uint8_t*)(&getDataCommand));
>                }
>        }
>
>        async event void I2CPacket2.writeDone(error_t success, uint16_t addr, 
> uint8_t length, uint8_t* data) {
>                call I2CPacket2.read(I2C_START | I2C_STOP, 0x49, 4, 
> (uint8_t*)(&readData));
>
>        }
>
>
>                async event void I2CPacket2.readDone(error_t success, uint16_t 
> addr, uint8_t length, uint8_t* data) {
>
>                if ( call I2CResource.isOwner() == TRUE) {
>                if(success == SUCCESS) {
>                        local.reading[4] = readData[0];
>                        local.reading[5] = readData[1];
>                        local.reading[6] = readData[2];
>                        local.reading[7] = readData[3];
>
>                        }
>                        chipnumber=1;
>                        call Leds.led0Toggle();                //red
>                        call I2CResource.release();
>                        isReadyToSend = TRUE;
>                }
>
>                }
>
>
>        event void AMSend.sendDone(message_t* msg, error_t error) {
>                sendBusy = FALSE;
>        }
>
> }
>
>
> ---------------------------------------------------------------------------------------------
>
> regards
> BG
> ________________________________________
> From: András Bíró [[email protected]]
> Sent: Wednesday, February 29, 2012 4:41 AM
> To: #BHARTI GOEL#
> Cc: [email protected]
> Subject: Re: [Tinyos-help] Reading two PCF8591 chips over I2C bus
>
> Hi,
>
> The address you provide to the i2cpacket will be automatically shift
> left, and r/~w bit will be added based on the command (read or write).
> So, your slave address is 1001 A2 A1 A0.
>
> Andris
>
> 2012/2/28 #BHARTI GOEL# <[email protected]>:
>> 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