You are on page 1of 67

PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.

com

PROGRAMACION DE PIC CON PIC IDE SIMULATOR

INTRODUCCION

Recibe el nombre de controlador el dispositivo que se emplea para el gobierno de uno o varios procesos.
Por ejemplo, el controlador que regula el funcionamiento de un horno dispone de un sensor que mide
constantemente su temperatura interna y, cuando traspasa los límites prefijados, genera las señales
adecuadas que accionan los efectores que intentan llevar el valor de la temperatura dentro del rango
estipulado.

Aunque el concepto de controlador ha permanecido invariable a través del tiempo, su implementación


física ha variado frecuentemente. Hace tres décadas, los controladores se construían
exclusivamente con componentes de lógica discreta,
posteriormente se emplearon los microprocesadores, que se rodeaban con chips de memoria y E/S
sobre una tarjeta de circuito impreso. En la actualidad, todos los elementos del controlador se han
podido incluir en un chip, el cual recibe el nombre de microcontrolador. Realmente consiste en un
sencillo pero completo computador contenido en el corazón (chip) de un circuito integrado.

Un microcontrolador es un circuito integrado de alta escala de integración que incorpora la mayor parte
de los elementos que configuran un controlador.

Un microcontrolador dispone normalmente de los siguientes componentes:

· Procesador o UCP (Unidad Central de Proceso).


· Memoria RAM para Contener los datos.
· Memoria para el programa tipo ROM/PROM/EPROM.
· Líneas de E/S para comunicarse con el exterior.
· Diversos módulos para el control de periféricos (temporizadores, Puertas Serie y Paralelo, CAD:
conversores Analógico/Digital, CDA: conversores Digital/Analógico, etc.).
· Generador de impulsos de reloj que sincronizan el funcionamiento de todo el sistema.

El microcontrolador es en definitiva un circuito integrado que incluye todos los componentes de un


computador. Debido a su reducido tamaño es posible montar el controlador en el propio dispositivo
al que gobierna. En este caso el controlador recibe
el nombre de controlador empotrado (embedded controller).

Al microcontrolador se le conectan periféricos, como entradas (pulsadores, sensores, teclados, etc) y


salidas (led, relés, lcd, display, etc). Las entradas y salidas pueden dividirse en dos tipos, las discretas
cuyo valor es 1 o 0 (esta o no esta), y las análogas (tiene varios valores en un rango establecido)..

Recuerde que los microcontroladores no manejan potencia, para ello deben realizarse cicuitos de potencia
según las cargas, voltajes y corrientes manejadas.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 1
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Internamente se conectan las entradas y salidas con un programa realizado por el usuario. Existen varios
lenguajes de programación, entre ellos tenemos:

- Assembler
- Basic
- C
- Pascal
- Diagramas de flujo
- Ladder

De cada uno de estos lenguajes, existen varios fabricantes de software que permiten mediante un IDE
propia generar el programa.

Existen varios fabricantes de microcontroladores, entre ellos tenemos:

- Intel
- Atmel
- Motorola
- Microchip

Los más conocidos de Microchip son los de la serie PIC, debido a su fácil programación, bajo costo,
grandes prestaciones, se acomodan a su aplicación.

Los microcontroladores PIC también se dividen en otros:

- Gama Enana PIC12C(F)XXX


- Gama media PIC16FXXX
- Gama alta PIC18FXXX

Existen PIC para aplicaciones avanzadas, como Ethernet, Can Bus y otras.

En un principio vamos a trabajar con el PIC16F873A que tiene las siguientes características:

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 2
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

DESCRIPCION DE PINES DEL PIC16F873A

MCLR* es el reset del PIC, se debe dar un pulso de 0 y luego dejar en uno, este genera un reset interno
en el microcontrolador, el cual borra todos los registros e inicia el programa interno.

RA0 a RA5, es el puerto RA, se compone internamente de 8 bits, 0 a 7, pero físicamente solo están
disponibles los primeros 6, si este puerto se configura como digital, los 6 bits se pueden utilizar como
entradas o como salidas. En este puerto también están las 5 entradas análogas, para ello se debn habilitar
por software (programa).

Vss, es el 0 (tierra) de la alimentación.

OSC1, OSC2, en estos dos pines se conecta un cristal, con valores entre 1 a 20 Mhz, este sincroniza la
ejecución de las instrucciones internas.

RC0 a RC7, es el puerto RC, se puede utilizar como entradas o salidas digitales, o programar algunas
funciones especiales (PWM, transmisión y recepción serial, I2C).

Vdd, es la alimentación del PIC, no debe superar los 5.5 voltios, ni menos de 4.5 voltios.

RB0 a RB7, es el puerto RB, se puede utilizar como entradas o salidas digitales, o programar algunas
funciones especiales, una delas características mas importantes es que los 8 bits tienen resitencias pull-up
internas.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 3
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

PROGRAMACION DE UN PIC
Recordemos que el PIC tiene internamente una memoria de programa de 4096 posiciones (4096 bytes),
en cada posición se guarda un código de programación (en hexadecimal), la tarea del programador es
realizar dicho programa.

Para realizar un programa para un microcontrolador, se podrían seguir los siguientes pasos:

1) Escribir el programa fuente: este se escribe según el lenguaje de programación seleccionado, aunque se
puede utilizar un Ide, también se puede escribir en cualquier editar de texto.

2) Tome el programa fuente y compílelo, esto nos permite verificar que la sintaxis del programa este
escrita de acuerdo al lenguaje. Si se presentan errores se deben corregir en el programa fuente.

3) Después de compilar se debe ensamblar el programa, se toma el programa sin errores y se crea uno con
extensión .hex, el cual contiene los códigos de programación para ubicar en las posiciones de memoria de
la memoria de programa del PIC. Muchos programas realizan compilación y ensamble de forma
automática.

4) Simular el programa, ya sea utilizando el simulador propio del fabricante o un simulador electrónico
que permita emular pic (proteus).

5) Después de simular y estar seguro del correcto funcionamiento, se debe quemar el PIC (programar
físicamente), para ello se utiliza un hardware adecuado y un programa que en vie el archivo .hex a través
de dicho hardware a el PIC (win800).

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 4
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

CREACION DE UN PROGRAMA
Vamos a mostrar la forma en que se crea un programa para un microcontrolador utilizando lenguaje basic
y el software PIC IDE Simulator, de este ultimo se puede descargar una versión de prueba de la pagina
http://www.oshonsoft.com.

1) Activamos el programa PIC IDE Simulator

2) Teniendo ya abierto el programa seleccionamos el PIC 16F873A

3) Luego seleccionamos la frecuencia de nuestro cristal, en este caso de 4.000.000 hez (4 Mhz)

4) Abrimos el IDE (Basic Compiler) para escribir nuestro programa en lenguaje basic.

5) Estando en el Ide, escribimos un programa,

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 5
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

6) Grabamos nuestro programa fuente, le damos un nombre, este queda con la extensión .bas, que es la de
Basic; en nuestro caso se llama Ej001.bas

7) Luego compilamos, ensamblamos y cargamos, lo de cargar es en el simulador propio del PIc Ide
Simulator.

8) Si se presenta algún error se corrige, y de nuevo se repite el paso anterior; al no tener errores se puede
cerrar el Ide, o se deja abierto para seguir el programa. El programa escrito toma una entrada S1 en el pin
RA0 y una salida H0 en el pin RB0, si se pulsa S1 prende H0, si se suelta S1 se apaga H0. En la pantalla
principal del software activamos una vista del microcontrolador.

9) Luego cambiamos la velocidad de simulación (Rate) a la máxima (6)

10) Ahora iniciamos la simulación

11) Verificamos en el simulador de microcontrolador la ejecución del programa

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 6
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

12) Detenemos la simulación

Lo siguientes es simular (si se quiere ¡!) con un programa de simulación electrónica (puede ser el
proteus), luego enviar el Ej001.hex al la memoria de programa del PIc, esto ultimo lo mostraremos mas
adelante.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 7
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

LENGUAJE BASIC

El lenguaje de programación Basic nos permite escribir programas para microcontroladores de una
manera muy fácil y rápida; es de rápido aprendizaje y disponible de varias librerías de programación, que
nos permite dedicarnos a la lógica del programa y no caer el algoritmos grandes y complejos.

Recordemos que un microcontrolador, entre ellos el PIC, es un dispositivo al cual se le conectan entradas
y salidas, mediante un programa guardado en su memoria se entrelazan y dan resultado a sistemas lógicos
de tipo combinacional y/o secuencial.

TOMA DE DECISIONES

Una de las cosas mas importantes que se debe aprender en cualquier lenguaje de programación es la de
tomar decisiones; estas nos permiten tomar las entradas aplicar conceptos de condiciones y dar resultados
en las salidas.

Existen 3 tipos de forma de decisiones:

1) Forma simple: cuando una condición se cumple nos genera una y solo una acción; la sintaxis es,

if <condición> then <acción>


Por ejemplo, se tienen dos pulsadores S1 y S2 y un led H0, se desea que al pulsar S1 se quede prendida
H0, si se pulsa S2 se quede apagada H0.

if S1 = 1 then H0 = 1
if S2 = 1 then H0 = 0

Siendo S1 = 1 la condición y H0 = 1 la acción. Siendo S2 = 1 la condición y H0 = 0 la acción,

Podemos escribir las condiciones de forma mas completa,

if S1 = 1 and S2 = 0 then H0 = 1
if S2 = 1 and S1 = 0 then H0 = 0

