Sei sulla pagina 1di 43

E.E.

T Nº 460 “Guillermo Lehmann”


Departamento de Electrónica

Micro Controladores

PIC 16F628A
Arquitectura, Lenguajes de Programación, Pic Simulator, El
Basic, Instrucciones, Manejo de LCD, Puerto Serie

Micro Controladores PIC Curso; 5º B – Año 2010 1


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

• Introducción
• ¿Qué es un Microcontrolador?
• Estructura de un Microprocesador
• PIC16F628
• Puertos del PIC 16F628
• Lenguajes de Programación
• Lenguaje de Alto y Bajo Nivel
• Pic simulator IDE
• IC-Prog
• JDM Programmer – GTP USB Lite
• El BASIC
• Comportamiento Digital
• Manejo de Instrucciones y Variables
• LECTURA DE LA PROGRAMACION
• ALLDIGITAL
• TRISx
• PORTx
• Comillas “ ’ ”
• WAITMS - WaitUs
• GOTO
• DIM
• SYMBOL
• IF THEN ELSE
• Ejercicios
• FOR TO STEP NEXT
• LOOKUP
• SHIFTLEFT – SHIFTRIGHT
• WHILE – WEND
• GOSUB
• FREQOUT
• HSEROUT / HSERIN
• Ejercicios
• Manejo de LCD en PIC
• El HD44780
• PinOut del LCD HD44780
• Ejemplos en BASIC
• Bibliografía

Micro Controladores PIC Curso; 5º B – Año 2010 2


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Introducción:
Generalmente en cualquier proyecto electrónico que diseñemos nos vemos en
situaciones donde un solo circuito integrado o bien la combinación de estos con sus
aplicaciones especificas no siempre llegan a conformar el Proyecto que tenemos en
mente ya que, justamente, este o estos circuitos integrados poseen una sola aplicación
especifica, es decir, sabemos por ejemplo que un CD4093 es una compuerta NANAD
Schmidt Trigger, pero es solo una compuerta por lo cual ese será su trabajo, otro
ejemplo seria un CD4017 el cual es un registro de desplazamiento, solo cumple la
función de desplazar un bit por cada cambio de CLOCK, pero solo hará esta tarea, si
queremos realizar algún proyecto donde variables como tiempo, entradas, salidas,
RS232, PWM, comparadores, etc deberíamos juntar un puñado de integrados con sus
aplicaciones especificas y congeniarlos para que en conjunto realice nuestro Proyecto.
La pregunta seria ¿Funcionaria?, Posiblemente si, o bien en parte, o en el peor de los
casos estos integrados no serian del todo compatibles ya sea por diferencias en la
alimentación de cada Integrado, la sincronización entre cada uno de ellos y otros
factores a tener en cuenta, y ni hablar del diseño del PCB con tantos integrados.-
Pero bien, que podemos hacer entonces. Y si les digo que estas variables y funciones la
puede ejercer un solo integrado, que el mismo puede hacer casi cualquier funcion que
necesitemos, que además se pueda “Programar” como quisiéramos y que solo nos
puede ocupar 18 Pines, que cada Pin lo puedo programar para que haga tal o cual
trabajo, y que el PCB solo posea uno y solo un integrado...seria genial no!
Perfecto!!!....les presento al MICROCONTROLADOR

¿Qué es un Microcontrolador?
Un Microcontrolador es un dispositivo electrónico programable capaz de realizar tareas
que el usuario programe. Este esta formado por una CPU, una Memoria RAM, una
Memoria ROM, Puertos de Entrada y Salida, etc. Lo que nos da una idea de lo que
comúnmente vemos, una PC.
Sabemos que una PC esta formada por una CPU, Memoria, Disco Rígido, Teclado,
Monitor. Un microprocesador es exactamente igual ,salvando distancia en cuanto a
tamaño y capacidades obviamente, veremos que el mismo posee una CPU donde realiza
operaciones aritméticas, una Memoria RAM donde lleva a cabo los movimientos de los

Micro Controladores PIC Curso; 5º B – Año 2010 3


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Bits, Una ROM donde guarda el programa que generemos y unos Puertos de entrada y
Salida.
Hay que tener en cuenta que un Microcontrolador al energizarlo, este no hará
absolutamente nada si no tiene una programación, es decir, el Micro tal como lo
compramos viene vacio, será nuestro trabajo programarlo de forma correcta para que
realice las operaciones que queremos que haga.
Pero antes de entrar a la Programación del Micro veamos cómo está Construido un
Microcontrolador.

Estructura de un Microprocesador

Figura: 1. Estructura básica de un microcontrolador

En esta figura, vemos al microcontrolador metido dentro de un encapsulado de circuito


integrado, con su procesador (CPU), buses, memoria, periféricos y puertos de entrada
salida. Fuera del encapsulado se ubican otros circuitos para completar periféricos internos y
dispositivos que pueden conectarse a los pines de entrada/salida. También se conectarán a
los pines del encapsulado la alimentación, masa, circuito de completamiento del oscilador y
otros circuitos necesarios para que el microcontrolador pueda trabajar.

Una de las ventajas que tenemos con algunos de los microprocesadores actuales es que
estos poseen una memoria EEPROM o E2PROM (Electrical Erasable Programmable Read
Only Memory) es decir, posee una Memoria eléctricamente programable de solo lectura.

Micro Controladores PIC Curso; 5º B – Año 2010 4


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Esta ventaja nos da la posibilidad de modificar miles de veces nuestro programa ya sea por
corrección del programa o bien para futuras modificaciones.

Registros

Son un espacio de memoria muy reducido pero necesario para cualquier microprocesador,
de aquí se toman los datos para varias operaciones que debe realizar el resto de los circuitos

del procesador. Los registros sirven para almacenar los resultados de la ejecución de
instrucciones, cargar datos desde la memoria externa o almacenarlos en ella.

En realidad los registros es una de las partes más importantes de un Microprocesador, esta
nos da la”capacidad” de nuestro Micro,

Cuando escuchamos que un procesador es de 4, 8, 16, 32 ó 64 bits, nos estamos refiriendo a


procesadores que realizan sus operaciones con registros de datos de ese tamaño, y por
supuesto, esto determina muchas de las potencialidades de estas máquinas.

Mientras mayor sea el número de bits de los registros de datos del procesador, mayores
serán sus prestaciones, en cuanto a poder de cómputo y velocidad de ejecución, ya que este
parámetro determina la potencia que se puede incorporar al resto de los componentes del
sistema, por ejemplo, no tiene sentido tener una ALU* de 16 bits en un procesador de 8
bits.

*ALU (Aritmetric Logila Unit o Unidad Lógica Aritmética)

Por otro lado un procesador de 16 bits, puede que haga una suma de 16 bits en un solo ciclo
de máquina, mientras que uno de 8 bits deberá ejecutar varias instrucciones antes de tener
el resultado, aún cuando ambos procesadores tengan la misma velocidad de ejecución para
sus instrucciones. El procesador de 16 bits será más rápido porque puede hacer el mismo
tipo de tareas que uno de 8 bits, en menos tiempo.

Unidad de control

Esta unidad es de las más importantes en el procesador, en ella recae la lógica necesaria
para la decodificación y ejecución de las instrucciones, el control de los registros, la ALU,
los buses y cuanta cosa más se quiera meter dentro del procesador. No hay nada dentro de
un procesador que escape a las garras de la unidad de control. La unidad de control es Dios
en el procesador, es omnipotente y omnipresente, todos tienen que rendirle y nadie escapa a
su voluntad.
Micro Controladores PIC Curso; 5º B – Año 2010 5
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

La unidad de control es uno de los elementos fundamentales que determinan las


prestaciones del procesador, ya que su tipo y estructura, determina parámetros tales como el
tipo de conjunto de instrucciones, velocidad de ejecución, tiempo del ciclo de máquina, tipo
de buses que puede tener el sistema, manejo de interrupciones y un buen número de cosas
más que en cualquier procesador van a para a este bloque. Por supuesto, las unidades de
control, son el elemento más complejo de un procesador y normalmente están divididas en
unidades más pequeñas trabajando de conjunto. La unidad de control agrupa componentes
tales como la unidad de decodificación, unidad de ejecución, controladores de memoria
cache, controladores de buses, controladores de interrupción, pipelines, entre otros
elementos, dependiendo siempre del tipo de procesador.

Unidad aritmética y lógica

Como los procesadores son circuitos que hacen básicamente operaciones lógicas y
matemáticas, se le dedica a este proceso una unidad completa, con cierta independencia.
Aquí es donde se realizan las sumas, restas, y operaciones lógicas típicas del álgebra de
Boole.

Actualmente este tipo de unidades ha evolucionado mucho y los procesadores más


modernos tienen varias ALU, especializadas en la realización de operaciones complejas
como las operaciones en coma flotante. De hecho en muchos casos le han cambiado su
nombre por el de “coprocesador matemático”, aunque este es un término que surgió para
dar nombre a un tipo especial de procesador que se conecta directamente al procesador más
tradicional.

Su impacto en las prestaciones del procesador es también importante porque, dependiendo


