Documentos de Académico
Documentos de Profesional
Documentos de Cultura
MICROCONTROLADORES PIC
Prólogo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1
3.4.3. El Opto-acoplador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.2.- Subrutinas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
i
4.3.1.- Define. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.3.3.- Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.3.4.- Constantes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.- Proyecto #2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
5.4.- Proyecto #4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
ii
5.8.- Proyecto #8. Implementación de la instrucción Branch . . . . . . . . . . . . 91
iii
Capitulo VIII. Memoria de Datos.
8.1.- Memoria de Datos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .157
iv
10.3.- Proyecto #29. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .196
v
Capitulo XIV. Módulos RF para comunicaciones.
14.1.- Módulos RF. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .293
@. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
ADCin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311
Branch. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .312
Button. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Call. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Clear . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .315
ClearWDT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .316
Count . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316
Data . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
DTMFout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
EEPROM. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .321
End. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
FreqOut. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .321
Gosub. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
vi
Goto. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .324
High. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .324
I2Cread. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
I2Cwrite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .326
IF-Then-Else. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Input. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .328
LCDin. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .329
LCDout. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .330
Low. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .331
NAP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331
Output. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Pause. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .333
PauseUs. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .333
Pot. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
PulsIn . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335
PulsOut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
PWM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336
Random . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .337
Read . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338
Return . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 339
Reverse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .340
SerIn. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .342
vii
SerOut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .343
Sleep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .344
Swap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .344
Toggle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .345
While-Wend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .347
Apéndice A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .348
Apéndice B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .358
Apéndice C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .360
Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .362
viii
Prólogo
2
Herramientas de Diseño Capitulo I
Figura 1.1.
(Fuente: http://www.microengineeringlabs.com)
3
• Programador de Microcontroladores PIC: es una herramienta
indispensable con la cual podemos grabar el código generado por el
compilador PicBasic para poner en funcionamiento cada uno de los
proyectos propuestos en cada capítulo. Existen en internet una gran
cantidad de modelos de programadores para microcontroladores PIC,
de muy bajo costo y fácil construcción. Consideramos una buena
experiencia realizar el montaje de cualquiera de estos diseños, aunque
en esta oportunidad nuestra recomendación es el programador
P16Pro/Picallw. Los detalles para la construcción de este programador
están contenidos en el apéndice A.
Figura 1.2.
4
• Placa de prototipos: proporciona al diseñador conexiones sin
soldaduras, con lo cual se hace más práctico el desarrollo de los
proyectos electrónicos propuestos a lo largo de cada capítulo.
Figura 1.3.
Figura 1.4.
5
• Fuente de poder regulada con salida de voltaje variable. En el capítulo
III se propone la construcción de una fuente de poder regulada a 5 Vdc
y 3.3 Vdc.
Figura 1.5.
Figura 1.6.
6
• Osciloscopio: este instrumento se requiere para el desarrollo de
algunas prácticas en las cuales se hace necesario medir las señales
generadas desde el microcontrolador.
Figura 1.7.
Figura 1.7.
7
Microcode Studio Capitulo II
Figura 2.1.
(Fuente: http://www.microengineeringlabs.com)
http://www.microengineeringlabs.com/resources/win_ide.htm
8
Figura 2.2.
(Fuente: http://www.microengineeringlabs.com)
http://www.melabs.com/products/index.htm
Figura 2.3.
(Fuente: http://www.microengineeringlabs.com)
Es posible descargar una versión DEMO del compilador PIC Basic, con la
cual se pueden compilar programas con un máximo de 31 líneas de código, a
través de la dirección: http://www.melabs.com/pbpdemo.htm
9
Haga clic en el Link aquí
señalado, para descargar la
versión Demo de PicBasic.
Pro
Figura 2.4.
(Fuente: http://www.melabs.com)
Para empezar la descarga del archivo de instalación del compilador, solo hay
que hacer clic en el link señalado en la figura 2.4, e indicar la ruta en la cual
se desea que el archivo de instalación sea almacenado.
10
El proceso de instalación es muy sencillo. El primer paso será ejecutar el
archivo mcsinstall.exe, el cual es el responsable de iniciar el proceso de
instalación de Microcode Studio:
Figura 2.7.
Figura 2.8.
11
Haga clic en el botón “Next” y podrá ver en la siguiente ventana el acuerdo de
licencia para Microcode Studio:
Figura 2.9.
Figura 2.10.
12
Pulse “Next” para iniciar la copia de archivos (figura 2.11), y finalmente espere
que se complete la instalación (figura 2.12).
Figura 2.11.
Figura 2.12.
13
Una vez instalado Microcode Studio, es importante tomar en cuenta que antes
de iniciar este software, es necesario instalar el compilador Basic, el cual es
indispensable para la generación del código que será cargado en el
microcontrolador PIC.
Para dar inicio a la instalación del compilador Pic Basic, será necesario
ejecutar el archivo denominado “pbpdemo.exe” para el caso de la versión de
demostración. La figura 2.13 muestra la ventana de inicio del proceso de
instalación, en la cual se da la bienvenida al usuario y le invita a cerrar
cualquier otra aplicación que se encuentre en uso en ese momento.
Figura 2.13.
14
Figura 2.14.
Figura 2.15.
15
Una vez seleccionadas las rutas de instalación del compilador, se debe hacer
clic en el botón “Install” (figura 2.16), para dar inicio a la copia de archivos.
Figura 2.16.
Figura 2.17.
16
Figura 2.18.
17
Integración de Microcode Studio y Pic Basic Pro:
Figura 2.19.
Figura 2.20.
18
3. En la pestaña “Compiler” haga clic en el botón “Find Automatically”
para una ubicación automática del compilador, o si lo prefiere haga clic
en “Find Manually” para ubicar el compilador manualmente.
Figura 2.21.
Figura 2.22.
19
Se debe ubicar en la lista el programador “PICALL Programmer”, haciendo
clic en el botón denominado “Add New Programmer” (Figura 2.22), y
seguidamente se debe seleccionar de la lista de opciones, como se puede
observar en la figura 2.23:
Figura 2.23.
20
Microcontroladores PIC Capitulo III
Con todas estas características es lógico pensar que este dispositivo pasa a
ser el corazón del circuito a ser controlado. Esto significa que el
microcontrolador es el encargado de dirigir todos los procesos de un circuito
electrónico, en base a las instrucciones de programa o rutinas que definen
funciones específicas de control, donde las mismas serán realizadas en
lenguaje Basic para microcontroladores PIC. Es por esta razón que
consideramos muy importante estudiar la arquitectura interna del
microcontrolador que se desea programar y aunque esta tarea pueda parecer
difícil, el Lenguaje Basic para microcontroladores PIC la hace sumamente
sencilla.
21
del microcontrolador para el control de dispositivos periféricos como pantallas
LCD, teclados, motores paso a paso, leds, servomotores entre otros. De ahí la
importancia de establecer cual será la función de cada puerto del
microcontrolador PIC elegido para nuestros proyectos.
Figura 3.1.
22
• PIC18F4XX, estos microcontroladores resultan muy útiles cuando
deseamos diseñar proyectos más avanzados.
http://www.microchip.com
• Microcontrolador de 8 Bits.
• Memoria de programa tipo Flash de 1024 palabras de 14 bits.
• Memoria RAM de 68 bytes.
• Memoria EEPROM de datos de 64 bytes.
• Velocidad de operación de hasta 20 Mhz.
• Cuatro fuentes de interrupción.
• Posee 13 pines I/O (pines de entrada o salida).
23
Diagrama de pines del PIC16F84:
Figura 3.2.
Tabla 3.1
24
El microcontrolador PIC16F84 cuenta con dos puertos I/O, el puerto A, el cual
consta de cinco pines I/O y el puerto B, el cual consta de ocho pines I/O como
se puede observar en la figura 3.3:
Figura 3.3.
En total se cuenta con trece pines I/O, los cuales pueden ser programados
como entrada o salida según convenga al momento de diseñar un circuito de
control.
25
• Oscilador HS: Oscilador de alta velocidad (High Speed).
• Oscilador RC: Resistencia / Condensador.
Figura 3.4.
Los valores de los condensadores cerámicos vienen dados según la tabla que
se muestra a continuación:
26
Por ejemplo, para un oscilador tipo XT, podemos utilizar un cristal de cuarzo
como el de la figura 3.5.
Figura 3.5.
• Voltios/Div: 200mV
• Time/Div: 100ns
Figura 3.6.
27
La lectura de la frecuencia y período en este caso sería la siguiente:
Cristal de cuarzo TTL: Este tipo de cristal consta de cuatro pines, de los
cuales solo tres están implementados de la siguiente manera:
Figura 3.7.
• Voltios/Div: 2V
• Time/Div: 100ns
28
Figura 3.8.
29
Figura 3.9.
30
Figura 3.10.
Una manera muy sencilla de ver el estado lógico de un pin configurado como
salida en cualquiera de los puertos de microcontrolador es a través del uso de
LEDs, como se observa en los circuitos de la figura 3.11.
31
En el primer circuito, el LED se iluminará solo cuando el estado lógico del pin
de salida del puerto sea igual a “1”, es decir, 5 voltios.
Figura 3.11.
32
3.4.2. Lectura de un estado lógico en un pin I/O:
Si deseamos introducir un nivel lógico bajo (0V), o alto (5V), a una de las
entradas de un microcontrolador a través de un pulsador, podríamos
considerar los circuitos de la figura 3.12, los cuales nos proporcionan dos
formas diferentes de hacerlo:
Figura 3.12.
33
El primer circuito en la figura 3.12 mantiene un nivel lógico alto (5V) mientras
el pulsador permanece abierto. Al presionar el pulsador, el nivel lógico en el
pin I/O del puerto pasa a ser bajo (0V).
3.4.3. El Opto-acoplador:
Figura 3.13.
34
En la configuración de la figura 3.13, cuando en el pin I/O aplicamos un 1
lógico (5V), el LED del opto-acoplador enciende y el fototransistor conduce la
corriente a tierra; por lo tanto, en la salida tendremos un 0 lógico (0V).
Figura 3.14.
35
través del cual circulará la corriente necesaria entre sus contactos, para hacer
funcionar cualquiera de estos dispositivos de potencia.
Figura 3.15.
36
3.4.4. Fuente de poder, 5Vdc / 3.3Vdc:
Figura 3.16.
37
Estructura de un programa.
Componentes y operadores en PicBasic. Capitulo IV
B C D
Figura 4.1.
38
Sección A: Corresponde al encabezado del programa, en el cual se debe
considerar información básica del mismo, como el nombre, la identificación
de autor, Copyright, fecha de elaboración o fecha de los últimos cambios
realizados, versión del programa que se está realizando, e incluso una breve
descripción acerca del objetivo del programa y su aplicación en un
determinado circuito electrónico.
Es importante resaltar que cada línea del encabezado debe empezar con una
comilla simple, en forma de comentario (ver “Sección D”).
39
Los comentarios ayudan al diseñador a identificar cada línea de programa o
cada una de las funciones de cada subrutina, garantizando así una buena
documentación en cada uno de los programas que realizamos.
Led1:
For Z = 0 To 9
LED = Encendido
Etiqueta Pause 1000
LED = Apagado
Subrutina
Pause 1000
Next Z
GoTo Inicio
End
40
4.3.- Componentes y operadores en PicBasic.
PIC Basic cuenta con una serie de herramientas de programación entre las
cuales podemos mencionar las etiquetas, variables, identificadores,
constantes, comentarios, símbolos entre otras.
41
Parámetro Descripción
Nombre de Tipo de
VAR Descripción
la Variable Variable
A1 Var Bit Toma los valores 0 y 1 unicamente
Temp Var Byte Toma valores entre 0 y 255 (8 bits)
dig1 Var Word Toma valores entre 0 y 65535 (16 bits)
Tabla 4.2.
42
4.3.3.- Arrays: Las variables Arrays tienen un determinado número de
“elementos”, definido según el tamaño de la variable. Las variables Arrays tipo
Bit, pueden almacenar 256 elementos; las variables Arrays tipo Byte pueden
almacenar hasta 96 elementos y las variables Arrays tipo Word hasta 48
elementos, los cuales a su vez pueden ser accesados en cualquiera de los
tres casos a través de un índice. Este índice se específica entre corchetes
como se muestra en los siguientes ejemplos:
Dato[0] = 200
Dato[1] = 15
Dato[2] = 56
Dato[3] = 75
Dato[4] = 80
Dato[5] = 20
Dato[6] = 33
Dato[7] = 45
43
4.3.4.- Constantes: Ayudan a identificar un valor constante en nuestro
programa, facilitando aún más la comprensión del mismo a la hora de verificar
su funcionamiento. En la tabla 4.3 se puede observar la forma de declarar una
constante.
Nombre de la Valor de la
CON
Constante Constante
Temp_Max CON 150
Temp_Min CON 55
Tabla 4.3.
Entonces,
44
4.3.6.- Operadores Aritméticos: Entre los operadores aritméticos más
utilizados tenemos los que se muestran en la siguiente tabla:
Tabla 4.4.
Operrador Descripción
& AND Lógico
| OR Lógico
^ XOR Lógico
˜ NOT Lógico
&/ NAND Lógico
|/ NOR Lógico
^/ NXOR Lógico
Tabla 4.5.
Si aplicamos una AND lógica, donde deseamos filtrar los siete bits más
significativos del valor almacenado en la siguiente variable:
Var1 = %00101001
Entonces,
45
El resultado de esta operación es Var1 = %00000001
Operador Descripción
= Igual
<> Diferente
< Menor que
> Mayor que
<= Menor o igual que
>= Mayor o igual que
Tabla 4.6.
Operador Descripción
AND AND Lógico
OR OR Lógico
XOR XOR Lógico
NOT NOT Lógico
NOT AND NAND Lógico
NOT OR NOR Lógico
NOT XOR NXOR Lógico
Tabla 4.7.
Ejemplo:
46
Primeros Programas con el PIC16F84 Capitulo V
El primer paso entonces será realizar el montaje del circuito con base en los
conocimientos adquiridos en las páginas anteriores. Se debe tomar en cuenta
que aunque en los diagramas de los circuitos que se muestran a continuación,
no están presentes los pines de alimentación “Vcc” y “Gnd”, éstos deben ser
conectados debidamente a la fuente de alimentación de 5 Voltios.
Figura 5.1.
47
Proyecto # 1
Componentes Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
LED 2
Resistencia de 220 Ohm 2
Fuente regulada de 5 Vdc 1
Tabla 5.1.
Note que el ánodo del diodo LED se encuentra conectado al pin de salida del
puerto, por lo tanto para que encienda el LED debemos hacer salir un 1 lógico
por el pin correspondiente.
Como los pines de los puertos pueden ser configurados como “entradas” o
como “salidas”, es importante tomar en cuenta los registros de configuración
de puertos, los cuales para el caso específico del PIC16F84 son dos:
48
Un ejemplo de configuración de los pines I/O del puerto A es el siguiente:
Registro TrisA
Bit menos
1 1 1 1 0
RA4 RA3 RA2 RA1 RA0
significativo
Figura 5.2.
1 = Entrada (Al configurar un bit del registro TrisA en “1”, éste se comporta como entrada).
0 = Salida (Al configurar un bit del registro TrisA en “0”, éste se comporta como salida).
Al ver la figura 5.2, se puede observar que el pin RA0 ha sido configurado
como salida y el resto de los pines como entrada.
Registro TrisB
1 1 1 1 1 1 1 0
Bit menos
RB7 RB6 RB5 RA4 RA3 RA2 RA1 RA0 significativo
Figura 5.3.
1 = Entrada (Al configurar un bit del registro TrisB en “1”, éste se comporta como entrada).
0 = Salida (Al configurar un bit del registro TrisB en “0”, éste se comporta como salida).
49
Para el caso particular del puerto B, se puede observar que el pin RB0 ha sido
configurado como salida y el resto de los pines como entrada.
HIGH
50
LOW
GOTO
PAUSE
'****************************************
'* Nombre : Proyecto1.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
51
TRISA = %11110 ' Configuración el Puerto A
TRISB = %11111110 ' Configuración el Puerto B
52
Al escribir el programa en el editor de texto de Microcode Studio, se debe
grabar el mismo con el nombre de su preferencia para que éste pueda ser
compilado y al mismo tiempo pueda ser enviado al microcontrolador.
Figura 5.4.
53
Modelo
Compilar
Compilar y del uC.
Grabar en
el PIC
Figura 5.5.
Figura 5.6.
54
Antes de programar el microcontrolador, también resulta conveniente verificar
los fusibles de programación, accediendo al botón “Config”, el cual puede ser
visualizado en la figura 5.6.
Figura 5.7.
55
• En la sección “Hardware” también disponemos de la opción “Power Up
Timer”, la cual una vez activada en el microcontrolador, hará que éste
no pueda iniciar el programa hasta tanto el voltaje aplicado al circuito
sea estable y seguro (ver figura 5.8).
Voltios 4
0
1 4 7 10 13 16 19 22 25 28 31 34 37 40 43 46 49 52 55 58 61
Tiempo
Figura 5.8.
Estos pasos se deben aplicar en cada uno de los proyectos aquí planteados,
o cada vez que se desee realizar una modificación a un programa para
obtener siempre mejores resultados sobre el objetivo propuesto en cada
actividad.
56
5.2.- Proyecto #2: En este ejemplo conectaremos un Led en cada pin del
puerto B, el cual a su vez deberá ser configurado como salida para garantizar
el correcto funcionamiento del mismo. En la figura 5.9 podemos observar en
detalle la conexión del circuito eléctrico que deberá ser montado.
Figura 5.9.
Proyecto # 2
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor de 33 pF 2
LED 8
Resistencia de 220 Ohm 8
Fuente regulada de 5 Vdc 1
Tabla 5.2.
57
En el proyecto #1 se pudo observar como es posible encender un led
conectado a un pin del puerto A o B en un PIC16F84A, utilizando las
instrucciones High y Low. También existen otras formas de poner un “1” o un
“0” lógico en un pin configurado como salida; esto se puede lograr de varias
maneras:
58
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
PORTB = %01010101 ' Enciente las salidas RB0, RB2, RB4 y RB6, al
' mismo tiempo apaga RB1, RB3, RB5 y RB7.
PORTB = %10101010 ' Enciente las salidas RB1, RB3, RB5 y RB7, al
' mismo tiempo apaga RB0, RB2, RB4 y RB6.
End
Este programa enciende primero las salidas pares del puerto B y apaga las
salidas impares, genera una pausa de 1 segundo (1000 ms) y seguidamente
hace el proceso inverso en las salidas, es decir, enciende las salidas impares
y apaga las salidas pares para generar nuevamente otra pausa de 1 segundo
y así repetir el proceso completo al generar un salto a la etiqueta “Inicio”.
59
5.3.- Proyecto #3: Los pines en los puertos de un microcontrolador pueden
ser configurados también como entradas, como se detalla en el contenido del
proyecto #1, donde se explica claramente que al poner un “1” en un bit de un
registro de configuración de puerto, ya sea TRISA o TRISB, para el caso del
PIC16F84A, éste se comportará como entrada. Realice el montaje de la figura
5.10 y analice el programa que se muestra a continuación.
Figura 5.10.
Proyecto # 3
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
LED 1
Resistencia de 220 Ohm 1
Resistencia de 10K Ohm 1
Pulsador Normalmente Abierto 1
Fuente regulada de 5 Vdc 1
Tabla 5.3.
60
IF – THEM – ELSE
Inicio:
End
61
En este caso si el pulsador ha sido activado, entonces RA0 = 1, es decir, se
cumple la condición y por lo tanto RB0 = 1, es decir, el LED enciende.
Figura 5.11.
62
Proyecto # 4
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
Resistencia de 220 Ohm 8
Resistencia de 10K Ohm 8
Pulsador Normalmente Abierto 8
Display de 7 Segmentos - Cátodo común 1
Fuente regulada de 5 Vdc 1
Tabla 5.4.
'****************************************
'* Nombre : Proyecto4.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
63
Define Osc 4 ' Define el Oscilador para un Cristal
' de 4 Mhz.
Inicio:
' gfedcba
' |||||||
If PORTB.0 = 1 Then PortD = %00111111 ' Enciende los segmentos correspondientes
' al dígito “cero” en el display.
End
64
5.5.- Proyecto #5: En el ejemplo a continuación se realiza un conteo
ascendente desde cero hasta nueve en un display de 7 segmentos conectado
al puerto “D” de un PIC16F877A.
Figura 5.12.
Proyecto # 5
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
Resistencia de 220 Ohm 8
Display de 7 Segmentos - Cátodo común 1
Fuente regulada de 5 Vdc 1
Tabla 5.5.
65
FOR… NEXT
' gfedcba
' |||||||
Cero CON %00111111
Uno CON %00000110
Dos CON %01011011
Tres CON %01001111
Cuatro CON %01100110
Cinco CON %01101101
Seis CON %01111101
Siete CON %00000111
66
Ocho CON %01111111
Nueve CON %01100111
Inicio:
Next I
Digito:
Return ' Retorna una línea después del salto con retorno (Call)
End
Si deseamos realizar el incremento en más de una unidad por vez, tan solo
debemos incluir la directiva “Step”, seguido del incremento, es decir, si
queremos realizar un incremento de dos unidades por vez, entonces el lazo
For – Next se compone de la siguiente manera:
67
For I = 0 To 9 Step 2 ' Repetición de Instrucciones dentro del Lazo
' For – Next con incremento en dos unidades.
Next I
Next I
En este caso en conteo inicia en nueve y decrece en una unidad hasta llegar
a cero.
5.6.- Proyecto #6: PicBasic cuenta con una instrucción capaz de generar
tonos DTMF (Dual Tone Multifrecuency - Multifrecuencia de doble tono), tonos
que se utilizan en telefonía para marcar una serie de números y así poder
establecer la comunicación entre dos o más personas. Una aplicación
interesante para esta instrucción podría ser el discado de números telefónicos
en sistemas de alarma cuando ha sido activado un dispositivo de supervisión,
para luego generar un mensaje de voz que nos alerte de dicho evento.
68
Figura 5.13.
Proyecto # 6
Componente Cantidad
PIC16F84A 1
Cristal de 10 Mhz 1
Capacitor cerámico de 33 pF 2
Capcitor Electrolítico de 10 uF 2
Parlante de 8 Ohm 1
Fuente regulada de 5 Vdc 1
Tabla 5.6.
69
correspondiente al dígito “0” de un teclado telefónico, entonces, según la tabla
5.7, el dígito a introducir en la instrucción “DTMFout” deberá ser el “10”.
Dígito en la Dígito en un
Frecuencias Frecuencias
Instrucción Teclado
Bajas Altas
DTMFout Telefónico
1 1 697 HZ 1209 HZ
2 2 697 HZ 1336 HZ
3 3 697 HZ 1477 HZ
4 4 770 HZ 1209 HZ
5 5 770 HZ 1336 HZ
6 6 770 HZ 1477 HZ
7 7 852 HZ 1209 HZ
8 8 852 HZ 1336 HZ
9 9 852 HZ 1477 HZ
10 0 941 HZ 1209 HZ
11 * 941 HZ 1336 HZ
12 # 941 HZ 1477 HZ
13 A 697 HZ 1633 HZ
14 B 770 HZ 1633 HZ
15 C 852 HZ 1633 HZ
0 D 941 HZ 1633 HZ
Tabla 5.7.
Figura 5.14.
70
Antes de empezar a programar, vamos a verificar la sintaxis de la instrucción
DTMFout:
DTMFout
Pin: especifica el pin del puerto en el cual se emitirán los tonos DTMF.
Tono: puede ser una variable o constante entre 0 y 15, que especifica el tono
que debe ser generado.
71
Programa en Pic Basic:
'****************************************
'* Nombre : Proyecto6.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
Inicio:
End
72
Observe que en la primera instrucción “DTMFout”, después de la etiqueta
“Inicio”, no se especifica la duración de cada tono y el tiempo en silencio entre
cada tono. Esto significa que el microcontrolador genera cada tono con una
duración de 200 milisegundos por defecto, y un tiempo en silencio entre cada
tono de 50 milisegundos como se muestra en las figuras 5.15 y 5.16
respectivamente:
Figura 5.15.
73
Figura 5.16.
74
Figura 5.17.
Figura 5.18.
75
5.7.- Proyecto #7: En este proyecto estudiaremos la instrucción “Button”, la
cual es utilizada para la eliminación de rebotes en pulsadores o para efectuar
repeticiones en un botón, como sucede en el caso de los teclados de las
computadoras, en las cuales si dejamos presionado un botón o tecla, la
misma se repite indefinidamente a una frecuencia específica, la cual puede
ser variada fácilmente como lo demostraremos a continuación.
Button
Estado: indica cual es estado lógico que debe ocurrir cuando el pulsador es
presionado (0 o 1). Si es 0, el pulsador deberá ser activo-bajo y si es 1, el
pulsador deberá ser activo-alto (Ver figura 5.19).
76
Figura 5.19.
Variable: es una variable auxiliar tipo Byte, definida también al inicio del
programa para uso exclusivo de la instrucción Button, por lo cual no deberá
ser utilizada con otro fin en el programa. Siempre debe ser inicializada antes
del comando Button.
77
Etiqueta: la instrucción realiza un salto a la etiqueta definida en este campo
cuando el pulsador no ha sido presionado.
PULSout
78
Para este proyecto hemos preparado tres ejemplos los cuales están basados
en el circuito de la figura 5.20.
Figura 5.20.
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
Resistencia de 10K Ohm 1
Pulsador Normalmente Abierto 1
Fuente regulada de 5 Vdc 1
Tabla 5.8.
79
Se puede observar en el diagrama esquemático, que mientras el pulsador
permanece abierto, hay un cero lógico en el pin RB0, el cual debemos
configurar como entrada en el programa. Cuando el pulsador sea presionado,
el estado lógico en el pin RB0 será un uno lógico.
La salida a través de la cual se van a generar los pulsos será el pin RB1, en el
cual hemos conectado un osciloscopio para poder ver el resultado de las
señales generadas a partir de las especificaciones dadas en cada ejemplo a
continuación.
Inicio:
Button PORTB.0,1,2,1,A,0,Tiempo
80
Ahora analicemos la secuencia del programa:
Button PORTB.0,1,2,1,A,0,Tiempo
Figura 5.21.
81
Al terminar el primer ciclo de programa, han transcurrido los primeros 10
milisegundos. Con el segundo ciclo de programa ocurre nuevamente el salto a
la etiqueta “Tiempo”, produciéndose una nueva pausa de 10 milisegundos,
para un tiempo de espera antes de ejecutar la auto-repetición de 20
milisegundos.
Figura 5.22.
Button PORTB.0,1,2,1,A,0,Tiempo
82
En la figura 5.22 se puede apreciar la lectura de la señal producida por el
programa al activar el pulsador. Observe que el tiempo entre el primer pulso y
la auto-repetición es de 20 milisegundos, y que el tiempo entre cada auto-
repetición es de 10 milisegundos (figura 5.23).
Figura 5.23.
83
En la figura 5.24 se puede observar la señal generada al activar el pulsador,
en la cual se ve la auto-repetición del pulso de 1.5 milisegundos, la cual
permanecerá hasta que el pulsador sea liberado.
Figura 5.24.
84
5.7.2.- Proyecto #7.2: Para el siguiente ejemplo se pretende generar el
mismo pulso de 1.5 milisegundos indefinidamente cada 20 milisegundos,
siempre y cuando el pulsador permanezca activado.
Inicio:
Button PORTB.0,1,2,2,A,0,Tiempo
End
Button PORTB.0,1,2,2,A,0,Tiempo
85
pausa de 10 milisegundos y finaliza el primer ciclo con un salto a la
etiqueta “Inicio”. En el segundo ciclo, la instrucción Button verifica el
conteo de los ciclos, el cual es controlado por la variable “A”,
determinando que aún no se puede empezar la auto-repetición hasta
tanto no haya culminado el segundo ciclo, de tal manera que ocurre
nuevamente el salto a la etiqueta “Tiempo”, y se produce una nueva
pausa de 10 milisegundos.
Figura 5.25.
86
5.7.3.- Proyecto #7.3: En este ejemplo se debe generar un pulso de 2.5
milisegundos, con un tiempo para anti-rebotes en el pulsador de 30
milisegundos, y un tiempo entre cada auto-repetición de 10 milisegundos.
Inicio:
Button PORTB.0,1,3,1,A,0,Tiempo
End
87
es decir, aproximadamente cada 10 milisegundos. La auto-repetición
se mantiene siempre y cuando el pulsador permanezca activo.
Figura 5.26.
88
En la figura 5.27, se puede apreciar el tiempo de espera generado por la
instrucción “Button”, igual a 30 milisegundos, para evitar los rebotes en el
pulsador. También se puede observar claramente, que una vez culminado
este tiempo, se genera una auto-repetición del pulso, la cual se mantiene
siempre que el pulsador se encuentre presionado.
Figura 5.27.
89
Observe en la figura 5.28 la medición del tiempo entre cada auto-repetición.
Figura 5.28.
90
5.8.- Proyecto #8: En este proyecto estudiaremos la instrucción “Branch”, con
un ejemplo sencillo basado en el circuito de la figura 5.29, en el cual se debe
iluminar cada Led en forma consecutiva por cada segundo transcurrido.
Figura 5.29.
Proyecto # 8
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
LED 3
Resistencia de 220 Ohm 3
Fuente regulada de 5 Vdc 1
Tabla 5.9.
91
Branch
'****************************************
'* Nombre : Proyecto8.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
Inicio:
Branch I,[Led1,Led2,Led3]
Led1:
PORTB = %00000001 ' enciende el led en RB0
Pause 1000 ' pause de 1 segundo
PORTB = %00000000 ' apaga el led
I = I + 1 ' suma 1 a la variable I
GoTo inicio ' salta a inicio
Led2:
PORTB = %00000010 ' enciende el led en RB1
Pause 1000 ' pause de 1 segundo
PORTB = %00000000 ' apaga el Led
I = I + 1 ' suma 1 a la variable I
GoTo inicio ' salta a inicio
92
Led3:
PORTB = %00000100 ' enciende el led en RB2
Pause 1000 ' pause de 1 segundo
PORTB = %00000000 ' apaga el Led
I = 0 ' Inicializa la variable I
93
5.9.- Proyecto #9: La instrucción “PWM”, puede ser usada para generar
voltajes analógicos implementando el circuito conectado al pin RB0 de la
figura 5.30. A continuación realizaremos un ejemplo de aplicación de la
instrucción PWM para generar un voltaje determinado, aplicando una serie de
cálculos sencillos.
Figura 5.30.
Proyecto # 9
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
Resistencia de 10K Ohm 1
Capcitor Electrolítico de 10 uF 1
Fuente regulada de 5 Vdc 1
Tabla 5.10.
94
PWM
Vfuente ∗ nivel
Vout =
255
donde,
95
Por ejemplo, si deseamos obtener Vout = 3.5V, entonces,
Inicio:
96
Módulos LCD Capitulo VI
6.1.- Pantallas LCD: Las pantallas LCD alfanuméricas, son las más utilizadas
hoy en día en el desarrollo de proyectos o equipos electrónicos en los cuales
se hace necesario visualizar mensajes de texto cortos, que proporcionen la
información adecuada sobre un evento determinado. Las pantallas más
comunes suelen ser de 1x16, de 2x16 y de 4x16 (Filas x Columnas). Todas
estas configuraciones también se encuentran para 20 columnas y hasta para
40 columnas. Aunque en esta edición solo estudiaremos el uso de pantallas
alfanuméricas, también resulta interesante mencionar que existen en el
mercado pantallas gráficas (GLCD), como la que se observa en la figura 6.3, y
donde se debe aplicar un método de control diferente al de las pantallas
alfanuméricas.
97
6.2.- Identificación de los pines de una pantalla LCD: Veamos a
continuación la descripción de cada uno de los pines de una pantalla LCD:
Pin 4: "RS" (trabaja paralelamente al Bus de datos del modulo LCD, Pines 7 al
14, es decir, cuando RS es cero, el dato presente en el bus corresponde a un
registro de control o instrucción, pero cuando RS es uno, el dato presente en
el bus corresponde a un registro de datos o caracter alfanumérico.
Pin 5: "R/W" (Read/Write), este pin es utilizado para leer un dato desde la
pantalla LCD o para escribir un dato en la pantalla LCD. Si R/W = 0, esta
condición indica que podemos escribir un dato en la pantalla. Si R/W = 1, esta
condición nos permite leer un dato desde la pantalla LCD.
98
Pin 7 al14: "Bus de Datos”, el Pin 7 hasta el Pin 14 representan 8 líneas que
se utilizan para colocar el dato que representa una instrucción para el modulo
LCD o un carácter alfanumérico.
Figura 6.5.
6.3.- Conexión de una pantalla LCD en Pic Basic: Una pantalla LCD puede
ser conectada a un microcontrolador utilizando los ocho bits del bus de datos
(D0 a D7) o solamente los cuatro bits mas significativos del bus de datos (D4
a D7). Al emplear los ocho bits, estos deberán estar conectados en un solo
puerto y nunca en puertos diferentes. Si deseamos trabajar solo con los
cuatro bits más significativos del bus, estos deberán ser conectados en los
cuatro bits menos significativos de un puerto o en los cuatro bits más
significativos del puerto seleccionado.
99
Un dato interesante resulta ser el hecho de que las pantallas LCD pueden ser
controladas utilizando dos configuraciones distintas para el bus de datos:
Nota Importante: PIC Basic asume por defecto que el conexionado entre un
módulo LCD alfanumérico y un microcontrolador, se ha realizado como se muestra
en el diagrama esquemático de la figura 6.6. En este caso no será necesario definir
estas conexiones en el programa; sin embargo, es conveniente saber que el
funcionamiento de un programa para el manejo de una pantalla LCD, no se verá
afectado si decidimos definir cada una de las conexiones como se muestran a
continuación:
DEFINE LCD_DREG PORTA ' Indica que el Bus de datos estará conectado
' en el Puerto A.
DEFINE LCD_DBIT 0 ' Selección del Bit de inicio del puerto en el uC para el
' bus de datos de la LCD
DEFINE LCD_RSREG PORTA ' Indica al uC que el pin “RS” estará en el Puerto A
DEFINE LCD_EREG PORTB ' Indica al uC que el pin “E” estará en el Puerto B
100
Figura 6.6.
Proyecto # 10
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
Pantalla LCD 16x4 1
Resistencia de 1K Ohm 1
Potenciómetro de 5K Ohm 1
Fuente regulada de 5 Vdc 1
Tabla 6.1.
101
Aunque esta configuración es la que PicBasic asume por defecto, la misma
puede ser cambiada según convenga, pero siempre tomando en cuenta las
definiciones anteriormente mencionadas; en ellas se especifica la disposición
de los pines de la pantalla LCD con respecto a su conexión en los puertos del
microcontrolador.
LCDout
Comando Acción
$FE, 1 Limpia la pantalla
$FE, 2 Retorna al inicio de la primera línea
$FE, $0C Apaga el Cursor
$FE, $0E Cursor bajo (Underline "_") activo
$FE, $0F Cursor intermitente activo
$FE, $10 Mueve el cursor un espacio a la izquierda
$FE, $14 Mueve el cursor un espacio a la derecha
$FE, $C0 Mueve el cursor al inicio de la segunda línea
$FE, $90 Mueve el cursor al inicio de la tercera línea
$FE, $D0 Mueve el cursor al inicio de la cuarta línea
Tabla 6.2.
102
En la figura 6.7 se muestran las direcciones de cada caracter en las líneas 2,
3 y 4:
Pantalla LCD 16x4
Línea 1 - - - - - - - - - - - - - - - -
Línea 2 $C0 $C1 $C2 $C3 $C4 $C5 $C6 $C7 $C8 $C9 $CA $CB $CC $CD $CE $CF
Línea 3 $90 $91 $92 $93 $94 $95 $96 $97 $98 $99 $9A $9B $9C $9D $9E $9F
Línea 4 $D0 $D1 $D2 $D3 $D4 $D5 $D6 $D7 $D8 $D9 $DA $DB $DC $DD $DE $DF
Figura 6.7.
103
LCDOut $fe,$C0, "* Alfanumerica *"
LCDOut $fe,$90, "* 1234567890 *"
LCDOut $fe,$D0, "* AaBbCcDdEeFf *"
Inicio:
104
6.5.- Proyecto #11. En el diagrama de la figura 6.10 se puede observar que la
conexión entre el modulo LCD y el microcontrolador ha cambiado con
respecto al proyecto #10, con el fin de utilizar en el programa la definición de
conexiones anteriormente mencionada.
La variable “Dato” ha sido inicializada con un valor cargado igual a 25. Para
aumentar o disminuir este valor, simplemente se pregunta si en RB0 o en RB1
hay un cambio de estado lógico. Adicionalmente se establecen dos
condiciones que se deben cumplir para que la variable pueda aumentar su
valor o disminuir:
105
Para mostrar el valor decimal cargado en la variable “Dato” a través de la
pantalla LCD, se debe utilizar la directiva “Dec” o el símbolo “#” antes de la
variable, como se muestra a continuación:
Lcdout $fe,$C0,"Dato: ",Dec Dato ' Escribe el mensaje en la línea 2
' seguido del valor cargado en la
' variable "Dato" en Decimal.
ó,
Lcdout $fe,$C0,"Dato: ",#Dato
Figura 6.10.
106
Proyecto # 11 - 12
Componente Cantidad
PIC16F877A 1
Cristal de 8 Mhz 1
Capacitor cerámico de 33 pF 2
Pantalla LCD 16x2 1
Resistencia de 10K Ohm 2
Potenciómetro de 5K Ohm 1
Pulsador Normalmente Abierto 2
Fuente regulada de 5 Vdc 1
Tabla 6.3.
'****************************************
'* Nombre : Proyecto11.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto en el uC para el
' bus de datos de la LCD
DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estará en el Puerto D
DEFINE LCD_RSBIT 2 ' "RS" estará conectado en RD2
DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estará en el Puerto D
DEFINE LCD_EBIT 3 ' "E" estará conectado en RD3
Inicio:
107
Lcdout $fe,2 ' Inicio de la primera línea.
Lcdout $fe,$C0,"Dato: ",Dec Dato," " ' Escribe el mensaje en la 2da línea
' seguido del valor cargado en la
' variable "Dato" en Decimal.
Suma:
Resta:
108
6.6.- Proyecto #12. En este proyecto nos hemos basado en el diagrama de la
figura 6.10 para efectuar la programación del microcontrolador.
Figura 6.11.
Figura 6.12.
• Al accionar el pulsador “P2”, se deberá mostrar el siguiente sub-menú
(figura 6.13), el cual también deberá permanecer visible durante 5
segundos para luego retornar al menú inicial:
Figura 6.13.
Lea detenidamente los comentarios de cada línea del programa. Observe que
en esta oportunidad hemos utilizado un alias para cada una de las entradas
utilizadas en el puerto B (RB0 se llamará P1, y RB1 se llamará P2).
'****************************************
'* Nombre : Proyecto12.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
109
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto en el uC para el
' bus de datos de la LCD
DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estará en el Puerto D
DEFINE LCD_RSBIT 2 ' "RS" estará conectado en RD2
DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estará en el Puerto D
DEFINE LCD_EBIT 3 ' "E" estará conectado en RD3
Inicio:
GoTo Inicio
Mensaje1:
Mensaje2:
End
110
6.7.- Proyecto #13. En el siguiente ejemplo explicamos la forma de visualizar
en la pantalla LCD un valor decimal y sus equivalentes en hexadecimal,
binario y el código ASCII correspondiente, de un dato almacenado en una
variable tipo Byte.
111
Figura 6.14.
Proyecto # 13 - 14
Componente Cantidad
PIC16F877A 1
Cristal de 8 Mhz 1
Capacitor cerámico de 33 pF 2
Pantalla LCD 16x2 1
Potenciómetro de 5K Ohm 1
Fuente regulada de 5 Vdc 1
Tabla 6.4.
112
' Programa en Pic Basic Pro:
'****************************************
'* Nombre : Proyecto13.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto en el uC para el
' bus de datos de la LCD
DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estará en el Puerto D
DEFINE LCD_RSBIT 2 ' "RS" estará conectado en RD2
DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estará en el Puerto D
DEFINE LCD_EBIT 3 ' "E" estará conectado en RD3
Inicio:
End
113
6.8.- Proyecto #14: Analice el programa propuesto a continuación, el cual
está basado en el diagrama esquemático de la figura 6.14. En este caso se
desea mostrar en la pantalla LCD los valores entre 33 y 125 en decimal,
además de sus equivalentes en hexadecimal y código ASCII correspondiente.
' Programa en Pic Basic Pro:
'****************************************
'* Nombre : Proyecto14.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto en el uC para el
' bus de datos de la LCD
DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estará en el Puerto D
DEFINE LCD_RSBIT 2 ' "RS" estará conectado en RD2
DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estará en el Puerto D
DEFINE LCD_EBIT 3 ' "E" estará conectado en RD3
Inicio:
For I = 33 To 125
Lcdout $fe,2
Lcdout "Dec:",#I," Hex:",HEX I," "
Lcdout $fe,$C0,"ASCII: ", I," "
Next I
Fin:
GoTo Fin ' Bucle infinito.
End
114
6.9.- Proyecto #15: Con la ayuda de la instrucción “Count”, estaremos
realizando un contador de pulsos, el cual se compone básicamente de un
PIC16F877A y una pantalla LCD 2x16. El tren de pulsos cuadrados de
frecuencia variable, será generado desde un microcontrolador PIC16F84A
utilizando la instrucción “Pulsout”, y el cual deberá ser programado para que
sea posible aumentar o disminuir la frecuencia a través de dos pulsadores
conectados a él, P1 para aumentar la frecuencia y P2 para disminuir la
frecuencia, como se muestra en el diagrama de la figura 6.15.
Figura 6.15.
115
Proyecto # 15 - 16
Componente Cantidad
PIC16F877A 1
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
Pantalla LCD 16x4 1
Resistencia de 10K Ohm 2
Potenciómetro de 5K Ohm 1
Pulsador Normalmente Abierto 2
Fuente regulada de 5 Vdc 1
Tabla 6.5.
116
Count
Pin: especifica el pin del puerto en el cual se introducirán los pulsos. Este pin
es designado como entrada automáticamente por la instrucción Count.
Inicio:
Count PORTB.1, 1000, Pulsos ' Cuenta los pulsos introducidos a través
' del pin RB1, durante 1000 milisegundos y el
' resultado del conteo es almacenado en la
117
' variable "Pulsos".
End
Inicio:
118
If PORTB.2 = 1 Then Call Resta ' Si RB2 = 1 llama a la subrutina "Resta"
Suma:
Resta:
End
119
• Inicializamos la variable “Base” con un valor igual a 100 y la variable
“Espera” con un valor igual a 1.
120
El tren de pulsos generado por el microcontrolador PIC16F84A en el pin RB1,
se puede observar en la siguiente figura:
Figura 6.16.
121
6.10.- Proyecto #16: El siguiente proyecto está basado en el montaje de la
figura 6.15. En esta oportunidad estudiaremos el funcionamiento de la
instrucción “Pulsin”, con la cual mediremos la duración de los pulsos
generados por el microcontrolador PIC16F84A, programado en el proyecto
#15.
PULSIN
Pin: especifica el pin del puerto en el cual se introducirá el pulso a ser medido.
Variable: es una variable de 8 bits (variable tipo byte) o 16 bits (variable tipo
word) definida por el programador en la cual se grabará el resultado de la
lectura.
122
Inicio:
LCDOut "Lectura: ",#LECTURA," " ' Muestra mensaje y dato por pantalla.
End
123
6.11.- Proyecto #17: Realice el montaje para el circuito la figura 6.17, con el
cual estudiaremos la instrucción “POT” a través de un ejemplo de
programación, con el cual se pretende tomar lectura de un elemento resistivo,
el cual en este caso será un potenciómetro de 10Kohm.
Figura 6.17.
124
Proyecto # 17
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
Pantalla LCD 16x2 1
Potenciómetro de 5K Ohm 1
Potenciómetro de 10K Ohm 1
Capacitor cerámico de 0,1 uF 1
Fuente regulada de 5 Vdc 1
Tabla 6.6.
POT
125
Variable: es una variable en la cual se almacena el resultado obtenido de la
lectura del potenciómetro o componente resistivo.
Inicio:
126
6.12.- Memoria CGRAM en la Pantalla LCD.
C5 C4 C3 C2 C1 C5 C4 C3 C2 C1 C5 C4 C3 C2 C1 C5 C4 C3 C2 C1 C5 C4 C3 C2 C1
Fila 1
Fila 2
Fila 3
Fila 4 .............
Fila 5
Fila 6
Fila 7
Fila 8
Figura 6.18.
* Nota: Los 3 bits más significativos de cada byte (3 bits más significativos de
cada fila), son tomados como ceros.
Posición en
la CGRAM Byte 0 Byte 1 Byte 2 Byte 3 Byte 4 Byte 5 Byte 6 Byte 7
Posición 0 $40 $41 $42 $43 $44 $45 $46 $47
Posición 1 $48 $49 $4A $4B $4C $4D $4E $4F
Posición 2 $50 $51 $52 $53 $54 $55 $56 $57
Posición 3 $58 $59 $5A $5B $5C $5D $5E $5F
Posición 4 $60 $61 $62 $63 $64 $65 $66 $67
Posición 5 $68 $69 $6A $6B $6C $6D $6E $6F
Posición 6 $70 $71 $72 $73 $74 $75 $76 $77
Posición 7 $78 $79 $7A $7B $7C $7D $7E $7F
Tabla 6.7.
127
Veamos el siguiente ejemplo en el cual almacenaremos el símbolo de un
parlante en la posición 0 de la CGRAM.
Tabla 6.8.
Note que cada cuadro representa un bit el cual corresponde a un “1” o un “0”
según sea el caso o la figura que deseamos realizar, donde “1” es encendido
y “0” es apagado.
LCDOUT $fe,$40,$02,$06,$1A,$1A,$1A,$06,$02,$00
128
En este caso la figura aparece en la primera línea de la pantalla LCD.
Por ejemplo;
LcdOut $fe,$C0, 0
LcdOut $fe,$C7, 4
Inicio:
129
6.13.- Proyecto #18. A continuación realizaremos la simulación de un control
digital de volumen, basados en el diagrama de la figura 6.19. El pulsador “P1”
será el encargado de aumentar el nivel de volumen, mientras que el pulsador
“P2” será el encargado de disminuir el nivel.
Figura 6.19.
Proyecto # 18
Componente Cantidad
PIC16F877A 1
Cristal de 8 Mhz 1
Capacitor cerámico de 33 pF 2
Pantalla LCD 16x2 1
Resistencia de 10K Ohm 2
Potenciómetro de 5K Ohm 1
Pulsador Normalmente Abierto 2
Fuente regulada de 5 Vdc 1
Tabla 6.9.
130
Las pantallas que veremos representadas en este ejemplo son las mostradas
en las figuras 6.20, 6.21, 6.22 y 6.23. Se puede observar en ellas la
representación de un pequeño parlante y cuatro rectángulos, encargados de
indicar el nivel de volumen.
Figura 6.20.
Figura 6.21.
Figura 6.22.
Figura 6.23.
131
El primer paso en la elaboración de este ejercicio, es crear las figuras que
deseamos mostrar en la pantalla LCD basados en la explicación dada
anteriormente:
Figura 1:
Figura 2:
132
Figura 3:
Figura 4:
133
Figura 5:
'****************************************
'* Nombre : Proyecto18.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto en el uC para el
' bus de datos de la LCD
DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estará en el Puerto D
DEFINE LCD_RSBIT 2 ' "RS" estará conectado en RD2
DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estará en el Puerto D
DEFINE LCD_EBIT 3 ' "E" estará conectado en RD3
134
Symbol P1 = PORTB.0 ' Alias para RB0.
Symbol P2 = PORTB.1 ' Alias para RB1.
LCDOut $fe, $40, $02, $06, $1A, $1A, $1A, $06, $02, $00 'Figura 1.
LCDOut $fe, $48, $00, $00, $00, $00, $00, $00, $1F, $1F 'Figura 2.
LCDOut $fe, $50, $00, $00, $00, $00, $1F, $1F, $1F, $1F 'Figura 3.
LCDOut $fe, $58, $00, $00, $1F, $1F, $1F, $1F, $1F, $1F 'Figura 4.
LCDOut $fe, $60, $1F, $1F, $1F, $1F, $1F, $1F, $1F, $1F 'Figura 5.
Inicio:
SubeVol:
Return
Nivel1:
135
Nivel2:
Nivel3:
BajaVol:
Return
Borra1:
Borra2:
Borra3:
End
136
6.14.- Proyecto #19. Realice el siguiente ejercicio en el cual se podrá
visualizar un pequeño caballo que corre a lo largo de la pantalla LCD, como
se muestra en las figuras 6.25 y 6.26. El programa ha sido diseñado en base
al diagrama esquemático de la figura 6.24:
Figura 6.24.
Proyecto # 19
Componente Cantidad
PIC16F877A 1
Cristal de 8 Mhz 1
Capacitor cerámico de 33 pF 2
Pantalla LCD 16x4 1
Potenciómetro de 5K Ohm 1
Fuente regulada de 5 Vdc 1
Tabla 6.10.
137
A continuación podrá ver una secuencia numerada de cada una de las
pantallas que debe generar el programa propuesto:
Figura 6.25.
138
Figura 6.26.
139
Un paso fundamental es hacer el diseño de cada figura en una matriz
cuadriculada de 8 filas por 5 columnas, como se muestra en la figura 6.27.
Figura 6.27.
140
Los datos a ser almacenados en las ocho posiciones de la CGRAM son los
siguientes:
Figura 1:
Palabra 0: $00,$00,$10,$0F,$0F,$0D,$18,$10
Figura 2:
Palabra 1: $04,$0E,$1F,$1C,$1C,$1C,$06,$05
141
Figura 3:
Palabra 2: $00,$00,$10,$0F,$0F,$0D,$04,$06
Figura 4:
Palabra 3: $04,$0E,$1F,$1C,$1C,$1C,$08,$18
142
Figura 5:
Palabra 4: $04,$0E,$1F,$07,$07,$07,$02,$03
Figura 6:
Palabra 5: $00,$00,$01,$1E,$1E,$16,$04,$0C
143
Figura 7:
Palabra 6: $04,$0E,$1F,$07,$07,$07,$0C,$14
Figura 8:
Palabra 7: $00,$00,$01,$1E,$1E,$16,$03,$01
144
En esta oportunidad pondremos a correr nuestro caballo en la segunda línea
de la pantalla, y lo ubicaremos de la siguiente manera:
Para ver el efecto que deseamos, hacemos una pausa de 300 milisegundos,
borramos la pantalla y mostramos las figuras “C” y “D” en las posiciones $C2
y $C3 respectivamente de la pantalla LCD; luego hacemos otra pausa de 300
milisegundos y comenzamos el proceso, solo que esta vez será partiendo
desde la dirección $C4.
Cuando la figura “D” llegue a la dirección $CF, estaremos listos para repetir
todo el proceso de forma inversa con las figuras “E”, “F”, “G” y “H”.
Línea 1 $80 $81 $82 $83 $84 $85 $86 $87 $88 $89 $8A $8B $8C $8D $8E $8F
Línea 2 $C0 $C1 $C2 $C3 $C4 $C5 $C6 $C7 $C8 $C9 $CA $CB $CC $CD $CE $CF
Línea 3 $90 $91 $92 $93 $94 $95 $96 $97 $98 $99 $9A $9B $9C $9D $9E $9F
Línea 4 $D0 $D1 $D2 $D3 $D4 $D5 $D6 $D7 $D8 $D9 $DA $DB $DC $DD $DE $DF
Figura 6.28.
145
Veamos el programa que hace posible esta representación:
' Programa en PIC Basic Pro
'****************************************
'* Nombre : Proyecto19.pbp *
'* Autor : Nombre del Autor *
'* Copyright : Copyright (Año) *
'* Fecha : Fecha *
'* Versión : 1.0 *
'****************************************
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto en el uC para el
' bus de datos de la LCD
DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estará en el Puerto D
DEFINE LCD_RSBIT 2 ' "RS" estará conectado en RD2
DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estará en el Puerto D
DEFINE LCD_EBIT 3 ' "E" estará conectado en RD3
inicio:
146
LCDOUT $fe, 1 ' Limpia la pantalla LCD
LCDOUT $FE,POS1, 0 ' Muestra Palabra 0 en la LCD
LCDOUT $FE,POS2, 1 ' Muestra Palabra 1 en la LCD
Pause 300
LCDOUT $fe, 1 ' Limpia la pantalla LCD
LCDOUT $FE,POS3, 2 ' Muestra Palabra 2 en la LCD
LCDOUT $FE,POS4, 3 ' Muestra Palabra 3 en la LCD
Pause 300
POS1 = POS1 + 3
POS2 = POS2 + 3
POS3 = POS3 + 3
POS4 = POS4 + 3
If POS4 > $CF Then RETRO ' Pregunta si llega al tope derecho de la LCD
' si POS4 = $CF salta a la etiqueta "RETRO"
GoTo inicio ' Salta a la etiqueta "inicio"
' Antes de retroceder nos aseguramos de que las figuras E,F,G y H tengan una
' posición inicial en la pantalla LCD:
RETRO:
POS1 = $CF
POS2 = $CE
POS3 = $CD
POS4 = $CC
RETROCEDE:
POS1 = POS1 - 3
POS2 = POS2 - 3
POS3 = POS3 - 3
POS4 = POS4 - 3
If POS4 < $C0 Then REINICIA ' Pregunta si llega al tope Izquierdo de la LCD
GoTo RETROCEDE
' Nos aseguramos de que las figuras A,B,C y D tengan una posición inicial en la
' pantalla LCD:
147
REINICIA:
POS1 = $C0
POS2 = $C1
POS3 = $C2
POS4 = $C3
148
Teclado Matricial Capitulo VII
Figura 7.1.
Figura 7.2.
149
El principio de funcionamiento de un teclado matricial es muy sencillo.
Básicamente cuando pulsamos un botón en el teclado, estamos uniendo una
fila con una columna.
Tabla 7.1.
Observe en el diagrama esquemático que los pines RB3, RB4, RB5 y RB6
tienen una resistencia “Pull-up”, lo cual significa que si leemos cualquiera de
estas entradas, asumiendo que ninguna tecla ha sido presionada, entonces
siempre habrá un uno lógico presente en cada una de ellas.
150
Figura 7.3.
151
3. Enviamos un cero “0” por la columna 2, y enviamos un “1” por las
columnas 1 y 3.
PORTB.0 = 1 ' Columna 1 = 1
PORTB.1 = 0 ' Columna 2 = 0
PORTB.2 = 1 ' Columna 3 = 1
152
Observe que el display de 7 segmentos es de ánodo común, lo cual significa
que para encender un segmento será necesario enviar un cero “0” a través
del pin que corresponda a éste, en el puerto D.
' Programa en PIC Basic Pro
Inicio:
Teclado:
Return
End
153
7.2.- Proyecto #20. En el siguiente proyecto utilizaremos una pantalla LCD
16x2, y un teclado matricial 3x4, conectados según el diagrama esquemático
de la figura 7.4. El objetivo de este proyecto será visualizar el valor o símbolo
correspondiente a cada una de las teclas.
Figura 7.4.
Proyecto # 20 - 21 - 22 - 23
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
Pantalla LCD 16x2 1
Resistencia de 1K Ohm 4
Potenciómetro de 5K Ohm 1
Teclado Matricial 3x4 1
Fuente regulada de 5 Vdc 1
Tabla 7.2.
154
Utilizaremos la técnica de lectura de teclado mostrada anteriormente para la
programación de este proyecto.
Inicio:
Call Teclado
Teclado:
155
If PORTD.3 = 0 Then VAR1 = 2 ' tecla "2"
If PORTD.4 = 0 Then VAR1 = 5 ' tecla "5"
If PORTD.5 = 0 Then VAR1 = 8 ' tecla "8"
If PORTD.6 = 0 Then VAR1 = 11 ' tecla "0"
156
Memoria de Datos Capitulo VIII
157
En un microcontrolador PIC16F877 la capacidad de almacenamiento aumenta
considerablemente y lo podemos ver en el siguiente mapa:
Tabla 8.2.
158
en PicBasic para grabar datos en la memoria de datos EEPROM es “Write” y
la estructura de la sentencia es la siguiente:
WRITE
Ejemplo:
Write $00,1 ' graba el dato o valor “1” en la dirección $00
READ
159
Ejemplo:
Figura 8.1.
160
8.2.- Proyecto #21. En este proyecto vamos a almacenar datos en la
memoria EEPROM, para luego ser consultados y mostrados uno por uno en
la pantalla LCD.
TRISA = %00000000
TRISB = %00000000
TRISD = %01111000
161
La siguiente subrutina lee el valor almacenado en la dirección $00 y lo
muestra en la pantalla LCD, espera tres segundos y lee el segundo valor
almacenado en la posición $01, lo muestra en la pantalla LCD y nuevamente
hace una pausa de tres segundos. Por último se lee el valor almacenado en la
posición $02 y lo muestra en la pantalla LCD durante tres segundos, para
luego volver a empezar el proceso de lectura.
Inicio:
Read $00,VAR1
Pause 3000
Read $01,VAR1
Lcdout $fe, 2 ' Posiciona el cursor en el inicio
Lcdout "Dirección 01: "
Lcdout $fe,$C0, "Dato: ",#VAR1," "
Pause 3000
Read $02,VAR1
Lcdout $fe, 2 ' Posiciona el cursor en el inicio
Lcdout "Dirección 02: "
Lcdout $fe,$C0, "Dato: ",#VAR1," "
Pause 3000
GoTo inicio
End
Para comprobar que estos datos están en la memoria de datos EEPROM del
microcontrolador, también es posible utilizar el programador P16Pro para este
fin, desde el cual podemos extraer el contenido completo de la memoria de
datos sin problemas, debido a que el software del programador cuenta con
una pequeña ventana llamada “Data Memory”, en la cual se pueden ver los
datos almacenados como se muestra en la figura 8.2:
162
Figura 8.2.
TRISA = %00000000
TRISB = %00000000
TRISD = %01111000
163
' Almacenaremos a continuación 20 datos en 20 direcciones
' consecutivas; los datos a almacenar serán: 1,3,5,7,9,11,13
' 15,17,19,21,23,25,27,29,31,33,35,37 y 39.
Inicio:
DIRECCION = $00
End
Figura 8.3.
164
8.4.- Proyecto #23. En el siguiente ejemplo vamos a utilizar la rutina para el
control de un teclado matricial, ya que con ella podremos insertar valores que
serán almacenados en la memoria de datos. Analice el siguiente programa, el
cual ha sido desarrollado en base al diagrama de la figura 8.1.
' Programa en Pic Basic Pro
TRISA = %00000000
TRISB = %00000000
TRISD = %01111000
Inicio:
espera1:
Call Teclado
If VAR1 = 0 Then espera1 ' Si ninguna tecla fue pulsada salta a “espera1”
If VAR1 = 10 Then espera1 ' Si pulsamos la tecla asterisco salta a “espera1”
If VAR1 = 11 Then VAR1 = 0 ' Si pulsamos la tecla “0”, entonces VAR1 = 0
If VAR1 = 12 Then espera1 ' Si pulsamos la tecla numeral salta a “espera1”
165
Lcdout $fe,$C0, "Dato Almacenado"
If DIRECCION = $0F Then Aviso ' Revisa si llegamos al límite asignado por
' el programador en la memoria de datos
GoTo inicio
Aviso:
Parada:
GoTo Parada
Teclado:
VAR1 = 0
End
166
Una vez compilado y puesto a prueba el programa, los valores podrán ser
introducidos a la memoria de datos a través del teclado matricial, y el límite de
datos a ser grabados será de 16 registros, ya que hemos fijado como límite la
dirección “$0F” en la memoria de datos, para luego mostrar un mensaje en la
pantalla LCD que nos indicará que hemos llenado cada uno de los 16
registros disponibles.
167
8.5.- Proyecto #24: En el siguiente ejemplo hemos desarrollado un sistema
de control de acceso, en el cual el usuario deberá introducir una contraseña
previamente almacenada en la memoria de datos. Si la contraseña es
correcta, se genera un mensaje de confirmación y sonido (“Beep”). Si la
contraseña es incorrecta, se genera un mensaje de error y un sonido
intermitente (“Beep, Beep, Beep”).
Figura 8.4.
168
Proyecto # 24
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
Pantalla LCD 16x2 1
Resistencia de 1K Ohm 4
Potenciómetro de 5K Ohm 1
Teclado Matricial 3x4 1
Transistor 2N3904 1
Buzzer 5 Vdc 1
Fuente regulada de 5 Vdc 1
Tabla 8.3.
169
Memoria de Datos PIC16F877
0000: 00 01 02 03 04 05 06 07
0008: 08 09 0A 0B 0C 0D 0E 0F
0010: 10 11 12 13 14 15 16 17
0018: 18 19 1A 1B 1C 1D 1E 1F
0020: 20 21 22 23 24 25 26 27
0028: 28 29 2A 2B 2C 2D 2E 2F
0030: 30 21 32 33 34 35 36 37
0038: 38 39 3A 3B 3C 3D 3E 3F
0040: 40 41 42 43 44 45 46 47
0048: 48 49 4A 4B 4C 4D 4E 4F
0050: 50 51 52 53 54 55 56 57
0058: 58 59 5A 5B 5C 5D 5E 5F
0060: 60 61 62 63 64 65 66 67
0068: 68 69 6A 6B 6C 6D 6E 6F
0070: 70 71 72 73 74 75 76 77
0078: 78 79 7A 7B 7C 7D 7E 7F
0080: 80 81 82 83 84 85 86 87
0088: 88 89 8A 8B 8C 8D 8E 8F
0090: 90 91 92 93 94 95 96 97
0098: 98 99 9A 9B 9C 9D 9E 9F
00A0: A0 A1 A2 A3 A4 A5 A6 A7
00A8: A8 A9 AA AB AC AD AE AF
00B0: B0 B1 B2 B3 B4 B5 B6 B7
00B8: B8 B9 BA BB BC BD BE BF
00C0: C0 C1 C2 C3 C4 C5 C6 C7
00C8: C8 C9 CA CB CC CD CE CF
00D0: D0 D1 D2 D3 D4 D5 D6 D7
00D8: D8 D9 DA DB DC DD DE DF
00E0: E0 E1 E2 E3 E4 E5 E6 E7
00E8: E8 E9 EA EB EC ED EE EF
00F0: F0 F1 F2 F3 F4 F5 F6 F7
00F8: F8 F9 FA FB FC FD FE FF
Tabla 8.4.
También podrá notar que seguimos utilizando la misma rutina para el control
del teclado matricial.
170
' Programa en Pic Basic Pro
TRISA = %00000000
TRISB = %00000000
TRISD = %01111000
X VAR Byte
VAR1 VAR Byte
DIGITO VAR Byte[7]
CLV VAR Byte[7]
Inicio:
Clave:
171
Consulta:
If VAR1 = 0 Then consulta ' Si no hay una tecla pulsada vuelve a consultar
' Si VAR1 es diferente de cero, significa que pulsamos una tecla, por lo
' tanto generamos un sonido y continuamos…
X = X + 1
Comprobar:
172
Correcto:
Pause 500
GoTo inicio
Error:
Pause 500
Beep:
Teclado:
VAR1 = 0
173
PORTD.0 = 1 ' Columna 1 = 1
PORTD.1 = 0 ' Columna 2 = 0
PORTD.2 = 1 ' Columna 3 = 1
End
174
Interrupciones Capitulo IX
Figura 9.1.
175
GIE:
1 = habilita todas las interrupciones.
0 = deshabilita las interrupciones.
EEIE:
1 = habilita la interrupción por escritura de la EEPROM.
0 = deshabilita la interrupción por escritura de la EEPROM.
TOIE:
1 = habilita la interrupción por temporizador TMR0.
0 = deshabilita la interrupción por temporizador TMR0.
INTE:
1 = habilita la interrupción por RB0/INT.
0 = deshabilita la interrupción por RB0/INT.
RBIE:
1 = habilita la interrupción por puerto B (RB4-RB7).
0 = deshabilita la interrupción por puerto B.
176
9.4.- Activación de interrupción a través del pin RB0/INT:
Figura 9.2.
177
Proyecto # 25
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
LED 2
Resistencia de 220 Ohm 2
Resistencia de 10K Ohm 1
Pulsador Normalmente Abierto 1
Fuente regulada de 5 Vdc 1
Tabla 9.1.
Figura 9.3.
178
TRISA = %00000000 ' Configura el Puerto A como salida
TRISB = %00000000 ' Configura el Puerto B como salida
I VAR Byte
Interrup:
179
9.6.- Interrupción TMR0:
Figura 9.4.
180
El Bit “TOSE” del registro OPTION, elige el tipo de flanco activo cuando el
contador TMR0 es incrementado a través del pin RA4/TOCKI, es decir,
determina si el incremento se hará con el flanco de bajada o con el flanco de
subida de la señal aplicada.
“FOSC/4” es una señal de reloj interna que genera pulsos que tienen una
frecuencia conocida y la cual depende del oscilador principal. FOSC/4 se
utiliza cuando queremos que el registro TMR0 se comporte como
temporizador, y esto se logra configurando el Bit “TOCS” del registro OPTION
(TOCS = 0).
Figura 9.5.
RBP0#:
1 = resistencias Pull-Up del puerto B activadas.
0 = resistencias Pull-Up del puerto B desactivadas.
181
INTEDG: (Flanco activo de interrupción externa)
1 = activación de la interrupción con flanco ascendente
0 = activación de la interrupción con flanco descendente
TOCS:
1 = señal de reloj introducida a través de RA4/TOCKI
0 = señal de reloj interno FOSC/4
TOSE:
1 = incrementa TMR0 con flanco descendente de RA4/TOCKI
0 = incrementa TMR0 con flanco ascendente de RA4/TOCKI
PSA:
1 = asigna el divisor de frecuencia a WDT
0 = asigna el divisor de frecuencia a TMR0
PS2,PS1,PS0:
Divisor de Divisor de
PS2 PS1 PS0
TMR0 WDT
0 0 0 1:2 1:1
0 0 1 1:4 1:2
0 1 0 1:8 1:4
0 1 1 1:16 1:8
1 0 0 1:32 1:16
1 0 1 1:64 1:32
1 1 0 1:128 1:64
1 1 1 1:256 1:128
Tabla 9.2.
182
9.8.- Proyecto #26. Para dar un ejemplo de aplicación del Registro TMR0
como temporizador, crearemos un programa que haga destellar un Led con
una frecuencia de 1 Hz. Este proceso se debe cumplir de la siguiente manera:
1. Encender el Led.
2. Esperar un segundo (1000 milisegundos).
3. Apagar el Led.
4. Esperar un segundo (1000 milisegundos).
5. Repetir todo el proceso.
Prescaler: según la tabla 9.2, el valor máximo para el divisor del TMR0 es
256.
Entonces;
183
Entonces, aplicando la formula tenemos:
Figura 9.6.
184
Proyecto # 26
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
LED 1
Resistencia de 220 Ohm 1
Fuente regulada de 5 Vdc 1
Tabla 9.3.
Symbol TOIF = INTCON.2 ' Alias para el bit 2 del registro INTCON.
Symbol GIE = INTCON.7 ' Alias para el bit 7 del registro INTCON.
Symbol LED = PORTA.0 ' Alias para el pin RA0
Disable
Inicio:
High LED ' Enciende el Led
Call Retardo ' Llama a la rutina de retardo
Low LED ' Apaga el Led
Call Retardo ' Llama a la rutina de retardo
GoTo Inicio ' Salta a la etiqueta “inicio”.
Retardo:
For I = 1 To 20 ' Repetimos la interrupción 20 veces para
' obtener un retardo de 1 segundo.
Call Retardo1
Next I
Return
185
' TMR0 = 256 - (0.050/0.000256) = 60,68 = 61
Espera:
If TOIF = 1 Then Reseteo ' pregunta si TOIF es igual a 1, es decir,
' pregunta si TMR0 se desbordo.
GoTo Espera ' Salta a la etiqueta “Espera”.
Reseteo:
End
Activar la interrupción por cambio de estado en los pines RB4, RB5, RB6 y
RB7 es muy sencillo, y lo podemos hacer a través del registro INTCON,
donde contamos con un bit llamado RBIE, que activa o desactiva este tipo de
interrupción, es decir, podemos configurar este registro de la siguiente
manera:
Figura 9.7.
INTCON = %10001000
GIE = 1, con este bit en estado lógico “1”, habilitamos las interrupciones.
RBIE = 1, con este bit en estado lógico “1”, habilitamos las interrupciones por
cambio de estado en el puerto B.
186
Es importante tomar en cuenta el registro de configuración del puerto B
(TrisB), en el cual debemos configurar los bits más significativos como
entrada.
Figura 9.8.
187
Proyecto # 27
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
LED 2
Resistencia de 220 Ohm 2
Resistencia de 10K Ohm 4
Pulsador Normalmente Abierto 4
Fuente regulada de 5 Vdc 1
Tabla 9.4.
En este circuito las entradas RB4, RB5, RB6 y RB7 están normalmente en “0”;
para producir una interrupción bastará con activar cualquiera de los
pulsadores, para poner un “1” en la entrada correspondiente.
Inicio:
188
Interrup:
Disable
For I = 1 To 6
End
189
Memoria Serial I2C Capitulo X
La tasa de transferencia de datos llega a niveles que van desde los 100 Khz
para un oscilador de 4 Mhz, hasta 400 khz para un oscilador de 20 Mhz. Si
deseamos utilizar una taza de transferencia inferior a 100 Khz la siguiente
directiva deberá ser definida al inicio del programa:
DEFINE I2C_SLOW 1
Cada dispositivo I2C cuenta con una única dirección de 7 bits, de tal manera
que el microcontrolador podrá saber exactamente a cual de ellos transferir
información y a cual de ellos solicitar información en cualquier momento. Los
cuatro bits más significativos de esta dirección regularmente siempre estarán
fijos y su estado depende del tipo de dispositivo a ser conectado. Por ejemplo,
para una memoria EEPROM serial, los cuatro bits mas significativos en la
dirección siempre será 1010.
190
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0
1 0 1 0 A2 A1 A0 R/W
Figura 10.1.
Figura 10.2.
Figura 10.3.
Las instrucciones de programa en PicBasic para el control del bus I2C son
“I2Cread” e “I2CWrite”, con las cuales realizaremos los siguientes proyectos, y
191
en los cuales podremos almacenar datos y extraer datos de una memoria
serial 24LC256.
Figura 10.4.
192
Proyecto # 28 - 29
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 22 pF 2
Pantalla LCD 16x2 1
Resistencia de 4,7K Ohm 2
Potenciómetro de 5K Ohm 1
Memoria EEPROM 24LC256 1
Fuente regulada de 5 Vdc 1
Tabla 10.1.
I2CWRITE
Sintaxis:
193
Direc VAR Word ' Declaración de variable "Direc"
Control VAR Byte ' Declaración de variable "Control"
Dato VAR Byte ' Declaración de variable "Dato"
Inicio:
Control = $A0 ' Dato de Control
Direc = $10 ' Dirección en la memoria externa
Dato = $23 ' Dato a ser cargado en la dirección
' especificada ($23 = 35 Decimal)
Recuerde que estos tres pines definen la dirección del dispositivo; entonces,
debemos tomar en cuenta que para una memoria serial, los cuatro bits más
significativos están configurados como “1010xxxx”; los tres bits A2, A1 y A0
están conectados a tierra en este proyecto; y el bit R/W debe estar en “0” para
poder escribir un dato en la memoria (ver figura 10.5).
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 (A2) Bit 2 (A1) Bit 1 (A0) Bit 0 (R/W)
1 0 1 0 0 0 0 0
A 0
Figura 10.5.
194
Para enviar el dato a la memoria en la dirección especificada, utilizamos la
instrucción I2CWrite de la siguiente manera:
I2CREAD
Sintaxis:
195
LCDOut $fe, 1 ' Limpia la LCD
Inicio:
Direc = $10 ' Dirección en la memoria externa
Control = $A0 ' Dato de Control
Escribir:
196
Leer:
LCDOUT $fe, 2,"Dato ",#I,": ",#A1," " ' Muestra el dato leido
Pause 1000 ' Pausa de 1 segundo
If I = 50 Then final ' Condicional
Direc = Direc + 1 ' Suma 1 a la variable "Direc"
Next I
Final:
End
197
10.4.- Proyecto #30: Veamos el siguiente programa en el cual se almacenan
datos en dos memorias conectadas al bus I2C, para luego ser extraídos y
verificados.
Figura 10.6.
Proyecto # 30
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 22 pF 2
Pantalla LCD 16x2 1
Resistencia de 4,7K Ohm 2
Potenciómetro de 5K Ohm 1
Memoria EEPROM 24LC256 2
Fuente regulada de 5 Vdc 1
Tabla 10.2.
198
Analice el siguente programa, prestando atención a los comentarios de cada
línea:
memoria1:
' xxxxAAAx
' xxxx210x
Control = %10100000 ' Dato de Control
confirma1:
memoria2:
' xxxxAAAx
' xxxx210x
Control = %10100010 ' Dato de Control
199
Direc = $00 ' Dirección en la memoria externa
Dato = 150 ' Dato inicial a ser grabado
confirma2:
lectura1:
' xxxxAAAx
' xxxx210x
Control = %10100000 ' Dato de Control
Direc = $00 ' Dirección en la memoria externa
LCDOUT $fe, 2,"Dato ",#I,": ",#A1," " ' Muestra el dato leido
Pause 1000 ' Pausa de 1 segundo
If I = 20 Then lectura2 ' Condicional
Direc = Direc + 1 ' Suma 1 a la variable "Direc"
Next I
lectura2:
' xxxxAAAx
' xxxx210x
Control = %10100010 ' Dato de Control
Direc = $00 ' Dirección en la memoria externa
200
LCDOUT $fe, 2,"Dato ",#I,": ",#A1," " ' Muestra el dato leido
Pause 1000 ' Pausa de 1 segundo
If I = 20 Then final ' Condicional
Direc = Direc + 1 ' Suma 1 a la variable "Direc"
Next I
final:
201
Conversor A/D en el PIC16F877 Capitulo XI
Figura 11.1.
202
En el microcontrolador PIC16F877, cada canal de conversión A/D está
conectado a un pin ubicado en el puerto “A” y en el puerto “E”. Por ejemplo, el
canal AN0 corresponde al pin # 2 del microcontrolador, o expresado de otra
manera, al pin RA0 del puerto A. El canal AN1 corresponde al pin # 3; el canal
AN2 corresponde al pin # 4 y así sucesivamente; entonces se puede ver
claramente que el puerto A cuenta con cinco de los ocho canales del
conversor A/D, y los otros tres canales están ubicados en los pines
correspondientes al puerto E del microcontrolador.
………….
250 1 1 1 1 1 0 1 0
251 1 1 1 1 1 0 1 1
252 1 1 1 1 1 1 0 0
253 1 1 1 1 1 1 0 1
254 1 1 1 1 1 1 1 0
255 1 1 1 1 1 1 1 1
Tabla 11.1.
203
Cuando la conversión se hace a 10 bits, la resolución aumenta
considerablemente en relación a la de 8 bits, ya que tenemos 210 = 1024
datos de conversión, como se puede observar en la tabla 11.2:
0 0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 0 0 1
2 0 0 0 0 0 0 0 0 1 0
3 0 0 0 0 0 0 0 0 1 1
4 0 0 0 0 0 0 0 1 0 0
………….
………….
………….
1018 1 1 1 1 1 1 1 0 1 0
1019 1 1 1 1 1 1 1 0 1 1
1020 1 1 1 1 1 1 1 1 0 0
1021 1 1 1 1 1 1 1 1 0 1
1022 1 1 1 1 1 1 1 1 1 0
1023 1 1 1 1 1 1 1 1 1 1
Tabla 11.2.
Vimax
Resolución =
2n
5V
Resolución =
28
204
5V
Resolución =
256
Vimax
Resolución =
2n
5V
Resolución =
210
5V
Resolución =
1024
205
Veamos el diagrama de bloques del conversor A/D (figura 11.2):
Figura 11.2.
Vimax
Resolución =
2n
206
2.5V
Resolución =
210
2.5V
Resolución =
1024
La resolución del conversor A/D sería de 2.5 mV por cada paso entre 0 y
1023. Hay una serie de pasos que debemos tomar en cuenta para llevar a
cabo una conversión A/D, basados en el diagrama de bloques de la figura
11.2:
Figura 11.3.
207
PCFG3 PCFG2 PCFG1 PCFG0 AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 Vref+ Vref-
0 0 0 0 A A A A A A A A Vdd Vss
0 0 0 1 A A A A Vref+ A A A RA3 Vss
0 0 1 0 D D D A A A A A Vdd Vss
0 0 1 1 D D D A Vref+ A A A RA3 Vss
0 1 0 0 D D D D A D A A Vdd Vss
0 1 0 1 D D D D Vref+ D A A RA3 Vss
0 1 1 x D D D D D D D D Vdd Vss
1 0 0 0 A A A A Vref+ Vref- A A RA3 RA2
1 0 0 1 D D A A A A A A Vdd Vss
1 0 1 0 D D A A Vref+ A A A RA3 Vss
1 0 1 1 D D A A Vref+ Vref- A A RA3 RA2
1 1 0 0 D D D A Vref+ Vref- A A RA3 RA2
1 1 0 1 D D D D Vref+ Vref- A A RA3 RA2
1 1 1 0 D D D D D D D A Vdd Vss
1 1 1 1 D D D D Vref+ Vref- D A RA3 RA2
Tabla 11.3.
Figura 11.4.
Tabla 11.4.
208
También es posible seleccionar el canal que deseamos utilizar, con la
instrucción de programa ADCin, en la cual sólo se especifica cual será el
canal de entrada de la señal a ser convertida y la variable en la cual se
almacenará el resultado de la conversión.
Figura 11.5.
Tabla 11.5.
209
Bit 5, Bit 4 y Bit 3: Selección del canal de entrada.
Tabla 11.6.
Figura 11.6.
210
1 = Justifica a la derecha.
0 = Justifica a la Izquierda.
PCFG3 PCFG2 PCFG1 PCFG0 AN7 AN6 AN5 AN4 AN3 AN2 AN1 AN0 Vref+ Vref-
0 0 0 0 A A A A A A A A Vdd Vss
0 0 0 1 A A A A Vref+ A A A RA3 Vss
0 0 1 0 D D D A A A A A Vdd Vss
0 0 1 1 D D D A Vref+ A A A RA3 Vss
0 1 0 0 D D D D A D A A Vdd Vss
0 1 0 1 D D D D Vref+ D A A RA3 Vss
0 1 1 x D D D D D D D D Vdd Vss
1 0 0 0 A A A A Vref+ Vref- A A RA3 RA2
1 0 0 1 D D A A A A A A Vdd Vss
1 0 1 0 D D A A Vref+ A A A RA3 Vss
1 0 1 1 D D A A Vref+ Vref- A A RA3 RA2
1 1 0 0 D D D A Vref+ Vref- A A RA3 RA2
1 1 0 1 D D D D Vref+ Vref- A A RA3 RA2
1 1 1 0 D D D D D D D A Vdd Vss
1 1 1 1 D D D D Vref+ Vref- D A RA3 RA2
Tabla 11.7.
A = Entrada Analógica
D = I/O Digital
Conversión a 8 Bits:
Define ADC_BITS 8
211
Esta directiva define que el resultado de la conversión A/D de una señal,
aplicada a cualquiera de los canales, será de 8 bits. Este resultado será
almacenado en un registro definido por el fabricante denominado ADRESL.
Figura 11.7.
Conversión a 10 Bits:
Define ADC_BITS 10
212
REGISTRO ALTO (ADRESH) REGISTRO BAJO (ADRESL)
BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0 BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
0 0 0 0 0 0
Figura 11.9.
Ejemplo:
Define ADC_SAMPLEUS 50
213
11.4.- Proyecto #31: A continuación presentamos un ejemplo de conversión
A/D a 8 bits, el cual consta básicamente de un microcontrolador PIC16F877,
un oscilador externo de 10 Mhz, una pantalla LCD para visualizar los
resultados, y un potenciómetro de 5Kohm para introducir un voltaje variable
en un canal de entrada al conversor A/D.
Figura 11.11.
214
Proyecto # 31
Componente Cantidad
PIC16F877A 1
Cristal de 10 Mhz 1
Capacitor cerámico de 22 pF 2
Pantalla LCD 16x2 1
Resistencia de 220 Ohm 2
Potenciómetro de 5K Ohm 2
Fuente regulada de 5 Vdc 1
Tabla 11.8.
ADCin
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto (0 o 4) en caso
' de utilizar los cuatro Bits mas significativos de la LCD
DEFINE LCD_RSREG PORTB ' Indica al uC que el pin "RS" estará en el Puerto B
DEFINE LCD_RSBIT 1 ' "RS" estará conectado en RB1
DEFINE LCD_EREG PORTB ' Indica al uC que el pin "E" estará en el Puerto B
DEFINE LCD_EBIT 0 ' "E" estará conectado en RB0
DEFINE LCD_LINES 2 ' Define el número de líneas de la pantalla
215
DEFINE ADC_BITS 8 ' Define la conversión A/D a 8 Bits
DEFINE ADC_SAMPLEUS 50 ' Tiempo de muestreo en el conversor A/D es 50 uS
Inicio:
End
216
Esto significa que podemos configurar el conversor A/D a 10 Bits, lo cual nos
lleva a considerar los siguientes cambios:
“C-AD a 10 Bit:”.
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto (0 o 4) en caso
' de utilizar los cuatro Bits mas significativos de la LCD
DEFINE LCD_RSREG PORTB ' Indica al uC que el pin "RS" estará en el Puerto B
DEFINE LCD_RSBIT 1 ' "RS" estará conectado en RB1
DEFINE LCD_EREG PORTB ' Indica al uC que el pin "E" estará en el Puerto B
DEFINE LCD_EBIT 0 ' "E" estará conectado en RB0
DEFINE LCD_LINES 2 ' Define el número de líneas de la pantalla
A VAR Word ' Declaración de una variable tipo word (16 bits)
Inicio:
217
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOUT "C-AD a 10 Bit: " ' Muestra mensaje en la línea 1
LCDOUT $fe,$C0," ",Dec A," " ' Muestra dato en la línea 2
PAUSE 100 ' Pausa de 100 milisegundos
End
218
Comunicación Serial
Transmisión y Recepción de Datos Capitulo XII
219
tener una transferencia de datos segura con otros osciladores de mayor valor,
será necesario utilizar la directiva “Define Osc” al inicio del programa.
Pin: en este campo definiremos cual será el pin de entrada entre los puertos
disponibles del microcontrolador. Ejemplo: PortB.1
Ejemplo:
220
Symbol T2400 = 0 ' Dato verdadero (Driven True)
Symbol T1200 = 1 ' Dato verdadero (Driven True)
Symbol T9600 = 2 ' Dato verdadero (Driven True)
Symbol T300 = 3 ' Dato verdadero (Driven True)
Symbol N2400 = 4 ' Dato invertido (Driven inverted)
Symbol N1200 = 5 ' Dato invertido (Driven inverted)
Symbol N9600 = 6 ' Dato invertido (Driven inverted)
Symbol N300 = 7 ' Dato invertido (Driven inverted)
221
condensadores de 1 uF, ya que una polaridad invertida afectará
negativamente el funcionamiento del MAX232 (Observe la polaridad de cada
condensador en la figura 12.2).
Figura 12.1.
222
Proyecto # 32
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 22 pF 2
Pantalla LCD 16x2 1
Resistencia de 220 Ohm 1
Capacitor Electrolítico de uF 5
Conector DB-9M 1
IC MAX232 1
Fuente regulada de 5 Vdc 1
Tabla 12.2.
Figura 12.2.
223
' Programa en Pic Basic Pro
inicio:
Como velocidad de transmisión, hemos elegido utilizar 9600 bps, por lo cual
debemos definir este valor en nuestro programa.
Las señales con las que actúa el puerto del PC son digitales y la tensión con
la cual trabaja es +12V y -12V; adicionalmente resulta importante saber que la
lógica es invertida, es decir:
224
Programa en Visual Basic 6.0:
Figura 12.3.
Figura 12.4.
225
Figura 12.5.
Figura 12.6.
226
Al hacer clic en el botón “Aceptar” veremos que en la barra de herramientas
aparece un nuevo icono representado por un teléfono.
Figura 12.7.
Figura 12.8.
227
Figura 12.9. Figura 12.10.
Figura 12.11.
228
Utilice el icono “CommandButton” en la barra de herramientas para agregar
botones en el formulario:
Figura 12.12.
Figura 12.13.
229
Este procedimiento se repite hasta lograr obtener un formulario con 12
botones debidamente identificados como se observa en la figura 12.14:
Figura 12.14.
MSComm1.Output = Chr$(1)
Figura 12.15.
230
Se repite el paso anterior para el resto de los botones:
Por último, haga clic en el botón “Iniciar” (ver figura 12.16), para hacer
funcionar el teclado 3x4 desde el cual se enviarán datos hacia el
microcontrolador.
231
Figura 12.16.
232
12.4.- Instrucción SerOut: La instrucción SerOut en PicBasic se encarga de
enviar uno o mas valores a través de un pin específico, usando el formato
asíncrono estándar 8N1, que significa 8 bits de datos, sin revisión de paridad
y 1 bit de parada (stop).
Pin: en este campo definiremos cual será el pin de salida entre los puertos
disponibles del microcontrolador. Ejemplo: PortB.5
Variable: En este campo se especifica la variable que contiene los datos que
serán enviados a través de pin especificado. Ejemplo:
inicio:
SerOut PORTC.6, T9600, [#I] ' Envía los datos a través del pin RC6
Next I
233
GoTo inicio ' Salta a inicio
End
Figura 12.17.
234
Proyecto # 33
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 22 pF 2
Capacitor Electrolítico de uF 5
Conector DB-9M 1
IC MAX232 1
Fuente regulada de 5 Vdc 1
Tabla 12.3.
Figura 12.18.
235
Deberá tomar en cuenta entonces, que los parámetros de comunicación
cambian, debido a que los datos ya no pasarán a través del inversor integrado
en el MAX232.
Inicio:
SerOut PORTC.6, N9600, [#I] ' envía los datos a través del pin RC6
Next I
236
Figura 12.19.
237
Figura 12.20.
Figura 12.21.
238
También es conveniente tomar en cuenta en la configuración de la conexión,
el tipo de emulación (figura 12.22).
Figura 12.22.
239
Figura 12.23.
240
• La pantalla LCD estará conectada en el puerto “D”, por lo cual será
necesario definir los pines de la misma al inicio del programa.
Figura 12.24.
241
Proyecto # 34
Componente Cantidad
PIC16F877A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 33 pF 2
Pantalla LCD 16x2 1
Resistencia de 220 Ohm 1
Capacitor Electrolítico de uF 5
Conector DB-9M 1
IC MAX232 1
Potenciómetro de 5K Ohm 1
Fuente regulada de 5 Vdc 1
Tabla 12.4.
DEFINE LCD_DREG PORTD ' Indica que el Bus estará conectado en el Puerto D
DEFINE LCD_BITS 4 ' El bus será de cuatro bits.
DEFINE LCD_DBIT 4 ' Selección del Bit de inicio del puerto (0 o 4) en caso
' de utilizar los cuatro Bits mas significativos de la LCD
DEFINE LCD_RSREG PORTD ' Indica al uC que el pin "RS" estará en el Puerto B
DEFINE LCD_RSBIT 2 ' "RS" estará conectado en RB1
DEFINE LCD_EREG PORTD ' Indica al uC que el pin "E" estará en el Puerto B
DEFINE LCD_EBIT 3 ' "E" estará conectado en RB0
DEFINE LCD_LINES 2 ' Define el número de líneas de la pantalla
A VAR Word ' Declaración de una variable tipo word (16 bits)
242
ADCON1 = %10000000 ' Configura el registro ADCON1
inicio:
End
243
Para esto debemos conectar el cable serial entre el circuito y el PC, desde la
cual realizaremos una nueva conexión con el HyperTerminal, como se
muestra en figura 12.25:
Figura 12.25.
244
Figura 12.26.
Figura 12.27.
245
anteriormente en el programa que hemos cargado en el microcontrolador PIC
(figura 12.28).
Figura 12.28.
La idea principal de esta práctica, será llevar estos datos a una hoja de Excel,
en la cual podamos realizar los cálculos para expresar estos valores en sus
equivalentes en voltios para luego tomar una muestra significativa y
graficarlos como se observa en la figura 12.29.
246
Figura 12.29.
El primer paso para configurar la hoja de Excel, será ubicar las herramientas
de Visual Basic y agregar a la hoja de cálculo el control “Microsoft
communications control, Version 6.0”. Para esto debemos seguir los
siguientes pasos:
247
1.- Al abrir la hoja de cálculo, podemos ver un menú de opciones en la parte
superior de la ventana denominado “Herramientas”. Haga clic en el menú
“Herramientas” y seleccione la opción “Personalizar”.
Figura 12.30.
248
Figura 12.31.
249
Figura 12.32.
250
Figura 12.33.
251
Figura 12.34.
252
puntero hasta que aparezca un pequeño recuadro. Al soltar el botón izquierdo
el control aparece sobre la hoja. La figura de un Teléfono sobre un “MODEM”
lo identifica claramente, como se muestra en la figura 12.35.
Figura 12.35.
253
Figura 12.36.
Al hacer doble clic sobre el nuevo botón, estamos entrando al editor de Visual
Basic, en el cual podemos agregar las siguientes líneas de programa, las
cuales permitirán abrir el puerto al hacer clic sobre el botón que hemos
agregado para tal fin:
254
Figura 12.37.
255
Figura 12.38.
Figura 12.39.
256
Veremos a continuación la ventana del editor de Visual Basic (Figura 12.40):
Figura 12.40.
257
paso en la configuración del control de comunicaciones ha sido la declaración
de dos variables, las cuales hemos denominado “Apuntador” y “datainput”.
datainput = MSComm1.Input
Hoja1.Cells(Fila, Columna)
Ejemplo:
Si datainput = 643645650681701718745776
Para extraer los tres primeros caracteres y llevarlos por ejemplo a la celda
(40,2) debemos hacer el siguiente arreglo:
258
Hoja1.Cells(40, 2) = Mid(datainput, 1, 3)
'Declara variable
datainput = MSComm1.Input
For Apuntador = 30 To 40
Hoja1.Cells(Apuntador, 2) = Hoja1.Cells(Apuntador + 1, 2)
Next
Hoja1.Cells(40, 2) = Mid(datainput, 1, 4)
End Sub
259
Figura 12.41.
260
Figura 12.42.
261
• =(B36*5)/1024 para la celda C36
• =(B35*5)/1024 para la celda C35
• =(B34*5)/1024 para la celda C34
• =(B33*5)/1024 para la celda C33
• =(B32*5)/1024 para la celda C32
• =(B31*5)/1024 para la celda C31
• =(B30*5)/1024 para la celda C30
Figura 12.43.
262
Figura 12.44.
Para graficar esta serie de datos, seleccionamos las diez celdas (desde la
celda C30 hasta la celda C40) y hacemos clic en el icono “Asistente para
Gráficos” (Figura 12.45), donde aparecerá una ventana en la cual podremos
elegir el tipo de gráfico que deseamos utilizar. Seleccione la ficha “Tipos
personalizados” y haga clic en la opción “Líneas suavizadas” de la lista
(Figura 12.46).
263
Figura 12.45.
Figura 12.46.
264
En la siguiente ventana podemos ver el rango de datos que será graficado
(Figura 12.47):
Figura 12.47.
265
Figura 12.48.
Figura 12.49.
266
Figura 12.50.
267
Servomotores Capitulo XIII
268
Torque (4.8V): 3.0 kg/cm (42 oz/in)
Torque (6.0V): 4.5 kg/cm (48.60 oz/in)
Rango de Temperatura Operacional: -20 a +60 ºC.
Velocidad (4.8V): 0.19sec/60 grados.
Velocidad (6.0V): 0.15sec/60 grados.
Corriente (4.8V): 7.4mA activo y 160mA al aplicar fuerza.
Corriente (6.0V): 7.7mA activo y 180mA al aplicar fuerza.
Figura 13.1.
Para controlar la posición del eje de un servomotor, hace falta enviar un tren
de pulsos, donde el ancho de cada pulso determina el punto en el cual el eje
mantiene su posición, siempre y cuando esté presente el tren de pulsos. El
recorrido será en la mayoría de los modelos de 180º y los tiempos
correspondientes al pulso en la señal para las posiciones principales (0º, 90º y
269
180º) se especifican en la tabla 13.1. (Estos tiempos pueden variar de
acuerdo al modelo y marca del servomotor).
Tabla 13.1.
Figura 13.3.
270
A medida que aumentamos gradualmente el tiempo T1, el eje del servomotor
se irá moviendo en sentido horario. Cuando T1 = 1.5 ms podremos ver que el
eje forma un ángulo de 90º con respecto al punto de inicio (0º). En la figura
13.4 se puede observar la señal correspondiente a esta posición (90º), donde
T2 se mantiene en 20 milisegundos.
Figura 13.4.
Figura 13.5.
271
13.2.- Proyecto #35: Se puede crear un programa en PicBasic que cumpla
con estas características, en el cual variando solo una variable, podemos
modificar el ángulo de giro de un servomotor. Veamos el siguiente ejemplo:
Figura 13.6.
Proyecto # 35
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 22 pF 2
Servomotor 1
Fuente regulada de 5 Vdc 1
Tabla 13.2.
272
PAUSEUS
Inicio:
End
273
Figura 13.7.
Volt/Div: 2V
Time/Div: 5ms
Período: 21,55 ms
T1: 1,55 ms (Ancho de pulso positivo).
T2: 20 ms
Vpp: 5,44 Voltios.
Ciclo de trabajo: 8,16%
Tiempo de subida: 160,0 us
Tiempo de bajada: 160,0 us
274
Entonces, si deseáramos modificar el ángulo de giro, podemos cambiar el
valor de la variable “Pulso”, siempre y cuando el valor esté dentro del rango
de tiempo permitido (0,65 ms ≤ T1 ≤ 2.6 ms), es decir, 650 ≤ PauseUs ≤ 2600.
Una forma aún más práctica para generar el tren de pulsos de la figura 13.7,
sería haciendo uso de la instrucción “PulsOut”, como se muestra a
continuación:
Inicio:
End
275
13.3.- Proyecto #36: Para hacer un poco más interesante la práctica, en la
cual el objetivo ha sido controlar el ángulo de giro de un servomotor,
proponemos incorporar al circuito dos pulsadores para aumentar y disminuir el
ángulo y una pantalla LCD para visualizar el valor en microsegundos de cada
pulso enviado al servomotor (Figura 13.8).
Figura 13.8.
276
Proyecto # 36
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 22 pF 2
Pantalla LCD 16x2 1
Resistencia de 10K Ohm 3
Potenciómetro de 5K Ohm 1
Servomotor 1
Pulsador Normalmente Abierto 2
Fuente regulada de 5 Vdc 1
Tabla 13.3.
Programa en PBP:
DEFINE OSC 4 ' Define el oscilador en 4 Mhz
TRISB = %11110110 ' Configuración del puerto B
Inicio:
277
' conectado a él. La condición se cumple sólo si el pulsador
' está activado y la variable "Pulso" es mayor a 650.
SUMA:
RESTA:
End
Inicio:
278
' está activado y la variable "Pulso" es menor a 260.
SUMA:
PULSO = PULSO + 10 ' Suma 10 a la variable "Pulso"
Pause 40 ' Pausa de 40 milisegundos
Return ' Retorno
RESTA:
PULSO = PULSO - 10 ' Resta 10 a la variable "Pulso"
Pause 40 ' Pausa de 40 milisegundos
Return ' Retorno
End
279
13.4.- Proyecto #37: En la siguiente actividad se desea controlar un
servomotor y visualizar el tiempo de cada pulso en una pantalla LCD,
conectados a un microcontrolador principal. Desde un microcontrolador
secundario se enviará el dato correspondiente al ángulo del eje, estableciendo
una comunicación serial con el microcontrolador principal, de tal manera que
cuando se requiera aumentar o disminuir el ángulo, sean utilizados dos
pulsadores conectados en cualquiera de los puertos disponibles del
microcontrolador secundario.
Figura 13.9.
280
Proyecto # 37
Componente Cantidad
PIC16F84A 2
Cristal de 4 Mhz 2
Capacitor cerámico de 22 pF 4
Pantalla LCD 16x2 1
Resistencia de 10K Ohm 3
Potenciómetro de 5K Ohm 1
Pulsador Normalmente Abierto 2
Fuente regulada de 5 Vdc 1
Tabla 13.4.
Inicio:
End
281
Programa para el microcontrolador secundario U2:
DEFINE OSC 4
inicio:
suma:
SerOut PORTA.2, T9600, [PULSO] ' Envía dato serial por RA2
PAUSE 40 ' Pausa de 40 milisegundos
Return ' Retorno
resta:
End
282
13.5.- Proyecto #38: En la siguiente actividad se controlará un servomotor
desde el puerto serial de un PC, desde donde enviaremos el dato a ser
cargado en la instrucción “PulsOut” en el código de programa del
microcontrolador, y el cual definirá el ancho de pulso a ser introducido en el
servomotor cada 20 milisegundos. El circuito consta de un microcontrolador
PIC16F84A con oscilador de 4 Mhz y un servomotor, donde la línea de control
estará conectada al Pin RB1. Para la comunicación entre el PC y el circuito,
emplearemos un circuito integrado MAX-232 (Figura 13.10).
Figura 13.10.
283
Proyecto # 38
Componente Cantidad
PIC16F84A 1
Cristal de 4 Mhz 1
Capacitor cerámico de 22 pF 2
IC MAX232 1
Capacitor electrolítico de 0,1 uF 5
Potenciómetro de 5K Ohm 1
Conector DB-9M 1
Fuente regulada de 5 Vdc 1
Tabla 13.5.
inicio:
SerIn PORTB.7, T9600, 18, sigue, PULSO ' Espera dato
' durante 18 ms
sigue:
End
284
Para la comunicación serial, se ha definido el modo de dato verdadero a 9600
bps (T9600). A partir de la etiqueta “inicio”, el primer paso será esperar un
dato serial durante 18 milisegundos antes de saltar a la etiqueta “sigue”, para
generar el pulso correspondiente y donde su duración se calcula en decenas
de microsegundos. Seguidamente se genera un salto a la etiqueta “inicio”
para repetir el proceso.
Además hemos agregado tres botones con valores fijos para las tres
posiciones principales (0º, 90º y 180º). Veamos a continuación el desarrollo de
la interfaz gráfica paso a paso:
Figura 13.11.
285
Paso 1: creamos un nuevo proyecto “EXE estándar” (Figura 13.12):
Figura 13.12.
Figura 13.13.
286
Figura 13.14.
Figura 13.15.
287
Figura 13.16. Figura 13.17.
288
Figura 13.20.
289
Figura 13.21.
End Sub
______________________________________________________________________________
290
Private Sub Boton1_Click() ' Boton 0º
Servo = 70 ' Carga el valor para 0º
Text1.Text = Servo * 10 ' Muestra dato * 10 en la caja de texto
MSComm1.Output = Chr$(Servo) ' Envía dato al puerto Comm1
End Sub
______________________________________________________________________________
291
Nota Importante:
Esto significa que el tiempo del pulso generado será de 100 decenas de
microsegundos:
Por lo tanto, los datos que enviamos al microcontrolador a través del puerto
serial desde la aplicación que hemos creado en Visual Basic, deben ser
considerados como la cantidad de decenas de microsegundos que deseamos
que dure cada pulso enviado al servomotor.
Esta es la razón por la cual hemos multiplicado por diez el dato a ser
mostrado en la caja de texto, especificando además la unidad de tiempo
correspondiente, que en este caso se expresa con la palabra
“Microsegundos”.
292
Módulos RF para comunicaciones Capítulo XIV
Figura 14.1.
El voltaje de alimentación no debe exceder los 3.3 Vdc, por lo cual se debe
considerar el uso de una regulador de voltaje para el transmisor y receptor,
considerando que el voltaje estándar en nuestros circuitos ha sido de 5 Vdc.
293
Transmisor: TXM-418-LR-S
Figura 14.2.
Receptor: RXM-418-LR-S
Figura 14.3.
294
Figura 14.4.
295
14.2.- Proyecto #39: En el siguiente proyecto se requiere la construcción de
dos circuitos, figura 14.5 y figura 14.6. En el transmisor hemos empleado un
microcontrolador PIC16F877 debido a que en los siguientes proyectos iremos
incorporando más dispositivos externos a demás de la pantalla LCD. El
circuito receptor estará controlado por un PIC16F84 al cual le hemos
conectado una pantalla LCD para visualizar los datos recibidos.
Circuito Transmisor:
Figura 14.5.
296
Circuito Receptor:
Figura 14.6.
297
Proyecto # 39
Componente Cantidad
PIC16F877A 1
PIC16F84A 1
Cristal de 4 Mhz 2
Capacitor cerámico de 22 pF 4
TXM-418-LR-S con antena 1
RXM-418-LR-S con antena 1
Pantalla LCD 16x2 2
Potenciómetro de 5K Ohm 2
Resistencia de 390 Ohm 2
Resistencia de 750 Ohm 1
Resistencia de 10K Ohm 1
Fuente regulada de 3.3 Vdc / 5 Vdc 2
Tabla 14.1.
inicio:
298
For I = 0 To 9 ' Repetición de 0 a 9
SerOut PORTB.0, T9600, [I] ' Envía los datos por RB0
Next I
End
inicio:
End
Como podemos observar en los diagramas de los circuitos, los módulos TXM-
418-LR-S y RXM-418-LR-S conforman el medio a través del cual viajan los
datos, sustituyendo al cable, cuyas limitaciones son de apenas unos pocos
metros cuando se requiere de comunicación serial RS-232.
299
14.3.- Proyecto #40: Incorporando un teclado matricial al proyecto anterior,
podemos enviar datos asignados a cada tecla.
Circuito transmisor:
Figura 14.7.
300
Circuito Receptor:
Figura 14.8.
301
Proyecto # 40
Componente Cantidad
PIC16F877A 1
PIC16F84A 1
Cristal de 4 Mhz 2
Capacitor cerámico de 22 pF 4
Pantalla LCD 16x2 2
TXM-418-LR-S con antena 1
RXM-418-LR-S con antena 1
Resistencia de 1K Ohm 4
Resistencia de 390 Ohm 2
Resistencia de 750 Ohm 1
Resistencia de 10K Ohm 1
Potenciómetro de 5K Ohm 2
Teclado Matricial 3x4 1
Fuente regulada de 3.3 Vdc / 5 Vdc 2
Tabla 14.2.
302
GoTo inicio ' Salto a inicio
teclado:
303
Cada vez que presionamos una tecla, el dato correspondiente a la misma es
cargado y enviado al receptor el cual a su vez almacena este dato en una
variable, e inmediatamente lo muestra en la pantalla LCD. Esta acción se
puede apreciar en el código de programa que se muestra a continuación.
inicio:
End
304
14.4.- Proyecto #41: En este proyecto se plantea realizar un sistema de
control a distancia que maneje ocho salidas de potencia en el circuito
receptor, de tal manera que pueda ser encendida o apagada cualquiera de
ellas al presionar el botón correspondiente en el teclado del circuito
transmisor. Esto significa que al pulsar la tecla “1”, el estado de la salida
correspondiente a esta tecla en el circuito receptor debe cambiar. Si la salida
se encuentra en estado lógico cero, la misma debe cambiar a estado lógico
uno y viceversa. Lo mismo debe aplicar para el resto de las salidas de
potencia del circuito receptor.
Circuito transmisor:
Figura 14.9.
305
Diagrama del circuito receptor:
Figura 14.10.
306
Programa para el circuito transmisor con teclado matricial:
Symbol T9600 = 2 ' Dato verdadero (Driven True)
inicio:
LCDOUT $fe, 2,"Dato: ",#TECLA," " ' Muestra dato por la LCD
GoTo inicio ' Salto a inicio
teclado:
tecla = 0
307
If PORTD.6 = 0 Then TECLA = 11 ' tecla "0"
Return
End
TRISD = %00000000
inicio:
308
' si se recibe el código correcto
' que hemos elegido (10011001)
sigue:
End
309
Instrucciones de programa de PicBasic Capítulo XV
Sintaxis:
Esta instrucción es utilizada para insertar dentro del código PicBasic, líneas
de programa en lenguaje ensamblador. En este caso, cada línea en lenguaje
ensamblador debe llevar el símbolo @ al inicio.
Ejemplo:
Inicio:
End
310
ADCin
Sintaxis:
Asm… EndAsm
Sintaxis:
Asm
*
*
Instrucciones en lenguaje ensamblador
*
*
EndAsm
311
Branch
Sintaxis:
Ejemplo:
inicio:
Branch I,[Led1,Led2,Led3]
Led1:
PORTB = %00000001 ' enciende el led en RB0
pause 1000 ' pause de 1 segundo
PORTB = %00000000 ' apaga el led
I = I + 1 ' suma 1 a la variable I
GoTo inicio ' salta a inicio
Led2:
PORTB = %00000010 ' enciende el led en RB1
pause 1000 ' pause de 1 segundo
PORTB = %00000000 ' apaga el Led
I = I + 1 ' suma 1 a la variable I
GoTo inicio ' salta a inicio
Led3:
PORTB = %00000100 ' enciende el led en RB2
pause 1000 ' pause de 1 segundo
PORTB = %00000000 ' apaga el Led
I = 0 ' Inicializa la variable I
GoTo inicio ' salta a inicio
End
312
Button
Estado: indica cual es estado lógico que debe ocurrir cuando el pulsador es
presionado (0 o 1). Si es 0, el pulsador deberá ser activo-bajo y si es 1, el
pulsador deberá ser activo-alto (Ver figura 15.1).
+5V +5V
R1
10 Kohm S1
Pulsador
Al Pin
Al Pin
S1
Pulsador R1
10 Kohm
Activo-Bajo Activo-Alto
Figura 15.1.
313
Variable: es una variable auxiliar tipo Byte, definida también al inicio del
programa para uso exclusivo de la instrucción Button, por lo cual no deberá
ser utilizada con otro fin en el programa. Siempre debe ser inicializada antes
del comando Button.
Ejemplo:
TRISB = %11111101 ' Configuración del puerto B
Lcdout $fe,1
A0 = 0 ' inicializa la variable A0
inicio:
Button PORTB.0,1,2,2,A0,0,NoPres
PulsOut PORTB.1,150
NoPres:
Pause 10
GoTo inicio ' Salta a inicio
End
314
Call
Sintaxis:
Call etiqueta
La instrucción “Call”, llama a una subrutina la cual está identificada con una
etiqueta, y una vez culminada la subrutina la cual contiene al final la
instrucción “Return”, vuelve a la siguiente línea después del llamado.
Ejemplo:
inicio:
Call Teclado
If A0 = 1 Then led1
.
.
.
Teclado:
.
.
.
.
Return
End
Clear
Sintaxis:
Clear
315
ClearWDT
Sintaxis:
ClearWDT
Count
Sintaxis:
Pin: especifica el pin del puerto en el cual se introducirán los impulsos. Este
pin es designado como entrada automáticamente por la instrucción Count.
316
Data
Sintaxis:
Ejemplo:
Data @10,1,3,5,7,9
DTMFout
Sintaxis:
Pin: especifica el pin del puerto en el cual se emitirán los tonos DTMF.
317
Off-ms: es una variable o constante que especifica el tiempo en milisegundos
del silencio que hay entre cada tono. En caso de no utilizar este parámetro, el
tiempo por defecto será de 50 ms.
Tono: puede ser una variable o constante (entre 0 – 15), que especifica el
tono que debe ser generado.
Dígito en la Dígito en un
Frecuencias Frecuencias
Instrucción Teclado
Bajas Altas
DTMFout Telefónico
1 1 697 HZ 1209 HZ
2 2 697 HZ 1336 HZ
3 3 697 HZ 1477 HZ
4 4 770 HZ 1209 HZ
5 5 770 HZ 1336 HZ
6 6 770 HZ 1477 HZ
7 7 852 HZ 1209 HZ
8 8 852 HZ 1336 HZ
9 9 852 HZ 1477 HZ
10 0 941 HZ 1209 HZ
11 * 941 HZ 1336 HZ
12 # 941 HZ 1477 HZ
13 A 697 HZ 1633 HZ
14 B 770 HZ 1633 HZ
15 C 852 HZ 1633 HZ
0 D 941 HZ 1633 HZ
Tabla 15.1.
318
Figura 15.2.
Ejemplo:
Ejemplo:
319
Los tonos tendrán una duración de 400 milisegundos cada uno y un tiempo en
silencio entre ellos de 150 milisegundos.
R1 R2
1K 1K
Al Pin Al amplif icador de Audio
C1 C2
0.1 uF 0.1 uF
GND GND
C1
Al Pin
10 uF
C2
10 uF
Parlante
GND
Figura 15.3.
320
EEPROM
Sintaxis:
END
Sintaxis:
End
FREQOUT
Sintaxis:
321
Pin: especifica el pin del puerto en el cual se va a generar la señal.
En cuanto al oscilador también se recomienda usar del tipo HS (20 Mhz) para
obtener mejores resultados en la generación de tonos, así como también se
recomienda utilizar un circuito de acople entre el microcontrolador y el
dispositivo externo al cual enviaremos los tonos (ver figura 15.3).
Ejemplo:
322
FOR… NEXT
Sintaxis:
Ejemplo:
Inicio:
For Z = 0 To 10
Next Z
End
323
Gosub
Sintaxis:
Gosub etiqueta
GOTO
Sintaxis:
GOTO etiqueta
HIGH
Sintaxis:
HIGH pin
Ejemplo:
Inicio:
324
GoTo inicio
End
I2CREAD
Sintaxis:
Ejemplo:
SDA VAR PORTB.0
SCL VAR PORTB.1
A1 VAR Byte
Direc VAR Word
Control VAR Byte
inicio:
' memoria
325
I2CWRITE
Sintaxis:
Ejemplo:
inicio:
Direc = $10 ' Dirección en la memoria externa
Control = $A0 ' Dato de Control
IF – THEM – ELSE
Sintaxis:
Con la instrucción “If – Them” podemos seleccionar uno, dos o mas posibles
comportamientos de programa, tomando decisiones en una estructura de
programación sencilla y la cual será considerada casi en la totalidad de los
programas.
326
Ejemplo 1: Si pulsamos un botón conectado al pin RA0 se cumple la condición
y salta a la etiqueta “Espera”.
inicio:
Espera:
GoTo Espera
End
Ejemplo 2:
inicio:
Espera:
GoTo Espera
End
Solo se utiliza “EndIf” cuando deseamos tener más de una condición o toma
de decisión.
327
Ejemplo 3:
A VAR Byte
inicio:
If PORTA.0 = 1 Then
A = A + 1
EndIf
GoTo inicio ' Salta a "inicio"
Espera:
GoTo Espera
End
INPUT
Sintaxis:
INPUT PIN
Ejemplo:
inicio:
Espera:
GoTo Espera
End
328
LCDIN
Sintaxis:
Ejemplo:
A VAR Byte
inicio:
Espera:
GoTo Espera
End
329
LCDout
Sintaxis:
Comando Acción
$FE, 1 Limpia la pantalla
$FE, 2 Retorna al inicio de la primera línea
$FE, $0C Apaga el Cursor
$FE, $0E Cursor bajo (Underline "_") activo
$FE, $0F Cursor intermitente activo
$FE, $10 Mueve el cursor un espacio a la izquierda
$FE, $14 Mueve el cursor un espacio a la derecha
$FE, $C0 Mueve el cursor al inicio de la segunda línea
$FE, $90 Mueve el cursor al inicio de la tercera línea
$FE, $D0 Mueve el cursor al inicio de la cuarta línea
Tabla 15.2.
Ejemplo:
Pause 200
Inicio:
GoTo Inicio
End
330
LOW
Sintaxis:
LOW pin
Ejemplo:
inicio:
espera:
GoTo espera
End
NAP
Sintaxis:
NAP periodo
331
Periodo Retardo (ms)
0 18
1 36
2 72
3 144
4 288
5 576
6 1152
7 2304
Tabla 15.3.
Ejemplo:
inicio:
espera:
GoTo espera
End
OUTPUT
Sintaxis:
OUTPUT pin
Ejemplo:
inicio:
espera:
GoTo espera
End
332
PAUSE
Sintaxis:
PAUSE periodo
Ejemplo:
inicio:
End
PAUSEUS
Sintaxis:
PAUSEUS periodo
Ejemplo:
333
inicio:
End
POT
Sintaxis:
334
PULSIN
Sintaxis:
Variable: es una variable de 8 bits (variable tipo byte) o 16 bits (variable tipo
word) definida por el programador en la cual se grabará el resultado de la
lectura.
Ejemplo:
Inicio:
PulsIn PORTB.0,1,LECTURA
335
PULSOUT
Sintaxis:
Ejemplo:
Inicio:
PWM
Sintaxis:
336
aproximadamente 100%. Cuando nivel = 0 la salida se mantiene en cero
lógico; cuando nivel = 255 la salida se mantiene en uno lógico.
Ejemplo:
Inicio:
End
RANDOM
Sintaxis:
RANDOM variable
Ejemplo:
Inicio:
337
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut "RANDOM: ",#A0," " ' Muestra mensaje y
' dato por pantalla
End
READ
Sintaxis:
Ejemplo:
I VAR Byte
DIRECCION VAR Byte
DATO VAR Byte
Inicio:
338
Read DIRECCION,DATO ' Lee la dirección especificada y la
' guarda en la variable "Dato".
RETURN
Sintaxis:
RETURN
Retorno de una subrutina desde donde se ha generado un salto del tipo Call o
Gosub.
Ejemplo:
inicio:
Call Teclado
If A0 = 1 Then led1
.
.
.
Teclado:
.
.
.
.
Return
End
339
REVERSE
Sintaxis:
REVERSE pin
Ejemplo:
SELECT CASE
Sintaxis:
Ejemplo:
' Declaración de Variables
I VAR Byte
Z VAR Byte
340
Z = 0 ' Inicializa la variable Z
Inicio:
Case 1
Case 2
Case 3
End Select
Final:
GoTo Final
End
341
SERIN
Sintaxis:
Pin: en este campo definiremos cual será el pin de entrada entre los puertos
disponibles del microcontrolador. Ejemplo: PortB.1
Ejemplo:
Inicio:
342
LCDOUT $fe, 2,"Dato: "
LCDOut $fe,$C0,#dato," "
End
SEROUT
Sintaxis:
Pin: en este campo definiremos cual será el pin de salida entre los puertos
disponibles del microcontrolador.
Variable: en este campo se especifica la variable que contiene los datos que
serán enviados a través de pin especificado.
Ejemplo:
Symbol T9600 = 2 ' Dato verdadero (Driven True)
Inicio:
SerOut PORTC.6, T9600, [#I] ' “#” envía los datos en ASCII
Next I
343
GoTo Inicio ' Salta a inicio
End
SLEEP
Sintaxis:
SLEEP período
Ejemplo:
Inicio:
Espera:
End
SWAP
Sintaxis:
Ejemplo:
A1 VAR Byte ' Define la variable "A1" como Byte
B1 VAR Byte ' Define la variable "B1" como Byte
344
A1 = 10
B1 = 15
Inicio:
Espera:
GoTo Espera ' Salta a la etiqueta "Espera"
End
TOGGLE
Sintaxis:
TOGGLE pin
Ejemplo:
Inicio:
345
GoTo Inicio ' Salto a inicio
End
WHILE-WEND
Sintaxis:
WHILE condición
...instrucciones...
WEND
Ejemplo:
Inicio:
Wend
346
LCDOUT $fe, 2, "While - Wend" ' Muestra mensaje
LCDOut $fe,$C0,"ha terminado!" ' Muestra mensaje
Espera:
GoTo Espera ' Salta a la etiqueta "espera"
End
WRITE
Sintaxis:
Ejemplo:
Inicio:
espera:
GoTo espera
End
347
Apéndice A
Figura A.1.
348
Software:
Figura A.2.
349
Figura A.3.
Figura A.4.
350
Figura A.5.
Figura A.6.
351
Figura A.7.
Figura A.8.
352
Figura A.9.
353
Tipo de programador:
Figura A.10.
354
Modelo del microcontrolador:
Figura A.11.
355
Figura A.12.
El software también cuenta con ayuda visual para saber la posición exacta del
microcontrolador en la base del programador, como se muestra en la figura
A.13. Notará que al cambiar el modelo de microcontrolador a ser programado,
la figura cambia indicando la posición adecuada para evitar daños
irreversibles en el dispositivo.
356
Figura A.13.
357
Apéndice B Tabla ASCII
Tabla B.1.
Fuente: http://www.melabs.com/resources/pbpmanual/
358
Caracteres ASCII Standard
Decimal Hex Display / Key Decimal Hex Display / Key Decimal Hex Display / Key
32 20 Space 64 40 @ 96 60 `
33 21 ! 65 41 A 97 61 a
34 22 " 66 42 B 98 62 b
35 23 # 67 43 C 99 63 c
36 24 $ 68 44 D 100 64 d
37 25 % 69 45 E 101 65 e
38 26 & 70 46 F 102 66 f
39 27 ' 71 47 G 103 67 g
40 28 ( 72 48 H 104 68 h
41 29 ) 73 49 I 105 69 i
42 2A * 74 4A J 106 6A j
43 2B + 75 4B K 107 6B k
44 2C , 76 4C L 108 6C l
45 2D - 77 4D M 109 6D m
46 2E . 78 4E N 110 6E n
47 2F / 79 4F O 111 6F o
48 30 0 80 50 P 112 70 p
49 31 1 81 51 Q 113 71 q
50 32 2 82 52 R 114 72 r
51 33 3 83 53 S 115 73 s
52 34 4 84 54 T 116 74 t
53 35 5 85 55 U 117 75 u
54 36 6 86 56 V 118 76 v
55 37 7 87 57 W 119 77 w
56 38 8 88 58 X 120 78 x
57 39 9 89 59 Y 121 79 y
58 3A : 90 5A Z 122 7A z
59 3B ; 91 5B [ 123 7B {
60 3C < 92 5C \ 124 7C |
61 3D = 93 5D ] 125 7D }
62 3E > 94 5E ^ 126 7E ~
63 3F ? 95 5F _ 127 7F DEL
Tabla B.2.
Fuente: http://www.melabs.com/resources/pbpmanual/
359
Apéndice C Software y Practicas en Formato Digital
360
Se pueden obtener los archivos digitales de cada uno de los proyectos
planteados en esta obra (archivo fuente en pbp de cada proyecto y
archivo compilado .hex), ingresando al sitio Web:
http://www.conexionelectronica.com
361
Bibliografía
INTERNET:
Empresas:
Mecanique
85 Marine Parade
SaltBurn by the Sea
TS12 1BZ
United Kingdom
Tel. +44 1287 622382
Fax. +44 8700 520279
http://www.mecanique.co.uk
362