La condición es S1 = 1 and S2 = 0 y la acción es H0 = 1


La condición es S2 = 1 and S1 = 0 y la acción es H0 = 0

Las condiciones se evalúan con verdaderas o falsas, si la condición es de forma matemática y no lógica,
se evalúa como verdadera si el resultado es mayor a 0 y falsa si el resultado es menor o igual a 0.

Ejemplo,

A=1
B=2
C=0
if A+B then C= A+B
if A-B then C= A-B

La condición A+B es verdadera, ya que 1 + 2 es igual a 3, que es mayor que 0, por lo que se realice la
acción C = A+B, C = 1 + 2, C = 3

La condición A-B es falsa, ya que 1 – 2 es -1, que es menor que 0, por lo que la acción C = A-B no se
realiza.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 8
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Si una condición se cumple (es verdadera) y debido a ello se requieren varias acciones, esta forma no se
puede emplear; es un error,

If S1=1 then H0 =1 H1 =1, es un error

If S2=1 then H0=1 and H1=1, es un error.

En las condiciones no se pueden usar paréntesis, ni mezclar AND (y) u OR (o),

If A and B or C then A=0, es un error


If (A+B) then C=9, es un error
If (A>2) and 2 then A=1, es un error

2) Forma compleja: si la condición se cumple se realizan varias acciones, la sintaxis es la siguiente,

if <condición> then
<accion1>
<accion2>

<accionn>
endif
Por ejemplo se tienen dos pulsadores S1 y S2 y dos lámparas H0 y H1, se desea que al pulsar S1 o S2 se
prendan las dos lámparas, y si no se pulsa S1 y S2 se apagan las dos lámparas,

If S1=1 or S2=1 then


H0=1
H1=1
Endif
If S1=0 and S2=0 then
H0=0
H1=1
Endif

Siempre si inicia con If y se termina con Endif, nunca se debe escribir después de el Then,

If S1=1 then H0=1 es un error


H1=0
Endif

3) Forma compuesta: cuando la condición es verdadera se realizan acciones y se la condición es falsa se


realizan otras acciones, la sintaxis es,

if <condición> then
<accion1>

<accionn>
Else
<accion1>

<accionm>
endif

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 9
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Por ejemplo, se tiene un pulsador S1 y una lámpara H0, se requiere que al pulsar S1 se prenda la lámpara
y si se suelta S1 se apaga H0,

If S1=1 then
H0=1
Else
H0=0
Endif

Estudie cuidadosamente estas tres formas de tomar decisiones a partir de condiciones, este seguro de entender
antes de continuar,

Ejercicios propuestos, en los siguientes ejercicios escribir las decisiones.

1) Se tienen 3 pulsadores S1, S2 y S3, una lámpara H0, se desea que al pulsar solo dos se prenda H0, y si no
se pulsa ninguno se apague H0.

2) Se tienen 2 lámparas H0 y H1, dos pulsadores S1 y S2, se desea que al pulsar S1 se prendan las dos
lámparas y se apaguen si se pulsa S2.

3) Se tienen 4 pulsadores h0 a H3, una lámpara H0, se desea que al pulsar H0 y H1 o H2 y H3 se prenda H0
en otro caso se apague.

4) Se tiene A=1, B=10,C=4, si A+B>3 de cargar en C 25, si A>C or B<C entonces cargue en A 34 y en B 12.

5) Se tienen 4 pulsadores S1 a S4, y tres lámparas H1 a H3, se desea que H1 solo prenda cuando se pulsen al
menos dos, H1 solo prende cuando se pulsen solo 3, H3 solo prende si H1 y H2 están prendidas.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 10
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

VARIABLES

Las variables son nombres que se le da a posiciones de memoria, y se utilizan para guardar y leer datos. Las
variables en los microcontroladores están o utilizan la memoria de datos, que puede ser una RAM o una
EEPROM.

En Basic (Pic ide simulator) se pueden crear las siguientes variables (tipos)

Bit: guardan un 1 o un 0 (verdadero o falso)


Byte: guardan un número de 0 a 255
Word: guardan un número de 0 a 65535

Para crear una variable se usa la siguiente sintaxis,

Dim <nombre> As <tipo>


Por ejemplo

Dim v1 as Bit
Dim v2 as Byte
Dim v3 as Word

El nombre de las variables no debe contener espacios, no utilizar nombre de instrucciones, nunca cargue un
dato a una variable que no lo pueda contener.

Por ejemplo, crear una variable x1 y cargar en ella el valor 4, crear una variable x2 y cargar en ella 25000

Dim x1 as Byte
Dim x2 as Word
x1=4
x2=2500

x1=-3 es un error
x2= 100000 es un error
x1= 500 es un error
x2=Hola es un error
x2=-1234 es un error

Ejemplo, se tiene una variable K con valores de 0 a 100, dos bits H0 y H1, H0 solo prende si K es menor a 25
y H1 solo prende solo si K es mayor a 80.

Dim K as Byte
Dim H0 as Bit
Dim H1 as Bit

If K<25 then
H0=1
Else
H0=0
Endif

If K>80 then
H1=1
Else
H1=0

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 11
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Endif

No confunda una variable tipo Bit con una entrada física (por un pin) del microcontrolador!!

Ejemplo: se tiene una variable V1 con valores de 0 a 2000, dos bits S1 y S2, dos bits H1 y H2, se desea que
H1 solo prenda cuando este S1 y V1 se mayor o igual a 1200, H2 solo prende si esta H1 y V1 es menor o
igual a 850.

Dim S1 as Bit
Dim S2 as Bit
Dim H1 as Bit
Dim H2 as Bit
Dim V1 as Word

If S1=1 and V1>=1200 then


H1=1
Else
H1=0
Endif
If H1=1 and V1<=850 then
H2=1
Else
H2=0
Endif

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 12
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

ESCRIBIR PROGRAMAS PARA PIC

Con las bases del lenguaje Basic vista anteriormente, podemos ya plantear programas para
microcontroladores PIC.

Para escribir un programa en el Ide del PIC Simulator IDE seguimos los siguientes pasos:

1) Si no va a usar ninguna entrada análoga inicie con la instrucción AllDigital, esta configura los bits del
puerto RA como entradas o salidas digitales.

2) Luego declare todas las variables que necesite

3) Crear los símbolos usados en el programa, los simbolos son nombres que se ledan a los pines, puertos o
registros del microcontrolador.
Por ejemplo si quiero llamar al pin RA0 como S1 escribo Symbol S1 = RA0
Por ejemplo si quiero llamar a todo el puerto RB como display, escribo Symbol Display = RB

4) Configuro entradas y salidas, debo decirle al PIC cuales pines (de los puertos) van a ser entradas y salidas,
para ello se utiliza la palabra TRIS, se pueden configurar los bits de forma independiente o todo el puerto.
Por ejemplo, se desea configurar RA0 como entrada y RA2 como salida,

TrisA.0 = 1
TrisA.2 = 0

Para configurar como salida se igual a 0 y como entrada se iguala a 1

Se desea configurar los primeros 4 bits (RB0 a RB3) del uerto RB como entradas y los últimos 4 (RB4 a RB7)
como salidas,

TrisB = %00001111 así se escribe en binario

Trisb = 0fh así se escribe en hexadecimal

Trisb = 0x0f asi también se escribe en hexadecimal

TrisB = 15 así se escribe en decimal

También se hubiera configurado bit por bit.

5) Configurar registros propios del PIC si se requiere, como temporizados, contadores, pwm, comunicaciones,
interrupciones, etc.

6) Se inicializan variables y estados de inicio para puertos

7) Se escribe una etiqueta que marcara el inicio del programa lógico, las etiquetas son nombres que se
escriben en la margen izquierda y terminan en dos puntos, no deben contener espacios, ni utilizar nombres
reservados,

Por ejemplo

Inicio:

Siga:

Main:

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 13
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

8) Escriba el cuerpo del programa usando lenguaje Basic

9) Al final el programa debe retornar a la etiqueta inicial, esto se realiza usando la instrucción

Goto <etiqueta> el control del programa salta a la etiqueta indicada.

Por ejemplo

Inicio:
……………….
……………….
Goto Inicio

10) Siempre termine con la directiva END

Ejemplos de Programas
1) Tenemos el siguiente esquema electrónico (realizado en proteus)

Se desea que al pulsar S1 se prenda H0 y al soltar S1 se apague H0

Como no usamos análogas iniciamos con


AllDigital
No vamos a usar variables, no declaramos variables
Creamos los símbolos para S1 y H0
Symbol S1 = RA0
Symbol H0 = RB0
Configuramos RA0 como entrada y RB0 como salida
TrisA.0 = 1
TrisB.0 = 0
Iniciamos apagando a H0
H0 = 0
Escribimos la etiqueta inicial
Inicio:
Escribimos el programa de control
If S1 = 1 then
H0 = 1
Else
H0 = 0
Endif
Retornamos la etiqueta inicial, ara que el programa sea cíclico

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 14
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Goto Inicio
Terminamos con la directiva
End

El programa completo será,

2) Tenemos el siguiente esquema electrónico

Se desea que al pulsar S1 se prenda H0 y se apague H1, y si se pulsa S2 se prende H1 y se paga H0

El programa es el siguiente

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 15
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

3) Se tiene el siguiente esquema

Se desea que al pulsar S1 se prendan todas las lámparas H, y al soltar S1 se apaguen