de su potencia, tareas más o menos complejas, pueden hacerse en tiempos muy cortos,
como por ejemplo, los cálculos en coma flotante.

Buses

Son el medio de comunicación que utilizan los diferentes componentes del procesador para
intercambiar información entre sí, eventualmente los buses o una parte de ellos estarán
reflejados en los pines del encapsulado del procesador.

En el caso de los microcontroladores, no es común que los buses estén reflejados en el


encapsulado del circuito, ya que estos se destinan básicamente a las E/S de propósito
general y periféricos del sistema.

Existen tres tipos de buses:

Micro Controladores PIC Curso; 5º B – Año 2010 6


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Dirección: Se utiliza para seleccionar al dispositivo con el cual se quiere trabajar o en el


caso de las memorias, seleccionar el dato que se desea leer o escribir.

Datos

Control: Se utiliza para gestionar los distintos procesos de escritura lectura y controlar la
operación de los dispositivos del sistema.

Conjunto de instrucciones

Aunque no aparezca en el esquema, no podíamos dejar al conjunto o repertorio de


instrucciones fuera de esta fiesta, porque este elemento determina lo que puede hacer el
procesador.

Define las operaciones básicas que puede realizar el procesador, que conjugadas y
organizadas forman lo que conocemos como software. El conjunto de instrucciones vienen
siendo como las letras del alfabeto, el elemento básico del lenguaje, que organizadas
adecuadamente permiten escribir palabras, oraciones y cuanto programa se le ocurra.

Aquí es donde centraremos atención más adelante y donde veremos las instrucciones más
conocidas para el tratamiento de señales DIGITALES

Memoria

Anteriormente habíamos visto que la memoria en los microcontroladores debe estar


ubicada dentro del mismo encapsulado, esto es así la mayoría de las veces, porque la idea
fundamental es mantener el grueso de los circuitos del sistema dentro de un solo integrado.

En los microcontroladores la memoria no es abundante, aquí no encontrará Gigabytes de


memoria como en las computadoras personales. Típicamente la memoria de programas no
excederá de 16 K-localizaciones de memoria no volátil para instrucciones y la memoria
RAM ni siquiera llegará a exceder los 5 Kilobytes.

La memoria RAM está destinada al almacenamiento de información temporal que será


utilizada por el procesador para realizar cálculos u otro tipo de operaciones lógicas. En el
espacio de direcciones de memoria RAM se ubican además los registros de trabajo del
procesador y los de configuración y trabajo de los distintos periféricos del
microcontrolador. Es por ello que en la mayoría de los casos, aunque se tenga un espacio de
direcciones de un tamaño determinado, la cantidad de memoria RAM de que dispone el
programador para almacenar sus datos es menor que la que puede direccionar el
procesador.

Micro Controladores PIC Curso; 5º B – Año 2010 7


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

El tipo de memoria utilizada en las memorias RAM de los microcontroladores es SRAM, lo


que evita tener que implementar sistemas de refrescamiento como en el caso de las
computadoras personales, que utilizan gran cantidad de memoria, típicamente alguna
tecnología DRAM. A pesar de que la memoria SRAM es más costosa que la DRAM, es el
tipo adecuado para los microcontroladores porque éstos poseen pequeñas cantidades de
memoria RAM.

En el caso de la memoria de programas se utilizan diferentes tecnologías, y el uso de una u


otra depende de las características de la aplicación a desarrollar, a continuación se
describen las cinco tecnologías existentes, que mayor utilización tienen o han tenido, hasta
el momento de escribir este libro:

ROM de máscara. En este caso no se “graba” el programa en memoria sino que el


microcontrolador se fabrica con el programa, es un proceso similar al de producción de los
CD comercial mediante masterización.

El costo inicial de producir un circuito de este tipo es alto, porque el diseño y producción de
la máscara es un proceso costoso, sin embargo, cuando se necesitan varios miles o incluso
cientos de miles de microcontroladores para una aplicación determinada, como por
ejemplo, algún electrodoméstico, el costo inicial de producción de la máscara y el de
fabricación del circuito se distribuye entre todos los circuitos de la serie y, el costo final de
ésta, es bastante menor que el de sus semejantes con otro tipo de memoria.

TP One Time Programmable. Este tipo de memoria, también es conocida como PROM o
simplemente ROM.

Los microcontroladores con memoria OTP se pueden programar una sola vez, con algún
tipo de programador. Se utilizan en sistemas donde el programa no requiera futuras
actualizaciones y para series relativamente pequeñas, donde la variante de máscara sea muy
costosa, también para sistemas que requieren serialización de datos, almacenados como
constantes en la memoria de programas.

EPROM Erasable Programmable Read Only Memory. Los microcontroladores con este
tipo de memoria son muy fáciles de identificar porque su encapsulado es de cerámica y
llevan encima una ventanita de vidrio desde la cual puede verse la oblea de silicio del
microcontrolador.

Se fabrican así porque la memoria EPROM es reprogramable, pero antes debe borrase, y
para ello hay que exponerla a una fuente de luz ultravioleta, el proceso de grabación es
similar al empleado para las memorias OTP. Al aparecer tecnologías menos costosas y más
flexibles, como las memorias EEPROM y FLASH, este tipo de memoria han caído en
Micro Controladores PIC Curso; 5º B – Año 2010 8
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

desuso, se utilizaban en sistemas que requieren actualizaciones del programa y para los
procesos de desarrollo y puesta a punto.

EEPROM Electrical Erasable Programmable Read Only Memory. Fueron el sustituto


natural de las memorias EPROM, la diferencia fundamental es que pueden ser borradas
eléctricamente, por lo que la ventanilla de cristal de cuarzo y los encapsulados cerámicos
no son necesarios.

Al disminuir los costos de los encapsulados, los microcontroladores con este tipo de
memoria se hicieron más baratos y cómodos para trabajar que sus equivalentes con
memoria EPROM. Otra característica destacable de este tipo de microcontrolador es que
fue en ellos donde comenzaron a utilizarse los sistemas de programación en circuito o ICSP
(In Circuit Serial Progamming) que evitan tener que sacar el microcontrolador de la tarjeta
que lo aloja para hacer actualizaciones al programa.

FLASH. En el campo de las memorias reprogramables para microcontroladores, son el


último avance tecnológico en uso a gran escala, y han sustituido a los microcontroladores
con memoria EEPROM.

A las ventajas de las memorias FLASH se le adicionan su gran densidad respecto a sus
predecesoras lo que permite incrementar la cantidad de memoria de programas a un costo
muy bajo. Pueden además ser programadas con las mismas tensiones de alimentación del
microcontrolador, el acceso en lectura y la velocidad de programación es superior,
disminución de los costos de producción, entre otras. Lo más habitual es encontrar que la
memoria de programas y datos está ubicada toda dentro del microcontrolador, de hecho,
actualmente son pocos los microcontroladores que permiten conectar memoria de
programas en el exterior del encapsulado. Las razones para estas “limitaciones” están dadas
porque el objetivo fundamental es obtener la mayor integración posible y conectar
memorias externas consume líneas de E/S que son uno de los recursos más preciados de los
microcontroladores. A pesar de lo anterior existen familias como la INTEL 51 cuyos
microcontroladores tienen la capacidad de ser expandidos en una variada gama de
configuraciones para el uso de memoria de programas externa. En el caso de los PIC, estas
posibilidades están limitadas sólo a algunos microcontroladores de la gama alta, la Figura 5
muestra algunas de las configuraciones para memoria de programa que podemos encontrar
en los microcontroladores. La configuración (a) es la típica y podemos encontrarla casi en
el 100% de los microcontroladores. La configuración (b) es poco frecuente y generalmente
se logra configurando al microcontrolador para sacrificar la memoria de programas interna,
sin embargo el 8031 de INTEL es un microcontrolador sin memoria de programas interna.
La configuración (c) es la que se encuentra habitualmente en los microcontroladores que
tienen posibilidades de expandir su memoria de programas como algunos PIC de gama alta.

Micro Controladores PIC Curso; 5º B – Año 2010 9


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Figura 5. Algunas configuraciones para memoria de programas en


microcontroladores

Cuando se requiere aumentar la cantidad de memoria de datos, lo más frecuente es colocar


dispositivos de memoria externa en forma de periféricos, de esta forma se pueden utilizar
memorias RAM, FLASH o incluso discos duros como los de las PC, mientras que para los
cálculos y demás operaciones que requieran almacenamiento temporal de datos se utiliza la
memoria RAM interna del microcontrolador. Esta forma de expandir la memoria de datos
está determinada, en la mayoría de lo casos, por el tipo de repertorio de instrucciones del
procesador y porque permite un elevado número de configuraciones distintas, además del
consiguiente ahorro de líneas de E/S que se logra con el uso de memorias con buses de
comunicación serie.

Interrupciones

Para entender de una manera más fácil que son las Interrupciones daremos un ejemplo
cotidiano:

Imagine que está esperando la visita de un amigo, al que llamaremos Juan. Usted y Juan
han acordado que cuando él llegue a su casa esperará pacientemente a que le abra la puerta.
Juan no debe tocar a la puerta porque alguien en la casa duerme y no quiere que le
despierten.

Ahora usted ha decidido leer un libro mientras espera a que Juan llegue a la casa, y para
comprobar si ha llegado, cada cierto tiempo detiene la lectura, marca la página donde se
quedó, se levanta y va hasta la puerta, abre y comprueba si Juan ha llegado, si éste todavía
no está en la puerta, esperará unos minutos, cerrará la puerta y regresará a su lectura
durante algún tiempo.

Micro Controladores PIC Curso; 5º B – Año 2010 10


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Como verá este es un método poco eficiente para esperar a Juan porque requiere que deje la
lectura cada cierto tiempo y vaya hasta la puerta a comprobar si él ha llegado, además debe
esperar un rato si todavía no llega. Y por si fuera poco, imagine que Juan no llega nunca
porque se le presentó un problema, tuvo que cancelar la cita y no pudo avisarle a tiempo, o
peor, que Juan ha llegado a la puerta un instante después que usted la cerraba. Juan,
respetando lo acordado, espera un tiempo, pero se cansa de esperar a que le abran y decide
marcharse porque cree que ya usted no está en la casa o no puede atenderlo. A este método
de atender la llegada de Juan lo llamaremos encuesta.

Veamos ahora otro método. En esta ocasión simplemente se recuesta en el sofá de la sala y
comienza a leer su libro, cuando Juan llegue debe tocar el timbre de la puerta y esperar
unos momentos a que le atiendan. Cuando usted oye sonar el timbre, interrumpe la lectura,
marca la página donde se quedó y va hasta la puerta para atender a la persona que toca el
timbre. Una vez que Juan o la persona que ha tocado el timbre, se marcha, usted regresa a
su asiento y retoma la lectura justo donde la dejó. Este último es un método más eficiente
que el anterior porque le deja más tiempo para leer y elimina algunos inconvenientes como
el de que Juan nunca llegue o se marche antes de que usted abra la puerta. Es, en principio,
un método simple pero muy eficaz y eficiente, lo llamaremos atención por interrupción.

Los ejemplos anteriores, nos sirven para introducir los dos métodos de trabajo que existen
para la atención de procesos en el mundo de los microcontroladores. Estos ejemplos no son
de mi creación, pero gracias a ellos comprendí cómo es que se atiende a los procesos
cuando utilizamos microcontroladores.

El primero de ellos, la encuesta, es un método eficaz, pero poco eficiente porque requiere
realizar lecturas constantes y muchas veces innecesarias del estado del proceso que
queremos atender. Sin embargo, es muy utilizado en la programación de

microcontroladores porque resulta fácil de aprender, la implementación de código con este


método es menos compleja y no requiere de hardware especial para llevarla adelante. Por
otra parte, la encuesta, tiene muchas deficiencias que con frecuencia obligan al diseñador a
moverse hacia otros horizontes

El mundo está lleno de situaciones; de las cuales no podemos determinar ni cuando, ni


como ni por qué se producen, en la mayoría de los casos lo único que podemos hacer es
enterarnos de que determinada situación, asociada a un proceso, ha ocurrido. Para ello
seleccionamos alguna condición o grupo de condiciones que nos indican que el proceso que
nos interesa debe ser atendido, a este fenómeno, en el cual se dan las condiciones que nos
interesa conocer, lo llamaremos evento. En el segundo ejemplo vemos que para atender a
Juan, éste debe tocar el timbre, por tanto, la llegada de Juan es el proceso que debemos
atender y el sonido del timbre es el evento que nos indica que Juan ha llegado.
Micro Controladores PIC Curso; 5º B – Año 2010 11
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

El método de atención a procesos por interrupción, visto desde la óptica del ejemplo que
utilicé para mostrarlo, es más simple que el de la encuesta, pero no es cierto, el método se
complica porque requiere que el microprocesador incorpore circuitos adicionales para
registrar los eventos que le indican que debe atender al proceso asociado y comprender
estos circuitos y su dinámica no es una tarea sencilla.

Los circuitos para la atención a las interrupciones y todas las tareas que debe realizar el
procesador para atender al proceso que lo interrumpe son bastante complejos y requieren
una visión diferente de la que estamos acostumbrados a tener de nuestro mundo.

Los seres humanos no estamos conscientes de las interrupciones, en nuestro organismo


existen mecanismos que nos interrumpen constantemente, para ello tenemos a nuestro
sistema sensorial, pero no somos conscientes del proceso de interrupción, aunque sí de la
atención a las interrupciones. Eso es porque incorporamos mecanismos que nos sacan
rápidamente de la tarea que estemos haciendo para atender una situación que no puede o no
debe esperar mucho tiempo. Bien, esa misma es la idea que se incorpora en los
microprocesadores para atender procesos que no pueden esperar o que no sabemos cuando
deben ser atendidos porque ello depende de determinadas condiciones.

La cosa se complica en la secuencia de acciones a realizar desde el momento en que se


desencadena el proceso de interrupción, hasta que se ejecuta el programa que lo atiende, y
en la secuencia de acciones posteriores a la atención. Piense en cuantas cosas debe hacer su
organismo ante una interrupción, utilicemos el segundo ejemplo para atender la llegada de
Juan. Piense en cuantas cosas su cerebro hace a espaldas de su conciencia, desde el
momento en que suena el timbre hasta que usted se encuentra listo (consciente de que es
probable que Juan ha llegado) para abrir la puerta, y todo lo que su cerebro debe trabajar
para retomar la lectura después que Juan se ha marchado. Todo eso, excepto abrir la puerta
y atender a Juan, lo hacemos de forma “inconsciente” porque para ello tenemos sistemas
dedicados en nuestro organismo, pero en el mundo de los microcontroladores debemos
conocer todos esos detalles para poder utilizar los mecanismos de interrupción.

Los procesos de atención a interrupciones tienen la ventaja de que se implementan por


hardware ubicado en el procesador, así que es un método rápido de hacer que el procesador
se dedique a ejecutar un programa especial para atender eventos que no pueden esperar por
mecanismos lentos como el de encuesta.

En términos generales, un proceso de interrupción y su atención por parte del procesador,


tiene la siguiente secuencia de acciones.

Micro Controladores PIC Curso; 5º B – Año 2010 12


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

En el mundo real se produce el evento para el cual queremos que el procesador ejecute un
programa especial, este proceso tiene la característica de que no puede esperar mucho
tiempo antes de ser atendido o no sabemos en que momento debe ser atendido.

El circuito encargado de detectar la ocurrencia del evento se activa, y como consecuencia,


activa la entrada de interrupción del procesador.

La unidad de control detecta que se ha producido una interrupción y “levanta” una bandera
para registrar esta situación; de esta forma si las condiciones que provocaron el evento
desaparecen y el circuito encargado de detectarlo desactiva la entrada de interrupción del
procesador, ésta se producirá de cualquier modo, porque ha sido registrada.

La unidad de ejecución termina con la instrucción en curso y justo antes de comenzar a


ejecutar la siguiente comprueba que se ha registrado una interrupción

Se desencadena un proceso que permite guardar el estado actual del programa en ejecución
y saltar a una dirección especial de memoria de programas, donde está la primera
instrucción de la subrutina de atención a interrupción.

Se ejecuta el código de atención a interrupción, esta es la parte “consciente” de todo el


proceso porque es donde se realizan las acciones propias de la atención a la interrupción y
el programador juega su papel.

Cuando en la subrutina de atención a interrupción se ejecuta la instrucción de retorno, se


desencadena el proceso de restauración del procesador al estado en que estaba antes de la
atención a la interrupción.

Como podemos observar, el mecanismo de interrupción es bastante complicado, sin


embargo tiene dos ventajas que obligan a su implementación: la velocidad y su capacidad
de ser asincrónico. Ambas de conjunto permiten que aprovechemos al máximo las
capacidades de trabajo de nuestro procesador.

Los mecanismos de interrupción no solo se utilizan para atender eventos ligados a procesos
que requieren atención inmediata sino que se utilizan además para atender eventos de
procesos asincrónicos.

Las interrupciones son tan eficaces que permiten que el procesador actúe como si estuviese
haciendo varias cosas a la vez cuando en realidad se dedica a la misma rutina de siempre,
ejecutar instrucciones una detrás de la otra.

Micro Controladores PIC Curso; 5º B – Año 2010 13


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

PIC16F628
Ya hablamos de la arquitectura del Micro, sus registros e Interrupciones, pues bien
hablemos entonces del PIC.
Centraremos nuestro estudio a esta Familia de Micros, si bien existen el el Mercado una
gran variedad de micros de diferentes Familias y Empresas que los desarrollan y Fabrican
según sus especificaciones y diseños, nosotros dedicaremos nuestro estudio a la Empresa
MicroChip y especialmente a el versátil 16F628.

Como podemos ver en la figura siguiente este micro consta de 16 pines de múltiple
propósito más 2 pines de Alimentación, necesarios en cualquier circuito.

