jueves, 1 de agosto de 2013

Microcontroladores PIC y su PROGRAMACION. Segunda Parte


MICROCONTROLADOR PIC

En esta ocasión utilizaremos el micro controlador 16f877A, que en el mercado Boliviano esta a sus  30 a 40 Bs aproximadamente (depende de que tan casero seas).
Los microcontroladores PIC, tienen un uso industrial en sistemas electrónicos embedidos dedicados  donde se requiera controlar procesos y automatizar tareas. Por otro lado también hay microcontroladores de gama baja o media que sirven para usos académicos y aplicaciones sencillas.


En resumen el microcontrolador es un circuito integrado compuesto por un microprocesador y componentes como memoria y ALU(Unidad Logico Aritmetica). Este conjunto puede ejecutar las instrucciones guardadas en su memoria, claro estas instrucciones tienen que estar grabadas en hexadecimal, algo como esto:

:1000000000308A0019280000223084008313000881
:10001000031918280130F800F701F70B0D28F80B29
:100020000C284A30F700F70B13281628800B0A28F3
:10003000080003081F398300FF30A00083161F1437
:100040009F141F159F1107309C00831300308600FA
:10005000FF3087008312A000831686018312860179
:1000600020142008831687008312071C4328831658
:100070000610831206140230A1009630A20004205C
:10008000A10B3D284E28831606108312061002305D
:10009000A1009630A2000420A10B4928302863005B
:02400E00713F00
:00000001FF
;PIC16F877A
;CRC=7B7F  CREATED="31-jul-13 21:36"

Si esta explicación no te satisface siempre puedes hecharle un ojo a Wikipedia:
http://es.wikipedia.org/wiki/Microcontrolador_PIC

PROGRAMACION DE MICROCONTROLADORES (PIC)

Bueno, ya sabemos lo que es un microcontrolador al menos superficialmente, y también sabemos que podemos darle instrucciones que el ejecutara si le damos la condiciones necesarias. Asi que ahora nos ocuparemos de la lógica bajo la que trabajara el MICROCONTROLADOR PIC 16f877A.

Escogiendo un lenguaje de programación.

Hay una gran variedad de opciones cuando tu quieras programar un microcontrolador PIC. Estas son algunas.

  1.  C --------------à CCS o C Microchip(Fabricante de PIC), o MicroC.
  2.  Basic -----------à(Parecido al Visual Basic) En este caso PICBASIC
  3.  Python ------------à (Muy Utilizado en entornos Linux)
Un lenguaje ni tan difícil ni tan fácil considero que es el C en este caso CCS, del que puedes encontrar bastante información y ayuda en foros de electrónica.

Entonces necesitaremos este sofware PIC C Compiler:
Compilador C para convertir el archivo del programa en Hexadecimal, este archivo hexadecimal se grabara en el microcontrolador. Editor de Codigo CCS, con esta herramienta crearemos nuestro programa en un Lenguaje que nosotros podamos entender.

                Puedes descargarlo desde aca en su versio 4.1.XXX

Aquí hay un chorro de info:


PROGRAMANDO EN NUESTRO MICROCONTROLADOR

Cada microcontrolador PIC puede ser usado para una inmensa cantidad de aplicaciones, esta flexibilidad exije que profundizemos unos cuantos conocimientos acerca del funcionamiento del PIC cuando a este se le energiza.

Como ya sabemos el PIC tiene direcciones de memoria reservados para configurar el funcionamiento y arranque. Por ejemplo el PIC 16f877A en la dirección 85h es también llamada TRISA y con ella podemos informar al PIC que pines del puerto A serán tratadas como salidas y que pines del puerto A serán tratada como entradas. Pero para poder llamarla TRISA o PORTA y no 85h o XXh tenemos que incluir una librería de nombres que nos permitirá además configurar muchos aspectos del microcontrolador como ser el oscilador que usara, si se activara o no el watchdog( perro guardián).


El Lenguaje CCS tiene un archivo que nos ayudara a nombrar fácilmente a las muchas direcciones de configuración que tiene el microcontrolador PIC llamado 16f877A.h. Como todo lenguaje C soporta librerías asignaremos 16f877A.h en nuestro código.

PROGRAMACION EN CSS PARA PIC 16F877A

Primero ejecutamos nuestro Compilador C PIC

