Salida de datos multiplexados a una pantalla de puerto paralelo

Pantalla de bus de datos de multiplexación con salida paralela y puerto serie Arduino.

El artículo describe el método de multiplexar el uso del puerto D del microprocesador ATMEL 328P (Arduino NANO) para proporcionar una salida de bytes alternativa a la pantalla y el intercambio a través del canal serie.

De alguna manera, ensamblé un dispositivo para monitorear el nivel de monóxido de carbono (CO) de elementos innecesarios: una pantalla de Nokia N95, Arduino NANO con puertos defectuosos (D3 y D11, roto debido a un cortocircuito fallido a +400 voltios al depurar un generador de alto voltaje), placas Reproducción de fragmentos de sonido y sensor de monóxido de carbono MQ7. Todos estos detalles en un grado u otro fueron defectuosos (excepto el sensor) y no se pudieron encontrar en ningún otro proyecto. Por extraño que parezca, resultó que el dispositivo es muy útil cuando se usa una estufa en el país. El verano de 2019 resultó no ser caluroso y calenté la estufa casi todos los días durante un par de semanas en julio, combinando agradable (meditación sobre la llama) con útil (reciclaje de árboles de basura aserrados). Resultó ser muy fácil controlar los regímenes de combustión, todas las manipulaciones con las aletas se reflejaron inmediatamente en las lecturas del dispositivo, lo que permitió controlar la estufa de manera inteligente. El dispositivo no se describe en este artículo; hay muchos dispositivos de este tipo en Internet para todos los gustos. Una característica distintiva de mi dispositivo es la función de monitoreo continuo de la salud del sensor de CO basado en una comparación de la curva de referencia almacenada y obtenida en tiempo real, así como la alta velocidad de reacción a los cambios en el nivel de CO logrado al comparar los datos almacenados en el ciclo anterior con los actuales.

El objetivo de este artículo es aumentar la velocidad del procesador y la pantalla con el intercambio de datos de bytes paralelos.

La pantalla tiene un intercambio de bytes paralelo y, a pesar del uso de todos los métodos que conozco para aumentar el tipo de cambio, la salida resultó ser bastante lenta. La razón principal es la necesidad de generar un byte de datos a diferentes bits de diferentes puertos, ya que Arduino Nano no tiene un solo puerto completo con un ancho de un byte. Este modo de salida requiere aproximadamente 8 veces más tiempo que escribir un byte en un registro. NANO tiene un solo puerto D completo, pero sus bits menos significativos se utilizan para el puerto serie de hardware, a través del cual los bocetos se cargan en el procesador y el boceto se intercambia con la máquina host.

Encontré una forma relativamente simple de utilizar la salida de visualización byte por línea. Este método consiste en el uso alternativo del puerto D para enviar datos a una pantalla e intercambiar datos a través de un canal en serie.

El método propuesto puede aumentar significativamente la velocidad del intercambio integral con la pantalla (aproximadamente 3 veces según mis mediciones). La palabra "integral" significa que se midieron los tiempos totales de ejecución de las operaciones de representación de pantalla a nivel macro. Es probable que la medición del tiempo a nivel de E / S atómica proporcione una ganancia significativamente mayor (en la región del mismo orden).

Las mediciones se llevaron a cabo en un modelo especialmente ensamblado (ver Figura 1) de la siguiente manera:

  1. En el programa de prueba, se colocaron marcas de tiempo con la salida a la máquina host.
  2. La pantalla se conectó a los pines D2 - D9, se cargó un programa de prueba, en el que el byte se emitía distribuyendo el byte por bits.
  3. La pantalla se conectó a los terminales D0 - D7, se cargó un programa de prueba en el que el byte se emitió utilizando el comando PORTD = data.

imagen

imagen
Figura 1. Fotos del diseño para probar la multiplexación de salida

Los programas son exactamente iguales, el cambio del método de salida se realizó cambiando los nombres de las rutinas SendDat y SendCom a SendDat1 y SendCom1, respectivamente.
La salida del programa al monitor incorporado de la serie se grabó en OneNote y se analizó.

imagen
Figura 2. Medición del tiempo que se tarda en mostrar en el modo de salida de bytes

imagen
Figura 3. Medición del tiempo de pantalla en modo de salida de bits

Los resultados de la medición se resumen en la tabla 1.

imagen
Tabla 1. Ganancia integrada en tipo de cambio

Las desventajas del método propuesto son la necesidad de usar comandos adicionales para cambiar los modos de visualización e intercambiar a través de un puerto serie.
También puede esperar algunas dificultades al recibir datos de la máquina host, la recepción solo es posible con la inclusión explícita del modo de canal en serie, que requiere una organización clara de procesos basada en el tiempo en el boceto.

El estudio del manual del procesador proporcionó la siguiente información: la inclusión del modo de puerto serie intercepta el control de las patas D0 y D1 a nivel de hardware. Esto significa que los intentos de controlar las piernas desde el boceto no darán el resultado deseado.

Un estudio más detallado del problema mostró que si no incluye el puerto serie en el boceto con el comando Serial.open (), todo el puerto D queda a disposición del usuario. Puede poner el puerto en modo de salida en todos los tramos con el comando DDRD = 0xFF y generar el byte completo con el comando PORTD = data al mismo tiempo, donde la variable de datos contiene los datos de salida.