Como se puede ver el micro consta de 2 Puertos, el Puerto A y el Puerto B y a la vez cada
puerto contiene 8 pines que van desde RA0 a RA7 y RB0 a RB7
La alimentación de estos Circuitos Integrados es de 3.3Volts a 5Volts.

NO USAR UN VOLTAJE SUPERIOR A 5.5 VOLTS, UN VOLTAJE SUPERIOR


PODRIA DAÑARLO PERMANENTEMENTE

Como se puede ver, cada pin tiene asociado una característica particular, estas característica
son las funciones que pueden o no ser utilizadas por nosotros, es decir, podemos trabajar
con salidas netamente Digitales (0 y 1) o bien utilizar la función con la que viene alojada en
el micro con solo habilitarlo por Software

Estas características son:

Micro Controladores PIC Curso; 5º B – Año 2010 14


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Característica Propiedad

Memoria de programa 1 KBytes)

Memoria SRAM 224 Bytes

Memoria EEPROM 128 Bytes

Pines de E/S 16

Entradas analógicas (ADC) No

Salidas PWM 2

SPI No

I2C No

USART Si

Temporizadores de 8 Bits 2

Temporizadores de 16 Bits 1

Comparadores 2

Frecuencia máxima: 20 MHz


Oscilador
Oscilador interno de 4 MHz.

Número de pines 18

Encapsulado PDIP, SOIC, SSOP, QFN

Puertos del PIC 16F628


Como dijimos anteriormente el 16f628 posee 2 puertos con 8 salidas cada una, si bien el
estudio que daremos en este curso es solo digital nombraremos las características
analógicas y funciones solo para saber el potencial de nuestro Micro.

PUERTO A

RA.0 = AN0 Entrada Comparadora 1

RA.1 = AN1 Entrada Comparadora 2

RA.2 = AN2/Vref Entrada Comparadora 3 - Voltaje de referencia

Micro Controladores PIC Curso; 5º B – Año 2010 15


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

RA.3 = AN3/CMP1 Entrada Comparadora 4 - Salida Comparador 1

RA.4 = TOCKI/CMP2 Entrada de Clock para TMR0


______
RA.5 =MCLR/Vpp Master Clear (reset) y Voltaje de programación

RA.6 = OSC/CLKOUT Oscilador Externo – Clock Output

RA.7 = OSC/CLKIN Oscilador Externo – Clock Input

PUERTO B

RB.0 = INT Interrupción Externa

RB.1 = RX/DT Recepcion USART

RB.2 = TX/CK Transmisión USART

RB.3 = CCP1 Captura Comparador

RB.4 = PGM Pin Habilitación del Programación del micro

RB.5 = Propósito general

RB.6 = T1OSI/PGD Timmer 1 Oscilador Input – Prog. DATA

RB.7 = T1OSO/T1CKI/PGC Timmer 1 Oscilador Output – Prog. CLOCK

Lenguajes de Programación
Bien, avanzaremos en lo que nos interesa, la programación del micro.
Si bien nos podemos encontrar con varios lenguajes de programación (C++, Assembler,
BASIC, PIC Basic) el lenguaje que usaremos para esta materia es el BASIC.

Veamos algunos ejemplos


Micro Controladores PIC Curso; 5º B – Año 2010 16
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Basic:
AllDigital
inicio:
If PORTA.0 = 1 Then GOTO inicio

Significaría, Si la puerta 0 es igual a 1 entonces ir a Inicio

Assembler:

; Begin
R0L EQU 0x20
R0H EQU 0x21
R1L EQU 0x22
R1H EQU 0x23
R2L EQU 0x24
R2H EQU 0x25
R3L EQU 0x26
R3H EQU 0x27
R4L EQU 0x28
R4H EQU 0x29
R5L EQU 0x2A
R5H EQU 0x2B
ORG 0x0000
BCF PCLATH,3
BCF PCLATH,4
GOTO L0002
ORG 0x0004
RETFIE
L0002:
; 1: AllDigital
MOVLW 0x07
MOVWF 0x1F
; 2: inicio:
L0001:
; 3: If PORTA.0 = 1 Then GOTO inicio
BTFSS 0x05,0
GOTO L0003
GOTO L0001
L0003: MOVLW 0x1F
ANDWF STATUS,F
; End of program
L0004: GOTO L0004
; End of listing
END

Esta claro que en Basic es mucho mas fácil no!, pero para que nos sirve Assembler
entonces?, Como vimos cualquier de los lenguajes nombrados deben terminar en un
lenguaje que el micro entienda (Binario), obviamente que no podríamos estar a un nivel de
lenguaje de máquina, es decir, programando o escribiendo en ceros y unos, pero si
acercarnos

Micro Controladores PIC Curso; 5º B – Año 2010 17


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Lenguaje de Alto y Bajo Nivel


El BASIC es un lenguaje de Alto Nivel, mientras otros como el Assembler son de Bajo
Nivel ¿Qué significa Alto y Bajo Nivel?
Se define como alto nivel aquel lenguaje que está más cerca de ser comprendido por el
usuario, (Basic, C++, etc.) Al fin y al cabo los dos llegaran al mismo propósito, con
significativas diferencias en cuanto a la eficiencia dada por las instrucciones y ocupación
de memoria, es un lenguaje intuitivo y consta de palabras o instrucciones fáciles de
entender.
Por el otro lado un lenguaje de Bajo Nivel es aquel que esta mas cerca del lenguaje de
Maquina (Binario).
Pero sigue la incógnita, para que me sirve Assembler?
Este lenguaje es muy utilizado en cuestiones donde la velocidad de respuesta, tiempos y
demás cuestiones muy significativas entran en juego, es decir, donde la mínima variación
de un bit cuenta, no nos referimos a un bit en cuanto a entradas, sino a bit en cada
instrucción o contador del programa (CP) que puede variar en un salto de ciclo a otro en
cuestión de micro segundos.

Pero para el uso que le vamos a dar en nuestro Curso nos es suficiente entender BASIC,
queda a criterio del estudiante ahondar mas sobre el tema y por qué no, programar en
Assembler

Sigamos….

Vimos que un compilador es aquel que traduce nuestro programa a un código el cual es
entendido por nuestro dispositivo (Pc, Micro Controlador,) la eficiencia del compilador
estará dada por el menor recurso utilizado (Ocupación de Memoria) y el mejor rendimiento
o desempeño para nuestra tarea

Un compilador entonces es un programa informático que traduce un programa escrito en un


lenguaje de programación a otro lenguaje de programación, en nuestros caso será un
traductor de un lenguaje de alto nivel, a su código máquina absoluto o reubicable
equivalente.

Además sabemos también que un integrado cualquier trabaja con 0 y 1, entonces cualquier
de estos lenguajes indefectiblemente deberá terminar en un código BINARIO.

Otro Punto Importante es el QUEMADOR, este Dispositivo sirve para grabar en el Micro
la programación de la que hablamos anteriormente. Es necesario tanto el Software como el
Hardware para realizar este propósito, en nuestro caso usaremos tanto WINPIC como el IC-
Prog que son los que soportan el circuito JDM Programmer el cual es sencillo de fabricar
Este Dispositivo utiliza el Puerto RS-232 y no requiere alimentación externa por lo cual lo
hace mas practico. El circuito puede ser consultado desde Internet en la siguiente dirección
http://www.jdm.homepage.dk/newpic.htm
Micro Controladores PIC Curso; 5º B – Año 2010 18
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Pic simulator IDE


Existe una herramienta que nos ayudara a la hora de realizar nuestros proyectos, este
Software es un Simulador que contiene varias herramientas internas como Matriz de Led,
Motores PaP, LCD, Internas RS232, teclado ademas de contar con un programador en
BASIC y un COMPLIADOR que transformara nuestro Proyecto a lenguaje maquina
Este programa será donde el estudiante hará sus simulaciones, la misma cuenta con varios
accesorios para que el estudiante hagas sus pruebas, simulaciones y programas en BASIC.
Con el aprenderá varias de las instrucciones que usa este excelente programa y podrá
realizar proyectos con muy buenos resultados.
Este puede ser descargado desde su Web en la siguiente Dirección

http://www.oshonsoft.com/pic.html
Veamos la presentación de Software

En la página podrán encontrar las instrucciones con las que trabaja este Práctico programa
el cual será utilizado en nuestros proyectos ya que cuenta con la posibilidad de Simular
antes de quemar nuestro PIC

Micro Controladores PIC Curso; 5º B – Año 2010 19


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

IC-Prog
Ya veremos la programación y como trabajar sobre el PIC, pero debemos saber que una
herramienta fundamental a la hora de ingresarle la programación al PIC es el
“Quemador”.Este quemador no es mas ni menos que una herramienta la cual esta conectada
a una PC y es la encargada de enviarle nuestra programación en lenguaje maquina (0 y 1)
por medio de Impulsos Eléctricos.
Esto se logra con otro Software llamado IC-Prog que puede ser descargado desde su web
http://www.ic-prog.com/

JDM Programmer RS-232