El programa seria

4) Se tiene el siguiente esquema

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 16
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Se desea que con un pulso (0 a 1) el motor M1 se prenda, con otro pulso (1 a 0) el motor M1se apague, y se
repita el ciclo de forma indefinida.

El programa podría ser!!

La instrucción Toggle m1 invierte el estado de un bit, en caso de estar en 1 lo pone en 0 y en caso de estar en
0 lo pone en 1.

Al probar el programa podemos ver que mientras se este pulsado S1 (en uno) el motor se prende y se apaga,
ya que no estamos detectando un cambio de 1 a 0 (flanco de subida), si no, que estamos trabajando por nivel,
por lo anterior el programa no cumple con lo requerido.

Debemos tener una variable que nos recuerde que el pulsador paso de 0 a 1 y solo nos permita realizar una
acción una sola vez cuando esto suceda, y que al solatar S1 90 a 1) se habilite de nuevo la detección de 0 a 1
(flanco de subida). Sirve cualquier tipo de variable, pero se recomienda por uso de memoria una tipo bit.

Vamos a crear una variable llamada Rs1 (el nombre no importa) para cumplir con los requerimientos.

Al iniciar Rs1 es igual a 0, si se pulsa S1 y siendo Rs1=0 se ejecuta la acción de invertir el estado del motor
M1, a demás, se carga 1 en Rs1; al volver el control del programa al inicio estando Rs1 en 1 y sigue S1
pulsado (en 1) ya no se cumplen las condiciones y no se invierte el motor M1, solo al soltar S1 (0) se borra
Rs1 ( a 0) y permite repetir la acción de invertir al pulsar de nuevo S1.

Estudie muy bien este método de detectar flancos de subido en bits, es muy utilizado en programación;
también se puede implementar para detectar flancos de bajada (0 a 1).

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 17
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

PAUSAS CON PIC BASIC


El PIC Basic tiene incorporadas ya unas funciones para realizar pausas,

Waitms K
Permite realizar pausas con base de tiempo en milisegundos, por ejemplo:

Waitms 200, realiza una pausa 200 milisegundos


Waitms 5000, realiza una puasa de 5000 milisegundos, osea, 1 segundo.

Waitus K
Permite realizar pausas con base de tiempo en microsegundos, por ejemplo:

Waitus 500, realiza una pausa de 500 microsegundos


Waitus 1000, realiza una pausa de 1000 microsegundos, o sea, 1 milisegundo.

Tenga en cuenta que el valor máximo de K es 65535.

La base de tiempo se calcula teniendo como referencia el cristal utilizado en el circuito, por lo que se debe
tener cuidado en que el valor de este sea el configurado en el PIC Simulator.

Se debe tener mucho cuidado con el uso de estas pausas, ya que detienen el ciclo del PIC, no se recomiendan
en multiprocesos. O sea, si por ejemplo, se programa una pausa de 20 segundos, el PIC se bloqueara hasta no
terminar con este tiempo.

Ejemplos:
1) Se tiene conectado al pin RB0 un led llamado Lámpara, y se desea que esta flashe con una frecuencia de 1
hz (1 segundo). El código es el siguiente:

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 18
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

La instrucción TOGGLE invierte el estado de un bit (o sea, lo complementa).

2) Se tiene un pulsador S0 a RC0, y un pulsador S1 no a RC4, en RB3 un led L0, se desea que al pulsar S0 se haga una
pausa de 2 seg y se prenda L0, y si se pulsa S1 se haga una pausa de 2.5 seg y se apague L0.

3) Tenemos dos pulsadores S0 y S1, dos led L0 y L1, se desea que al pulsar S0 L0 prenda y al pulsar S1 L0 apague, y que
el led L1 siempre prenda y apague cada 2 segundos.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 19
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Si utilizamos directamente una pausa de WaitMs 2000 se anularía cada 2 segundos la lectura de los pulsadores S0 y S1, ,o
mejor es realizar un programa que se ejecute cada 200 microsegundos y contamos hasta 10000 para asi obtener los dos
segundos.

4) A un PIC16F873A conectar un display de 7 segmentos (cátodo común) y mostrar de forma automática los
números del 0 al 9 con intervalo de 0.5 segundos

Realizamos el cuadro de valores a enviar al puerto RB para mostrar los números de 0 al 9

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 20
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Ahora escribimos el código

5) Al ejemplo anterior, anexar un pulsador S1 en RA0, cada que pulso se incrementa el valor en el display

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 21
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Otra forma de enviar los códigos al display es guardándolos en un vector (array) de 10 elementos; estos se
crean como las variables y su sintaxis es,

Dim <nombre>(n) as <tipo> n es el numero de elementos a contener

Ejemplo, Dim datos(3) as byte se crea un vector llamado datos, el cual contiene 3 elementos, estos son
datos(0), datos(1) y datos(2), cada uno puede contener un byte, al crear el vector este inicia sus elementos con
valor igual a 0.

Ejercicios propuestos

1) Conecte a un PIC16f873A dos pulsadores S1 y S2, un display de 7 segmentos (cátodo común), con S1 se
incrementa de 0 a 9 (de 9 pasa a 0) y con S2 decrementa de 9 a 0 (de 0 pasa a 9), el conteo debe mostrase en
el display.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 22
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

2) En el ejercicio anterior use un display de 7 segmentos de ánodo común

3) Conecte a un PIC16f873A tres pulsadores S1, S2 y S3, un display de 7 segmentos (cátodo común), al
pulsar S1 se muestra por 2 segundos la “A”, si se pulsa S2 se muestra por 1.5 segundos la “B”, si se pulsa S3
se muestra la “C” por 1 segundo, mientras no se pulse se debe apagar el display.

4) Conectar a un PIC16f873a un display de cátodo común al RB y otro mismo display a RC, mostrar conteo
de 0 a 99 (de 99 pasa a 0) cada 250 milisegundos.

5) Al mismo montaje anterior anexar un pulsador S0, se inicia conteo incremental de 0 a 99, si en cualquier
momento se pulsa S0 el contador decrementa de 99 a 0.

6) Conecte a un PIC 16F873A un pulsador S0 y un pulsador S1, un led H0, el programa inicia con el led
apagado, al sostener pulsado S0 el led incrementa flasheo con intervalo de 10 milisegundos, y al sostener
pulsado S1 el led decrementa flasheo con inérvalo de 10 milisegundos.

7) Conecte a RA0 un generador de frecuencia (0 a 1Khz), dos led H0 y H1 a RB0 y RB1, si la frecuencia de
entrada esta entre 245 y 255 hz prende H0, si la frecuencia esta entre 495 y 505 hz prende H1 y si frecuencia
superior a 800 hz prende las dos lámparas.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 23
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

SUBRUTINAS CON PIC BASIC


Una subrutina es un bloque de programa por fuera del programa principal (después del END), el cual puede
ser llamado las veces que se requiera y este retornara el control a la instrucción siguiente donde se invoco. Las
subrutinas deben iniciar siempre por una etiqueta y para retornar se usa la instrucción RETURN.

Un llamado a una subrutina se realiza con GOSUB <etiqueta>

Por ejemplo, se desea una subrutina calcule la suma de dos números

Ejemplos

1) Se tiene el siguiente circuito

Se desea que al pulsar S0 se incremente el display de 0 a 15, y al pulsar S1 se decrementa el display de 15 a 0.


Los nuevos códigos serian,

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 24
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Otra forma (la mas adecuada) de cargar los códigos del display es usando la función LOOKUP, estúdiela
cuidadosamente de la ayuda, y lo vamos a utilizar en este ejemplo,

2) Se va realizar un programa que detecte alarma de varias casas, el esquema es el siguiente,

Se muestran solo 3 casas, pero se puede implementar hasta 15 (con DIP de 4, si es de 5 hasta 31, etc), la idea
es que al pulsar en una casa se prende el led correspondiente (AL1, AL2 o AL3) y suene la sirena, los led
deben prender y apagar cada 0.5 segundos, si se pulsa reconocer se apagan los led y la sirena.

AllDigital
Dim k As Word
Dim fbit As Bit
Dim v1 As Byte
Symbol casa = RA
Symbol al1 = RB0
Symbol al2 = RB1
Symbol al3 = RB2
Symbol reconoce = RB3

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 25
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Symbol sirena = RB4


TRISA = %00001111
TRISB = %00001000
RB = 0
fbit = 1
inicio:
Gosub flasheo
If casa = 1 Then v1.1 = 1
If casa = 2 Then v1.2 = 1
If casa = 3 Then v1.3 = 1
If v1.1 = 1 And fbit = 1 Then
al1 = 1
Else
al1 = 0
Endif
If v1.2 = 1 And fbit = 1 Then
al2 = 1
Else
al2 = 0
Endif
If v1.3 = 1 And fbit = 1 Then
al3 = 1
Else
al3 = 0
Endif
If casa > 0 Then sirena = 1
If reconoce = 1 Then
v1 = 0
sirena = 0
Endif
'WaitMs 1
Goto inicio
End
flasheo:
k=k+1
If k = 1000 Then
Toggle fbit
k=0
Endif
Return

La variable V1 (tipo byte) posee 8 bits, Basic nos permite tomar de una variable tipo byte sus bits de forma
independiente para prenderlos y/o apagarlos,

V1.0=1 prende el bit 0 de la variable v1


V1.3=0 apaga el bit 3 de la variable v1
V1.6=1 prende el bit 6 de la variable v1

