Archivo por meses: diciembre 2014

Soluciones: Puente H simple y barato

por Eduardo J. Carletti

La explicación detallada de lo que es un puente H se puede ver aquí.

Los puentes H con transistores bipolares comunes tienen el defecto de que entre colector y emisor de cada transistor cae un poco de voltaje (normalmente 0,4 V). Como hay por lo menos dos transistores en serie con el motor, la caída es de 0,8V. Incluso podría haber un tercero para controlar la velocidad del motor por ancho de pulso.

En un sistema con una batería de 6V y motores de este voltaje, esta caída en los transistores significa menos fuerza y velocidad en el motor.

Los circuitos implementados con MOSFET solucionan esto.

Generalmente se utilizan MOSFET de potencia, que tienen una cápsula TO220, algo grande. En un pequeño robot, cuatro de estos transistores para cada motor pueden hacer una plaqueta bastante voluminosa.

La solución propuesta es usar el integrado IRF7105, que tiene un par de MOSFET (uno de canal P y uno de canal N) en la misma cápsula, una SO8 de montaje superficial.



Estos MOSFET tienen las características ideales para el manejo de motores pequeños con un consumo de hasta 2,3 A.



Controlar este circuito es muy fácil con un microcontrolador:

F1=0, F2=1, B1=0 and B2=1 – motor avanza
F1=1, F2=0, B1=1 and B2=0 – motor retrocede
F1=1, F2=0, B1=0 and B2=1 – motor detenido

El integrado IRF7105 se puede comprar en Argentina en Electrocomponentes por un precio muy accesible.




Control de motores de corriente continua con Puente H

por Eduardo J. Carletti

En el circuito de abajo vemos un Puente H de transistores, nombre que surge, obviamente, de la posición de los transistores, en una distribución que recuerda la letra H. Esta configuración es una de las más utilizadas en el control de motores de CC, cuando es necesario que, además de arrancar y detener la marcha, se pueda invertir el sentido de giro del motor.

Funcionamiento:

Aplicando una señal positiva en la entrada marcada AVANCE se hace conducir al transistor Q1. La corriente de Q1 circula por las bases de los transistores Q2 y Q5, haciendo que el terminal a del motor reciba un positivo y el terminal b el negativo (tierra).

Si en cambio se aplica señal en la entrada RETROCESO, se hace conducir al transistor Q6, que cierra su corriente por las bases, de los transistores Q4 y Q3. En este caso se aplica el positivo al terminal b del motor y el negativo (tierra) al terminal a del motor.

Una de las cosas muy importantes que se deben tener en cuenta en el control de este circuito es que las señales AVANCE y RETROCESO jamás deben coincidir. Si esto ocurre los transistores Q2, Q3, Q4 y Q5 cerrarán circuito directamente entre el positivo de la fuente de alimentación y tierra, sin pasar por el motor, de modo que es seguro que se excederá la capacidad de corriente Emisor-Colector y los transistores se dañarán para siempre. Y si la fuente de alimentación no posee protección, también podrá sufrir importantes daños. Al efecto existen varias formas de asegurarse de que estas señales no coincidan, utilizando circuitos que impiden esta situación interlock, generalmente digitales, basados en compuertas lógicas. Abajo mostramos un ejemplo.

He aquí otra opción de Puente H y circuito de interlock, con la ventaja de que utiliza menos transistores, (tipo Darlington en este caso) y de tener un circuito de interlock aún más seguro. En el circuito anterior, si se presentan las dos señales activas simultáneamente se habilita uno de los sentidos de marcha, sin que se pueda prever cuál será. Si las señales llegan con una leve diferencia de tiempo, se habilita la orden que ha llegado primero, pero si ambas señales llegan al mismo tiempo no se puede prever cuál comando (AVANCE o RETROCESO) será habilitado. En este segundo circuito no se habilita ninguno:

El circuito Puente H sólo permite un funcionamiento Sí-NO del motor, a plena potencia en un sentido o en el otro (además del estado de detención, por supuesto), pero no ofrece un modo de controlar la velocidad. Si es necesario hacerlo, se puede apelar a la regulación del voltaje de la fuente de alimentación, variando su potencial de hacia abajo para reducir la velocidad. Esta variación de tensión de fuente produce la necesaria variación de corriente en el motor y, por consiguiente, de su velocidad de giro. Es una solución que puede funcionar en muchos casos, pero se trata de una regulación primitiva, que podría no funcionar en aquellas situaciones en las que el motor está sujeto a variaciones de carga mecánica, es decir que debe moverse aplicando fuerzas diferentes. En este caso es muy difícil lograr la velocidad deseada cambiando la corriente que circula por el motor, ya que ésta también será función —además de serlo de la tensión eléctrica de la fuente de alimentación— de la carga mecánica que se le aplica (es decir, de la fuerza que debe hacer para girar).




Una de las maneras de lograr un control de la velocidad es tener algún tipo de realimentación, es decir, algún artefacto que permita medir a qué velocidad está girando el motor y entonces, en base a lo medido, regular la corriente en más o en menos. Este tipo de circuito requiere algún artefacto de detección (sensor) montado sobre el eje del motor. A este elemento se le llama tacómetro y suele ser un generador de CC (otro motor de CC cumple perfectamente la función, aunque podrá ser uno de mucho menor potencia), un sistema de tacómetro digital óptico, con un disco de ranuras o bandas blancas y negras montado sobre el eje, u otros sistemas, como los de pickups magnéticos. Ver más en Control de motores de CC con realimentación.

Existe una solución menos mecánica y más electrónica, que es, en lugar de aplicar una corriente continua, producir cortes regulares de la señal en forma de pulsos, a los que se les regula el ancho. Este sistema se llama control por Regulación de Ancho de Pulso (PWM, Pulse-Width-Modulated, en inglés).



El Propeller, un microcontrolador nada habitual

por Eduardo J. Carletti

¿Qué es el Propeller?

El Propeller es un microcontrolador producido por Parallax Inc. Como muchos chips de este tipo, posee una sección de proceso, generación de reloj, contador de sistema, puertos de entrada/salida, memoria RAM y ROM… pero aquí termina toda similitud con los microcontroladores conocidos.



El Propeller posee una novísima arquitectura, que contiene ocho procesadores que trabajan cooperativamente y comparten los pines de salida y otros recursos.
Cada uno de estos 8 procesadores —a los que Parallax ha bautizado «cog»— es de 32 bits, con una velocidad de proceso de 20 MIPS (millones de instrucciones por segundo) usando un pulso de reloj de 80 MHz. Es decir, en un momento en que están trabajando todos los cogs, tenemos una capacidad de proceso de 160 MIPS.
Cada procesador tiene su propia RAM local de 2 Kb (512 registros de 32 bits). También existe una memoria común, compartida, que se divide en dos secciones: una RAM de 32 Kb y una ROM de 32 Kb.
La ROM contiene rutinas preprogramadas, como la de arranque o «bootstrap», un interpretador y recursos tales como generadores de caracteres, tablas matemáticas, etc.
Pero no es regrabable y no está pensada para contener el programa de usuario.

¿Entonces… cómo funciona esto?

Uno se pregunta enseguida… ¿cómo se programa este chip? Sin memoria de programa reprogramable, como las flash que son habituales en los microcontroladores de hoy, ¿dónde se alojan las instrucciones del microcontrolador, es decir, lo que hemos programado?
Veamos el concepto de Parallax para la programación de este microcontrolador.

Bootstrap o rutina de arranque