Pero bien, nos falta algo, con que lo vamos a Quemar a nuestro PIC, nos hace falta el
HARDWARE para realizarlo.
Existe una variedad interesante de programadores PIC, por medio de RS232, USB, Puerto
Paralelo, pero todos hacen exactamente lo mismo, más rápido o más lento pero todos llegan
al mismo fin, grabar nuestro PIC
El JDM Programmer es un programador que podemos realizar en forma casera con
resultados óptimos
El GTP USB Lite es un poco mas avanzado pero con resultados en cuanto a velocidad y
compatibilidad, ya que las PC de ultima generación no poseen puerto Serial pero si USB.
Queda a criterio del Alumno hacer uno u otro programador, aquí les presentamos el JDM,
pero no quita que el alumno realice el GTP USB Lite

Circuito del JDM Programmer:

Micro Controladores PIC Curso; 5º B – Año 2010 20


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

El BASIC en PIC Simulator


Como mencionamos anteriormente el lenguaje que vamos a utilizar es el BASIC, ya sea
porque es bastante fácil de entender y además para nuestros proyectos como se dijo antes,
nos alcanza y sobra.

Micro Controladores PIC Curso; 5º B – Año 2010 21


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Comportamiento Digital
Vamos a ver también el comportamiento digital, la idea es que sepan trabajar primero
sabiendo este tipo de comportamiento en los Micro y luego ir avanzando en la parte
analógica.
De esta forma las salidas serán 0 o 1 es decir, Vcc o Vdd, encender o apagar, pulsado o no
pulsado, entonces trabajaremos entre estos dos valores discretos.

Empecemos…

Instrucciones y Variables
Instrucción:
Es un conjunto de datos insertados en una secuencia estructurada o específica que el
procesador interpreta y ejecuta., es como si alguien no daría una orden y la cumpliéramos
tal cual al pie de la letra, de esta forma trabaja un micro, obedeciendo nuestras
instrucciones.
Generalmente una instrucción viene acompañada de una variable, pues bien, que es una
variable.
En programación, las variables son estructuras de datos que, como su nombre indica,
pueden cambiar de contenido a lo largo de la ejecución de un programa
Ejemplo:
Instrucción Variable
For A 1 to 100 Setp 1
Donde For es la instrucción y A es la variable Declarada anteriormente

Variable:
Imaginemos a una Variable como una Caja Grande, es esta caja grande puedo meter hasta
255 cajitas de Fósforos, entonces la caja grande será la variable y las cajitas serán el valor o
la cantidad de cajitas de Fósforos que tengo, pero que pasaría si necesito meter 300
Fósforos, Me sirve esta variable?….NO, como lo soluciono, pues fácil, consigo una caja
mas grande, por lo cual esta variable se llamara igual a la primera, pero la diferencia
radicaría en el tamaño de la caja.
Pues bien, pero por el contrario, que pasaría si tengo una caja del tamaño de un Galpón para
guardar solo 1 cajita de Fósforos, me serviría…SI, pero seria lo Indicado?..Seguramente ya
se darán cuenta por que no, es claro, seria muy costoso y poco practico tener un Galpón
para Guardar ¡¡¡¡¡una caja de fósforos!!!!!
En el Micro pasaría lo Mismo, se desperdiciaría Memoria y Recursos para algo que no
tendría sentido.
“SIEMPRE SE DEBE SELECCIONAR UN TAMAÑO DE VARIABLE ACORDE A
EL VALOR QUE TENGA O LLEGUE A TENER LA VARIABLE EN TODO EL
PROGRAMA”

Micro Controladores PIC Curso; 5º B – Año 2010 22


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

En la programación (PIC Simulator) las variables pueden ser del orden de un Bit, un Byte,
un Word o un Long que equivalen a:
Bit: valores de 0 a 1
Byte: valores de 0 a 255
Word: valores de 0 a 65535
Long: valores de 0 a 4294967295
En PIC Simulator se le asigna el valor con la Instrucción DIM

Ejemplo:
Dim A as Byte
Dim var as Long
Dim Valor as Bit
A = 200 ‘correcto
Var = 1024 ‘correcto pero poco eficiente
Valor = 20 ‘Incorrecto, solo puede ser 0 o 1

LECTURA DE LA PROGRAMACION
Se deberá tener en cuenta que la programación es leída, salvo casos que nombraremos mas
adelante, de forma secuencial, que quiero decir con esto, que es leída de arriba hacia abajo
y se deber respetar ciertas reglas, un ejemplo seria que no puedo declarar las variables al
final de la programación o decirle que el micro trabajara de forma Digital en todos sus
pines al final del programa.

ALLDIGITAL
Esta instrucción dejara a nuestro Microcontrolador funcionando con valores discretos, es
decir, si posee entradas comparadoras, pwm, conversores A/D y demás los anulara para
poder utilizarlo como entrada o salidas con valores discretos de 0 y 1 (Vcc y Vdd).
Es importante establecer esto ya que de otra forma podremos obtener resultados
inesperados.-

TRISx
Define el comportamiento de los puertos del Micro, si adopta un valor igual a cero (0) este
Pin será utilizado como Salida, si por el contrario adopta un valor igual a uno (1) este se
comportara como Entrada. Tener siempre en cuenta que cuando se define un Puerto este
puede ser escrito en Decimal, binario o Hexadecimal, Siendo el Binario el mas fácil de
interpretar
Ejemplo:
TRISA = 200
TRISA = %11001000
Micro Controladores PIC Curso; 5º B – Año 2010 23
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

TRISA = 0xC8
En realidad estos tres valores son exactamente igual, pero en binario antecedido por el
símbolo % vemos pin por pin el Puerto…veamos

RA.7 RA.6 RA.5 RA.4 RA.3 RA.2 RA.1 RA.0


TRISA = %1 1 0 0 1 0 0 0
Ent Ent Sal Sal Ent Sal Sal Sal

PORTx
Asigna un valor a la salida del Portx, este puede ser Bit a Bit o puerto Completo
Ejemplo:
PORTA=%01000000
PORTA.6=1

En cualquiera de los dos casos si conectamos un led a la salida RA6 este se encenderá.
Es importante antes de seguir con las próximas instrucciones que se entienda estas dos
instrucciones y la forma de proceder para energizar una salida o leer una entrada x de
cualquier Port.
Se lo puede hacer de las dos maneras mencionadas, por Puerto General por así decirlo
(PORTA= %XXXXXXXX) o por puerto Individual (PORTA.6=1) obteniendo el mismo
resultado.

WAITMS – WaitUs
Esta instrucción hace que el micro espere un tiempo antes de seguir con la próxima
instrucción, este tiempo estará determinado por Mili Segundos en caso de ser WAITMS o
bien Micro Segundos si es WaitUs.
Ejemplo:
Alldigital ‘Declaro todos los pines como digital
TRISA = &00000000 ‘Todos los puertos A como Salida
PORTA.0=1 ‘Enciendo un Led en el puerto RA1
WAITMS 1000 ‘Espero 1 Seg
PORTA.0=0 ‘Apago el Led en RA1

GOTO
Esta Instrucción realiza un salto o bucle como bien dice la palabra GO TO o “Ir a”, se usa
par apuntar a un destino ya definido siempre finalizándolo a este destino con dos puntos”:”.
Micro Controladores PIC Curso; 5º B – Año 2010 24
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Es decir, siempre que uso la palabra GOTO va precedido del destino, el cual debera esta
indicado en el programa y finalizándolo con “:”
Ejemplo:
Inicio:
PORTA.0=1 ‘Enciendo un Led en el puerto RA1
WAITMS 1000 ‘Espero 1 Seg
PORTA.0=0 ‘Apago el Led en RA1
WAITMS 1000 ‘Espero 1 Seg
GOTO Inicio ‘Vuelvo a Inicio y repito el bucle Indefinidamente

DIM
Define las variables, en esta instrucción debemos asignarle el tamaño que ira a tener nuestra
variable, ya sea un bit, un byte, un Word o un long, a tener en cuenta, una variable es un
nombre, por lo cual algunos caracteres no puede ser usados al igual que números y además
el valor que tomara esta variable no deberá ser nunca mayor que el tamaño asignado.
Ejemplo:
DIM var AS Byte
DIM tiempo AS Word
Var = 16
Tiempo = 1024

SYMBOL
Se utiliza para reemplazar una parámetro con un símbolo o nombre, esto nos ayuda en un
programa entender mejor un la lectura
Ejemplo:
SYMBOL led1 = PORTB.0
SYMBOL led2 = PORTB.1
led1 = 0
led2 = 1
Que seria lo mismo que
PORTB.0 = 0
PORTB.1 = 1

IF THEN ELSE
Esta instrucción es un condicionante, es decir, es quien se encargara de devolver cierto
resultado si se cumple tal o cual condición, podríamos traducirlo como: SI esto es asi
ENTONCES realizar esto SINO realizar esto otro

Micro Controladores PIC Curso; 5º B – Año 2010 25


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Ejemplo:
IF PORTA.6=1 THEN GOTO inicio ‘Si puerto RA6 leo un 1 entonces voy a inicio
GOTO stop ‘Sino voy a Stop