Ejercicio propuesto:
Tome el esquema anterior y cambie los led por un display de 7 segmentos, muestre el número de la casa que
genere alarma, también flasheando.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 26
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

GRABAR EL PIC

Recordemos que el PIC tiene la memoria de programa, en ella se debe grabar el programa a ejecutar.

Cuando usted escribe el código de programación esta creando el PROGRAMA FUENTE, el cual contiene
las instrucciones según el lenguaje usado, en nuestro caso Basic, este programa fuente se debe COMPILAR,
lo cual verifica que la sintaxis corresponda al lenguaje y no se tengan errores, luego de no tener ningún error y
haber pasado la compilación se ENSAMBLA el programa, este proceso genera los códigos de maquina que la
CPU del microcontrolador ejecutara. Generalmente la compilar y ensamblar se ralizan en un mismo paso,
lógico que no se ensambla si se presentan errores.

El programa fuente genera un archivo con extensión .bas


Al compilar y ensamblar se genera un archivo con el nombre del archivo fuente pero con extensión .hex

Para grabar un PIC se requiere un circuito programador de PIC, existen muchas clases, por puerto paralelo,
por puerto serial, por USB.

Luego de tener el programador, debemos utilizar un programa que tome el archivo ensamblado (el .hex) y lo
envíe al PIc usando dicho programador; también existen muchos programas para tal fin, entre los mas
conocidos están el ICprog y el WinPic800, este ultimo lo vamos a utilizar y lo puede bajar de forma gratuita
de www.winpic800.com.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 27
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Vamos a realizar un ejemplo de programación de un PIC 16F873A; tenemos el siguiente esquema,

Al pulsar S1 se activa el rele R1 por 5 minutos, al cabo de los cuales se apaga de forma automática, el led H1
es de señalización mientras se realiza la temporización, en cualquier momento se puede pulsar S2 y se apaga
el relé interrumpiendo la temporización.

Para realizar un temporizado de 5 minutos tenemos que,

5 minutos = 300 segundos = 300000 milisegundos, o sea, una variable que cuenta hasta 50000 a intervalos de
1 milisegundo y otra que cuente hasta 6 la anterior variable, o sea, 50000 x 6 = 300000 milisegundos = 300
segundos = 5 minutos.

AllDigital
Dim k1 As Word
Dim k2 As Byte
Symbol s1 = RA0
Symbol s2 = RA1
Symbol h1 = RB0
Symbol rele = RB1
TRISA = %00000011
TRISB = %00000000
borrar:
rele = 0
h1 = 0
k1 = 0
k2 = 0
inicio:
If s1 = 1 And s2 = 0 And rele = 0 Then
rele = 1
h1 = 1
k1 = 0
k2 = 0
Endif
If rele = 1 Then k1 = k1 + 1
If k1 = 50000 Then
k2 = k2 + 1
k1 = 0
endif
If k2 = 6 Or s2 = 1 Then Goto borrar
If rele = 1 Then WaitMs 1
Goto inicio
End

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 28
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Llamar el programa Rele.bas

Ahora abrimos el programa Winpic800

1) Seleccionamos Configuración -> Hardware, para seleccionar el tipo de programador a usar.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 29
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

2) Seleccionamos los PIC 16F

3) Luego buscamos el PIC 16F873A (o el que use)

4) Ubicamos el PIC en el programador, nunca lo inserte con el programador conectado y nunca lo retire con el
programador conectado.

5) Luego realizamos un reconocimiento del PIC

6) Ahora cargamos el archivo Rele.hex

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 30
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

7) Configuramos los fusibles, si el cristal es menor a 10 MHz seleccionamos XT, si es mayor seleccionamos
HS

8) Damos la orden de programar,

El programador primero borra el PIC

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 31
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Luego lo programa y verifica

Ya tenemos el PIC programado, desconecte el programador del PC y retire el microcontrolador.

Móntelo en el circuito armado y pruebe su programa!!

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 32
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

USO DEL FOR…NEXT


Cuando se desea realizar un proceso repetitivo n veces, se puede usar el algoritmo FOR…NEXT, la sintaxis
es la siguiente,

FOR <variable> = <inicio> TO <fin> STEP <paso>


<acciones>
…………..
NEXT <variable>
La variable toma valores desde inicio hasta fin con incrementos dado por el paso. Se repite el ciclo mientras el
valor de la variable sea menor o igual al fin.

Ejemplo:

Dim v1 as Byte
Dim v2 as Byte

For v1 = 1 to 100 Step 1


v2 = v1
Next v1

Al terminar el programa el valor de v1 es 101 y el valor de v2 es 100.

Dim v1 as Byte
Dim v2 as Byte

For v1 = 0 to 50 Step 2
v2 = v1 * 2
Next v1

Al terminar el programa se tiene v1 = 52 y v2 = 100

Ejemplo: se tiene un PIC16F873A, al cual se le conectan 8 led en puerto RB, se desea que los led prendan de
uno en uno cada 0.5 segundos, desde el bit 0 al 7, y se repita el ciclo de forma indefinida.

AllDigital
Dim v1 As Byte
TRISB = 0
RB = 0
inicio:

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 33
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

For v1 = 0 To 7 Step 1
RB = LookUp(1, 2, 4, 8, 16, 32, 64, 128), v1
WaitMs 500
Next v1
Goto inicio
End

Ejemplo: Se tiene el mismo circuito anterior, se desea que los led roten de 0 a 7 y de 7 a 0 de manera ciclica.

AllDigital
Dim v1 As Byte
TRISB = 0
RB = 0
inicio:
For v1 = 0 To 7 Step 1
RB = LookUp(1, 2, 4, 8, 16, 32, 64, 128), v1
WaitMs 500
Next v1
For v1 = 7 To 0 Step -1
RB = LookUp(1, 2, 4, 8, 16, 32, 64, 128), v1
WaitMs 500
Next v1
Goto inicio
End

Otra forma

AllDigital
Dim v1 As Byte
TRISB = 0
RB = 0
inicio:
For v1 = 0 To 15 Step 1
RB = LookUp(1, 2, 4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 2, 1), v1
WaitMs 500
Next v1
Goto inicio
End

Ejemplo: en el mismo circuito anterior se anexan dos pulsadores S0 y S1, con S1 se rota de 0 a 7 y con S1 se
rota de 7 a 0

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 34
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

AllDigital
Dim v1 As Byte
Dim vi As Byte
Dim vf As Byte
Symbol s0 = RA0
Symbol s1 = RA1
TRISA = 3
TRISB = 0
RB = 0
vi = 0
vf = 0
inicio:
For v1 = vi To vf Step 1
RB = LookUp(1, 2, 4, 8, 16, 32, 64, 128, 64, 32, 16, 8, 4, 2, 1), v1
WaitMs 500
If s0 = 1 Then
vi = 0
vf = 7
Endif
If s1 = 1 Then
vi = 7
vf = 15
Endif
Next v1
Goto inicio
End

Ejemplo: con el mismo circuito anterior, cuando se pulse S0 se genera una secuencia, al pulsar S1 se genera
otra.

AllDigital
Dim v1 As Byte
Dim v2 As Bit
Symbol s0 = RA0
Symbol s1 = RA1
TRISA = 3
TRISB = 0
RB = 0
v2 = 0
inicio:
If v2 = 0 Then
For v1 = 0 To 7 Step 1
RB = LookUp(01h, 03h, 07h, 0fh, 1fh, 3fh, 7fh, ffh), v1
Gosub prueba
Next v1
Else
For v1 = 0 To 8 Step 1
RB = LookUp(00h, 81h, c3h, e7h, ffh, e7h, c3h, 81h), v1
Gosub prueba
Next v1
Endif
Goto inicio
End
prueba:
WaitMs 250
If s0 = 1 Then v2 = 0
If s1 = 1 Then v2 = 1
Return

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 35
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

ROTAR BITS
Se pueden rotar los bits de un byte usando funciones propias de Basic, estas pueden rotar hacia la derecha o
hacia la izquierda definiendo el número de bits a rotar, la sintaxis es,

<byte1> = SHIFTLEFT ( byte2, n) rotar a la izquierda

<byte1> = SHIFTRIGHT ( byte2, n) rotar a la derecha

Donde byte1 es donde queda el valor después de rotar y byte2 es el byte a rotar, n es cuantos bits se van a
rotar, ojo byte2 no se altera

Ejemplo:

AllDigital
Dim v1 As Byte
Dim v2 As Byte
v1 = %01100001
v2 = ShiftRight(v1, 1)
End

Los valores finales son v1 = %01100001, v2 = %00110000

Ejemplo:

AllDigital
Dim v1 As Byte
Dim v2 As Byte
v1 = %01100001
v2 = ShiftLeft(v1, 3)
End
Los valores finales son v1 = %01100001, v2 = %00001000

Ejemplo: Se tiene el siguiente circuito

Se desea que al pulsar S0 se rote el puerto RB a la izquierda y señalizar con RC0 y si se pulsa S1 se rota a la
derecha y señalizar con RC1.

AllDigital
Symbol s0 = RA0
Symbol s1 = RA1
TRISA = 3
TRISB = 0

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 36
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

TRISC = 0
RB = 0
RC = 0
inicio:
If RC0 = 1 Then
RB = ShiftLeft(RB, 1)
WaitMs 200
If RB = 0 Then
RB = 1
WaitMs 200
Endif
Endif
If RC1 = 1 Then
RB = ShiftRight(RB, 1)
WaitMs 200
If RB = 0 Then
RB = 128
WaitMs 200
Endif
Endif
If s0 = 1 Then RC = 1
If s1 = 1 Then RC = 2
Goto inicio
End