Por cierto, no es una novedad para los diseñadores con microcontroladores: una pequeña rutina preprogramada se ocupa de cargar el programa principal en el chip.
¿Pero dónde se guarda este programa principal?
Muchos microcontroladores que conocemos cargan su programa en la memoria flash, pero en el Propeller, como en las computadoras convencionales del tipo de nuestra PC, el programa se instala en la RAM. El programa de arranque que reside en la ROM se comunica a través de una interfaz serie (puede ser una interfaz serie convencional o transformada a USB por un chip convertidor) y descarga el programa en la RAM.
«Ah, pero entonces este chip sólo funciona conectado a una computadora, para que ésta le envíe el programa…»
No necesariamente: una vez probado y en funcionamiento, el programa se aloja en una memoria externa EEPROM de tipo serie desde donde el Propeller, en el arranque, copia el programa a la RAM. Por esta razón, casi siempre veremos asociado al Propeller con una memoria EEPROM serie de capacidad suficiente, como la 24LC256 (32K x 8).
Interesante.

Secuencia de arranque



Placa de prueba del Propeller

Después del inicio (reset), el Propeller arranca funcionando con un reloj en modo lento (de unos 20 KHz), espera 50 milisegundos, pasa el reloj a modo rápido (de unos 12 MHz), y entonces comienza a ejecutar su rutina interna de arranque, o Boot Loader, en el procesador número 0 (cero).
A través de los pines P30 y P31, esta rutina observa si existe comunicación con un procesador principal o «host», tal como una PC. Si esta comunicación se establece, se genera un intercambio con el programa en la PC, que resulta en la descarga de un programa hacia la RAM principal o, alternativamente, hacia la EEPROM externa auxiliar, de 32 Kb.
Si no se detecta la presencia de una computadora principal que aporte el programa, la rutina de arranque busca una EEPROM serie exterior en los pines P28 y P29. Si esta memoria existe, copia su contenido completo en la memoria RAM del Propeller.
Si no se pudo comunicar con una computadora principal, y tampoco detecta esta memoria EEPROM, el Propeller pasa a un modo de apagado con todos los pines definidos como entradas.
Si en cambio se logró descargar el programa a la RAM, ahora el procesador 0 (o cog 0) carga el interpretador y comienza a correr el código del usuario.

¿Interpretador? Oh, oh…

¿Cómo que corre un interpretador, se pregunta uno de inmediato? ¿No hay un código de programa en idioma binario? ¿Qué clase de microcontrolador es éste?
Tranquilos. El programa se puede componer de instrucciones en Spin, que es un lenguaje de alto nivel específico del Propeller que corre por medio de un interpretador, y también de componentes de bajo nivel, escritos en el lenguaje ASM del Propeller.
Todo lo que está en lenguaje Spin es interpretado por un cog en el que corre el interpretador, mientras que lo que aparezca en idioma binario (compilado a partir del ASM de Propeller) se ejecuta en otro cog.




Veamos el hardware

Ya vimos cómo se maneja el concepto de programa de este chip, veamos entonces cómo es a nivel físico.
El diagrama en bloques del Propeller tiene tantos elementos que deja ver muy poco de sus detalles. De todos modos, lo muestro aquí:



Será mejor que lo veamos por partes.

Paso a paso, la arquitectura del Propeller

Dijimos ya que el Propeller contiene ocho procesadores, o cogs, que se identifican con los números 0 a 7. Todos contienen los mismos componentes: un procesador, una RAM local de 2 K bytes —que se estructura en 512 registros de 32 bits—, dos asistentes de E/S (Entrada/Salida) y PLLs (lazos de enganche de fase), un generador de video, un registro de salida de E/S, un registro de dirección de E/S, y otros registros que no se representan en el diagrama que sigue. El procesador se conecta con las barras de direcciones, de datos, del contador de sistema y de entradas (en inglés, lo que llamamos «barra» es «bus»). Los asistentes de E/S están conectados a las entradas y las salidas.



Diagrama de un cog

Los ocho cogs pueden realizar tareas independientes y también pueden trabajar en tareas cooperativas.



Detalle de cuatro de los cogs y su interconexión

Estas explicaciones suenan muy bien en términos generales, pero la verdad es que no dicen mucho, así que uno se pregunta: ¿cómo funciona esto?
¿Cómo acceden sin conflicto los procesadores que trabajan simultáneamente a los recursos compartidos, como la RAM principal y la ROM? ¿Cómo escriben en los puertos de salida? ¿Para qué son los generadores de video que tiene cada procesador? ¿Cómo atienden
los procesadores a los sucesos que ocurren en el mundo exterior?
Aportemos algunas respuestas.