Fíjense que ELSE no esta en el programa, esto es porque este o no en el programa sabe que
si la condición no se cumple salta a la próxima instrucción

Ejercicios
1) Realice según el siguiente diagrama de flujo el programa correspondiente

2) Realice según el siguiente diagrama de flujo el programa correspondiente

Micro Controladores PIC Curso; 5º B – Año 2010 26


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

3) Resuelva las siguientes condiciones, si la entrada de A2 es igual a 1 encienda las


salidas B7 y B6, si la entrada es igual a 0 encienda solo B7 , si la entrada A3 es
igual a 1 encienda B1, si es igual a 0 apague B1y si la entrada A4 es igual a 1
encienda B3 y B4, si es igual a cero no ejecute ningún comando y deje el puerto B
con todas sus salidas igual a cero.
Deberá hacer el diagrama de flujo correspondiente

FOR TO STEP NEXT


Esta instrucción es utilizada como contador donde podemos predefinir Inicio- Fin y los
saltos de paso en paso
Siempre debemos definir con anterioridad una variable para esta función, ya que esta
variable ira modificando su valor a lo largo del programa., cabe destacar que esta variable
deberá ser por lo menos de un BYTE o mas, de otra forma seria imposible. En cada
iteración del bucle, la variable va cambiando su valor. Cuando el valor de la variable
alcanza o supera el valor prefijado, el bucle termina y prosigue con la próxima instrucción.
Ejemplo:
DIM a AS BYTE 'Declaro la variable "A" como BYTE
DIM TOTAL AS WORD 'Declaro la variable "TOTAL" como WORD
TOTAL = 0 'Asigno "0" a la variable "TOTAL".
FOR a = 1 TO 100 STEP 1 '"A" va de 1 a 100 de 1 en 1
TOTAL = TOTAL + A 'Sumo "A" al valor de "TOTAL".
Micro Controladores PIC Curso; 5º B – Año 2010 27
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

NEXT a 'fin del bucle

LOOKUP
La función LOOKUP puede ser utilizada para seleccionar un Byte desde una lista de
constantes del mismo tipo, de acuerdo al valor de un índice (también de tipo Byte). El
resultado de la selección se almacena (como no!) también en una variable tipo byte.
Ejemplo:
DIM cuenta AS BYTE
DIM Var AS BYTE
Cuenta = 3
Var = LOOKUP (25, 35, 55, 70, 85, 100), indice

variable tendrá el valor "70" (decimal) al ejecutar este código. El primer elemento de la
lista, recordemos, corresponde al valor "0" de índice.
Si bien la lista puede contener un máximo de 255 elementos, que es el máximo
direccionable por una variable índice de tipo byte, hay que asegurarse que el
microcontrolador que estamos empleando tenga memoria suficiente para albergarla

SHIFTLEFT – SHIFTRIGHT
Estas dos son funciones que operan a nivel bit que pueden ser utilizadas para "correr" el
contenido de variable a la izquierda o a la derecha. Cada uno de los bits que componen la
variable se desplazan una posición (a la izquierda o a la derecha, de acuerdo a que función
utilicemos). Esto tiene dos consecuencias. En primer lugar, el bit de más a la izquierda
(SHIFTLEFT) o derecha (SHIFTRIGHT) se pierde. Y el espacio creado en el otro extremo
se completa con un "0".

AllDigital

TRISC = %00000000 ‘Todos los pines como salidas


PORTC = %00000001
goleft:
WAITMS 500
PORTC = ShiftLeft(PORTC, 1)
Micro Controladores PIC Curso; 5º B – Año 2010 28
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

If PORTC = %10000000 Then GOTO goright


GOTO goleft
goright:
WAITMS 500
PORTC = ShiftRight(PORTC, 1)
If PORTC = %00000001 Then GOTO goleft
GOTO goright

Lo que hace el programa es muy sencillo: enciende el primer bit del PORTC y
espera durante medio segundo. Luego, desplaza hacia la izquierda el contenido del
byte que representa al PORTC en la memoria del Microcontrolador, y verifica si
esos bits llegaron al extremo. Si es así, se invierte el sentido del desplazamiento.

WHILE – WEND
La segunda estructura de control que proporciona PIC BASIC es WHILE - WEND.
Su propósito también es la construcción de bucles que se ejecutan un número de
veces, y se puede decir que esta a “mitad de camino” entre la construcción de un
bucle mediante etiquetas y GOTOs y la utilización de un FOR…NEXT. Su
estructura es la siguiente:

WHILE condición
instruccion1
instruccion2
...
instruccion n
WEND

Mientras que la condición sea verdadera, el grupo de instrucciones dentro del


cuerpo del WHILE-WEND se ejecuta. Las características de la condición son las
mismas que vimos antes para la instrucción IF-THEN-ELSE-ENDIF.

Por supuesto, si no somos cuidadosos al momento de elegir la condición, puede


darse el caso de que el número de repeticiones del bucle sea infinito, y nunca
salgamos de él. De hecho, esta circunstancia se aprovecha en algunos programas
para repetir indefinidamente un grupo de instrucciones. También hay que tener
presente que si la condición no es cierta al momento de ejecutar la primera vez el
WHILE, el flujo del programa pasara directamente a la instrucción posterior al
WEND y las instrucciones dentro del bucle no se ejecutaran ninguna vez.

No hay mucho más para decir de WHILE-WEND , solo analizar algunos ejemplos:

Ejemplo 1:
Micro Controladores PIC Curso; 5º B – Año 2010 29
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

El siguiente es un bucle infinito. Como dentro del cuerpo del WHILE-WEND no se


cambia el valor de la variable A, esta siempre vale "0" y la condición del WHILE
nunca es falsa, por lo que se repite eternamente: es un caso similar a los que vimos
en la entrega anterior del tutorial.

DIM A AS BYTE
A=0
...
WHILE A = 0
instruccion1
instruccion2
...
instruccion n
WEND
...

Ejemplo 2:
Las instrucciones dentro del siguiente WHILE-WEND no se ejecutan nunca, dado
que la condición siempre es falsa:

DIM A AS BYTE
A=0
...
WHILE A > 0
instruccion1
instruccion2
...
instrucción n
WEND
...

Ejemplo 3:
Las instrucciones dentro del siguiente WHILE-WEND se ejecutan 20 veces, y al
terminar la variable B contiene la suma de los números del 0 al 20 naturales:

DIM A AS BYTE
DIM A AS BYTE
A=0
B=0

WHILE A < 20
A = A + 1 'Incremento la variable A
B = B + A 'Sumo a B el valor de la variable A
WEND

Micro Controladores PIC Curso; 5º B – Año 2010 30


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Cuando A = 20, se suma su valor a A, y al llegar al WEND el control del programa


se transfiere al WHILE, donde se evalúa la condición A < 20, se determina que es
falsa, y el programa pasa el control a la línea que exista después del WEND.
Este bucle hace la misma suma que el que realizamos antes con FOR…NEXT. No
se puede decir que uno sea mejor o peor que el otro: solo son dos formas distintas
de hacer lo mismo, y en cada situación decidiremos cual nos conviene más.

GOSUB
Esta instrucción es muy parecida a un GOTO con la diferencia que esta al ejecutarse
realiza un salto (GOTO) a la instrucción que le digamos y cuando termine de
ejecutarla esta retornara a la siguiente instrucción que le sigua a GOSUB.
Es decir, veamos el siguiente ejemplo:

GOSUB alto
Bajo:
PORTA.7=0
Alto:
PORTA.7=1

La instrucción GOSUB realizara un salto a la bandera ALTO poniendo el puerto


A.7 en 1, cuando termine de ejecutar esta instrucción retornara a la instrucción
siguiente a GOSUB el cual es la bandera BAJO poniendo un 0 en el puerto A.7 y
luego seguirá con las instrucciones normalmente

HSEROUT / HSERIN
Esta función nos permite establecer una comunicación SERIAL por ejemplo entre el Micro
y una PC mediante el puerto RS232 (Puerto Serial de la PC)

Ejemplo:

AllDigital
TRISA = 255
Dim i As Byte 'declare a variable

inicial:
Hseropen 9600
Hserin i
If i = "c" Then GOTO inicio

inicio:
If PORTA.3 = 1 Then GOTO PORTA31
If PORTA.3 = 0 Then GOTO PORTA30

Micro Controladores PIC Curso; 5º B – Año 2010 31


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

PORTA31:
Hserout "Puerto A3=1", Cr, Lf
GOTO inicial
PORTA30:
Hserout "Puerto A3=0",Cr, Lf
GOTO inicial

Con este programa al encender el Micro y estar conectado a un Serial de la PC con un


Software de Comunicación serial como ser el Hyper Terminal de Windows o Secure CRT
esperara a que se teclee la letra c y luego leerá los estados del Puerto A3 y lo mostrara en
Pantalla

Freqout
Esta instrucción hace de nuestro PIC un generador de tono, con solo colocar el Puerto,
Frecuencia y Duración para que este nos genere un tono,

TRISB.0 = 0
FreqOut PORTB.0, 600, 1000

