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.



miércoles, 31 de julio de 2013

ELECTRONICA DIVERTIDA. Primera Parte

Inicio en la Electrónica (HACKLAB-ELALTO)

Para todos los que les llama la atención la electrónica y no saben donde empezar les propongo que me sigan con esta experiencia electrónica e informática.
Como es el inicio de varios proyectos quise hacerlo con las herramientas que ustedes ya han estado habituados o puedan virtualizar en sus maquinas. Me refiero a programas que simularan el funcionamiento y configuración de elementos eletronicos.
SIMULADOR DE CIRCUITOS ELECTRONICOS PROTEUS(ISIS)

Proteus – WIKI
http://es.wikipedia.org/wiki/Proteus_(electr%C3%B3nica)
Guía de Instalación de Proteus 7.X en Windows
(Decirles que ya salio la versión 8, y trae muchas novedades la diferencia mas clara que se da es que ISIS y ARES están juntos en un solo IDE)
La herramienta llamada ISIS nos ayudara a simular el comportamiento de componentes electrónicos, desde leds y resistencias hasta complejos circuitos microcontrolados. De esa manera con solo un computador uno puede empezar en este mundo de la electrónica.
(Si estas utilizando un sistema operativo basado en Linux te recomiendo las siguientes alternativas:    http://www.kicad-pcb.org/display/KICAD/KiCad+EDA+Software+Suite)


TUTORIAL EN PROTEUS RE RE RE FACIL:

Arrancamos el programa ISIS en la versión 7.X del PROTEUS:



Como ven hay las librerías suficientes como entretenerse un buen tiempo.


Seleccionamos una resistencia genérica:

Si haces doble click sobre el componente notaras que en tu lista de la izquierda se agrega:

Aquí el modelo grafico de la resistencia

En el lado derecho de la librería de componentes veremos el modelo 2D del componente en este caso una resistencia, abajo también podemos observar el componente pero para el diseño en placa electrónica, que veremos su uso en otra oportunidad.

Ahora agregamos un led o Diodo Emisor de Luz (Light Emiter Diode):

Hay muchos leds de los que podemos escoger, pero si se fijan solo algunos tiene la leyenda Animated, que quiere decir que tiene cierta animación en la simulación de cualquier circuito que hagamos.
Por ultimo agregaremos un botón o switch que nos permitirá tener cierto control sobre la corriente que fluya en el circuito. Igualmente tiene la leyenda Interactive que le da interactividad en la simulación.



ARMADO DEL CIRCUITO.
Desde nuestros Componentes

Hacemos click seleccionando y el siguiente clic para posicionar dentro del campo de diseño:

Si damos click derecho en el componente veremos que nos aparecen varias opciones, entre ellas rotar 90 o 180 grados, lo acomodamos según nos convenga.
Colocamos el siguiente componente en este caso el Diodo Led, recordemos que este componente si tiene polaridad y como todo diodo la corriente circulara en un solo sentido, asi que es importante saber si queremos que fluya corriente a través de nuestro Diodo Led o no. En este caso lo colocaremos de la siguiente manera:


Ahora vamos a empezar a realizar las conexiones entre componentes como si fuera un PROTOBOARD. Primero hacemos clic en el extremo de nuestra resistencia y notamos que se levanta una conexión, después posicionamos esa conexión al extremo positivo de nuestro Diodo Led de la siguiente manera:

Ahora ya estamos listos para probar el funcionamiento del circuito, pero hace falta algo importante. Se necesita Corriente que fluya a través de nuestro componentes, presta atencion:
* hacemos clic derecho en cualquier parte de nuestra área de diseño y seleccionamos la opción PLACE>TERMINALS>
POWER.

Este elemento es un fuente de alimentación muy flexible a la que podemos definir el voltaje que queramos para nuestro circuito. Asignando voltaje en el menú de clic derecho sobre el componente >Edit Properties:

Pero falta algo, la corriente necesita un lugar hacia donde dirigirse de lo contrario estaría estatica. En el mismo Menu Clic derecho PLACE>TERMINALS>GROUND, obtenemos un elemento tierra para nuestro circuito, este componente representara el punto neutral hacia el cual se dirigirá la corriente en nuestro circuito. Este componente neutral o TIERRA estará dispuesto en el lado negativo de nuestro Diodo Led.

El circuito quedaría de la siguiente manera:

Ahora bastaría con darle PLAY a nuestra simulación para ver que ocurre.

Y…………… nada.


Nada, nada es lo que ocurre, pues nos olvidamos de un aspecto importante en la electrónica, como es el calcular la resistencia que necesitamos para poder encender un LED.

Detengan la simulación.

Como podras ver la resistencia que esta dispuesta en el circuito R1  tiene el valor de 10k(Kilo Ohmios), valor que según la famosa Ley de Ohm, nos daría el siguiente valor en CORRIENTE (I):

Despejando la corriente:
I corriente= Voltaje/Resistencia
Asignando valores de nuestro circuito actual:
I corriente=  5 Voltios/ 10000 ohmios
Resultando:
I corriente = 0.0005 Amperios(Magnitud de corriente) o  0.5 miliamperios.

Este valor resultante esta demasiado por debajo de lo que se necesita para encender un LED.



20 miliAmperios es lo que se necesita para encender un LED.
Hagamos de nuevo esa sencilla operación en regla de 3 simple:
Necesitamos 20 mA(0.0020 Amperios), tenemos 5 voltios asi que solo nos basta obtener el valor adecuado de resistencia:
Según:

Tenemos:
Voltaje: 5v
Corriente: 0.02 Amperios
Resistencia : ?
Resistencia  = Voltaje / Corriente
R = 5 Voltios / 0.02 Amperios (corriente deseada)
R = 250 ohmios

Facil, no lo creen.
Ahora bien como ya tenemos el valor de resistencia que necesitamos para encender un LED, vamos a asignarlo en las propiedades del componente R1.

AHORA SIIIII      !!!!!! DENLE PLEYYY!!!


Hermoso, no es cierto….

Para finalizar este tutorial RE RE RE fácil vamos a hacer uso de nuestro SWITCH que recordaran agregamos en un principio. Tambien eliminamos la línea de conexión entre la Alimentacion +5V y nuestra resistencia R1 de la siguiente manera:

Posicionamos nuestra alimentación al costado izquierdo de nuestro SWITCH y hacemos las siguientes conexiones:

Recuerda que para mover algunos componentes tienes que darle clic derecho y darle DRAG OBJECT.

Ahora denle play a la animación y hagan clic sobre el SWITCH, para asi dejar fluir la corriente hacia la resistencia y el LED o detenerla según les antoje.

  
Algo mas que podamos agregar, a este tutorial y que les puede servir para entender el funcionamiento de circuitos en sus próximas simulaciónes es la opción que trae el proteus, una simulación de las corrientes que fluyen a través de un circuito, esto lo habilitaremos de la siguiente manera:



Con nuestra simulación detenida vamos al menú System>Set Animation Options:


Habilitamos el SHOW Wire Voltaje by Colour, que nos mostraran los voltajes que están trabajando en el circuito, y SHOW Current With Arriwos las direcciones que tienen las corrientes en el circuito.
Con esto inicias tu simulación y tendrías que ver algo como esto:


Bueno, espero les haya gustado esta parte de la simulación en Proteus y les animo a ver los ejemplos que trae el proteus en su carpeta SAMPLES y probar ustedes mismos algunos circuitos que tengan en mente. Con esto terminaría por ahora la parte Electrónica de nuestra primera experiencia, puedes tomarse un descanso o profundizar algunos aspectos de la Electrónica:

PRACTICA:
¿Porque razones no se debe colocar 0 ohmios a mi resistencia en serie con un LED en un circuito real?

Enlaces Interesantes al respecto de los iniciados en Electrónica:
Motor Eléctrico Sencillo:             
https://www.youtube.com/watch?v=xPi06hI4ZD8

El siguiente Tutorial sera del MICROCONTROLADOR PIC y su programacion.