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

Reply via email to