Ejercicios
1) Envíe mediante RS232 a una PC el mensaje “Hola Mundo” cuando ingrese
desde pantalla la letra C
2) Realice un contador ascendente en binario con salida por puerto B y cuando este
llegue a 255 realizar conteo de forma descendente

Manejo de LCD en PIC


El manejo de los LCD se hace mediante el uso de sentencias “DEFINE”, que le dicen al
compilador a que pines del Microcontrolador hemos conectado cada uno de los pines del
LCD. La forma de la instrucción DEFINE es la siguiente:

DEFINE parámetro = valor

Donde “parámetro” es el nombre del parámetro al que le queremos asignar el “valor”. Los
parámetros disponibles para el manejo de LCD alfanuméricos son los siguientes:

LCD_BITS: Define el número de bits de la interfaz de datos. Se pueden asignar valores de

Micro Controladores PIC Curso; 5º B – Año 2010 32


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

4 u 8, siendo 4 el valor por defecto.

LCD_DREG: Define a que puerto del PIC tenemos conectado el port de datos del LCD.
Los valores permitidos son PORTA, PORTB, PORTC, etc. Por defecto se asume PORTB.

LCD_DBIT: Define cual es el primer pin del puerto que usamos para enviar los datos al
LCD cuando seleccionamos un bus de 4 bits. Solo puede ser el 0 (para los pines el 0, 1, 2 y
3) o 4 (para usar los pines 4, 5, 6 y 7). Por defecto se asume “4”, y esta instrucción se
ignora para LCD_BITS = 8.

LCD_RSREG: Define a que puerto del PIC tenemos conectado el pin RS del LCD. Los
valores permitidos son PORTA, PORTB, PORTC, etc. Por defecto se asume PORTB.

LCD_RSBIT: Define a que pin del puerto tenemos conectado el pin RS del LCD. Por
defecto se asume “3”.

LCD_EREG: Define a que puerto del PIC tenemos conectado el pin E del LCD. Los
valores permitidos son PORTA, PORTB, PORTC, etc. Por defecto se asume PORTB.

LCD_EBIT: Define a que pin del puerto tenemos conectado el pin E del LCD. Por defecto
se asume “2”.

LCD_RWREG: Define a que puerto del PIC tenemos conectado el pin RW del LCD. Los
valores permitidos son 0, PORTA, PORTB, PORTC, etc. Por defecto se asume “0”, que
significa “no usamos el pin RW”.

LCD_RWBIT: Define a que pin del puerto tenemos conectado el pin RW del LCD. Por
defecto se asume “0”, que significa “no usamos el pin RW”.

LCD_COMMANDUS: Define cuantos microsegundos demora la escritura de un comando


en el display. Por defecto, este valor es de 5000. La mayoría de los LCD funcionan bien
con un valor de 2000, lo que hace más rápidos nuestros programas.

LCD_DATAUS: Define cuantos microsegundos demora la escritura de un dato en el LCD.


Por defecto, este valor es de 100.

LCD_INITMS: Define cuantos microsegundos demora la inicialización e la electrónica del


LCD. Por defecto, este valor es de 100.

Luego, tenemos una serie de instrucciones que manejan el envío de comandos e


instrucciones al display:

LCDINIT debe utilizarse antes de enviar cualquier comando o dato al LCD. La forma de
esta instrucción es la siguiente:

LCDINIT n
Micro Controladores PIC Curso; 5º B – Año 2010 33
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Donde “n” es el tipo de cursor que queremos que muestre el display. “0” significa que el
cursor estará oculto, “1” significa que el cursor parpadeara, “2” nos mostrara un cursor
subrayado, y “3” un cursor subrayado y parpadeando.

LCDCMDOUT es la instrucción que envía comandos al LCD. Se emplea de la siguiente


manera:

LCDCMDOUT comando

Donde “comando” es alguno de los siguientes:

LcdClear: Borra el contenido del LCD.


LcdHome: Lleva el cursor a la primera posición del primer renglón del LCD.
LcdLine2Home: Lleva el cursor a la primera posición del segundo renglón del LCD.
LcdLeft: Mueve el cursor una posición a la izquierda.
LcdRight: Mueve el cursor una posición a la derecha.
LcdShiftLeft: Desplaza el contenido del LCD una posición a la izquierda.
LcdShiftRight: Desplaza el contenido del LCD una posición a la derecha.
LcdLine1Clear: Borra la primera línea del LCD.
LcdLine2Clear: Borra la segunda línea del LCD.
LcdLine1Pos(x): Coloca el cursor en la posición “x” del primer renglón del LCD. “X”
puede tener cualquier valor entre 1 y 40
LcdLine2Pos(x): Coloca el cursor en la posición “x” del segundo renglón del LCD. “X”
puede tener cualquier valor entre 1 y 40

