Hi,
I'm also working with the MDA300 and MICAz. I have some problems which may be straightforward to you guys.

1. How to setup the sampling rate? Can I just change ANALOG_SAMPLING_TIME (for example, 10)? I tried. But it didn't make any difference, or the sensor worked a few seconds and then stopped.
2. Does Sample.getSample() trigger a continuous sampling with the ANALOG_SAMPLING_TIME interval?
3. How is radio (UART) communication called when data ready?
4. What is the timer used for?

Thanks.

LT


On 11/8/05, Michael Schippling <[EMAIL PROTECTED]> wrote:
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

_______________________________________________
Tinyos-help mailing list
[email protected]
https://mail.millennium.berkeley.edu/cgi-bin/mailman/listinfo/tinyos-help

Reply via email to