Una vez ahí empezamos nuestro primer proyecto:


Buscamos un destino donde colocar nuestro proyecto:


Bueno, después nos aparecerá una ventana donde podemos configurar algunos aspectos importantes de nuestro PIC, como ser la familia a la que pertenece y el tipo de Oscilador que utilizara para calcular los ciclos reloj. Nosotros escogeremos el PIC 16f877A con un Cristal de 4Mhz.

Bueno, automáticamente se escribe una plantilla básica, y vemos en la cabecera que esta incluido un archivo *.h, eso es una librería.



La librería se llama como nuestro proyecto PruebaLed_16f877A.h y aquí esta el contenido de ella:


 Esta se encuentra situada en la misma carpeta de nuestro proyecto, y como pueden observar todas las configuraciones que predefinimos anteriormente se escriben en instrucciones aca.
Podemos usar este asistente para realizar nuestro proyectos, como también escribir la configuración en la cabecera de nuestro propio archivo PruebaLed_16f877A.c y sin usar este archivo *.h. 


Ahora empecemos paso a paso cada parte de nuestro programa.
Como bien lo decía al principio CCS tiene una librería que contiene tanto configuraciones y nombre de direcciones de memoria reservadas del PIC, así que primero importaremos esa librería, en este caso llamada 16f877A.h



Segundo paso #fuses se refiere a algunos fusibles o banderas que podemos habilitar o deshabilitar según requiramos en nuestro PIC.
Por ejemplo:
El "Watch Dog Timer" o "Temporizador Perro guardián" es un artificio que se utiliza de antiguo para evitar que los microprocesadores se queden "colgados".

El WDT lo que hace fundamentalmente es resetear el micro tras un periodo de tiempo determinado. Su funcionamiento es similar a la Interrupción por Desbordamiento de un Timer, que se produce cuando un Timer que es incrementado continuamente pasa de su valor máximo al mínimo para comenzar de nuevo a contar. En el caso del WDT en lugar de saltar una interrupción se genera un reset automático en el momento de producirse dicho desbordamiento.

Por ahora no lo usaremos asi que lo mantendremos asi:


Ahora tal y como se quiso especificar en una librería a parte, definimos el tipo del oscilador que se usara:



Al interior de la instrucción delay puede especificarse HS, RC o Crystal y el valor de dicho oscilador.
Hasta aquí el encabezado necesario:
Agregamos un procedimiento principal Main() clásico en el lenguaje C de la siguiente manera.



Configurando puertos.- Tenemos que tomar en cuenta de que nuestro PIC puede exteriorizar ordenes e interactuar con el exterior a través de sus puertos, cada PUERTO tendrá una cantidad de PINES, a su vez cada PIN puede funcionar como una salida o entrada para el PIC.


Este grafico nos muestra una disposición común de un circuito con un 16f877A, como ven se tiene 4 PUERTOS, PORTA, PORTB, PORTC, PORTD y PORTE. Si se dan cuenta PORTA o RAX solo tiene 6 PINES. La mayoría de los PINES de PORTA pueden ser usados para leer valores analógicos. Desde AN0 a AN4, los demás puertos analógicos corresponderán al PORTE. En esta practica solo haremos uso de dos puertos, PORTB y PORTC.


set_tris_B(0b00000000);  se refiere a setear una dirección del PIC con un byte de puros ceros, esto para definir como salidas los 8 PINES de PORTB.

set_tris_C(255); se refiere a setear todos los PINES de PORTC con un valor de puros 1, en este caso se hace a través de un valor de decimal 255.
Para no provocar una salida de voltaje inesperado al inicio del funcionamiento del PIC ponemos la instrucción:
output_B(0b00000000);
De esta manera nos aseguramos que todos los PINES de PORTB estén en 0 logico.

Añadimos un bucle infinito en el cual contendrá la lógica de nuestro programa, que no será mas que una serie de instrucciones que se repetirán si cumplen las condiciones que instruyamos.


Primeramente vamos a poner en un 1 lógico un PIN del puerto configurado como salidas en este caso el PORTB con la siguiente instrucción:



Bueno, si ejecutamos este código dentro el microcontrolador y pusiéramos un LED en el PORTB el PIN 0, este no se prendería cuando se ejecute la instrucción de la línea 16.

