31 jul 2022

MICROCONTROLADORES PROGRAMABLES PIC (I)


Como continuación del último capítulo de Electrónica Básica, esta sección se centra en un elemento muy versátil, que es el Micro Controlador Programable o PIC. Tan solo vamos a ver su potencial y algunos ejemplos para poder desarrollar aplicaciones prácticas, dividido en varias publicaciones.



INTRODUCCIÓN.
Esta va a ser una introducción a la programación del PIC16F84. En las siguientes páginas veremos, desde la estructura básica del dispositivo, hasta los métodos y técnicas de programación más básicas. También veremos ejemplos de códigos y sugerencias para modificarlo y poderlo adaptar a otras aplicaciones o necesidades.



MICROCONTROLADORES

Un microcontrolador, como vimos en anteriores publicaciones, es un circuito integrado programable que contiene los elementos necesarios para controlar un sistema.
El acrónimo PIC significa “Peripheral Interface Controler”, es decir, un controlador de periférico. Un sistema que contiene, entre otros elementos, una unidad aritmético-lógica, memorias de datos y programas, puertos de entrada y salida. Podrimos decir, que es un pequeño ordenador, diseñado para realizar funciones específicas.
Es ese el motivo por el que lo podemos encontrar en lavadoras, teclados, teléfonos móviles, ratones etc.

Existen diversos modelos de microcontroladores, diferentes características respecto a más memoria, entradas y salidas, frecuencia de trabajo, coste, subsistemas integrados, etc.
Como iniciación y aprendizaje, veremos el conocido PIC 16F84, del fabricante Microchip Technology Inc. por ser un sistema sencillo, barato y potente para muchas aplicaciones electrónicas.
Las características del controlador las podemos encontrar en la web del fabricante microchip https://www.microchip.com/en-us/product/PIC16F84A y en su hoja de características (o Datasheet) https://ww1.microchip.com/downloads/aemDocuments/documents/MCU08/ProductDocuments/DataSheets/35007C.pdf



CARACTERÍSTICAS DEL 16F84.

Esta es la estructura interna del microcontrolador:




Y en la siguiente imagen vemos el diagrama de pines o patillas del PIC 16F84. 



  • VSS y VDD 
Estos son los pines de alimentación del PIC. VDD es la alimentación positiva (+), y VSS es el negativo de la alimentación, o 0 Voltios (-). La tensión máxima de alimentación que soporta el microcontrolador es 6 Voltios, y el mínimo son 2 Voltios. El consumo del circuito dependerá de las cargas en los puertos y de la frecuencia de trabajo.
En el siguiente gráfico se muestra un ejemplo de un regulador de alimentación para el PIC:



  • RA0 a RA4 
RA es un puerto bidireccional. Eso significa que se puede configurar como entrada o como salida. El número que hay después de RA indica el número de bit (0 a 4). Por tanto, tenemos un puerto bidireccional de 5 bits donde cada bit puede ser configurado como entrada o como salida. 
  • RB0 a RB7 
RB es un segundo puerto bidireccional. Se comporta exactamente de la misma manera que RA, excepto que este tiene 8 bits. 

  • OSC1/CLK IN y OSC2/CLKOUT 
En estos pines es donde conectaremos el reloj externo, para que el microcontrolador disponga de algún tipo de temporización que marca la frecuencia de trabajo.
Los osciladores pueden ser varios tipos; RC Formado por una resistencia y un condensador, HS se utiliza un cristal de cuarzo o resonador cerámico (Hasta 10 Mz), XT Cristal o resonador hasta 4 Mhz y LP Bajo consumo (hasta 200Khz).
En la imagen, un ejemplo clásico de oscilador de cristal (XT) a 4MHz:

  • MCLR 
Este pin, es el que se utiliza para borrar las posiciones de memoria dentro del PIC (p.ej. cuando quiero reprogramarlo). Durante el funcionamiento normal está conectado a la alimentación positiva. 

  • INT 
