Como se puede observar en el artículo sobre el diagrama básico del robot programable, utilizamos como unidad central de control un microcontrolador PIC16F876A de Microchip, en encapsulado DIP de 28 patas.
PIC16F876A
Características de los microcontroladores PIC16F87xA
PIC16F87xA es una familia de 4 microcontroladores de Microchip: PIC16F873A, PIC16F874A, PIC16F876A y PIC16F877A. Se diferencian entre ellos por la cantidad de memoria disponible y la cantidad de conexiones al exterior, que dependen del modelo de su encapsulado, básicamente dos modelos en formato DIP (Dual In Line Package) los de 28 patas y los de 40 patas. También hay formatos de montaje de superficie: los de 28 en SOIC y SSOP, y los de 40 QFP (Quad Flat Package), de 44 patas, y PLCC (Plastic Leaded Chip Carrier), de 40 patas, con las mismas prestaciones que en el caso de cápsula DIP de 40.
Encapsulados
En la tabla que sigue, donde está remarcado el microcontrolador que controla en este momento el robot programable, podemos observar los siguientes datos:
FAMILIA
La primera columna (Micro controlador) lista los microcontroladores que componen esta familia.
Las columnas segunda (Progr bytes) y tercera (Progr words) indican los bytes de memoria de programa y la cantidad de words equivalentes (palabras de 14 bits en la arquitectura de estos microcontroladores, tamaño que ocupa cada instrucción de programa) que posee el microcontrolador para alojar el programa de usuario.
La columna (RAM bytes) indica el espacio de memoria RAM (memoria de acceso aleatorio) disponible.
La columna (EEPROM) indica el espacio de memoria EEPROM (memoria de sólo lectura modificable eléctricamente) disponible.
La columna (E/S) indica la cantidad de Entradas y Salidas de ese microcontrolador.
La columna (ADC 10bit) indica la cantidad de entradas al convertidor analógico digital de 10 bits de resolución.
La columna (CCP) indica la cantidad de módulos para comparar y capturar pulsos.
La columna (SPI) indica si existe un módulo de interfaz serie para periféricos.
La columna (I2C) indica si existe un módulo de interfaz serie inter-integrados.
La columna (USART) indica si existe un módulo universal de recepción/transmisión serie asincrónica.
La columna (TIMER 8/16) indica la cantidad de temporizadores de 8 y de 16 bits.
La columna (Comp) indica la cantidad de comparadores.
Los microcontroladores PIC16F87x de Microchip pertenecen a una gran familia de microcontroladores con un bus de datos de 8 bits, que tienen las siguientes características generales que los distinguen de otras familias:
– Arquitectura Harvard
– Tecnología RISC
– Tecnología CMOS
– Sólo posee 35 instrucciones que aprender
– Todas las instrucciones se ejecutan en un ciclo de reloj, excepto los saltos, que requieren dos ciclos
– Frecuencia de operación de 0 a 20 MHz (desde CC a 200 ns de ciclo de instrucción)
– Hasta 8K x 14 bits de memoria FLASH para el programa
– Hasta 368 bytes de memoria de datos de acceso aleatorio (RAM)
– Hasta 256 bytes de memoria de datos EEPROM
– Hasta 14 fuentes de interrupción en los de 28 patas y 15 en los de 40 patas
– Pila (Stack) de hardware de 8 niveles
– Reset de encendido (POR)
– Temporizador de encendido (PWRT)
– Temporizador de arranque del oscilador (OST)
– Sistema de vigilancia Watchdog Timer (temporizador «despertador»).
– Se puede programar una protección de código
– Modo SLEEP (dormido) de bajo consumo de energía
– Diversas opciones para el oscilador
– Programación y depuración serie (ICSP, In Circuit Serial Programming = Programación Serie En Circuito) a través de dos patas
– El CPU puede realizar lectura/escritura de la memoria FLASH de programa
– Rango de voltaje de operación de 2,0 a 5,5 volts
– Puede entregar alta corriente en una pata de salida: 25 mA
– Rangos de temperatura: Comercial, Industrial y Extendido
– Bajo consumo de potencia:
. Menos de 0,6 mA a 3 V, 4 MHz
. 20 µA a 3 V, 32 KHz
. Menos de 1µA de corriente en estado latente (stand by).
Estas características se conjugan para lograr un dispositivo altamente eficiente en el uso de la memoria de datos y programa, y por lo tanto en la velocidad de ejecución.
El PIC16F876, utilizado en el robot programable, maneja hasta 14 posibles fuentes de interrupción.
Los módulos CCP pueden comparar y capturar la duración de pulsos. La captura se efectúa con una precisión de 12,5 ns y una resolución de 16 bits, mientras que la comparación con igual resolución alcanza una precisión de 200 ns. Además, la sección PWM varía el ancho de los pulsos con una resolución máxima de 10 bits, técnica muy empleada en la regulación de los motores de CC (corriente continua).
La USART está orientada a la comunicación entre sí de subsistemas o máquinas (RS-232), y el MSSP (Master Synchronous Serial Port = Puerto Sincrónico Serie Maestro; el módulo que implementa la comunicación I2C y SPI) está destinado a la comunicación entre diversos circuitos integrados, admitiendo los protocolos I2C y SPI.
En los PIC de esta familia con 40 patas (16F874 y 16F877) está disponible el protocolo PSP (Parallel Slave Port, o Puerto Paralelo Esclavo), que es más veloz que la comunicación serie pero consume muchas líneas de E/S: 8 del puerto D y 3 de control del puerto E. Sin embargo, es muy importante su existencia porque estos puertos permiten comunicarse con memorias y periféricos de acceso paralelo utilizados ampliamente en el mundo de los microprocesadores.
En todos los PIC 16F87X existe un conversor A/D de 10 bits, con 5 canales de entrada en los de 28 patas y 8 canales en los de 40.
Conexiones al exterior del microcontrolador PIC16F876A
Diagrama en bloques del microcontrolador PIC16F876A utilizado en el robot programable de los Robots Didácticos
Sociales
Parámetros generales a tener en cuenta
Los microcontroladores que produce Microchip cubren un amplio rango de dispositivos cuyas características pueden variar como sigue:
– Encapsulado desde 8 patitas hasta 68 patitas
– Tecnología de la memoria incluida EEPROM, EPROM, ROM, FLASH
– Voltajes de operación desde 2,0 V hasta 6,0 V
– Frecuencia de operación hasta 20 MHz
En el caso de nuestro microcontrolador, el que controla el robot programable, los parámetros indicados son:
– Cápsula de 28 patas
– Memoria RAM, EEPROM y FLASH
– Voltaje de operación de 2 V a 5,5 V
– Frecuencia máxima de operación de 20 MHz
Encapsulado
El microcontrolador de nuestro robot está disponible en cápsulas DIP, SOIC y SSOP de 28 patas, que se pueden observar en las figuras de encapsulados que mostramos a continuación y en los diagramas de patas ubicados al comienzo.
Encapsulado DIP, SOIC y SSOP
Por el momento utilizamos la cápsula DIP de 28 patas.
Parte del montaje del robot didáctico programable
Diagrama de entradas y salidas del PIC16F876A en formato DIP 28
Oscilador
Los PIC de rango medio permiten hasta 8 diferentes modos de funcionamiento para el oscilador. El usuario puede seleccionar alguno de estos modos programando 3 bits de configuración en el dispositivo denominados: FOSC2, FOSC1 y FOSC0. En algunos de estos modos el usuario puede indicar que se genere o no una salida del oscilador (CLKOUT) a través de una pata de Entrada/Salida.
Los modos de operación se muestran en la siguiente lista:
• LP Baja frecuencia (y bajo consumo de potencia)
• XT Cristal / Resonador cerámico externos (frecuencia media)
• HS Alta velocidad (y alto consumo de energía) cristal/resonador
• RC Resistor/Capacitor externos (lo mismo que EXTRC con salida CLKOUT)
• EXTRC Resistor/ capacitor externos
• EXTRC Resistor/Capacitor externos con CLCKOUT
• INTRC Resistor/Capacitor internos para una frecuencia de operación de 4 MHz
• INTRC Resistor/Capacitor internos para operación a 4 MHz con CLKOUT
Los modos LP, XT y HS requieren un cristal o resonador externo.
Cristal externo: En los tres modos se puede utilizar un cristal o un resonador cerámico externo.
Circuito RC externo: En los modos RC y EXTRC, el PIC puede generar su señal de oscilación basada en un conjunto RC (Resistor/Capacitor) externo conectados al microcontrolador.
Este modo sólo se recomienda cuando la aplicación no requiera una gran precisión en la medición de tiempos.
Rangos
La frecuencia de oscilación depende no sólo de los valores del resistor Rext y el capacitor Cext, sino también del voltaje de la fuente, Vdd. Los rangos admisibles para el resistor y capacitor son:
Rext: de 3 a 100 Kohms
Cext: mayor de 20 pf
Oscilador externo
También es posible conectarle al microcontrolador una señal de reloj generada en un oscilador externo a través de la pata OSC1 del PIC. Para ello el PIC deberá estar en uno de los tres modos que admiten cristal (LP, XT o HS).
Oscilador interno de 4 MHz
En el modo INTRC, el PIC utiliza un conjunto RC interno que genera una frecuencia de 4 MHz con un rango de error calibrable de ± 1,5%. Para calibrar el error de oscilación se usan los bits CAL3, CAL2, CAL1 Y CAL0 del registro OSCCAL.
Calibración del oscilador interno
El fabricante ha colocado un valor de calibración para estos bits en la última dirección de la memoria de programa. Este dato se ha guardado en la forma de una instrucción RETLW XX. Si no se quiere perder este valor al borrar el PIC (por ejemplo en versiones EPROM con ventana) primero se deberá leer esta memoria y copiar el valor en un resguardo. Es una buena idea escribir el valor en la cápsula empaquetado antes de borrar la memoria.
En la siguiente figura se muestran las conexiones en cada uno de los modos:
Modos de oscilador de reloj
En nuestro robot programable utilizamos un cristal de 4 MHz en modo XT.
Periféricos
– Timer0 : Contador/Temporizador de 8 bits con pre-escalador de 8bits
– Timer1 : Contador/Temporizador de 16 bits con pre-escalador
– Timer2 : Contador/Temporizador de 8 bits con pre-escalador y post-escalador de 8 bits y registro de periodo.
– Dos módulos de Captura, Comparación y PWM
– Convertidor Analógico/Digital: de 10 bits, hasta 8 canales (en nuestro robot, hasta 5 canales)
– Puerto Serie Síncrono (SSP)
– Puerto Serie Universal (USART/SCI).
Descripción de la CPU (Central Processing Unit = Unidad Central de Proceso)
La CPU es la responsable de la interpretación y ejecución de la información (instrucciones) guardada en la memoria de programa. Muchas de estas instrucciones operan sobre la memoria de datos. Para operar sobre la memoria de datos, además, si se van a realizar operaciones lógicas o aritméticas, se debe usar la Unidad Lógica y Aritmética (Arithmetic Logic Unit = ALU). La ALU controla los bits de estado (Registro STATUS). Los bits de este registro se alteran dependiendo del resultado de algunas instrucciones.
Ciclo de instrucción
El registro Contador de Programa (Program Counter = PC) es gobernado por el ciclo de instrucción. En cada ciclo de instrucción la CPU lee la instrucción guardada en la memoria de programa que está apuntada por el PC (ciclo Traer = Fetch) y al mismo tiempo ejecuta la instrucción anterior, esto debido a una cola de instrucciones que le permite ejecutar una instrucción mientras lee la próxima:
Cada ciclo de instrucción (Tcy) se compone a su vez de cuatro ciclos del oscilador (Tosc). Cada ciclo Q provee la sincronización para los siguientes eventos:
– Q1: Decodificación de la instrucción
– Q2: Lectura del dato (si lo hay)
– Q3: Procesa el dato
– Q4: Escribe el dato
Debido a esto cada ciclo de instrucción consume 4 ciclos de reloj, de manera que si la frecuencia de oscilación es Fosc, Tcy será 4/Fosc.
Registros de la CPU
Registro PC (Program Counter o Contador de Programa)
Es un registro de 13 bits que siempre apunta a la siguiente instrucción a ejecutarse.
Registro de Instrucción
Es un registro de 14 bits. Todas las instrucciones se colocan en él para ser decodificadas por la CPU antes de ejecutarlas.
Registro W
Registro de 8 bits que guarda los resultados temporales de las operaciones realizadas por la ALU
Registro STATUS (Estado)
Es un registro de 8 bits. Cada uno de ellos (denominados Banderas) es un indicador de estado de la CPU o del resultado de la última operación.
Banderas en el registro de Estado
Z – Este bit se pone (= 1) para indicar que el resultado de la última operación fue cero, de lo contrario se limpia (= 0)
C – Bit de Acarreo/Préstamo de la última operación aritmética (en el caso de resta, se guarda el préstamo invertido.
CD – Acarreo/Préstamo proveniente del cuarto bit menos significativo. Funciona igual que el bit C, pero para operaciones de 4 bits.
Posibilidad de direccionamiento indirecto
Este modo de direccionamiento permite acceder una localidad de memoria de datos usando una dirección de memoria variable, a diferencia del direccionamiento directo, en que la dirección es fija. Esto puede ser útil para el manejo de tablas de datos.
Funcionamiento básico de los puertos de Entrada/Salida
Ejemplo: el Puerto A (PORTA)
El puerto A posee 6 líneas bidireccionales. Los puertos tienen asociados registros que regulan su funcionamiento. En el caso del Puerto A hay 3 registros asociados a él, que son:
Registro PORTA (05H)
Registro de estado del Puerto A. Cada uno de los 6 bits menos significativos (RA5 a RA0) de este registro están asociados a la línea física correspondiente del puerto. Al hacer una lectura este registro se lee el estado de todas las patas del puerto. Todas las escrituras al registro son operaciones del tipo “lee-modifica-escribe”, es decir, toda escritura al puerto implica que el estado de las patas es leído, luego es modificado y posteriormente se escribe al registro de datos del puerto.
Registro TRISA (85H)
Cada bit de este registro configura la dirección en que fluye la información de la pata correspondiente del puerto A: entrada o salida.
Bit n de TRISA = 1 configura la patita RAn del puerto A como Entrada
Bit n de TRISA = 0 configura la patita RAn del puerto A como Salida
Los puertos de un microcontrolador son muy variados entre sí. Tienen características muy similares –si no idénticas– cuando se utilizan como entradas o salidas, pero además la mayoría de las patas de un microcontrolador, a veces todas, poseen otras funciones. Estas funciones adicionales, que se seleccionan por medio de un registro de configuración, a veces condicionan algunas características de entrada/salida de la pata.
Las patas del puerto A poseen diodos de protección conectados a Vdd (para proteger de altos voltajes de entrada) y a Vss (para proteger contra voltajes negativos). Manejan niveles de entrada tipo TTL y como salida poseen transistores tipo CMOS. La pata RA4, tiene tres excepciones a la regla de las entradas/salidas este puerto: como entrada posee un disparador Schmitt (Schmitt Trigger) y como salida la configuración de transistores es de drenaje abierto. Además RA4 sólo posee diodo de protección conectado a Vss.
El Registro ADCON1 (9FH)
Las patas RA0, RA1, RA2, RA3 y RA5 se pueden conectar a las entradas analógicas AN0 a AN4. Debemos configurar en este registro si serán usadas como entradas analógicas o como entradas/salidas digitales. Para seleccionar la segunda opción (entradas/salidas digitales) se debe colocar en la mitad menos significativa de este registro un 0110 (es decir, un 06h).
Registros del Puerto A
Todos los detalles sobre este y los otros puertos de entrada/salida, y del microcontrolador en general, se pueden buscar en la hoja de datos original de Microchip, o en esta traducción al castellano.