La razón es simple, el microcontrolador ejecuta ordenes a una razón de 4 millones de ciclos por segundo, por tal motivo y para generar persistencia en el puerto tenemos que agregar un tiempo de espera antes de cambiar nuevamente de estado el PIN 0 de PORTB.


Este programa tendrá un PIN que expulsara un voltaje de 5 voltios o 1 lógico por el PORTB el PIN 0 de manera intermitente ya que aproximadamente cambiara de estado cada 300 milisegundos. Se dice aproximadamente porque cada instrucción que escribimos ocupa algunos ciclos reloj en el tiempo de ejecución del PIC que para cuestiones de precisión se tienen que tomar en cuenta.

Leyendo las entradas del PIC, PORTC:

Ahora vamos a leer una entrada en nuestro PIC, tal y como configuramos los puertos podemos escoger cualquier PIN del PORTC desde RC0 hasta RC7:


Escogimos el PIN 0 del PORTC, asi que vamos a condicionar nuestra salida en el PORTB de la siguiente manera:


 Hasta aquí la programación, solo nos queda compilar el programa.


Si todo va bien solo nos falta verificar si genero los archivos que necesitamos para grabarlos en nuestro microcontrolador PIC:


AHORA VAMOS A DISEÑAR LA SIMULACION EN PROTEUS 7.X:

En ISIS vamos a crear un proyecto lo llamaremos como queramos y luego vamos a guardarlo en el mismo directorio de nuestro proyecto CCS.


En el agregamos cuatro componentes:
·         Una resistencia genérica
·         Un pulsador o Button
·         Un Diodo de Luz LED
·         Un microcontrolador PIC16f877A

Añadiendo el pulsador

Añadiendo el PIC16f877A:


Añades tambien una resistencia generica y un pulsador o "Button",

ARMANDO EL CIRCUITO:
Primeramente vamos a explicar que la alimentación y tierra en un microcontrolador en PROTEUS no mereció la pena el diseño o al menos eso es lo que parece pues las patillas de alimentación 11 y 32 y las de tierra 12 y 31 no aparecen en el esquemático de PROTEUS, eso no quiere decir que no estén presentes, sino solo que se obvia su conexión.

En este esquema si están presentes: 


En este de Proteus no estan presentes los PINES de alimentacion

OTRO ASPECTO MUY IMPORTANTE EN LOS PIC ES LA PATILLA VPP, esta PIN es muy importante en lo que respecta al funcionamiento del PIC y se situa en el PIN #1 del 16f877A:

Si VPP esta en un estado de 0 Lógico o puesto a tierra(0 voltios), el PIC estará en RESET y ninguna instrucción se ejecutara.

Si VPP esta en un estado de 1 Lógico o 5 Voltios aproximadamente, se dice que el PIC esta habilitado para hacer correr el programa guardado de un memoria.

Y si VPP tiene un valor de entrada de 12 Voltios aproximadamente, se dice que el PIC esta en modo de programación, y que esta listo para que se graben datos de programa en su memoria.

Para nuestra aplicación definiremos el PIN VPP en estado 1 Lógico o 5 Voltios aprox, para que así corra el programa que vamos a suministrarle mas adelante.

1.       Entonces añadimos una fuente de alimentación PLACES>TERMINALS>POWER

2.       Modificamos el valor de la alimentación con clic derecho > Edit Properties asignando “+5V”.

1.       Añadimos una resistencia genérica entre la alimentación y el PIN VPP del PIC.

2.       Hacemos las conexiones respectivas.


Bueno, si intentas correr la animación no sucederá nada mas que un error indicándote que no existe programa dentro el microcontrolador, así que te pido un poco mas de paciencia que ya casi terminamos.

Ahora vamos a incluir nuestro actuador, en este caso nuestro LED con su correspondiente resistencia. Recordemos que el led tiene polaridad, la parte negativa de este tendrá que dirigirse a TIERRA(GROUND) y la parte positiva con su resistencia correspondiente dirigirse a un puerto de SALIDA que le suministre el voltaje y corriente necesarios para su iluminación. El PIN que escogimos es el mismo que en el programa en el PUERTOB el PIN 0, que es la patilla 33:

1.       Añadimos una resistencia, cambiamos el valor de 10k por 300 (ohmios), que provoca una corriente de casi 20 mA para hacer funcionar el LED.