Sucesos del mundo real: interrupciones… no hay

Debido a que posee varios procesadores, el sistema no tiene necesidad de usar un mecanismo de interrupciones: asigna tareas importantes a algunos cogs, mientras que mantiene libres a otros cogs para atender los sucesos que se presentan. Sólo es necesario asignar algunas patas de E/S a esas tareas de alta velocidad. Los cogs tienen instrucciones especiales para esperar por un suceso externo, como WAITPEQ, que espera hasta que un pin esté en un determinado estado, o WAITPNE, que espera lo contrario, que el pin no esté en ese estado. También, obviamente, se puede recurrir a una técnica de sondeo continuo de las líneas, lo que en inglés se llama «polling».

Compartir las entradas y salidas

El propeller tiene 32 patas dedicadas a entrada/salida. De éstas, sólo cuatro tienen una función predefinida, y esto sólo durante el inicio o Boot Up, y luego quedan libres para su uso a gusto del programador. Las 28 restantes son de propósito general.
Los pines utilizados durante el boot son:

  • P28 – conexión SCL del bus I2C a una EEPROM externa opcional.
  • P29 – conexión SDA del bus I2C a una EEPROM externa opcional.
  • P30 – Señal Tx (Transmisión) de la interfaz serie con el computador principal.
  • P31 – Señal Rx (Recepción) de la interfaz serie con el computador principal.

Cada cog tiene su registro propio de dirección de las E/S, de 32 bits (que define si es entrada o salida), y un registro de salida, también de 32 bits. No hay una protección de hardware que impida que distintos cogs usen el mismo pin para usos diferentes; esto lo debe controlar el programador.



Las salidas de los cogs se unen entre sí en forma de «o» inclusiva (compuerta o), y lo mismo pasa con las definiciones de dirección de las E/S.
Debido a esto, la definición de la dirección de cada pin y de sus niveles de salida (si son salidas) cumple las siguientes reglas:

  • A. Un pin del Propeller es una entrada si todos los cogs activos lo tienen definido como entrada. Si un único cog activo lo define como salida, el pin será salida.
  • B. Una línea de un pin de salida irá a bajo sólo si todos los cogs que lo tienen definido como salida la ponen en bajo.
  • C. Una línea de un pin será alta si cualquier cog activo que la tiene definido como salida la pone en alto.

En base a esta lógica, un cog puede dejar libres para el uso de los otros cogs los pines de E/S —quedando sin ninguna influencia sobre ellos— sólo con poner a cero su registro de dirección de E/S y a cero su registro de salida.

Generadores de video

No he encontrado precisiones sobre por qué cada procesador tiene un generador de video y tampoco cómo es que puede generar video sin una RAM para mantener la imagen. Es de suponer que si se genera video en cada procesador, se pueden crear distintas imágenes que se sumen o que se alternen.

Simultaneidad y reloj del sistema

Los ocho cog están en funcionamiento con el mismo reloj del sistema, de modo que mantienen la misma referencia en el tiempo.
El reloj del sistema alimenta casi todos los componentes del chip Propeller. La señal del reloj del sistema se produce en tres fuentes posibles: el oscilador RC interno, el lazo de enganche de fase del reloj (PLL), o el oscilador a cristal, que puede ser interno o un dispositivo externo que genere los pulsos de reloj. La fuente del reloj se determina por los valores definidos en el registro CLK, que se pueden seleccionar al compilar y también durante la ejecución del programa.
Los únicos componentes que no usan directamente el reloj del sistema son el Hub y las barras (o Buses), donde la frecuencia del reloj del sistema está dividida por dos.
La funcionalidad de los cog para trabajar en forma simultánea está bajo control del usuario. El programa escrito por el usuario tiene control total sobre cómo y cuándo se utiliza cada cog. Pueden ser programados, entonces, para realizar tareas simultáneamente, independientes o con la coordinación de otros cogs, así como también hacer que cualquiera de los cogs arranque y se detenga durante el funcionamiento del programa.

