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