LCDOUT envía datos al display. Si son caracteres, simplemente los ponemos entre
comillas a continuación del comando. Si se trata de mostrar el contenido de una variable, se
escribe la variable (precedida por “#”) a continuación del comando. Si se necesitan
imprimir varias variables, se pueden separar por “comas”.

Micro Controladores PIC Curso; 5º B – Año 2010 34


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Un LCD en acción.

A continuación, un par de ejemplos de cómo se utilizan todas estas instrucciones.


El primero se encarga de mostrar un texto parpadeando en la primera línea del
display. Intenten deducir como está conectado el LCD al PIC mirando las
instrucciones “DEFINE” del principio del programa.

DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTB
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTD
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTD
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTD
DEFINE LCD_RWBIT = 2

LCDINIT 0 ‘inicializo el LCD sin cursor.

loop:
LCDOUT "www.NeoTeo.com" ‘Muestra el texto…
WAITMS 1000 ‘Espero un segundo
LCDCMDOUT LcdClear ‘Borro el display
WAITMS 1000 ‘Espero un segundo
GOTO loop ‘Vuelvo a loop: para repetir indefinidamente.
Micro Controladores PIC Curso; 5º B – Año 2010 35
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

El segundo ejemplo muestra como imprimir el contenido de una variable (“A”) en


el LCD. Concretamente, se muestra un texto en el primer renglón, mientras que en
el segundo se cuentan los números del 65535 al 0 en el segundo.

DEFINE LCD_BITS = 8
DEFINE LCD_DREG = PORTB
DEFINE LCD_DBIT = 0
DEFINE LCD_RSREG = PORTD
DEFINE LCD_RSBIT = 1
DEFINE LCD_EREG = PORTD
DEFINE LCD_EBIT = 3
DEFINE LCD_RWREG = PORTD
DEFINE LCD_RWBIT = 2

DIM A AS WORD
A = 65535

LCDINIT 3 ‘Cursor parpadeando


WAITMS 1000

loop:
LCDOUT "¡Estoy contando!” ‘Texto del primer renglón
LCDCMDOUT LcdLine2Home ‘Paso al Segundo renglón
LCDOUT #A ‘Muestro el valor de A
A=A-1
WAITMS 250
LCDCMDOUT LcdClear ‘Limpio del display
GOTO loop

Esto es todo por hoy. La semana próxima veremos cómo implementar estos
ejemplos en una placa de expansión para nuestro PIC TRAINER, y también como
definir nuestros propios caracteres especiales. ¡Hasta la próxima!

Micro Controladores PIC Curso; 5º B – Año 2010 36


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Veremos como definir nuestros propios Estos LCD son ideales para modding.
caracteres.

El HD44780
En muchos casos, la señalización de estados de nuestros proyectos mediante diodos
LED resulta insuficiente. Una alternativa muy profesional y económica (y de fácil
implementación) es la utilización de displays LCD alfanuméricos.

Continuando con la serie de notas dedicadas a aprender a programar


microcontroladores, veremos las instrucciones que dispone el lenguaje de
programación PIC BASIC orientadas al manejo de displays LCD.

Existen en el mercado una enorme variedad de pantallas de cristal liquido, de un


precio accesible, con características comunes en cuanto a la interfaz y
programación, gracias que la mayoría utiliza para comunicarse con el “exterior” el
mismo chip de la empresa Hitachi, el HD44780. Esto hace posible que con un
puñado de instrucciones podemos manejar desde un sencillo display de una línea
de 8 caracteres hasta uno de 4 líneas con 80 caracteres.

El aspecto físico de estas pantallas se puede ver en las fotos que ilustran la nota,
básicamente son una pequeña placa de circuito impreso con un par de integrados
(tipo “gota”) pegados en una de sus caras, y la pantalla propiamente dicha en la
otra, rodeada de una estructura metálica que la protege. Esta placa casi siempre
dispone de agujeros para poder fijar el conjunto a un chasis o gabinete sin grandes
complicaciones. Desde el punto de vista eléctrico, hay un conector (a veces solo
agujeros metalizados donde soldar los cables) que tiene 14 pines en los que no
poseen iluminación propia (backlite) o 16 en los que si la tienen.

Vista trasera de un LCD 2x16 típico. Hermoso: un LCD de 4 líneas de 40 caracteres,


color azul.

Micro Controladores PIC Curso; 5º B – Año 2010 37


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Mediante las señales apropiadas enviadas y recibidas mediante este conector el


display es capaz de representar caracteres, mostrar o esconder un cursor, borrar la
pantalla, etc.

PinOut del LCD HD44780


Descripción de los pines
Como mencionamos, la gran mayoría de los display existentes en el mercado
respetan la misma distribución de pines. Igualmente, antes de conectar nada,
debemos asegurarnos de que así sea, para no dañar de forma permanente el LCD.
Siempre es necesario tener a mano la “DataSheet” (hoja de datos) del componente
electrónico que queremos usar.

Veamos qué función cumple cada uno de los pines de un display LCD genérico:

Pines 1,2 y 3: Estos pines están dedicados a la alimentación y contraste del LCD.
Efectivamente, el pin 1 (VSS) es el que se debe conectar al negativo (masa) de la
alimentación, y el pin 2 (Vdd/Vcc) es el que va unido al positivo (5 voltios). El pin 3
permite el ajuste del contraste del panel. Se puede unir al pin 1 mediante una
resistencia de 220 ohm para obtener un contraste adecuado (pero fijo) o bien
utilizar un potenciómetro o preset de 10 KOhm para variar el contraste a gusto.

Pines 4,5,6: Estos pines son de alguna manera los que controlan el funcionamiento
del display. El pin 4, también llamado RS (Registration Select) es el que le indica al
controlador interno del LCD que el valor presente en el bus de datos es un
comando (cuando RS=0) o bien un carácter para representar (cuando RS=1).

El pin 5 (“R/W” por “Read/Write” o “Leer/Escribir”) permite decidir si queremos


enviar datos al display (R/W=0) o bien nos interesa leer lo que el display tiene en
su memoria o conocer su estado (R/W=1).

Por último, el pin 6 (E por “Enable” o “habilitado”) es el que selecciona el display a


utilizar. Es decir, podemos tener varios LCD conectados a un mismo bus de datos
(pines 7-14) de control, y mediante E seleccionar cual es el que debe usarse en cada
momento.

Pines 7, 8, 9, 10, 11, 12, 13, 14: Estos ocho pines son el “bus de datos” del
controlador de la pantalla. Llamados DB0-DB7 son los encargados de recibir (o
enviar) los comandos o datos desde o hacia el display. DB0 es el bit de menor peso
y DB7 es el más significativo.

Por último, los pines 15 y 16 son los que se utilizan para alimentar el (o los)
LEDs de fondo de la pantalla, que brindan la iluminación (backlight). El pin 15
debe ser conectado a 5 voltios y el 16 al negativo o masa de la fuente. En estas
condiciones, la luz de fondo está encendida a 100% de su brillo. Nuevamente, se
Micro Controladores PIC Curso; 5º B – Año 2010 38
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

puede utilizar un potenciómetro o preset para ajustar el brillo. Como una nota
curiosa, muy frecuentemente estos dos pines están ubicados ANTES del pin 1 (ver
esquema). Debemos asegurarnos de cuál es su posición consultando la hoja de
datos del fabricante o la serigrafía que existe sobre la placa del LCD.

Estos display soportan dos modos de trabajo: en uno de ellos reciben en DB0-DB7
los 8 bits del dato, y en el otro, llamado “modo de 4 bits” reciben los datos en dos
mitades (nibbles) por los pines DB4-DB7, en dos pasos sucesivos. Si bien esto
puede complicar ligeramente la programación en assembler, en PIC BASIC es
completamente transparente, a la vez que supone un ahorro de 4 pines en el bus de
datos, y esto en microcontroladores con pocos pines de I/O es muy útil.

Los pines de un display LCD genérico. De esa forma podemos controlar el contraste
del LCD.

A grandes rasgos, y a pesar de la simplicidad que brinda el disponer de un


mismo integrado especializado en casi todos los modelos de display, la
escritura en estos es relativamente compleja, dado que se deben respetar
protocolos de inicialización, tiempos entre envío de datos, etc., lo que hace
bastante tediosa su programación en assembler. Pero PIC BASIC dispone de
un juego de instrucciones especiales para manejar display en modo “8 bits” y
en modo “4 bits” que nos evitan toda esa complejidad. Veremos cuáles son y

Micro Controladores PIC Curso; 5º B – Año 2010 39


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

algunos ejemplos de uso. La próxima semana realizaremos un módulo para


el PIC TRAINER y escribiremos varios programas de ejemplo.

Ejemplos en BASIC

Ejemplo 1

Este es el clásico ejemplo “Hola Mundo”

AllDigital

TRISA = %11111111
TRISB = %00000000

loop:
PORTB.3 = 1
WAITMS 500
PORTB.3 = 0
WAITMS 500
GOTO loop

Ejemplo 2

Con este ejemplo hacemos que lea el estado de un pulsador y lo indique sobre un led a la
salida

AllDigital

TRISA.7 = 1 'Defino PORTA.7 como ENTRADA


TRISA.6 = 0 'Defino PORTA.6 como SALIDA

Symbol pulsador = PORTA.7


Symbol led = PORTA.6

loop:
led = pulsador
GOTO loop

Micro Controladores PIC Curso; 5º B – Año 2010 40


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

Ejemplo 3

Este ejemplo usa la función lookup para representa un contador de 7 segmentos de 0 a 9,


observe que en una línea se resume los dígitos a representar

Dim digito As Byte


Dim mascara As Byte
Inicio:
digito = 0
'Comienzo el bucle principal
loop:
if digito = 9 then GOTO inicio
TRISB = %00000000
mascara = LookUp(0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d,
0x07, 0x7f, 0x6f), digito
PORTB = mascara
WAITMS 1000 'Espero un segundo…
digito=digito + 1
GOTO loop
End

Ejemplo 4

Este realiza un contador a la salida del puerto C de 0 a 100

AllDigital
TRISC = 0
Dim a As Byte

For a = 0 To 100
WAITMS 250
PORTC = a
Next a

Ejemplo 5

Estos son ejemplos de contadores, observe cual es la diferencia entre uno y otro

DIM A AS BYTE 'Declaro la variable "A" como BYTE


DIM INICIO AS BYTE 'Declaro la variable "INICIO" como BYTE
DIM FINAL AS BYTE 'Declaro la variable "FINAL" como BYTE
DIM PASO AS BYTE 'Declaro la variable "PASO" como BYTE
Micro Controladores PIC Curso; 5º B – Año 2010 41
E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

DIM TOTAL AS WORD 'Declaro la variable "TOTAL" como WORD

INICIO = 1 'Asigno "1" a la variable "INICIO".


FINAL = 100 'Asigno "100" a la variable "FINAL".
PASO = 1 'Asigno "1" a la variable "PASO".
TOTAL = 0 'Asigno "0" a la variable "TOTAL".

FOR A = INICIO TO FINAL STEP PASO '"A" va de 1 a 100 de 1 en


1
TOTAL = TOTAL + A 'Sumo "A" al valor de "TOTAL".
NEXT A 'fin del bucle
Y el mismo ejemplo, sin usar STEP:

DIM A AS BYTE 'Declaro la variable "A" como BYTE


DIM TOTAL AS WORD 'Declaro la variable "TOTAL" como WORD

TOTAL = 0 'Asigno "0" a la variable "TOTAL".

FOR A = 1 TO 100 '"A" va de 1 a 100 de 1 en 1


TOTAL = TOTAL + A 'Sumo "A" al valor de "TOTAL".
NEXT A 'fin del bucle.

Si quisiéramos sumar otro grupo de números, bastaría con modificar el valor de las
variables INICIO y FINAL.

Hay casos en que es necesario que el valor de la variable de control del bucle se
decremente en lugar de ir aumentando. Un cronometro descendente seria una
aplicación práctica de este caso. Para lograr esto, se puede usar un valor negativo
para STEP. El siguiente ejemplo cuenta desde 50 hasta 20, de 5 en 5:

DIM A AS BYTE 'Declaro la variable "A" como BYTE

FOR A = 50 TO 20 STEP -5 '"A" va de 50 a 20 de 5 en 5


instruccion1
instruccion2
...
instrucción n
NEXT A 'fin del bucle.

Ejemplo 6
Este programa genera un tono en RB.0 si RA.0 es igual a 1,la frecuencia será de
6000 hz y durara 100 Ms

AllDigital

Micro Controladores PIC Curso; 5º B – Año 2010 42


E.E.T Nº 460 “Guillermo Lehmann”
Departamento de Electrónica

TRISA = 1
loop:
If PORTA.0 = 1 Then Goto inicio
Goto loop
inicio:
TRISB.0 = 0
FreqOut PORTB.0, 6000, 100
Goto loop

Bibliografía:

Revista U Control, Autor Ariel Palazzesi - http://www.ucontrol.com.ar/

Oshon Software, Web - http://www.oshonsoft.com/

MicroPic, Web - http://www.micropic.es/

NeoTeo, Web - http://www.neoteo.com/

Todo PiC, Web - http://www.todopic.com.ar/

Micro Controladores PIC Curso; 5º B – Año 2010 43

Potrebbero piacerti anche