Este es un pin de entrada que puede ser monitorizado. Si el pin se pone a nivel alto, podemos hacer que el programa se reinicie, se pare o cualquier otra función de deseemos. En nuestro caso, no se utiliza mucho. 

  • TOCK1 
Esta es otra entrada de reloj, que opera con un temporizador interno. Opera aisladamente del reloj principal. De nuevo, este tampoco la utilizaremos mucho.
Con esta información, podemos montarnos un sencillo entrenador para el 16F84, con los puertos RA como entradas y los puertos RB como salidas. Utilizaremos como entrada unos micro interruptores y como salida unos leds conectados al puerto. Este podría ser entrenador PIC:


El propio PIC, dispone de una memoria de programa o de instrucciones es una memoria tipo FLASH de 1K.
En ella almacenaremos el programa que ejecutará el microcontrolador. Existe un registro especial llamado contador de programa PC cuya finalidad es avanzar por las instrucciones del programa de forma secuencial, a excepción de las instrucciones de salto.



 
La memoria de datos sirve para almacenar variables, leer puertos de entrada o escribir en los puertos de salida, podemos también acceder al temporizador o al registro EEPROM
La memoria de datos en el PIC 16F84 está formada por dos zonas; MEMORIA RAM de 68 registros, y MEMORIA EEPROM de 68 registros cuya característica principal es que no se perderán los datos cuando se desconecta la alimentación. Está formada por dos bancos Bank0 y Bank1.


Otras características del microcontrolador, son unos registros especiales que determinan algunas de las características notables del microcontrolador:
  • Temporizador/Contador TMR0
  • watch Dog o “Perro guardian” (WD)
  • Interrupciones.
  • Reset .(Reinicio del sistema)



COMO PROGRAMAR EL PIC.

Todo esto está muy bien, pero ¿Cómo programamos realmente el código y lo grabamos en el PIC? Pues hay dos maneras, la sencilla y la DIY (Do It Yourself). 
La manera sencilla es comprar al fabricante un programador de PIC, que se conecte al PC, y que suele llevar incluido un software con el que puedes programar el PIC. Para este caso, consultar la web del fabricante. 
La DIY se trata, ni más ni menos que construir nuestro propio programador y utilizar software gratuito descargado de Internet. 
En el caso de escoger este último, se puede encontrar documentación en la entrada de nuestro blog Programador PicKit, https://blog-xanur.blogspot.com , o la sección de Enlaces, al final del documento.



ENSAMBLADOR.

Lo siguiente que nos hace falta es un software ensamblador. Este convertirá el programa que escribimos, a un formato que el PIC comprende. El mejor es del propio Microchip, llamado MPLAB. Es un programa que incluye un editor, un simulador y el ensamblador. Este es un software escrito por los propios fabricantes del PIC, y además es gratuito. en la web de MPLAB de Microchip®, https://www.microchip.com/mplabx/.



PRUEBAS CON EL PIC

En este punto ya tenemos un programador, además de uno o dos chips PIC´s para empezar a "jugar". En los siguientes apartados conoceremos la teoría para saber programar el PIC, pero el aprendizaje real es cuando se hacen las pruebas del código generado y comprobar el resultado en el circuito. 
En la siguiente imagen, se puede ver un diagrama de un circuito, que muestra una placa de entrenamiento muy básica y económica. Evidentemente, si tenemos conocimientos más amplios, o requerimos otras funcionalidades, se puede modificar y ampliar el circuito, por ejemplo, añadiendo LED e interruptores o pulsadores. Básicamente, podemos iniciarnos con este circuito y posteriormente añadir lo que creamos necesario:


También tenemos la opción de realizar las pruebas en una placa de pruebas tipo “Protoboard”, la cual tienen diversos pines interconectados por la parte inferior, facilitando hacer circuitos no muy complejos, y probarlos con cierta agilidad.




