Professional Documents
Culture Documents
com
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.
Un microcontrolador es un circuito integrado de alta escala de integración que incorpora la mayor parte
de los elementos que configuran un controlador.
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.
- 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.
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
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).
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.
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.
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.
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
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.
1) Forma simple: cuando una condición se cumple nos genera una y solo una acción; la sintaxis es,
if S1 = 1 then H0 = 1
if S2 = 1 then H0 = 0
if S1 = 1 and S2 = 0 then H0 = 1
if S2 = 1 and S1 = 0 then 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 <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,
Siempre si inicia con If y se termina con Endif, nunca se debe escribir después de el Then,
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,
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)
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
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
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.
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
Se desea configurar los primeros 4 bits (RB0 a RB3) del uerto RB como entradas y los últimos 4 (RB4 a RB7)
como salidas,
5) Configurar registros propios del PIC si se requiere, como temporizados, contadores, pwm, comunicaciones,
interrupciones, etc.
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
9) Al final el programa debe retornar a la etiqueta inicial, esto se realiza usando la instrucción
Por ejemplo
Inicio:
……………….
……………….
Goto Inicio
Ejemplos de Programas
1) Tenemos el siguiente esquema electrónico (realizado en proteus)
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 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
El programa seria
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.
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
Waitms K
Permite realizar pausas con base de tiempo en milisegundos, por ejemplo:
Waitus K
Permite realizar pausas con base de tiempo en microsegundos, por ejemplo:
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
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
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
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,
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
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
Ejemplos
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,
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
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,
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.
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
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.
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
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
4) Ubicamos el PIC en el programador, nunca lo inserte con el programador conectado y nunca lo retire con el
programador conectado.
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
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
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
Ejemplo:
Dim v1 as Byte
Dim v2 as Byte
Dim v1 as Byte
Dim v2 as Byte
For v1 = 0 to 50 Step 2
v2 = v1 * 2
Next v1
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,
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
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
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.
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
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
Ejercicios propuestos:
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
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
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
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:
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
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.
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
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:
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
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.
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
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).
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).:
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.
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
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.
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
Luego se define el modo de trabajo, con 1 paso normal, con 2 medio paso.
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
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
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.
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.
LCDINIT n, n=0, sin cursor; n=1, blink; n=2, underline; n=3, blink + underline
LCDCMDOUT <orden> ejecuta una orden
LCDClear borrar LCD
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
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
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
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
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
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
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
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.
El programa es el siguiente:
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
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
Voltios = Vd * 50 / 1024
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
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