2.       Añadimos un LED, respetando su polaridad y lo ponemos en serie con la resistencia.

3.       Añadimos una terminal PLACES>TERMINAL>GROUND, y hacemos las conexión necesarias


Eso en cuanto a nuestra salida del microcontrolador.

En nuestro programa también nos referimos a una entrada cuyo valor lógico verificábamos con una condicional, esa condición tiene dos estados, 1 o 0, falso o verdadero y también entendido como +5 Voltios o 0 Voltios(GROUND). Entonces necesitamos un componente electrónico que nos de la capacidad de permutar entre esos dos estados. Por ello seleccionamos nuestro Button y lo colocamos de la siguiente manera:

1.       Añadir el Button a el esquema cerca del PIN 15 correspondiente a PORTC 0.
2.       Crear una fuente de “+5V” cerca suyo y hacer las siguientes conexiones.


 Esto permitirá que fluya 5 Voltios con dirección hacia el PIN RC0 o patilla 15 del PIC. Pero no podemos asegurar que como esta actualmente el circuito tendrá un real y verdadero 0 lógico, ya que cuando el Button no estará apretado el PIN RC0 estará al aire, sin conexión alguna. Por ello para que el PIN RC0 o patilla 15 este en cero Lógico se coloca una resistencia en serie desde la patilla 15 hasta GROUND.


La resistencia que acabamos de colocar se le denomina como PULLDOWN, y nos asegura un 0 lógico mientras no este presionado el componente Button.

CIRCUITO OSCILADOR.- Por ultimo vamos a agregar(aunque no es necesario en la simulación) un oscilador de cristal de 4 Mhz que funciones como reloj de nuestro microcontrolador.

Agregamos dos componentes de nuestra librería:


CRYSTAL, Osiclador de cristal de valor configurable.


ARMADO DE CIRCUITO OSCILADOR:

1.       Añade una PALCE>TERMINAL >GROUND.
2.       Añade Dos Capacitores genéricos de 22 picofaradios cada uno.
3.       Añade un Crystal y cambia el valor 4 Mhz.
4.       Haz las conexiones respectivas.


Modificamos el valor del CRYSTAL a 4 Mhz


Esto para que te familiarices con el oscilador, repito este oscilador no es necesario para la simulacion. Ya que el microcontrolador tiene un campo donde puedes asignar esos 4 Mhz al propio PIC y no asi e este circuito, Para ello te vas a Properties del microcontrolador y Modificas el campo “Frecuency CLock”de 1 Mhz a 4 Mhz.


El Circuito quedaría de la siguiente manera:


GRABACION DE NUESTRO PROGRAMA EN EL PIC

Si este fuera un verdadero PORTOBOARD nos veríamos en la necesidad de conseguir un GRABADOR de PIC’s, para poder grabar el archivo hexadecimal que generamos desde CCS y grabarlo en la memoria del PIC 16f877A. Por suerte nada de ello necesitamos por el momento, ya que PROTEUS logra emular la interpretación del archivo hexadecimal que tenemos y lo ejecuta como si estuviera grabado en la memoria del microcontrolador, acaso no es fantástico.

Vamos a las propiedades de nuestro MICROCONTROADOR y veremos algo como esto:


Vamos con el explorador hasta nuestro directorio donde guardamos nuestro programa en CSS, en dicho directorio se encontrara un archivo hexadecimal *.hex y otro *.cof, en este caso el archivo COF es para uso de depuración, podemos en esta simulación usar cualquiera de los dos como si estuviéramos grabando el microcontrolador.

Seleccionamos el archivo y quedaría asi:


Esito seria, ahora pónganle play a la animación y crucen los dedos.

Aqui de nuevo el programa:


El programa dice que mientras esta apretado el Button, el LED pasara a estado HIGH(ALTO) que será 5 Voltios los cuales irán a la resistencia y al LED iluminándose como quisimos desde un principio.


Si tienes alguna Duda no olvides revisar la documentación que tiene CSS para su lenguaje.

Si no se enciende el LED comprueba que este con una resistencia R2 mayor a 1 kiloOhmio.

Para el próximo tutorial tenía previsto hacer el Puerto SERIAL pero , puerto serial es una tecnología en extinción, así que ustedes propongan si quieren puerto SERIAL o ya se animan por el puerto USB.