¿Qué tan rápida es la salida digital mbed

1

Necesito generar enteros de 8 bits a través de paralelo (es decir, usando 8 pines en el mismo puerto) a 1024 hz. Por lo que puedo ver, tengo dos opciones:

1) Escriba en cada pin individualmente utilizando DigitalOut.

2) Evita la biblioteca mbed por completo y haz algo como:

void sendByte(char byte)
{ 
    DataPort|= (((byte >>0x00) & 0x01) << LCD_D0);
    DataPort|= (((byte >>0x01) & 0x01) << LCD_D1);
    DataPort|= (((byte >>0x02) & 0x01) << LCD_D2);
    DataPort|= (((byte >>0x03) & 0x01) << LCD_D3);
    DataPort|= (((byte >>0x04) & 0x01) << LCD_D4);
    DataPort|= (((byte >>0x05) & 0x01) << LCD_D5);
    DataPort|= (((byte >>0x06) & 0x01) << LCD_D6);
    DataPort|= (((byte >>0x07) & 0x01) << LCD_D7);
}

He escuchado que DigitalOut es bastante lento, aunque no estoy seguro de qué frecuencia puede manejar. ¿Es probable que la segunda opción sea más rápida? ¿Alguien puede comparar los dos métodos?

PREGUNTA LATERAL: Usaré la salida con un DAC para producir una señal analógica. ¿Necesitaré usar un búfer en medio, o se garantiza que los pines salgan simultáneamente?

    
pregunta 19172281

2 respuestas

0

El código mbed parece ser este:

void port_write(port_t *obj, int value) {
    *obj->reg_out = (*obj->reg_in & ~obj->mask) | (value & obj->mask);
}

Por lo tanto, no es en este caso el uso de bandas de bits, e incluye la sobrecarga de lectura / modificación / escritura. Eso lo hace no óptimo para los casos en que conoce el último valor escrito.

Al calcular el valor del byte directamente, se guardan 7 escrituras, 8 lecturas y las operaciones aritméticas. También obtiene actualizaciones síncronas de todo el byte a la vez, en lugar de cambiar cada bit en secuencia. Esto es bastante crítico para su aplicación DAC, e incluso entonces debe considerar la fluctuación entre líneas individuales.

Probablemente puedas usar el marco mbed para configurar el GPIO y proporcionar las direcciones de registro (haciendo que tu código sea un poco más portátil).

    
respondido por el Sean Houlihane
0
  

PREGUNTA LATERAL: Usaré la salida con un DAC para producir una señal analógica. ¿Tendré que usar un búfer en medio, o se garantiza que los pines salgan simultáneamente?

No necesita un búfer intermedio, si actualiza todos los bits con solo un sencillo escriba en la ubicación de la memoria especial (también conocida como registro ) que controla esa Puerto de E / S.

El código en su pregunta no escribirá todos los bits al mismo tiempo, pero esto:

void sendByte(char value)
{ 
    uint32_t temp = DataPort;
    //clear the pins connected to D0..D7
    temp &= ~((1 << LCD_D0)
            | (1 << LCD_D1)
            | (1 << LCD_D2)
            | (1 << LCD_D3)
            | (1 << LCD_D4)
            | (1 << LCD_D5)
            | (1 << LCD_D6)
            | (1 << LCD_D7));
    //Write the value to the pins
    temp |= (((value >> 0) & 1) << LCD_D0)
          | (((value >> 1) & 1) << LCD_D1)
          | (((value >> 2) & 1) << LCD_D2)
          | (((value >> 3) & 1) << LCD_D3)
          | (((value >> 4) & 1) << LCD_D4)
          | (((value >> 5) & 1) << LCD_D5)
          | (((value >> 6) & 1) << LCD_D6)
          | (((value >> 7) & 1) << LCD_D7);
    //apply the new value to the I/O register. All pins are updated at once.
    DataPort = temp;
}  

También puede hacer que el código sea más eficiente conectando las líneas de datos a los pines de E / S que se asignan a bits secuenciales en los registros de puertos de E / S (por ejemplo, D0 a PORT_A_3, D1 a PORT_A_4 ... D7 a PORT_A_10)

Entonces podrías simplificar esa función para simplemente

#define LCD_D0 3
void sendByte(char value)
{ 
    DataPort = (DataPort & ~(0xFF << LCD_D0)) | (value & 0xFF) << LCD_D0);
}  

Cuando se trata del MBED general, no tengo idea.

    
respondido por el jms

Lea otras preguntas en las etiquetas