cómo marcar la hora de los paquetes con CC2420 y MSP430F1611

3

Estoy trabajando en un proyecto de sensores que utiliza TelosB basado en CC2420 y MSP430F1611 ejecutando TinyOS . Y quiero marcar la hora de cada paquete entrante, cuyo tiempo de recepción se indica mediante el aumento del pin SFD de CC2420. El pin SFD de CC2420 está conectado a P4.1 / TB1 de MSP430F1611 como se ve en esquemático . Una forma sencilla es almacenar las marcas de tiempo en búfer: siempre que se capture un flanco ascendente SFD (por ejemplo, por el canal 1 de TimerB), almacene la marca de tiempo capturada en una cola. Cuando cada paquete se lee desde RXFIFO, se desalinea y se asocia con una marca de tiempo. Esto es realmente lo que hace el controlador de radio predeterminado en TinyOS. Hay varios problemas con este enfoque.

(1) Antes de que una marca de tiempo capturada se coloque en la cola, otro paquete llega y activa un borde ascendente de SFD, sobrescribiendo la marca de tiempo anterior. No hay una marca de tiempo para el paquete correspondiente. Lo que es peor, se desconoce qué marca de tiempo restante corresponde al paquete recibido. La asignación del paquete y la marca de tiempo está desordenada.

(2) Algunos paquetes son descartados por CC2420 (por ejemplo, no pasan el reconocimiento de dirección) y no se colocan en RXFIFO. Sin embargo, todavía genera SFD alza. No hay ningún paquete para la marca de tiempo correspondiente. De nuevo, el mapeo es desordenado.

¿Alguien puede, por favor, darme una pista sobre cómo superar estos dos problemas y los paquetes de marca de tiempo correctamente, especialmente bajo una carga pesada? Mi requerimiento puede ser relajado para no marcar la hora de todos los paquetes correctamente, sino una fracción de ellos. Su ayuda será sinceramente apreciada.

    
pregunta sinoTrinity

1 respuesta

1

El método que describiste parece que no sufrirá el primer problema que describiste. Excepto en circunstancias extremas o algún tipo de implementación de sondeo. ¿No está utilizando una interrupción para colocar la marca de tiempo en la cola? Tomaría tal vez 15 ciclos para completar la copia, ¿qué tan rápido entran los paquetes?

// Timer B0 interrupt service routine
#pragma vector=TIMERB1_VECTOR
__interrupt void Timer_B (void)
{
 *Timestamp_RX_Write++ = TBR;   // Copy TBR value into timestamp buffer
 if(Timestamp_RX_Write >= Timestamp_RX_Buffer + Timestamp_Buffer_Size)
    Timestamp_RX_Write -= Timestamp_Buffer_Size;
}

Esto supondría que creaste tu FIFO de esta manera:

unsigned int Timestamp_RX_Buffer[Timestamp_Buffer_Size];    // Timestamp buffer
volatile unsigned int *Timestamp_RX_Read = Timestamp_RX_Buffer;// Read pointer
volatile unsigned int *Timestamp_RX_Write = Timestamp_RX_Buffer;// Write pointer

Para el segundo problema, simplemente saque las marcas de tiempo de la cola cuando esté revisando / verificando los paquetes, si el direccionamiento falla, se desechará esa marca de tiempo.

Timestamp = *Timestamp_RX_Read++;  // Load the time stamp value from the queue
if(Timestamp_RX_Read >= Timestamp_RX_Buffer + Timestamp_Buffer_Size)
   Timestamp_RX_Read -= Timestamp_Buffer_Size;

if(Packet_Address!=Correct_Address)
   return;

Obviamente, deberá verificar los desbordamientos en su contador o, al menos, mantener un índice de ejecución con paquetes RXed para poder ordenarlos correctamente más adelante. Pero eso dependerá de cómo utilice las marcas de tiempo, tal vez todo lo que necesita es la diferencia entre dos marcas de tiempo. Podría dar más ayuda si describe con más detalle su solicitud.

    
respondido por el Samuel

Lea otras preguntas en las etiquetas