En lo que a la programación en si se refiere, para elaborar un código, partimos de un planteamiento, teniendo presente todas las variables que afectan al sistema, desarrollaremos la idea y la implementaremos con las herramientas adecuadas. Este podría ser el diagrama de flujo para desarrollar un programa:


Luego pasamos a redactarlo, que lo podemos hacer mediante un editor de texto simple, como el que viene por defecto en el sistema operativo, o algún otro software, como por ejemplo, el propio MPLAB de Microchip, mencinado nteriormente, que nos da la opción de depurar el código y compilarlo, o bien  NotePad++, que nos facilita la  compresión de las instrucciones con diferentes modos de edición. En la sección de Enlaces, encontrareis todos ellos.






PROGRAMACIÓN BÁSICA.

Antes de empezar con la programación del PIC, habría que explicar algunas técnicas para programar bien. 

En el compilador, si escribimos “;” (punto y coma) en cualquier punto de tu programa, el compilador ignorará cualquier cosa que haya detrás de él, hasta llegar al retorno de carro. Esto significa que podemos añadir comentarios a nuestro programa que nos recuerden que estábamos haciendo en ese punto. 
Esta es una buena práctica incluso para los programas más sencillos, porque en el momento de programarlo, puede que entendamos completamente qué es lo que hace tu programa, pero dentro de un tiempo, tal vez nos desesperemos sin compréndelo o volver a descodificar lo que se hizo. Por tanto, utilizar comentarios es muy recomendable. 

Otro punto es asignar nombres a las constantes vía los registros. Hace lo que estás escribiendo mucho más sencillo de leer, para saber de qué valor se trata, en vez de intentar entender que significan todos esos números. Así que es preferible usar nombres reales como CONTADOR. Y es mejor ponerlo en letras mayúsculas. Esto lo hace destacar, y también significa por convención,  que se trata de una constante. 

Otra buena técnica es, añadir algún tipo de cabecera en los programas, utilizando los punto y coma para comentarios. Un ejemplo podría ser algo así:

1
2
3
4
5
6
7
8
9
10
;*************************************************************;
; PROGRAMA PRUEBA03.asm              FECHA: 15 Enero 2022     ;
; Programa para generar Luz Emergencia Auxiliar Coche         ;
; Usa los puertos RB 0-7 (Pin 6-13) y RA 0 (Pin 17)           ;
; Revisión: 2.0                     Programa para PIC16F48A   ;
; Velocidad de Reloj: RC externo 1Mhz Instrucción 1Mhz=1us    ;
; WatchDog = OFF                 Tipo Reloj: RC Externo       ;
; Autor: XMG                        Por: XANUR2001 / ACME 2022;
; Compilado en : MPLAB X IDE v2.05 (MICROCHIP)                ;
;*************************************************************;

También es recomendable documentar el programa sobre papel, usando diagramas de flujo, algoritmos, etc… Esto ayuda a escribir el programa paso a paso. 
 


REGISTROS.

Un registro es una posición del PIC que puede ser escrito, leído o ambas cosas. Podemos comparar un registro a un trozo de papel, donde podemos ver una información o escribirla. 
En la siguiente figura se muestra el mapa de registros internos del PIC16F84. Si no hemos visto algo parecido anteriormente, no debemos asustarnos, ya que es solo para mostrar donde están los diferentes bits y piezas dentro del PIC, y ayudará a explicar unos cuantos comandos.


Lo primero que observaremos es que está dividido en dos Bancos (Banco 0 y Banco 1). 
El Banco 1 se usa para controlar las propias operaciones del PIC, por ejemplo para decirle al PIC que bits del Puerto A son entradas y salidas. 
El Banco 0 se utiliza para manipular los datos. Por ejemplo: Supongamos que queremos poner un bit del puerto A, en nivel alto. Lo primero que necesitamos hacer es ir al Banco 1 para poner ese bit o pin en particular en el puerto A como salida. Después volvemos al Banco 0 y enviamos un 1 lógico a ese pin. 