Ejemplo: en el mismo circuito anterior, se rota al derecha cada que se pulsa S0 y se rota a la derecha cada que
se pulsa S1

AllDigital
Dim rs0 As Bit
Dim rs1 As Bit
Symbol s0 = RA0
Symbol s1 = RA1
TRISA = 3
TRISB = 0
TRISC = 0
RB = 1
RC = 1
inicio:
If s0 = 1 And rs0 = 0 Then
RC = 1
If RB.0 = 0 Then
RB = ShiftRight(RB, 1)
rs0 = 1
Endif
Endif
If s0 = 0 Then rs0 = 0
If s1 = 1 And rs1 = 0 Then
RC = 2
If RB.7 = 0 Then
RB = ShiftLeft(RB, 1)
rs1 = 1
Endif
Endif
If s1 = 0 Then rs1 = 0
Goto inicio
End

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 37
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

CONEXION DE TECLADO

Los teclados son pulsadores conectados de forma matricial, o sea, por filas y columnas, se pueden conectar a
un PIC usando las filas como salidas y columnas como entradas, también las filas como entradas y columnas
como salidas.

Se deben tener resistencias pull-up de 1 k y resistencias pull-down de 10k.

En el esquema anterior vamos a utilizar salidas a columnas y entradas a filas. Se debe realizar un cuadro de
señales, se deben prender las filas en orden RB0 a RB2 e ir verificando cual de las columnas se activan RB4 a
RB7.

La tabla nos permite verificar cual es el valor del puerto RB cuando se activa cualquier tecla.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 38
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Según el esquema mostrado vamos a realizar un programa donde se muestre en un display de 7 segmentos el
valor de la tecla pulsada.

AllDigital
Dim k As Byte
Dim v1 As Byte
TRISB = %11110000
TRISC = %00000000
RB = 0
RC = 0
inicio:
For k = 0 To 2 Step 1
RB = LookUp(1, 2, 4), k
v1 = RB And 240
If v1 > 0 Then Gosub leer_tecla
Next k
Goto inicio
End
leer_tecla:
waitms 10
If RB = 82h Then RC = 3fh '0
If RB = 11h Then RC = 06h '1
If RB = 12h Then RC = 5bh '2
If RB = 14h Then RC = 4fh '3
If RB = 21h Then RC = 66h '4
If RB = 22h Then RC = 6dh '5
If RB = 24h Then RC = 7dh '6
If RB = 41h Then RC = 27h '7
If RB = 42h Then RC = 7fh '8
If RB = 44h Then RC = 6fh '9
Return

Ahora vamos a agregar dos led, uno verde a RA0 y uno rojo RA1, deseamos entrar una clave de tres números,
usamos el # como enter, si la clave es correcta el led verde prende 3 segundos y se apaga, si la clave es
incorrecta el led rojo prende 3 segundos y se apaga. Vamos a utilizar la clave correcta = 192

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 39
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

El esquema electrónico es el siguiente,

AllDigital
Dim k As Byte
Dim v1 As Byte
Dim n1 As Byte
Dim n2 As Byte
Dim n3 As Byte
Dim tecla As Byte
Symbol lv = RA0
Symbol lr = RA1
TRISA = %00000000
TRISB = %11110000
TRISC = %00000000
RB = 0
RC = 0
lv = 0
lr = 0
inicio:
For k = 0 To 2 Step 1
RB = LookUp(1, 2, 4), k
v1 = RB And 240
If v1 > 0 Then Gosub leer_tecla
Next k
Goto inicio
End
leer_tecla:
If RB = 82h Then tecla = 0
If RB = 11h Then tecla = 1
If RB = 12h Then tecla = 2
If RB = 14h Then tecla = 3
If RB = 21h Then tecla = 4

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 40
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

If RB = 22h Then tecla = 5


If RB = 24h Then tecla = 6
If RB = 41h Then tecla = 7
If RB = 42h Then tecla = 8
If RB = 44h Then tecla = 9
If RB = 84h Then tecla = 10
RC = LookUp(3fh, 06h, 5bh, 4fh, 66h, 6dh, 7dh, 27h, 7fh, 6fh, 249), tecla
Gosub verifica
Return
verifica:
If tecla = 10 Then
If n1 = 1 And n2 = 9 And n3 = 2 Then
lv = 1
WaitMs 2000
lv = 0
Else
lr = 1
WaitMs 3000
lr = 0
Endif
n1 = 100
n2 = 100
n3 = 100
RC = 0
Else
n1 = n2
n2 = n3
n3 = tecla
Endif
WaitMs 500
RC = 0
espere:
RB = 0
If RB <> 0 Then Goto espere
Return

Ejercicios propuestos:

1) Programar una clave de 4 números que active el led verde.

2) Programador dos claves de 3 números que activen el led verde.

3) Programa la tecla ‘*’ para cambiar la clave correcta.

4) Conecte 4 leds y programe 4 claves de 3 números que los activen por 3 segundos.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 41
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

PWM MODULACION POR ANCHO DE PULSO

La modulación por ancho de pulsos (o PWM, de pulse-width modulation en inglés) es una técnica en la que se
modifica el ciclo de trabajo de una señal periódica (por ejemplo sinusoidal o cuadrada).

El ciclo de trabajo de una señal periódica es el ancho relativo de su parte positiva en relación al período.
Matemáticamente:

D=t/T

D es el ciclo de trabajo
t es el tiempo en que la función es positiva (ancho del pulso)
T es el período de la función

La construcción típica de un circuito PWM se lleva a cabo mediante un comparador con dos entradas y una
salida. Una de las entradas se conecta a un oscilador de onda triangular, mientras que la otra queda disponible
para la señal moduladora. En la salida la frecuencia es generalmente igual a la de la señal triangular y el ciclo
de trabajo esta en función de la portadora.

La principal desventaja que presentan los circuitos PWM es la posibilidad de que haya interferencias
generadas por radiofrecuencia. Estas pueden minimizarse ubicando el controlador cerca de la carga y
realizando un filtrado de la fuente de alimentación.

Parámetros importantes

Algunos parámetros importantes de un PWM son:


La relación de amplitudes entre la señal portadora y la moduladora, siendo recomendable que la última no
supere el valor pico de la portadora y esté centrada en el valor medio de ésta.
La relación de frecuencias, donde en general se recomienda que la relación entre la frecuencia de la portadora
y la de señal sea de 10 a 1.

Aplicaciones

En actualidad, existen muchos circuitos integrados que integran la función PWM, además de otros muy
particulares para lograr circuitos funcionales que puedan controlar fuentes conmutadas, controles de motores,
controles de elementos termoeléctricos, choppers para sensores en ambientes ruidosos y algunas otras
aplicaciones. Se distinguen por fabricar este tipo de integrados compañías como Texas Instruments, National
Semiconductor, Maxim, y algunas otras más.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 42
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

CONTROL DE VELOCIDAD DE UN MOTOR DC CON PWM


Realicemos el siguiente circuito,

Con S1 deseamos incrementar la velocidad al motor, con S2 deseamos decrementar la velocidad al motor.
Debemos recordar que el PWM es control por ancho de pulso, lo que hacemos es variar el ancho del pulso a una señal
conservando su frecuencia, este método es utilizado para realizar variación de velocidad en motores, controlar temperatura
en resistencias calefactores, etc.
En nuestro ejemplo la frecuencia base es de 400 Hz (un valor típico) por lo que el periodo de la onda (T=1/f) será de 2500
microsegundos.

El programa es el siguiente,

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 43
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

El control por ancho de pulso PWM, viene incorporado en los microcontroladores 16F873A y 16F877A, y son llamados
CCPn, siendo n el número de canal, los dos microcontroladores tiene dos canales el CCP1 (pin RC2) y el CCP2 (pin
RC1).

El PIC Simulator tiene ya las funciones propias para el control autónomo de estas salidas por PWM, y son:

PWMON, PWMOFF y PWMDUTY

PWMON Canal, Modulo

La función PWMON configura el canal a utilizar, el escalamiento para la salida y la base de frecuencia, requiere de dos
parámetros,

Canal = es el CCPn que se va a utilizar, los valores son 1, 2 o 3; 1 para CCP1, 2 para CCP2 y 3 para CCP3 (algunos
micros PIC lo tienen)

Modulo = se selecciona la frecuencia base para generar el PWM, y se selecciona el numero de bits que forman de 0 al 100
% de la salida. Se obtiene de la siguiente tabla,

Por ejemplo PWMON 1,1, quiere decir que se utiliza el canal CCP1 (pin RC2), el modulo 1, con frecuencia base de 244
Hz, y una precisión de 10 bits, por lo que salida del 0% será 0, salida del 100% será 1023.

Si PWMON 2, 10, se selecciona canal CCP2 (pin RC1), el modulo 2, con frecuencia base de 1953 Hz, y una presicion de
7 bits, por lo que 0% será 0 y 100% será un valor de 127.

PWMoff Canal

La función PWMoff desactiva el canal iniciado por el PWMON, requiere un parámetro,

Canal = es el CCPn que se va a utilizar, los valores son 1, 2 o 3, 1 para CCP1, 2 para CCP2 y 3 para CCP3 (algunos
micros PIC lo tienen)