Poner el puerto D en modo de salida es suficiente una vez (en Configuración). El encendido y apagado posterior del modo de comunicación en serie no afecta el modo del puerto D; permanece en el modo de salida paralela de 8 bits. Cuando se activa el modo de intercambio en serie, los terminales D0 y D1 pasarán a los modos de recepción y transmisión, respectivamente. Aparecerá "1" en el pin D1, independientemente del estado anterior del bit D1, y este "1" estará en este pin todo el tiempo mientras el modo de transmisión en serie esté activado, excepto en los momentos de la transmisión del símbolo. Cuando se desactiva el modo de transmisión en serie, las salidas D0 y D1 pasarán al estado de salida y las señales del registro de salida aparecerán en ellas. Si en el registro de salida en lugar de D1 hay "0", se generará un borde negativo en la salida, lo que conducirá a la transmisión del carácter espurio al canal serie.

Ahora consideremos la pregunta, pero ¿tal uso del puerto D impedirá la descarga de programas? Cuando se carga el programa, el procesador se reinicia mediante el pulso generado por el controlador del puerto USB FT232RL (o su CH340 analógico) cuando se establece la señal DTR. La señal DTR va de 1 a 0 y una caída negativa a través del condensador restablece el procesador. Después de un reinicio, el procesador enciende el puerto serie, inicia el gestor de arranque y recibe el código del programa. Entonces, cambiar el modo de operación del puerto D no interfiere con la carga normal del boceto.
Si el boceto requiere salida al puerto serie, entonces el comando Serial.open () es suficiente antes que los comandos de salida.

Sin embargo, hay sutileza. Consiste en el hecho de que la entrada RxD del chip FT232RL permanece conectada a la salida TxD y los datos que van a la pantalla se reciben y se envían a la máquina host. Estos datos parecen ruido, aunque en realidad no lo son (Figura 4).

imagen
Figura 4. Vista de pantalla en modo de salida de bytes sin bloqueo

Hay dos formas de lidiar con esta señal innecesaria.

La primera forma es el software. Consiste en el hecho de que el boceto antes de la salida usa el comando Serial.println () para crear una nueva línea antes de la salida de información útil. Esto facilitará que la máquina host analice las líneas entrantes y resalte información útil del boceto.

La segunda forma es el hardware. La entrada RxD del FT232RL está conectada a la salida TxD a través de una resistencia de 1 kΩ. Para bloquear la transferencia de información, simplemente conecte la entrada RxD FT232RL a "1". Hacer que esta sea la forma más fácil es una de las conclusiones gratuitas de Arduino. Usé la salida de D8. Para realizar esta acción, solde al pin 7 de la resistencia RP1B con un valor nominal de 1 kΩ de cables con un conector al final, pasándolo a través de los agujeros en la placa para su fijación mecánica. En la Figura 5, esta conexión se muestra mediante una línea roja, la Figura 6 muestra una fotografía del punto de soldadura.

imagen
Figura 5. Parte del circuito Arduino Nano

imagen
Figura 6. Lugar de soldar un cable adicional en Arduino NANO

Este mecanismo funciona así: después de reiniciar, el tramo D8 está en modo de entrada de alta impedancia y la placa Arduino no interfiere con el funcionamiento normal del mecanismo de carga del programa en la placa.

Cuando es necesario comenzar a controlar la pantalla en el boceto, el pin D8 se cambia al modo pin activo, se establece en "1" (esto bloquea la transferencia de datos desde el pin TxD Atmel328P al pin RxD FT232RL) y luego se ejecuta el comando Serial.end (); El procedimiento es importante, porque después de apagar el modo de transmisión en serie, el bit D1 aparece en el pin TxD, que se almacena en el registro de salida del puerto D del registro de bytes anterior en este puerto. Si el bit D1 era "0", cuando el modo de transmisión en serie está desactivado, la pata del procesador cambiará de "1" a "0" y esto generará una transmisión de caracteres parásitos en el canal en serie.

En el proceso de depuración, también resultó que teníamos que esperar al final de la transferencia de todo el búfer a la máquina host antes de bloquear el canal serie, de lo contrario, algunos de los datos transmitidos se perderían.

Cuando un boceto necesita habilitar la transferencia de datos a través del puerto serie, es necesario activar el modo de transferencia en serie y desactivar el bloqueo de la transmisión de datos en serie configurando el modo de lectura en el pin D8.

Para realizar estas tareas, se agregaron dos rutinas al boceto:

void s_begin() { Serial.begin(115200); //    TxD   USART.  TxD   "1",  RxD   pinMode(8, INPUT); //    RxD FT232RL  "1",       RxD FT232RL } 

 void s_end() { Serial.flush(); //   pinMode(8, OUTPUT); //  FT232RL  "1"       .   D8_High; //    Serial.end(); //   .      TxD  RxD    D0(RxD)  D1(TxD)  D } 

Un programa de prueba completo se puede tomar aquí .

Source: https://habr.com/ru/post/476986/


All Articles