Compartir los recursos

Existen dos tipos de recursos a compartir en el Propeller: recursos de uso común, y recursos de uso momentáneamente exclusivo. Los recursos comunes, como los pines de E/S y el contador del sistema, permiten el acceso conjunto de varios cogs en todo momento, mientras que los recursos de uso momentáneamente exclusivo, como la RAM y ROM principales, los registros de configuración, etc., pueden accederse desde todos los cogs, pero solamente puede ser utilizado por uno de ellos a la vez.
¿Cómo gobierna el Propeller este acceso a los recursos de uso exclusivo, de a uno por vez? Existe un dispositivo llamado Hub, que es el que controla qué cog puede acceder, por turno, a los recursos exclusivos.
La palabra «hub», en inglés, se refiere al cubo en el extremo del eje de un automóvil, donde se fija la rueda (entre otros ejemplos), y en electrónica a un distribuidor o múltiple: en este caso sería como el distribuidor de bujías de un automóvil.
El dispositivo se representa en el esquema en bloques, justamente, como un objeto circular rodeado por los cogs.



El Hub va dando acceso exclusivo a cada «cog» de manera secuencial, comenzando por el cog 0, y así en sucesión hasta el cog 7, sin importar cuántos cogs estén activos. Cuando se desea un acceso exclusivo a los recursos para alguno de los cogs, se utilizan semáforos, controlados por programa.



Hub, Registros de configuración, generación de reloj, RAM, ROM, semáforos

La memoria principal

El mapa de memoria principal cubre 64 Kbytes sin ninguna división en bloques, y se la puede direccionar de manera continua. Esto evita los esquemas de paginado en secciones de código, datos o variables que se observan en otros microcontroladores.
La memoria principal tiene dos partes funcionales: la primera mitad de las direcciones está ocupada por 32 Kbytes de RAM y la segunda mitad por 32 Kbytes de ROM.
La RAM es de propósito general, y en ella se juntan programa, datos y variables. Cuando se descarga el programa desde una PC a través de la interfaz serie, o se lo copia desde los 32 Kbytes de la EEPROM auxiliar externa, se puede utilizar por completo esta memoria.
Las primeras ubicaciones se ocupan con los datos de inicialización que utiliza el intérprete, el espacio que sigue es utilizado por el código ejecutable y datos del programa, y el resto del espacio se puede utilizar para localizar variables.
En los 32 Kbytes de ROM están pregrabados recursos de programa y datos vitales para el funcionamiento del Propeller, entre ellos el programa de arranque y el intérprete, tablas de definición de caracteres y funciones matemáticas.
La primera mitad de la ROM contiene las plantillas píxel a píxel de un juego de 256 caracteres de 16 píxeles de ancho por 32 píxeles de alto. Estos caracteres se pueden utilizar para exhibir en pantallas de video, LCD gráficos, para imprimir, etc. Además de letras comunes, se han definido cantidad de caracteres auxiliares para uso en diagramas esquemáticos, símbolos griegos y varias flechas y formas predefinidas.




Entradas y Salidas

El chip Propeller tiene 32 pins de E/S para utilizar en señales de entrada, salida y control. Como ya indicamos, de los 32 pines, 28 —de P0 a P27— son para propósito general y 4 —P28 a P31— tienen un uso especial durante el arranque, utilizándose para la comunicación con la PC y el acceso a la EEPROM externa. Pero luego se los puede utilizar para propósito general.

Contador del sistema

El contador del sistema es un contador de 32 bits de acceso global, lectura solamente, cuyo conteo se incrementa cada ciclo del reloj de sistema. Los cogs pueden leer este contador del sistema para hacer cálculos referidos al tiempo y también disponen del comando WAITCNT para producir retardos en sus programas. El contador del sistema es un recurso común: todos los cog lo pueden leer al mismo tiempo. El contador del sistema no se inicializa durante el arranque debido a que la forma de usarlo es calculando el tiempo de manera diferencial. Si un cog necesita medir el tiempo de un suceso específico lo único que debe hacer es leer el valor inicial del contador en ese momento y comparar los valores posteriores leídos del contador contra el tiempo inicial.

