Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Micro Controladores
PIC 16F628A
Arquitectura, Lenguajes de Programación, Pic Simulator, El
Basic, Instrucciones, Manejo de LCD, Puerto Serie
• 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
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
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
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.
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,
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.
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
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.
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.
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
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
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.
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.
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.
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.
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
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.
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.
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.
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.
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.
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.
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
Característica Propiedad
Pines de E/S 16
Salidas PWM 2
SPI No
I2C No
USART Si
Temporizadores de 8 Bits 2
Temporizadores de 16 Bits 1
Comparadores 2
Número de pines 18
PUERTO A
PUERTO B
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.
Basic:
AllDigital
inicio:
If PORTA.0 = 1 Then GOTO 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
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
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
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
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/
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”
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
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
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
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
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
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
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
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
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
PORTA31:
Hserout "Puerto A3=1", Cr, Lf
GOTO inicial
PORTA30:
Hserout "Puerto A3=0",Cr, Lf
GOTO inicial
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
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_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”.
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 comando
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”.
Un LCD en acción.
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
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
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
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!
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.
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.
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).
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.
Ejemplos en BASIC
Ejemplo 1
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
loop:
led = pulsador
GOTO loop
Ejemplo 3
Ejemplo 4
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
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:
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
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: