Paso 3: ChipKIT Microcontrollers con chips PIC32
Vamos a comenzar con mi familia favorita personal de microcontroladores, el chipKIT. (Si lo desea, el esquema acortado para Arduino UNO es en el siguiente paso, pero la lógica se explica aquí). Usando procesadores de PIC32 de 32 bits de Microchip, el chipKIT tiene memoria mucho más, casi dos veces tantos pines de I/O y funciona mucho más rápido que las placas Arduino comparables, así que si usted necesita ese empuje extra, recomiendo mirar en conseguir uno. (Es también una buena idea familiarizarse con tantos dispositivos como sea posible para hacerte tan útil como sea posible a un empleador, si ese es su objetivo.)
Cada pin de I/O en un microcontrolador está conectado al menos tres registros diferentes. (Pernos que cumplen varias funciones asociadas a ellos tienen varios más, por ejemplo, PWM y I2C/SPI/UART). De los tres nos preocupa aquí, uno es el registro TRISx que determina que si el pin debe ser una entrada o una salida, donde "x" señala que TRIS estamos trabajando con el ya que hay varios (el pinMode() función establece TRISx). Poner un poco en TRISx como un 1 establecerá el pin correspondiente como entrada, y sigue ese ajuste como un 0 se el pin como salida. El siguiente es el registro LATx, que es donde asignamos un pin set como salida alta (1) o bajo (0) (digitalWrite() establece LATx). El último es el registro PORTx, y donde podemos leer el estado actual del perno cuando se encuentra a la entrada (digitalRead() Lee PORTx). Un bit '1' en PORTx indica que el pin de entrada correspondiente está detectando un alto valor de la lógica. Cada registro se actualiza con el reloj del autobús periférico mientras que el código se está ejecutando para el estado de entrada/salida en tiempo real. Técnicamente podrás leer/escribir a los tres de estos registros, pero que realmente sólo quiere escribir el TRISx registrarse una vez en su configuración() estado de cuenta al principio del boceto. Puede recuperar el estado de LATx y PORTx y utilizar esos datos según sea necesario, pero escribir un 1 en el registro LATx para un perno que se señala como una entrada no hará nada porque no salida (configurarla como una entrada al registro TRISx). ¿Confundido aún?
Mantener en camiones, hace sentido.
Para inicializar TRISx en setup(), primero necesitas saber que registro y bits están ligados a que pines. Usando la tabla de pines (ver adjunto archivo PDF más abajo) para el chipKIT Uno32, podemos ver que pines 26→33 muy bien se asignan para registrar E, brocas 0→7. (Me resulta más fácil de usar bits secuenciales en un registro. Más adelante tendremos que hacer algunas operaciones bit a bit y simplifica las cosas). Debe hacer sentido entonces que nos marquen TRISE, brocas 0→7. Mirando hacia atrás en el código, se determinó que 26→29 pasadores LED y 30→33 serían los interruptores. Mapa de 26→29 de pins para TRISE bits 0→3. Los LED son de salida, para 0→3 de bits a 0. Mapa de 30→33 de pins para TRISE bits 4→7. Interruptores son de entrada, para 4→7 de bits a 1. Mirando el registro poco a poco, tenemos los últimos 8 bits de TRISE que 1111 0000. Tome un segundo para asegurarse de que usted entiende por qué.
Sólo podríamos asignar el valor, con un valor hexadecimal de 0xF0 o un valor binario de 0b11110000, directamente a TRISE con la línea
TRISE = 0XF0;
pero corremos el riesgo de cambiar inadvertidamente los otros pedacitos más significativos en el registro. Recuerde que estamos tratando con registros de 16-32 bit con el PIC32. (En tabla 4-27 pág. 73 de la hoja de datos para el PIC32MX320F128, sé que TRISE solo me permite acceso a los 10 bits menos significativos, pero elegir proteger el registro entero de 16 bits como una cuestión de buena práctica.) Debemos asegurarnos que sólo establecemos los pedacitos exactos que necesitamos dejando los otros bits en cualquier Estado que se están actualmente para que accidentalmente no toma cosas para arriba. Para ello, utilizamos una técnica llamada enmascaramiento y algunos operadores de lógica bit a bit. Digamos que TRISE comienza con un valor de 0b1101 0010 1001 1011. Utilizando el operador OR lógico bit a bit "|", que TRISE o con 0b0000 0000 1111 0000 (0x00F0). Cuando nosotros o dondequiera que haya un '1', el resultado siempre será un uno. Si hay un '0', el resultado será determinado por el estado del otro operando. De nuevo a nuestro ejemplo, si nos 0b1101 OR 0010 1001 1011 con 0b0000 0000 1111 0000 terminamos con 0b1101 0010 1111 1011. Podemos ver que 4→7 de bits ahora son todos 1, que es lo que queríamos.
Con lógica similar y el operador AND, entonces tomamos la TRISE y y con 0b1111 1111 1111 0000. Cualquier tiempo a nosotros y con un '0', el resultado es siempre 0. ANDing con un '1' resultados en el estado del otro operando. Así que tenemos 0b1101 0010 1111 1011, y él con 0b1111 1111 1111 0000 y el resultado es 0b1101 0010 1111 0000. Ahora son los cuatro últimos bits, 0→3, 0, que es otra vez lo que queríamos. Observe que los 8 bits más significativos son tocados. Las dos operaciones (o) puede ser invertida sin afectar el resultado. Las dos líneas de código para esto son las siguientes:
TRISE = TRISE | 0x00F0; 0b0000 0000 1111 0000
TRISE = TRISE & 0xFFF0; 0b1111 1111 1111 0000
Si hace más fácil, pueden asignarse los valores hex/bin como variables int antes de configuración().
Ahora que ya tenemos TRISE set, (pinMode()), podemos ahora escribir nuestra declaración de bucle() . Mirando hacia atrás en la versión más corta y simplificada del código, en el último paso, aviso que estamos leyendo el estado de la entrada de pin (digitalRead() = PORTE) y mapeo con el conector de salida (digitalWrite() = tardío). Tan tarde = PORTE, pero con un ligero ajuste. Recuerde que los botones están ligados a PORTE bits 4→7 y los LEDs están ligados a finales 0→3 de bits. Si escribimos tarde = PORTE, estamos escribiendo el estado de PORTE bits 4→7 a fines 4→7 bits, 0→3 de bits no tarde. Tenemos que cambiar los datos de PORTE sobre los espacios de derecho 4 para que coincida con la colocación de poco en últimas. Dicho de otro modo, si el PORTE Lee 0b0010 1101 1111 0000, pedacitos de 4→7 son todos altos. Cambiar los datos de 4 bits (0b0000 0010 1101 1111) y asignar este valor nuevo a tardío, ajuste de 0→3 de bits alta y encienden todos los 4 LEDs. Es simple para el procesador hacer un cambio de bit a bit y no afectará los datos actuales en PORTE. Los datos de PORTE realmente se copian en un registro temporal y es la que se manipula, si es necesario. La única forma de PORTE cambiar los valores es cambiar los Estados de botón. Aquí está la línea de código:
TARDE = PORTE >> 4;
Se dará cuenta que no estoy tratando de hacer cualquier enmascaramiento aquí al asignar PORTE a tardío. La razón es que LATE no se utiliza para cualquier cosa menos de salida, y si no se establece el bit específico TRISE como una salida, un 1 en eso poco en últimas no tiene ningún efecto. Lo mismo vale para PORTE al intentar leerlo. Puede conectar un botón a cualquier bit en PORTE, pero a menos que asigne PORTE como insumo en TRISE, presionar el botón no cambia el valor en el registro. Los cambios son errantes y al azar porque el pin no tiene resistor de pull-up-down.
Usando 4 bits secuenciales en PORTE, extrayendo los datos es una simple cuestión de desplazamiento bit a bit, que es una operación ridículamente barata que el chip se refiere en términos de tiempo y recursos necesarios. Si habíamos utilizado esparcidos pedacitos y registros por el tablero, tenemos que hacer algunos adhesiva y ANDing y ORing, pero podríamos obtener los datos. También hemos evitado llamar a pinMode(), digitalRead()y digitalWrite(), por lo que nuestro código debe tomar menos espacio en el chip ya que los archivos del fondo no tienen que ser cargados. Vamos a ver cuánto espacio necesitamos ahora.
Aquí está el código:
Este código tiene 10 líneas sin comentarios, y sobre todo es las estructuras de() () y buclerequiere configuración. Sólo hay 3 líneas de código real. 3.
Esta compilación en MPIDE para el chipKIT Uno32 requiere 4792 bytes, una reducción de 1532 bytes desde la versión más corta en el paso anterior que costó 6324 bytes.
El siguiente paso muestra el mismo código pero específicamente para el chip ATMEL.