Después de ejecutar PWMoff, se desactiva el canal y se debe otra vez llamar el PWMON para iniciar.

PWMDuty Canal, variable

La función PWMDUTY es la que genera la salida PWM sobre el pin (canal) seleccionado, require dos parámetros,

Canal = es el CCPn que se va a utilizar, los valores son 1, 2 o 3, 1 para CCP1, 2 para CCP2 y 3 para CCP3 (algunos
micros PIC lo tienen)

Variable = es el valor, ya sea una variable o una constante que nos dara el porcentaje de salida, va de acuerdo al modulo
seleccionado en PWMON.

Por ejemplo si PWMON 1,9 y PWMDUTY 1,255, la salida estará a un 100% de PWM, si PWMDUTY 1, 127 la salida
estará al 50% de PWM.

Ejemplo:

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 44
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Queremos generar en un CCP1 de un 16F873A salida PWM del 50% fijo, se tiene un pulsador en S0 en RC0 que apaga la
salida. El código es el siguiente:

Ejemplo:

Según el esquema anterior, queremos que, al pulsar S1 el motor va del 0% al 100% de su velocidad con una rampa de
10 segundos, si se pulsa S2 el motor para inmediatamente.
0% es 0, 100% es 1023, o sea, para ir de 0 al 100% en 10 segundos se debe incrementar con un intervalo de
10milisegundos (aproximadamente). El código será el siguiente:

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 45
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

CONEXION DE MATRIX DE LEDS

Una matrix de led es un arreglo de filas y columnas de diodos tipo led, estas se usan entre otras cosas para
visualizar mensajes, desplazar caracteres.

Viene en diferentes tamaños, según el numero de filas y de columnas, nosotros vamos a trabajar con una de
5x7, o sea, 5 columnas y 7 filas.

Las filas las activamos con “0” y las columnas con “0”. Usemos el puerto RB (RB0 a RB6) para controlar las
filas y RC (RC0 a RC4) para controlar las columnas.

Primero debemos definir en la matrix lo que vamos a mostrar, por ejemplo la “A”, “7”, “0”

Las columnas se enumeran de derecha a izquierda (0, 1, 2, 3, 4) y las filas de arriba hacia abajo (0, 1, 2, 3, 4,
5, 6, 7).
De lo anterior debemos sacar de la figura formada los 5 valores para cada columna formado por los bits 0 a 6
de las filas, por ejemplo:

La “A”, los códigos son 7ch, 12h, 11h, 12h, 7ch


El “7”, los códigos son
El “0”, los códigos son 3eh, 51h, 49h, 45h, 3eh

Y así podemos hallar los códigos de cualquier figura a formar.

Usando un PIC16F873A, vamos a usar una matrix de led de 5x7, para la conexión de filas debemos utilizar un
buffer, por ejemplo el 74ls240 que tiene salidas negadas, y en las columnas usamos transistores, por ejemplo
2n3904, que activen la columna a “1”.

Por ahorro de tiempo en la simulación se puede conectar en el proteus la matrix de forma directa, teniendo en
cuenta, que la salida por RB a filas debe ser negada (invertir bits).

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 46
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Para la realización del programa debemos realizar los siguientes pasos

1) Crear una subrutina “Msg”, en ella escribimos el mensaje a mostrar, se debe terminar con 255, para saber
hasta donde llega el mensaje. Por ejemplo

En la variable “letra” (byte) vamos a poner la letra amostrar, la variable “kletra” (byte) nos dirá cual letra del
mensaje a sacar.

2) Crear una subrutina “Codigos”, en ella escribimos los códigos de los caracteres a mostrar. Por ejemplo

Según la letra a mostrar (variable “letra”), buscamos los códigos, os capturamos en la variable “dato” (byte) y
los metemos en un vector “datos()” (byte), este ultimo nos permitirá mostrar en la matrix los códigos y
rotarlos.

3) Crear una subrutina “Rotar”, esta rota los códigos en el vector “datos()”, lo cual permite que los caracteres
se vallan mostrando y rotando sobre la matrix.

4) En el programa principal, debemos leer la letra, luego rotar el vector, hallar los códigos, mostrar las
columnas un momento, desplazar la letra, a terminar de desplazar buscamos la otra letra, y se repite el ciclo.

El código completo es el siguiente:

AllDigital
Dim k1 As Byte
Dim k2 As Byte
Dim k3 As Word
Dim k4 As Byte
Dim kletra As Byte
Dim letra As Byte
Dim dato As Byte
Dim datos(6) As Byte
TRISB = 0
TRISC = 0
k2 = 0
inicio:
Gosub msg
If letra = 255 Then
k2 = 0

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 47
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

kletra = 0
Goto inicio
Endif
Gosub rotar
Gosub codigos
For k3 = 0 To 50
k4 = 1
For k1 = 0 To 5
RC = k4
RB = Not datos(k1)
WaitUs 500
k4 = k4 * 2
Next k1
Next k3
k2 = k2 + 1
If k2 > 5 Then
kletra = kletra + 1
k2 = 0
Endif
Goto inicio
End
rotar:
datos(5) = datos(4)
datos(4) = datos(3)
datos(3) = datos(2)
datos(2) = datos(1)
datos(1) = datos(0)
Return
msg:
letra = LookUp("H", "O", "L", "A", " ", 255), kletra
Return
codigos:
Select Case letra
Case "H"
dato = LookUp(77h, 8h, 8h, 8h, 77h, 00h), k2
Case "O"
dato = LookUp(3eh, 41h, 41h, 41h, 3eh, 00h), k2
Case "L"
dato = LookUp(7fh, 40h, 40h, 40h, 40h, 00h), k2
Case "A"
dato = LookUp(7ch, 12h, 11h, 12h, 7ch, 00h), k2
EndSelect
datos(0) = dato
Return

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 48
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

CONTROL MOTORES PASO A PASO

Recordemos que existen motores paso a paso de tipo unipolar (2 bobinas) y motores bipolares (5, 6 o 8 bobinas). A estos
motores se les puede controlar la velocidad, el ángulo y el sentido de giro. La velocidad máxima la da el fabricante y se
varía con la frecuencia de activación de las bobinas, el ángulo se varía controlando el número de activaciones de las
bobinas y el sentido se controla invirtiendo la secuencia de activación de las bobinas.

Hay que tener cuidado con la conexión al PIC, ya que estos motores requieren mucha corriente.

Para controlar un motor bipolar se debe controlar cada bobina con puente H (inversor de giro), ya sea realizado con
semiconductores o relés (en lo posible de estado solido).

La secuencia para su control es la siguiente:

Paso Terminales
A B C D
1 +V -V +V -V
2 +V -V -V +V
3 -V +V -V +V
4 -V +V +V -V

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 49
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Para motores paso a paso unipolares se debe conectar cada punta de bobina a través de transistores de potencia (alto
consumo de corriente) o relés, ya sea controlado el Gnd o el +Vcc
.

Hay tres formas de controlar un motor paso a paso y son (sin importaren que pines del PIC se conecten).:

Por Oleada: Bajo par, sencillo

Paso Normal: Alto par

Por Medio Paso: Mas presicion

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 50
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Si los valores de las secuencias se invierten, también se invierte el sentido de giro del motor. Por ejemplo si la
secuencia es 1, 2, 4, 8, 1, 2, 4, … el motor podría girar de forma continua hacia la derecha, pero si en la misma
conexión enviamos 8, 4, 2, 1, 8, 4, 2,… el motor girara hacia la izquierda.

Ejemplo: Conectar un motor paso a paso bipolar a un PIC 16F873A, al iniciar el programa el motor debe girar hacia
la derecha de forma continua.

Por comodidad en el Proteus, lo vamos a conectar de forma directa.

Configurar el MPP con los siguientes parámetros,