Disposición habitual básica

La disposición típica de circuito nos muestra al microcontrolador conectado a una memoria EEPROM de 32 Kbytes y a una interfaz serie.
La conexión de la memoria EEPROM con el microcontrolador es de tipo serie de dos líneas, como en todas estas memorias, mediante un bus I2C.



El esquema muestra un ejemplo del conexionado de los elementos, y en este caso la comunicación serie se realiza a través de un convertidor de niveles MAX232, que se ocupa de adaptar los niveles lógicos que utiliza la PC en su interfaz serie RS232 a los niveles TTL del microcontrolador.

Bajo consumo de energía

El consumo de potencia de un dispositivo se debe tener en cuenta, sobre todo en sistemas alimentados por baterías, porque cuanto más rápido trabaja el microcontrolador más consumo se produce. Dado que la mayor parte del consumo de los circuitos actuales integrados en los chips se produce en los cambios de estado de las señales (o flancos), al aumentar la frecuencia de reloj para reducir el tiempo en que se ejecutan las instrucciones se produce un ingente incremento del consumo. El chip del Propeller se ha diseñado para ofrecer una muy alta velocidad de proceso en sistemas embebidos pero con bajo consumo de energía.
El Propeller trabaja con una velocidad de reloj de 80 MHz pero se alimenta con sólo 3,3 voltios, lo que facilita su uso en dispositivos portátiles a baterías. Su consumo se calcula así: 500 uA por MIPS, donde MIPS = (frecuencia en MHz / 4) * cantidad de cogs activos. Digamos que si tenemos los 8 cogs corriendo a 80 MHZ, tendremos 20 * 8 * 500 = 80.000 uA (80 mA). A 3,3 V esto significa 264 mW.

¿Ideal para un robot?

Es evidente que un microcontrolador de estas características podría ser el controlador central ideal para un robot móvil. En lugar de repartir tareas entre varios microcontroladores, como se hace necesario muchas veces, con el consiguiente gasto de espacio de plaqueta, consumo y trabajo de armado, se pueden concentrar las tareas críticas en un único chip, especialmente aquellas relacionadas con el manejo de tiempos muy estrictos. Un caso concreto sería la medición de eco en un emisor/receptor de ultrasonido, atención de una cantidad de servos afectados en los movimientos, procesamiento de imagen, y lectura de múltiples sensores.
Estamos ansiosos por instalar este microcontrolador en un robot y empezar a exigirlo con pruebas más y más comprometidas.

Nota:
La placa de desarrollo con el micro Propeller que nos permitió realizar esta nota nos la donó Micros Parallax Argentina, por gentileza de Aristides Álvarez



El microcontrolador "cerebro" del robot programable (básico)

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.

PIC16F876Apic16f876

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.

EncapsuladosCápsulas

En la tabla que sigue, donde está remarcado el microcontrolador que controla en este momento el robot programable, podemos observar los siguientes datos:

FAMILIAFamilia

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

SocialesDiagrama en bloques

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 SSOPCápsulas

Por el momento utilizamos la cápsula DIP de 28 patas.

Parte del montaje del robot didáctico programableMicrocontrolador en el robot

Diagrama de entradas y salidas del PIC16F876A en formato DIP 28PIC16F876A

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 relojOsciladores

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 APuerto 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.





Robot Programable: Diagrama Básico en Bloques

El robot programable de nuestras clases posee un microcontrolador PIC16F876A como centro de control, un integrado L293D de manejo de potencia para los motores y circuitos auxiliares.

En el momento de introducir la programación al robot se inserta un módulo de comunicación USB/USART que convierte las señales de nivel USB que salen de la PC al nivel TTL utilizado en el microcontrolador.

Diagrama básico en bloquesDiagrama en bloques

La comunicación se establece entre un programa de carga de datos en la PC y el módulo de comunicaciones serie del microcontrolador (USART o Universal Serial Asynchronous Receiver / Transmiter = Receptor / Transmisor Asincrónico Serie Universal), que es controlado en el microcontrolador por un pequeño programa de carga de datos llamado «bootloader«, o cargador inicial.

Este programa se ocupa de tomar los datos que componen nuestro programa a través del puerto serie del microcontrolador (USART), y grabarlos en la memoria de programa. Describiré con más detalles este proceso en el próximo artículo.

En este caso, el microcontrolador PIC16F876A trabaja a una velocidad de reloj de 4 MHz (puede hacerlo hasta 20 MHz). Esto lo determina un cristal conectado a sus patas de oscilador. El cristal, como es habitual, tiene dos capacitores auxiliares en su circuito. Para los observadores, en la imagen que sigue verán otro chip (el que maneja la corriente de los motores), un regulador de voltaje, capacitores y resistores auxiliares, una llave de encendido (de color negro), una llave de reinicio (de color rojo), y hacia la parte baja de la imagen un conjunto de pequeñas llaves deslizantes (llamado DIP switch, también de color rojo y con las llavecitas en blanco) que utilizo para ingresar indicaciones al microcontrolador. Estos indicadores se pueden comprobar en el programa a través de unas entradas y seguir, según su posición, diferentes acciones. En un principio, con las primeras 6 llavecitas se eligen partes del programa que realizan diferentes secuencias de movimiento.

En las imágenes que siguen se puede observar el montaje del robot a nivel de prueba (con plaqueta base de prototipo, o protoboard), primero con la conexión USB-USART inserta, luego el robot libre (tal como funciona al ponerlo en marcha), y el mismo montaje visto de abajo.Robot con cable
Robot sin cable
Robot de abajo


Esta imagen muestra de cerca la parte de circuito de control.

Detalle del área del controlÁrea de control

En la imagen de abajo se observa un detalle del área del microcontrolador, el cristal con sus capacitores, y la llave que se utiliza para reiniciar (reset) al momento de programar o de reponer el funcionamiento del robot a sus condiciones iniciales.

Detalle del área del microcontroladorÁrea del microcontrolador

El microcontrolador maneja los motores derecho e izquierdo utilizando un amplificador de potencia L293D. Las señales de control son 4, dos para cada uno de los motores, y permiten seleccionar tres estados: marcha adelante, marcha atrás y detención.

Detalle del L293D y su conexión con el microcontrolador.Área del control de motores

El arranque de los motores puede generar bajones de tensión en los 6V que aportan 4 pilas recargables tamaño AA de 1,5V. Por eso entre las pilas y la alimentación del microcontrolador se insertó un regulador de voltaje LM2940CT-5.0 que lleva los 6V a 5V, y que tiene a su salida un capacitor electrolítico de alto valor que ayuda, con su carga, a mantener estable el voltaje de la parte de control en los momentos en que los motores producen bajones de tensión al arrancar. La parte de los motores se alimenta directamente con 6V, en la etapa previa a la regulación.

En la imagen, un detalle de la parte de regulación de voltaje.Área de regulación de voltaje

El microcontrolador recibe su programación a través de dos señales, RX, o recepción, y TX, o transmisión. Esto configura la comunicación serie entre el microcontrolador del robot y el programa en la PC que envía los datos a programar.

Detalle de la conexión entre el módulo adaptador entre el puerto USB de la PC y el puerto USART del microcontrolador.Área de interconexión con la PC

El módulo tiene 4 contactos enchufables, y se desenchufa para operar el robot dejándolo moverse libremente.

Se observan en el circuito unos pequeños capacitores azules de 0,1 uF, llamados capacitores de desacople, que sirven para filtrar los ruidos de alta frecuencia producidos por las chispas de las escobillas de los motores, que podrían interferir con el funcionamiento del microcontrolador.

La imagen señala la posición de estos capacitores.Capacitores de filtro

Aquí se observan una cantidad de módulos comerciales de adaptación
del puerto USB de la PC al puerto USART de un microcontrolador.
Módulos

Continuaré con más detalles de circuito y de programación en los próximos artículos.