Alessandro Balvis
Centro Ricerche Enel - Pisa
[EMAIL PROTECTED]
----- Original Message -----
From: "Alessandro Balvis" <[EMAIL PROTECTED]>
To: "Michael Schippling" <[EMAIL PROTECTED]>
Sent: Wednesday, November 09, 2005 6:31 PM
Subject: Re: [Tinyos-help] Programming FFT with MDA300
I eliminate the state variable, but it still didn't work.
Also, I have reduced the number of the samples, beause I suspected that
something was wrong
with the timing of the task. In fact the MCU couldn't compute the FFT and
send the packet in
the same time that the MDA300 finished the acquisition of data. With N=8
for
example everything
works without problem. I would increase the interval of the timer, but the
max number is 1024*31 (in fact is 32768).
How can I use the timer with a larger interval? It's possible?
Thanks.
Alessandro Balvis
Centro Ricerche Enel - Pisa
[EMAIL PROTECTED]
----- Original Message -----
From: "Michael Schippling" <[EMAIL PROTECTED]>
To: "Alessandro Balvis" <[EMAIL PROTECTED]>
Cc: <[email protected]>
Sent: Tuesday, November 08, 2005 11:35 PM
Subject: Re: [Tinyos-help] Programming FFT with MDA300
I would suspect the use of your "sending_packet" state variable.
It may be getting reset by the sendDone() in the midst of doing
your data acquisition, which will prevent the next message start.
MS
Alessandro Balvis wrote:
Hy, I'm working with the MDA300 and Micaz for data analysis of a
signal.
I have some problem with the code about the sending data. Everything
works good until the event "Send.done", that block the acquisition of
data from MDA300, while the Timer is still working. I try to send some
results from the implemented FFT, just to try the send task with the
radio. It works just once, the first time, then it stops. Why the
event
blocks the execution of FFT? There is some problem with the timing of
the command and event?
I list the code for explication, any suggest or comment is
appreciated,
thanks.
Alessandro Balvis
Centro Ricerche Enel - Pisa
[EMAIL PROTECTED] <mailto:[EMAIL PROTECTED]>
includes sensorboard;
includes sinewave;
module MDA300M
{
provides interface StdControl;
uses {
interface Leds;
//Sampler Communication
interface StdControl as SamplerControl;
//interface StdControl as SubControl;
interface Sample;
//interface LoggerWrite;
//interface LoggerRead;
//RF communication
interface StdControl as CommControl;
interface Send;
interface RouteControl;
interface CC2420Control as Radio;
//Timer
interface Timer;
}
}
implementation
{
#define RATE_TIMER 50 // in decimi di secondo
#define ANALOG_SAMPLING_TIME 1
#define MDA300_PACKET1 1
#define INTERVAL_TIMER 1024 * 14
#define NSIGNAL 128
uint16_t fr[NSIGNAL];
uint16_t fi[NSIGNAL];
uint16_t index;
#define LOG2NSIGNAL 7 //ATTENZIONE!!
Impostare bene il parametro
uint16_t mr, nn, i, j, l, k, istep, n, shift;
uint16_t qr, qi, tr, ti, wr, wi;
uint16_t m;
//dimensione dei dati 2^m
//#define PACKET1_FULL 1 // contatore per
riempire
pacchetto
#define MSG_LEN 40 // excludes TOS
header, but includes xbow header
enum {
SENSOR_ID = 7,
POWER = 9,
FREQ = 10,
DATA_START = 12,
} PacketDataEnum;
/* Messages Buffers */
//TOS_Msg packet;
TOS_Msg radio_send_buffer;
TOS_MsgPtr radio_msg_ptr;
char *ptr_store;
uint8_t msg_status;
uint16_t Len;
uint8_t power;
uint16_t freq;
uint8_t nsam, z;
bool working;
bool sending_packet;
int8_t record[4];
/***************************************************************************
*
* Inizializzo i componenti.
*
****************************************************************************
/
command result_t StdControl.init() {
call Leds.init();
atomic {
radio_msg_ptr = call Send.getBuffer(&radio_send_buffer,&Len);
}
msg_status = 0;
nsam = NSIGNAL-1;
z = 0;
working = FALSE;
sending_packet = FALSE;
call SamplerControl.init();
call CommControl.init();
return SUCCESS;
}
/***************************************************************************
*
* Avvio i componenti. Avvio il clock. Setup del campionamento
*
****************************************************************************
/
command result_t StdControl.start() {
call SamplerControl.start();
call CommControl.start();
call Timer.start(TIMER_REPEAT, INTERVAL_TIMER);
return SUCCESS;
}
/***************************************************************************
*
* Blocco i componenti.
*
****************************************************************************
/
command result_t StdControl.stop() {
call SamplerControl.stop();
return SUCCESS;
}
/***************************************************************************
*
* Trasmissione del paccheto via radio
*
****************************************************************************
/
task void send_radio_msg()
{
power = (uint8_t) call Radio.GetRFPower();
radio_msg_ptr->data[POWER] = power;
freq = (uint16_t) call Radio.GetFrequency();
radio_msg_ptr->data[FREQ] = freq;
radio_msg_ptr->data[FREQ+1] = (freq >> 8);
//radio_msg_ptr->data[RSSI] = radio_send_buffer.strength;
radio_msg_ptr->data[SENSOR_ID] = SENSOR_BOARD_ID;
radio_msg_ptr->data[SENSOR_ID+1] = (SENSOR_BOARD_ID >> 8);
call Send.send(radio_msg_ptr,Len);
}
/***************************************************************************
*
* Inserimento dati in pacchetto
*
****************************************************************************
/
task void insert_result() {
uint16_t ibuff;
ibuff = 0;
for (ibuff = 0; ibuff < 15; ibuff += 1) {
radio_msg_ptr->data[DATA_START+ibuff] = 79; //fr[ibuff];
}
post send_radio_msg();
}
/***************************************************************************
*
* Elaborazione dati tramite FFT
*
****************************************************************************
/
task void fix_fft() {
m = 7; //ATTENZIONE!!
Impostare bene il parametro
n = 1 << m;
mr = 0;
nn = n - 1;
tr = 0;
ti = 0;
shift = 1;
istep = 0;
call Leds.yellowOn();
//Decimazione nel tempo e riordino dei dati
for (m = 1; m<=nn; ++m) {
l = n;
do {
l >>= 1;
} while (mr+l > nn);
mr = (mr & (l-1)) + 1;
if (mr <= m) {
tr = fr[m];
fr[m] = fr[mr];
fr[mr] = tr;
ti = fi[m];
fi[m] = fi[mr];
fi[mr] = ti;}
}
l = 1;
k = LOG2NSIGNAL;
while (l < n) {
shift = 1;
istep = l << 1;
for (m = 0; m < l; ++m) {
j = m << k;
if (j >= NSIGNAL/2) {
wr = -sinewave[j-NSIGNAL/2+NSIGNAL/4];
wi = sinewave[j-NSIGNAL/2];
} else {
wr = sinewave[j+NSIGNAL/2];
wi = -sinewave[j];
}
if (shift) {
wr >>= 1;
wi >>= 1;
}
for (i = m; i < n; i += istep) {
j = i + l;
tr = ((wr)*(fr[j]))-((wi)*(fi[j]));
ti = ((wr)*(fr[j]))+((wi)*(fi[j]));
qr = fr[i];
qi = fi[i];
if (shift) {
qr >>= 1;
qi >>= 1;
}
fr[j] = qr - tr;
fi[j] = qi - ti;
fr[i] = qr + tr;
fi[i] = qi + ti;
}
}
--k;
l = istep;
}
for (m = 0; m < NSIGNAL-1; m += 1) {
//conversione in forma polare
fr[m] = fr[m] >> 12;
fi[m] = fi[m] >> 12;
fr[m] = fr[m]*fr[m];
fi[m] = fi[m]*fi[m];
fr[m] = sqrt(fr[m]+fi[m]);
dbg(DBG_USR1, "Ale: X(k=%d)=%d\n", m, fr[m]);
}
call Leds.yellowOff();
post insert_result();
}
/***************************************************************************
*
* Messaggio trasmesso via radio.
****************************************************************************
/
event result_t Send.sendDone(TOS_MsgPtr pMsg, result_t success) {
radio_msg_ptr = pMsg;
call Leds.redToggle();
atomic {
sending_packet = FALSE;
}
return SUCCESS;
}
/***************************************************************************
*
* Timer Fired -
*
****************************************************************************
/
event result_t Timer.fired() {
call Leds.greenToggle();
atomic {
working = TRUE;
sending_packet = TRUE;
}
record[3] = call
Sample.getSample(7,ANALOG,ANALOG_SAMPLING_TIME,AVERAGE_FOUR);
return SUCCESS;}
/***************************************************************************
*
* Gestisco l'evento dataReady singolarmente
* per tutti i tipi di dati generati dal MDA300
****************************************************************************
/
event result_t Sample.dataReady(uint8_t channel,uint8_t
channelType,uint16_t dato) {
switch (channelType) {
case ANALOG:
switch (channel) {
case 7:
if (working) {
fr[z]=(int16_t) 1000*((dato/2048) - 1);
//normalizzo il valore del seganel e
call Leds.yellowToggle();
//moltiplico per mille per operare con interi
atomic {z += 1;
nsam -= 1;
}
break;
}
}
default:
break;
}
atomic {
if (nsam == 0 && sending_packet) {
z = 0;
nsam = NSIGNAL-1;
working = FALSE;
post fix_fft();
}
}
return SUCCESS;
}
}
------------------------------------------------------------------------
_______________________________________________
Tinyos-help mailing list
[email protected]
https://mail.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help
_______________________________________________
Tinyos-help mailing list
[email protected]
https://mail.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help