Paso 8: Firmware - microcontrolador secundario
Coloque uno de los MSP430G2553 en el Launchpad y conéctelo a su computadora. Descargar el código proporcionado y abrirlo en Energia. A continuación proporcionamos un esbozo general de cómo las funciones de código. No se cubre la operación de la biblioteca de teclado ya está bastante bien documentado aquí
El microcontrolador secundario es responsable de comunicarse con el MCP3008 sobre SPI e interpretación entrada del telclado numérico. He incluido el código del microcontrolador secundario para este proyecto y un demo que hice para comunicarse con el MCP3008 en general (solo tutorial que encontré fue para Raspberry Pi). Esto debería funcionar en Launchpad y Arduino creo.
Entender el código
Cuando una clave es presionada, liberada o sostenida, se llama a la función llamada keypadEvent. Esta función es responsable de enviar mensajes al microcontrolador principal cuando cambia el estado del teclado.
De todos modos, cuando se presiona una tecla por ejemplo, SendKeypadEvent se llama con los argumentos de clave (tecla presionada), una verdadera (1, lo que significa que la tecla fue presionada), digitalRead P1.7 (que es el interruptor de 2 vías que identifica la plataforma que se ve afectada por la pulsación de la tecla), y el modo actual (que se determina en el bucle principal del programa).
SendKeypadEvent formatos de mensaje que puede ser entendido más adelante abajo de la línea. Consulte el paso anterior para obtener más información acerca de cómo está formateado el protocolo para cada control. Envía dos bytes que indica al programa Qué tecla fue presionada (o si fue liberado), la cubierta actual y el modo actual.
Ahora si nos fijamos en el bucle principal del programa vemos algunos trozos de código. El primer bit del código Lee que cualquier nueva pulsación de las teclas y el teclado se envía desde allí. La segunda sección Lee todos los controles analógicos. La tercera sección, envía un mensaje de cambio de cubierta. Esto se hace en el bucle principal mediante un indicador establecido por la rutina de servicio de interrupción porque enviar datos en serie en de ISR están ineficientes.
Las perillas son todas las clases de SPI_Control. Esto localiza todas las variables y métodos y permite registrar cualquier número de mandos que necesita. El bucle principal sólo comprueba si la clase ha determinado un valor nuevo (bastante), y si hay, envía un mensaje detallando lo que mando y es lo que el nuevo valor. Mi comentario en el código resume la comunicación con el MCP3008 sobre SPI bastante bien:
En lectura de datos de la MCP3008 ADC IC:
Tenga en cuenta que el SPI está en modo 0,0, que significa SCLK huelga en estado 'bajo'
Pasos
- Perno de tirón CS/SS (selección de Chip select/esclavo) baja (0)
- Enviar datos de bit de start, 00000001 o 0 x 01 (Lea la hoja de datos)
- Enviar los datos de selección de canal de configuración de entrada
- Nota: Formato de datos de configuración de entrada: SGL/DIFF, D2, D1, D0, X, X, X, selecciona X. SGL/DIFF no importa qué modo, D2, D1 y D0 (3 bits) Seleccione el canal a leer (0-7) y XXXX. 1 = balanceado, 0 = diferencial
- ¿El primer byte recibido será el siguiente:? /? /? /? /? / 0/B9/B8, donde? es desconocido, 0 es un null, y B9 y B8 son los primeros bits de la muestra de 10 bits. El siguiente byte recibido será el resto de la muestra de 10 bits
- Para obtener una lectura significativa, tenemos que combinar los bits 2 desde el primer mensaje con el segundo mensaje. Podemos lograr esto por recortar los 6 primeros bits del primer byte (usando bitwise & con la máscara 0b00000011) cambiando los bits 8 a la izquierda y el ing de OR bit a bit del primer byte con el segundo byte
- Comunicación final estableciendo CS/SS alto
Eso es un poco confuso, pero todo lo que necesitas saber es que la función readADC sólo obtiene un valor de 10 bits de la MCP3008 para cualquier canal.
Si nos fijamos en la función SendDeckChange, notará que se envía como una pulsación de teclado. Puesto que sólo tenemos 12 teclas, pero representa la tecla que se presionó con 4 bits, podemos usar 12-15 para lo que sea porque nunca será ser recibidos como entrada del hardware. Así que utilizamos la tecla ID 15 para representar cambios de baraja.
Eso es bastante. Cada ciclo de reloj del microcontrolador analiza para ver si un botón del teclado ha sido presionado, consultas al MCP3008 para todos los valores de la perilla y comprueba si han cambiado dentro de una cierta sensibilidad y también comprueba si el interruptor de la cubierta ha sido movido de un tirón. Ver el código para una explicación más detallada, está bastante bien comentado.
Cargar el código
Ahora debe tener una comprensión de cómo funciona el firmware del microcontrolador secundario, así que vamos adelante y subirlo! Obtener el código que postee en su ventana de código de Energia y haga clic en la marca de verificación en la esquina para verificar/compilación. Debe comprobar todos fuera. Cuando eso se hace, cargar el código en el microcontrolador haciendo clic en la flecha situada junto a la marca de verificación. Cuando es completa, desconecte el Launchpad, retirar el microcontrolador y ponerlo a un lado por ahora.