Los registros que vamos a usar con más asiduidad en el Banco 1, son STATUS, TRISA y TRISB. 
El primero permite volver al Banco 0, TRISA nos permite establecer los pines que serán entradas y salidas del Puerto A, y TRISB nos permite establecer los pines que serán entradas y salidas del puerto B. Vamos a ver con más detalle estos y otros registros. 

  • STATUS 
Para cambiar del Banco 0 al Banco 1, utilizamos el registro STATUS. Hacemos esto poniendo el bit 5 (RP0) del registro STATUS a 1. Para cambiar de nuevo al Banco 0, ponemos el bit 5 del registro STATUS a 0. El registro STATUS se localiza en la dirección 03h en hexadecimal (es así definido por la 'h'). 
  • TRISA y TRISB 
Están localizados en las direcciones 85h y 86h respectivamente. Para programar que un pin sea una entrada o una salida, tan solo hemos de colocar 1 o un 0 al bit en cuestión en el registro.
Tenemos la posibilidad de hacer esto en binario o en hexadecimal. Si no estamos familiarizados con el paso de binario a hexadecimal y viceversa, podemos usar una calculadora científica. Visualmente, es más entendible comenzar a escribir en binario.
En el puerto A disponemos de 5 pines, por tanto 5 bits. Así que si queremos poner uno de los pines como entrada, enviamos un 1 al bit en cuestión. Y si queremos poner uno de los pines como salida, ponemos un 0 en ese bit. Los bits están definidos de acuerdo con los pines, es decir, el bit 0 es el RA0, el bit 1 es el RA1, el bit 2 es el RA2, y así sucesivamente. 
Supongamos a modo de ejemplo que queremos poner RA0, RA3 y RA4 como salidas, y RA1 y RA2 como entradas. Para ello enviamos esto: 00110 (en binario) o 06h (en hexadecimal). Es importante tener en cuenta de que, el bit cero está a la derecha, como se muestra aquí:


Para TRISB se aplica lo mismo. 
  • PORTA y PORTB 
Para poner uno de nuestros pines de salida a nivel alto, simplemente ponemos un 1 el bit correspondiente en nuestro registro PORTA o PORTB. El formato es el mismo que para los registros TRISA y TRISB. Para leer si un pin está a nivel alto o nivel bajo en los pines de nuestro puerto, podemos ejecutar una comprobación para ver si el bit en particular correspondiente esta puesto a nivel alto (1) o está puesto a nivel bajo (0). 
Pero antes de ver un ejemplo de código, tenemos que explicar dos registros más; W y F. 
El registro W es un registro de propósito general, al cual se puedes asignar cualquier valor que deseemos. Una vez que hemos asignado un valor a ese registro, puedes sumarle cualquier otro valor, o moverlo. Tener en cuenta que si le asignamos otro valor a W, su contenido se sobrescribe.

JUEGO DE INSTRUCCIONES.

El PIC dispone de un juego de instrucciones para poder programarlo. Este el set completo de 35 instrucciones, que iremos viendo poco a poco con ejemplos:


 
Como en todos los lenguajes de programación, disponemos de instrucciones aritméticas, instrucciones condicionales e instrucciones de salto.



En la siguiente publicación, empezaremos a ver el primer ejemplo de código.


ENLACES.

Y a continuación, una serie de enlaces útiles sobre lo expuesto:

Hoja de características (Datasheet) del PIC 16F84A®:

Web del Fabricante Microchip®:

MPLAB de Microchip®:

Software PICKit2 Programmer (y otros recursos en Microchip):

NotePad++:

WinPic800:

IC-PROG:

Programador JDM, en Blog Xanur:

Programador PicKit, en Blog Xanur:

Electrónica Digital, en Blog Xanur:




Esperamos que os haya gustado esta publicación. Si es así, no dudes en compartirla.

© Se permite reproducción total o parcial de este contenido, siempre y cuando se reconozca la fuente de información utilizada y se incluya el enlace a este artículo.

Equipo Xanur©2022.

 

No hay comentarios:

Publicar un comentario