O sea, por cada paso el MPP (motor paso a paso) va a girar un (1) grado (hacia la izquierda

El programa es el siguiente

AllDigital
Dim k As Byte
TRISB = 0
RB = 0
inicio:
For k = 0 To 3
RB = LookUp(5, 9, 10, 6), k
WaitMs 50
Next k
Goto inicio
End

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 51
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

El valor de -37.3 nos indica que el motor a girado 37.3 grados en sentido antihorario

Si en el programa cambiamos la secuencia de los pasos, el motor cambia el sentido de giro.

AllDigital
Dim k As Byte
TRISB = 0
RB = 0
inicio:
For k = 3 To 0 Step -1
RB = LookUp(5, 9, 10, 6), k
WaitMs 50
Next k
Goto inicio
End

Ejemplo: Se desea que con el circuito anterior el motor gire 45 grados a la derecha, realice una pausa de 1.5
segundos y repita el ciclo de forma indefinida.

AllDigital
Dim k As Byte
Dim pasos As Word
TRISB = 0
RB = 0
inicio:
For k = 3 To 0 Step -1
RB = LookUp(5, 9, 10, 6), k
WaitMs 50
pasos = pasos + 1
If pasos = 45 Then
WaitMs 1500

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 52
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

pasos = 0
Endif
Next k
Goto inicio
End

La variable “pasos” cuenta cada paso (que equivale a 1 grado), cuando se alcanza el valor 45 se realiza la pausa y se
resetea el contador.

Ejemplo: Conectar un MPP unipolar a un PIC16F873A, cuando el programa inicie el MPP de be girar de forma
continua, usando secuencia normal.

Configure MPP a 5V y 1 grado por paso.

AllDigital
Dim k As Byte
TRISB = 0
RB = 0
inicio:
For k = 0 To 3
RB = LookUp(3, 6, 12, 9), k
WaitMs 100
Next k
Goto inicio
End

Ejemplo: Con el mismo circuito anterior, realizar un programa donde el MPP gire 45 grados a la derecha, pausa de
1.5 segundos, gire 45 grados a la izquierda, pausa 1,5 segundos, y se repita el ciclo.

AllDigital
Dim pasos As Word
Dim k As Byte
TRISB = 0
RB = 0
inicio:
Gosub secuencia1
WaitMs 1500
Gosub secuencia2
WaitMs 1500
Goto inicio
End
secuencia1:
For k = 0 To 3
RB = LookUp(3, 6, 12, 9), k
WaitMs 100
pasos = pasos + 1

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 53
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

If pasos = 45 Then
pasos = 0
Return
Endif
Next k
Return
secuencia2:
For k = 3 To 0 Step -1
RB = LookUp(3, 6, 12, 9), k
WaitMs 100
pasos = pasos + 1
If pasos = 45 Then
pasos = 0
Return
Endif
Next k
Return

Ejemplo: En el circuito anterior agregar tres pulsadores S1, S2 y S3, con S1 el MPP gira hacia la derecha, con S2 gira
hacia la izquierda y con S3 el MPP para. Usar secuencia de medio paso.

AllDigital
Dim k As Byte
Dim v1 As Byte
Symbol s1 = RA0
Symbol s2 = RA1
Symbol s3 = RA2
Symbol mpp = RB
TRISA = 7
TRISB = 0
mpp = 0
inicio:
If s1 = 1 Then v1 = 1
If s2 = 1 Then v1 = 2
If s3 = 1 Then v1 = 0
If v1 = 1 Then Gosub derecha
If v1 = 2 Then Gosub izquierda
If v1 = 0 Then mpp = 0
Goto inicio
End
derecha:
mpp = LookUp(1, 3, 6, 4, 12, 8, 9), k
WaitMs 50
k=k+1
If k = 8 Then k = 0
Return

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 54
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

izquierda:
mpp = LookUp(1, 3, 6, 4, 12, 8, 9), k
WaitMs 50
k=k-1
If k = 255 Then k = 7
Return

El PIC Ide Simulator trae funciones para controlar un MPP unipolar, estas se pueden usar de modo rápido para
cualquier control

Para cada bobina A, B, C y D se debe configurar el puerto y bit a utilizar.

Luego se define el modo de trabajo, con 1 paso normal, con 2 medio paso.

Se utiliza STEPHOLD para detener el motor

Para mover el motor a la derecha o izquierda se usa STEPCW o STEPCCW, estas funciones requieren de
dos parámetros, el primero indica los pasos a dar, y el segundo la pausa entre pasos en microsegundos.

AllDigital
Define STEP_A_REG = PORTB
Define STEP_A_BIT = 0
Define STEP_B_REG = PORTB
Define STEP_B_BIT = 1
Define STEP_C_REG = PORTB
Define STEP_C_BIT = 2
Define STEP_D_REG = PORTB
Define STEP_D_BIT = 3
Define STEP_MODE = 1
StepHold
inicio:
StepCW 45, 3000
WaitMs 500
Goto inicio
End

En el programa anterior el motor gira a la derecha 45 grados y realiza pausa de 500 milisegundos, el ciclo es infinito

Si cambiamos STEPCW por STEPCCW el MPP cambia de sentido de giro

AllDigital
Define STEP_A_REG = PORTB
Define STEP_A_BIT = 0
Define STEP_B_REG = PORTB
Define STEP_B_BIT = 1
Define STEP_C_REG = PORTB
Define STEP_C_BIT = 2
Define STEP_D_REG = PORTB
Define STEP_D_BIT = 3
Define STEP_MODE = 1

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 55
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

StepHold
inicio:
StepCCW 45, 3000
WaitMs 500
Goto inicio
End

Ejemplo: Usando el siguiente circuito, se desea que al pulsar S1 el MPP gire a la derecha, con S2 gire a la izquierda,
y con S3 el MPP pare.

AllDigital
Define STEP_A_REG = PORTB
Define STEP_A_BIT = 0
Define STEP_B_REG = PORTB
Define STEP_B_BIT = 1
Define STEP_C_REG = PORTB
Define STEP_C_BIT = 2
Define STEP_D_REG = PORTB
Define STEP_D_BIT = 3
Define STEP_MODE = 1
Dim v1 As Byte
TRISA = 7
StepHold
inicio:
If RA0 = 1 Then v1 = 1
If RA1 = 1 Then v1 = 2
If RA2 = 1 Then v1 = 0
If v1 = 1 Then
StepCW 1, 3000
Endif
If v1 = 2 Then
StepCCW 1, 3000
Endif
If v1 = 0 Then
StepHold
Endif
WaitMs 1
Goto inicio
End

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 56
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

MANEJO DE UN DISPLAY LCD

El compilador PIC Basic posee las funciones propias para el manejo de display LCD de varios tipos, si tomamos como
ejemplo un LCD de 2 Filas y 16 columnas (16x2), podremos enviar mensajes a cualquiera de las dos líneas y en la
posición que queramos.

Recordemos que un display de 16x2 tienen generalmente 16 pines, a saber:

1. Gnd
2.+5Vcc
3.Vo, manejo de contraste
4.RS, selección de registro instrucción datos
5. R/W, selección escritura o lectura, con R/W=0 se escribe en el Lcd, con R/w=1 se lee
6. E, habilitación, con E=1 se activa el LCD
7 a 14, entrada y salida de datos
15 y 16, algunos tienen luz propia.

Los LCD se pueden manejar con 8 o 4 bits. Para 8 bits se utilizan los pines 7 a 14 (D0 a D7), para 4 bits se utilizan los
pines 11 a 14 (DD4 a D7)..

Este curso no pretende explicar el funcionamiento de los LCD, ya que deben ser conocimientos adquiridos por el propio
estudiante, por lo que si existen dudas se debe recurrir a adquirir fundamentación propia.

Para controlar el LCD debemos programar las siguientes definiciones:

DEFINE LCD_LINES = 2 ‘numero de filas del LCD


DEFINE LCD_CHARS = 16 ‘numero de columnas del lcd
DEFINE LCD_BITS = 8 ‘manejo por 8 (8) o 4 (4) bits
DEFINE LCD_DREG = PORTB ‘puerto a conectar los 8 o 4 bits
DEFINE LCD_DBIT = 0 ‘0 para manejo de 8 bits y 4 para manejo de 4 bits
DEFINE LCD_RSREG = PORTC ‘Puerto para manejar RS
DEFINE LCD_RSBIT = 1 ‘Bit para manejar RS (RC1)
DEFINE LCD_EREG = PORTC ‘Puerto para manejar E
DEFINE LCD_EBIT = 3 ‘Bit para manejar E (RC3)
DEFINE LCD_RWREG = PORTC ‘Puerto para manejar RW
DEFINE LCD_RWBIT = 2 ‘Bit para manejar RW

Algunas funciones son:

LCDINIT n, n=0, sin cursor; n=1, blink; n=2, underline; n=3, blink + underline
LCDCMDOUT <orden> ejecuta una orden
LCDClear borrar LCD

LCDLINE!HOME se sitúa en fila 1 columna 1

LCDOUT “texto” envía texto a LCD a posición seleccionada

LCDLINE2POS(10) selecciona línea 2 columna 10

Se deja al alumno para que lea las ayudas con respecto a las demás funciones.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 57
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Ejemplo: Realizar el siguiente montaje,

Escriba el siguiente programa de prueba,

Define LCD_LINES = 2 ‘2 filas


Define LCD_CHARS = 16 ’16 columnas
Define LCD_BITS = 8 ‘8 bits
Define LCD_DREG = RB ‘puerto a conectar los 8 bits (pines 7 a 14)
Define LCD_DBIT = 0 ‘manejo de 8 bits
Define LCD_RSREG = RC ‘puerto para RS
Define LCD_RSBIT = 0 ‘RC0 a RS
Define LCD_EREG = RC ‘puerto para E
Define LCD_EBIT = 1 ‘RC1 a E
Define LCD_RWREG = RC ‘puerto para R/W
Define LCD_RWBIT = 2 ‘RC2 a R/W
Lcdinit 0
loop:
Lcdcmdout LcdClear
Lcdout "Microntroladores"
WaitMs 1000
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Home
Lcdout "Soy Fila 1"
WaitMs 500
Lcdcmdout LcdLine2Home
Lcdout "Soy Fila 2"
WaitMs 2000
Goto loop
End

Se vería en el Proteus

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 58
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Para mostrar variables, escriba el siguiente programa

Define LCD_LINES = 2
Define LCD_CHARS = 16
Define LCD_BITS = 8
Define LCD_DREG = RB
Define LCD_DBIT = 0
Define LCD_RSREG = RC
Define LCD_RSBIT = 0
Define LCD_EREG = RC
Define LCD_EBIT = 1
Define LCD_RWREG = RC
Define LCD_RWBIT = 2

Dim v1 As Byte
Dim v2 As Byte

Lcdinit 0
Lcdcmdout LcdClear
loop:
Lcdcmdout LcdLine1Home
Lcdout "Variable V1="
Lcdcmdout LcdLine1Pos(14)
Lcdout #v1
Lcdcmdout LcdLine2Home
Lcdout "Variable V2="
Lcdcmdout LcdLine2Pos(14)
Lcdout #v2
WaitMs 250
v1 = v1 + 1
v2 = v1 * 7
Goto loop
End

Ejemplo: Conectar un LCD 2x16 a un PIC16F873A a 4 bits y enviar un mensaje.

AllDigital
Define LCD_LINES = 2
Define LCD_CHARS = 16
Define LCD_BITS = 4
Define LCD_DREG = RB
Define LCD_DBIT = 4
Define LCD_RSREG = RC
Define LCD_RSBIT = 0
Define LCD_EREG = RC
Define LCD_EBIT = 1

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 59
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Define LCD_RWREG = RC
Define LCD_RWBIT = 2
Lcdinit 0
loop:
Lcdcmdout LcdClear
Lcdcmdout LcdLine1Home
Lcdout "Microntroladores"
Lcdcmdout LcdLine2Home
Lcdout "4 BITS !!"
WaitMs 50
Goto loop
End

Lo simulamos en el mismo PIC Ide Simulator

Ejemplo: conectar un LCD 2x16 a un PIC16F873A a 4 bits, rotar de derecha a izquierda un mensaje

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 60
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

LECTURA DE SENALES ANALOGAS


Algunos microcontroladores PIC poseen entradas análogas,

El PIC16F873A tiene 5 entradas análogas: AN0 (RA0), AN! (RA1), AN2 (RA2), AN3 (RA3), AN4 (RA5)
El PIC16F877A tiene 8 entradas análogas: AN0 (RA0), AN! (RA1), AN2 (RA2), AN3 (RA3), AN4 (RA5), AN5 (RE0),
AN6 (RE1), AN7 (RE2).

Se puede tener referencias VREF- (RA2) y VREF+ (RA3) o tomar como referencia a VDD y VSS.

El puerto RA se puede usar como entradas o salidas digitales (discretas) o como entradas análogas, esto se configura con
el registro ADCON1.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 61
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Como observamos en la tabla anterior, para tener todo el puerto RA como I/O digitales hay que cargar ADCON1=6
(0x06); por ejemplo si solo se requiere usar la entrada análoga AN0 se carga ADCON1=0x8E; si se requieren usar todas
las entradas análogas se configura ADCON1=0x80.
Si se configura una entrada análoga (o varias) y no se usan se recomiendo conectarlas a GND ya sea de forma directa o a
través de una resistencia de 1 K.

Los PIC (16F873A y 16F877A) solo tiene un conversor ADC (análogo a digital) el cual es usado por las entradas
análogas por multiplexion, este ADC es de 10 bits con valor digital (Vd) de 0 a 1023 (1024 pasos), este valor Vd nos lo
entrega en dos registros llamados ADRESH y ADRESL.

Con el bit 7 (ADFM) del ADCON1 se configuran los bits del Vd en ADRESH y ADRESL

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 62
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

El PIC Basic tiene las librerías para leer las entradas análogas de los PIC, estas son

Adcin canal, variable

canal : es la entrada análoga a leer, sus valores son 0 a 4 para 16F873A y 0 a 7 para 16F877A

variable : donde se va aguardar el valor digital Vd correspondiente a la entrada análoga leída, como Vd es de 10 bits con
valores desde 0 a 1023 la variable debe poder contener este numero, por lo que se debe configurar como WORD.

Ejemplo : leer el la entrada análoga 0, Adcin 0, vd0; leer la entrada análoga 6, Adcin 6,Vd6

Se recomienda también configurar la entrada análoga a usar como entrada con el TRISCn, no es necesario configurar el
ADCON1 ya que la instrucción Adcin lo configura de forma automática.

Para leer varias entradas análogas se deBe invocar varias veces Adcin y guardando los valores Vd en variables diferentes

Adcin 0,vd0
Adcin 2,vd2
Adcin 5,vd5

Ejemplo: Vamos a leer la entrada análoga 0 de un PIC16F873A, el circuito es el siguiente

Se desea que cuando el voltaje en la entrada análoga 0 sea menor a 2.5 voltios se active el led D2, y si el voltaje es superior a 3.5 voltios
se active D1.

Sabemos que el PIc no me entrega el valor análogo en voltaje, sino en un numero decimal escalado de 0 1 1023 (10 bits), por lo que para
un voltaje de 0 voltios el valor decimal es 0, para 2.5 voltios el valor decimal es 511, para 3.5 es 716 y para 5 voltios el valor decimal es
1023 voltios.

Para hallar el valor decimal de cualquier voltaje use la formula

Vd = Voltios * 1024 / 5 (tome el entero)

El programa es el siguiente:

Dim vd0 As Word


Symbol d1 = RB0
Symbol d2 = RB1
TRISB = 0
inicio:
Adcin 0, vd0
If vd0 < 511 Then
d2 = 1
Else
d2 = 0
Endif
If vd0 > 716 Then
d1 = 1
Else

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 63
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

d1 = 0
Endif
Goto inicio
End

No utilizar la directiva “AllDigital” ya que se deshabilitan las entradas análogas.

Ejemplo: Vamos a utilizar la entrada análoga 3 como se muestra a continuación

Primero vamos a mostrar en el Lcd el valor decimal de la entrada análoga 3.

Define LCD_LINES = 2
Define LCD_CHARS = 16
Define LCD_BITS = 8
Define LCD_DREG = RB
Define LCD_DBIT = 0
Define LCD_RSREG = RC
Define LCD_RSBIT = 0
Define LCD_EREG = RC
Define LCD_EBIT = 2
Define LCD_RWREG = RC
Define LCD_RWBIT = 1
Dim vd3 As Word
Dim rvd3 As Word
Lcdinit 0
Lcdcmdout LcdClear
rvd3 = 2000
Lcdcmdout LcdLine1Home
Lcdout "Decimal = ", #vd3
inicio:
Adcin 3, vd3
If vd3 <> rvd3 Then
Lcdcmdout LcdLine1Pos(11)
Lcdout " "
Lcdcmdout LcdLine1Pos(11)
Lcdout #vd3

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 64
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

rvd3 = vd3
Endif
Goto inicio
End

Ahora vamos a mostrar también el valor en voltaje, para calcular el voltaje a partir del valor decimal, usar la formula,

Voltios = Vd * 5 / 1024

Para obtener un decimal de precisión cambiamos 5 por 50,

Voltios = Vd * 50 / 1024

Para obtener la parte entera calculamos , V1 = Voltios / 10

Para obtener el decimal calculamos, V2 = Voltios Mod 10

El programa es el siguiente

Define LCD_LINES = 2
Define LCD_CHARS = 16
Define LCD_BITS = 8
Define LCD_DREG = RB
Define LCD_DBIT = 0
Define LCD_RSREG = RC
Define LCD_RSBIT = 0
Define LCD_EREG = RC
Define LCD_EBIT = 2
Define LCD_RWREG = RC
Define LCD_RWBIT = 1
Dim vd3 As Word
Dim rvd3 As Word
Dim voltios As Word
Dim v1 As Byte
Dim v2 As Byte
Lcdinit 0
Lcdcmdout LcdClear
rvd3 = 2000
Lcdcmdout LcdLine1Home
Lcdout "Decimal = ", #vd3
Lcdcmdout LcdLine2Home
Lcdout "Voltios = ", #v1, ",", #v2

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 65
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

inicio:
Adcin 3, vd3
voltios = vd3 * 50 / 1024
v1 = voltios / 10
v2 = voltios Mod 10
If vd3 <> rvd3 Then
Lcdcmdout LcdLine1Pos(11)
Lcdout " "
Lcdcmdout LcdLine1Pos(11)
Lcdout #vd3
Lcdcmdout LcdLine2Pos(11)
Lcdout " "
Lcdcmdout LcdLine2Pos(11)
Lcdout #v1, ",", #v2
rvd3 = vd3
Endif
Goto inicio
End

Ejemplo: Mostrar en un LCD el valor de temperatura dada por un LM35.

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 66
PIC CON PIC IDE SIMULATOR BASIC ingjaop@gmail.com / www.ingjaop.blogspot.com

Recordemos que un LM35 es un sensor de temperatura, con rango de -55 a 150 grados centígrados, nos entrega 10
milivoltios por grado centígrado.

Define LCD_LINES = 2
Define LCD_CHARS = 16
Define LCD_BITS = 8
Define LCD_DREG = RB
Define LCD_DBIT = 0
Define LCD_RSREG = RC
Define LCD_RSBIT = 0
Define LCD_EREG = RC
Define LCD_EBIT = 2
Define LCD_RWREG = RC
Define LCD_RWBIT = 1
Dim vd0 As Word
Dim rvd0 As Word
Dim grados As Word
Dim v1 As Byte
Dim v2 As Byte
Lcdinit 0
Lcdcmdout LcdClear
rvd0 = 2000
Lcdcmdout LcdLine1Home
Lcdout "Temperatura Lm35"
Lcdcmdout LcdLine2Home
Lcdout "Grados C. = ", #v1, ",", #v2
inicio:
Adcin 0, vd0
grados = vd0 * 50 / 1024
v1 = grados
v2 = grados Mod 10
If vd0 <> rvd0 Then
Lcdcmdout LcdLine2Pos(13)
Lcdout " "
Lcdcmdout LcdLine2Pos(13)
Lcdout #v1, ",", #v2
rvd0 = vd0
Endif
Goto inicio
End

Ing. Jaime Alberto Ocampo Pérez Manizales – Colombia 11_2009 / Derechos reservados Página 67