Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Basic para Microcontroladores Pic Microcontroladores Pic
Basic para Microcontroladores Pic Microcontroladores Pic
MICROCONTROLADORES PIC
CONTENIDO
Prlogo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .1
Captulo I. Herramientas de Diseo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .3
Captulo II. MicroCode Studio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .8
Capitulo III. Microcontroladores PIC.
3.1.- Que es un PIC? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .21
3.2.- El Oscilador Externo. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .25
3.3.- El Circuito de Reset. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
3.4.- Consideraciones tcnicas de diseo. . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4.1.- Estado Lgico de un pin I/O. . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.4.2. Lectura de un estado lgico en un pin I/O. . . . . . . . . . . . . . . 33
3.4.3. El Opto-acoplador. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
3.4.4. Fuente de poder, 5Vdc / 3.3Vdc. . . . . . . . . . . . . . . . . . . . . . . 37
4.3.1.- Define. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
4.3.2.- Variables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .42
4.3.3.- Arrays. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
4.3.4.- Constantes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.3.5.- Smbolos o Alias. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
4.3.6.- Operadores Aritmticos. . . . . . . . . . . . . . . . . . . . . . . . . . . . .45
4.3.7.- Operadores Binarios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .45
4.3.8.- Operadores de Comparacin. . . . . . . . . . . . . . . . . . . . . . . . 46
4.3.9.- Operadores Lgicos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
ii
iii
iv
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
Select Case . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .340
SerIn. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .342
vii
SerOut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .343
Sleep . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .344
Swap . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .344
Toggle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .345
While-Wend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 346
Write . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .347
Apndice A . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .348
Apndice B . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .358
Apndice C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .360
Bibliografa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .362
viii
Prlogo
Herramientas de Diseo
Capitulo I
Figura 1.1.
(Fuente: http://www.microengineeringlabs.com)
Figura 1.2.
Figura 1.3.
Figura 1.4.
Figura 1.5.
Figura 1.6.
Figura 1.7.
Figura 1.7.
Microcode Studio
Capitulo II
Figura 2.1.
(Fuente: http://www.microengineeringlabs.com)
Figura 2.2.
(Fuente: http://www.microengineeringlabs.com)
Figura 2.3.
(Fuente: http://www.microengineeringlabs.com)
Es posible descargar una versin DEMO del compilador PIC Basic, con la
cual se pueden compilar programas con un mximo de 31 lneas de cdigo, a
travs de la direccin: http://www.melabs.com/pbpdemo.htm
Figura 2.4.
(Fuente: http://www.melabs.com)
Para empezar la descarga del archivo de instalacin del compilador, solo hay
que hacer clic en el link sealado en la figura 2.4, e indicar la ruta en la cual
se desea que el archivo de instalacin sea almacenado.
Nota Importante: Es necesario adquirir una de las versiones completas del
compilador Basic, para no tener lmites en la cantidad de lneas del programa
a compilar.
En la figura 2.5 se puede observar el archivo descargado para la versin
disponible del software Microcode Studio, y en la figura 2.6 se puede observar
el archivo del compilador PicBasic Pro en su versin de prueba.
Figura 2.5.
Figura 2.6.
10
Figura 2.7.
Figura 2.8.
11
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 instalacin (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 generacin del cdigo que ser cargado en el
microcontrolador PIC.
Instalacin del compilador PicBasic Pro:
Para dar inicio a la instalacin del compilador Pic Basic, ser necesario
ejecutar el archivo denominado pbpdemo.exe para el caso de la versin de
demostracin. La figura 2.13 muestra la ventana de inicio del proceso de
instalacin, en la cual se da la bienvenida al usuario y le invita a cerrar
cualquier otra aplicacin 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 instalacin del compilador, se debe hacer
clic en el botn Install (figura 2.16), para dar inicio a la copia de archivos.
Figura 2.16.
Figura 2.17.
16
Figura 2.18.
17
Figura 2.19.
Figura 2.20.
18
Figura 2.21.
Figura 2.22.
19
Figura 2.23.
20
Microcontroladores PIC
Capitulo III
Figura 3.1.
22
veamos
algunas
caractersticas
del
microcontrolador
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 operacin de hasta 20 Mhz.
Cuatro fuentes de interrupcin.
Posee 13 pines I/O (pines de entrada o salida).
23
Figura 3.2.
PIN
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Identificacin
RA2
RA3
RA4/TOCKI
MCLR
Vss
RB0/INT
RB1
RB2
RB3
RB4
RB5
RB6
RB7
Vdd
OCS2/CLKOUT
OSC1/CLKIN
RA0
RA1
24
Figura 3.3.
En total se cuenta con trece pines I/O, los cuales pueden ser programados
como entrada o salida segn convenga al momento de disear un circuito de
control.
Los pines correspondientes al oscilador (OSC1 y OSC2) y al reset (MCLR)
deben ser siempre tomados en cuenta en el diseo de nuestros proyectos. Es
por este motivo que damos inicio al estudio de algunos circuitos
indispensables para el correcto funcionamiento del microcontrolador PIC.
3.2. El Oscilador Externo.
Es un circuito indispensable para el funcionamiento del microcontrolador y el
cual adems, define la velocidad a la cual va a trabajar. Para hacer funcionar
nuestro diseo podemos elegir entre las siguientes cuatro opciones:
Figura 3.4.
Los valores de los condensadores cermicos vienen dados segn la tabla que
se muestra a continuacin:
Modo
LP
XT
HS
Frecuencia
32 kHz
200 kHz
2 MHz
4 MHz
4 MHz
10 MHz
Osc1/CLKin
68 - 100 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
Tabla 3.2
26
Osc2/CLKout
68 - 100 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
15 - 33 pF
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
Cristal de cuarzo TTL: Este tipo de cristal consta de cuatro pines, de los
cuales solo tres estn 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.
En el primer circuito, el LED se iluminar solo cuando el estado lgico del pin
de salida del puerto sea igual a 1, es decir, 5 voltios.
En el segundo circuito, el LED se iluminar solo cuando el estado lgico de la
salida del puerto sea igual a 0, es decir, 0 voltios.
Figura 3.11.
32
Figura 3.12.
33
El primer circuito en la figura 3.12 mantiene un nivel lgico alto (5V) mientras
el pulsador permanece abierto. Al presionar el pulsador, el nivel lgico en el
pin I/O del puerto pasa a ser bajo (0V).
El segundo circuito de la figura 3.12 mantiene un nivel lgico bajo (0V)
mientras el pulsador permanece abierto. Al presionar el pulsador, el nivel
lgico en el pin I/O del puerto pasa a ser alto (5V).
3.4.3. El Opto-acoplador:
El opto-acoplador es un componente muy til cuando se requiere acoplar
circuitos electrnicos digitales con etapas de manejo de potencia o con otros
circuitos.
Este componente en una de sus versiones, se compone bsicamente de un
diodo LED el cual se encarga de iluminar un fototransistor, para que ste
conduzca corriente a travs del colector.
Figura 3.13.
34
Figura 3.14.
35
travs del cual circular la corriente necesaria entre sus contactos, para hacer
funcionar cualquiera de estos dispositivos de potencia.
Figura 3.15.
36
Figura 3.16.
37
Estructura de un programa.
Componentes y operadores en PicBasic.
Capitulo IV
D
Figura 4.1.
38
39
Led1:
Etiqueta
For Z = 0 To 9
LED = Encendido
Pause 1000
LED = Apagado
Pause 1000
Next Z
GoTo Inicio
End
Subrutina
40
41
Parmetro
Descripcin
OSC {frecuencia}
LCD_DREG {puerto}
LCD_DBIT {bit}
LCD_RSREG {puerto}
LCD_RSBIT {bit}
LCD_EREG {puerto}
LCD_EBIT {bit}
LCD_RWREG {puerto}
LCD_RWBIT {pin}
LCD_LINES {lneas}
I2C_SCLOUT 1
I2C_SLOW 1
Tabla 4.1.
Nombre de
la Variable
A1
Temp
dig1
VAR
Var
Var
Var
Tipo de
Variable
Bit
Byte
Word
Descripcin
Toma los valores 0 y 1 unicamente
Toma valores entre 0 y 255 (8 bits)
Toma valores entre 0 y 65535 (16 bits)
Tabla 4.2.
42
43
CON
CON
CON
Valor de la
Constante
150
55
Tabla 4.3.
{alias}
{elemento}
Motor = PORTA.0
Relay = PORTB.0
Symbol
Sensor = PORTA.0
Symbol
LED
= PORTA.1
Symbol
RC0
= PORTC.0
44
Descripcin
Suma
Resta
Multiplicacin
Divisin
Residuo
Desplaza a la Izquierda
Operador
ABS
SIN
COS
MIN
MAX
REV
>>
Desplaza a la Derecha
DIG
Asignacin de Valores
Descripcin
Valor Absoluto
Seno del Angulo
Coseno del Angulo
Minimo de un nmero
Mximo de un nmero
Invertir un Bit
Valor de un digito para un
nmero decimal
Tabla 4.4.
Descripcin
AND Lgico
OR Lgico
XOR Lgico
NOT Lgico
NAND Lgico
NOR Lgico
NXOR Lgico
&/
|/
^/
Tabla 4.5.
45
Descripcin
Igual
Diferente
Menor que
Mayor que
Menor o igual que
Mayor o igual que
Tabla 4.6.
Descripcin
AND Lgico
OR Lgico
XOR Lgico
NOT Lgico
NAND Lgico
NOR Lgico
NXOR Lgico
Tabla 4.7.
Ejemplo:
If Var1 = 1 and Var2 = 3 And Var3 = 5 Then Goto inicio
La condicin saltar a la etiqueta inicio solo si se cumplen las tres
condiciones.
46
Capitulo V
Figura 5.1.
47
Proyecto # 1
Componentes
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
LED
Resistencia de 220 Ohm
Fuente regulada de 5 Vdc
Cantidad
1
1
2
2
2
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 lgico
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 configuracin
de puertos, los cuales para el caso especfico del PIC16F84 son dos:
TrisA (registro de configuracin I/O del puerto A), es un registro de 8 bits, de
los cuales los tres ms significativos no se encuentran implementados en este
modelo de microcontrolador, ya que como se puede observar en el diagrama
de pines del dispositivo (figura 3.2), el puerto A solo cuenta con 5 pines (RA0,
RA1, RA2, RA3 y RA4).
48
Registro TrisA
1
1
1
Bit menos
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.
En PicBasic, este paso se realiza de la siguiente manera:
TrisA = %11110
Registro TrisB
1
1
1
1
Bit menos
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.
Consideramos importante configurar los pines que no estarn en uso como
entrada, ya que de esta forma podemos evitar daos en el hardware interno
del microcontrolador al experimentar con ste en un tablero de pruebas.
La configuracin en PicBasic para el registro TrisB, ajustada al ejemplo de la
figura 5.3 sera entonces la siguiente:
TrisB = %11111110 (si se desea hacer la notacin en binario), :
TrisB = $FE (si se desea hacer la notacin en hexadecimal)
Antes de verificar el programa propuesto para este ejemplo, veremos la
sintaxis de las instrucciones utilizadas en l, para tener una idea clara de la
funcin que cumple cada instruccin. Esta informacin puede ser
complementada en el captulo XV, en el cual encontrar la descripcin de
cada una de las instrucciones utilizadas en cada proyecto planteado en esta
edicin.
HIGH
Sintaxis:
HIGH pin
50
LOW
Sintaxis:
LOW pin
GOTO
Sintaxis:
GOTO etiqueta
PAUSE
Sintaxis:
PAUSE periodo
51
TRISA = %11110
' Configuracin el Puerto A
TRISB = %11111110 ' Configuracin el Puerto B
PORTA = 0
PORTB = 0
Inicio:
High PORTA.0
Pause 1000
Low PORTA.0
Pause 1000
High PORTB.0
Pause 1000
Low PORTB.0
Pause 1000
GoTo Inicio
End
52
programa,
hemos
designado
el
nombre
Figura 5.4.
53
Compilar
Compilar y
Grabar en
el PIC
Modelo
del uC.
Figura 5.5.
Figura 5.6.
54
Figura 5.7.
55
Voltios
4
3
2
1
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.
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 conexin del circuito elctrico que deber ser montado.
Figura 5.9.
Proyecto # 2
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor de 33 pF
LED
Resistencia de 220 Ohm
Fuente regulada de 5 Vdc
Cantidad
1
1
2
8
8
1
Tabla 5.2.
57
PORTA.0 = 0
58
Define Osc 4
TRISB = %00000000
PORTB = %00000000
Inicio:
PORTB = %01010101
Pause 1000
PORTB = %10101010
Pause 1000
GoTo Inicio
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
Figura 5.10.
Proyecto # 3
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
LED
Resistencia de 220 Ohm
Resistencia de 10K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc
Tabla 5.3.
60
Cantidad
1
1
2
1
1
1
1
1
IF THEM ELSE
Sintaxis:
TRISA = %11111
' configura el Puerto A como Entrada
TRISB = %00000000 ' Configura el Puerto B como Salida
PORTB = $00
Inicio:
If PORTA.0 = 1 Then PORTB.0 = 1 ' Pregunta si RA0 = 1, si se cumple
' la condicin entonces enciende el Led.
Pause 1000
Low PORTB.0
Pause 1000
GoTo inicio
End
61
Figura 5.11.
62
Proyecto # 4
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Resistencia de 220 Ohm
Resistencia de 10K Ohm
Pulsador Normalmente Abierto
Display de 7 Segmentos - Ctodo comn
Fuente regulada de 5 Vdc
Cantidad
1
1
2
8
8
8
1
1
Tabla 5.4.
63
Define Osc 4
TRISB = $FF
TrisD = $00
Inicio:
'
'
'
'
' gfedcba
' |||||||
If PORTB.0 = 1 Then PortD = %00111111
GoTo Inicio
End
64
Figura 5.12.
Proyecto # 5
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Resistencia de 220 Ohm
Display de 7 Segmentos - Ctodo comn
Fuente regulada de 5 Vdc
Tabla 5.5.
65
Cantidad
1
1
2
8
1
1
FOR NEXT
Sintaxis:
For variable = inicio to final
*
*
Instrucciones
*
*
Next { variable}
I Var Byte
Cero
Uno
Dos
Tres
Cuatro
Cinco
Seis
Siete
CON
CON
CON
CON
CON
CON
CON
CON
' gfedcba
' |||||||
%00111111
%00000110
%01011011
%01001111
%01100110
%01101101
%01111101
%00000111
66
Ocho
Nueve
CON %01111111
CON %01100111
Inicio:
For I = 0 To 9
Call Digito
Pause 1000
Next I
GoTo Inicio
Digito:
' Verificacin del dgito a ser mostrado en el Display el cual
' se corresponde con el valor almacenado en la variable "I".
If
If
If
If
If
If
If
If
If
If
I
I
I
I
I
I
I
I
I
I
=
=
=
=
=
=
=
=
=
=
Return
End
0
1
2
3
4
5
6
7
8
9
Then
Then
Then
Then
Then
Then
Then
Then
Then
Then
PortD
PortD
PortD
PortD
PortD
PortD
PortD
PortD
PortD
PortD
=
=
=
=
=
=
=
=
=
=
cero
Uno
dos
tres
cuatro
cinco
seis
siete
ocho
nueve
' Retorna una lnea despus del salto con retorno (Call)
67
For I = 0 To 9 Step 2
Call Digito
Pause 1000
Next I
Call Digito
Pause 1000
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 instruccin capaz de generar
tonos DTMF (Dual Tone Multifrecuency - Multifrecuencia de doble tono), tonos
que se utilizan en telefona para marcar una serie de nmeros y as poder
establecer la comunicacin entre dos o ms personas. Una aplicacin
interesante para esta instruccin podra ser el discado de nmeros telefnicos
en sistemas de alarma cuando ha sido activado un dispositivo de supervisin,
para luego generar un mensaje de voz que nos alerte de dicho evento.
Realice el montaje de la figura 5.13 y analice el programa que se muestra a
continuacin, el cual genera tonos DTMF consecutivos de una serie de dgitos
predefinidos. Es muy importante considerar que para generar los tonos
adecuadamente el oscilador externo debe ser de 10 Mhz o superior.
68
Figura 5.13.
Proyecto # 6
Componente
PIC16F84A
Cristal de 10 Mhz
Capacitor cermico de 33 pF
Capcitor Electroltico de 10 uF
Parlante de 8 Ohm
Fuente regulada de 5 Vdc
Cantidad
1
1
2
2
1
1
Tabla 5.6.
69
Dgito en un
Teclado
Telefnico
1
2
3
4
5
6
7
8
9
0
*
#
A
B
C
D
Frecuencias
Bajas
Frecuencias
Altas
697 HZ
697 HZ
697 HZ
770 HZ
770 HZ
770 HZ
852 HZ
852 HZ
852 HZ
941 HZ
941 HZ
941 HZ
697 HZ
770 HZ
852 HZ
941 HZ
1209 HZ
1336 HZ
1477 HZ
1209 HZ
1336 HZ
1477 HZ
1209 HZ
1336 HZ
1477 HZ
1209 HZ
1336 HZ
1477 HZ
1633 HZ
1633 HZ
1633 HZ
1633 HZ
Tabla 5.7.
Figura 5.14.
70
DTMFout
Sintaxis:
Pin: especifica el pin del puerto en el cual se emitirn los tonos DTMF.
On-ms: es una variable o constante que especifica la duracin de cada tono
en milisegundos. En caso de no utilizar este parmetro, el tiempo por defecto
de cada tono es de 200 ms.
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 parmetro, el
tiempo en silencio entre cada tono por defecto ser de 50 ms.
Tono: puede ser una variable o constante entre 0 y 15, que especifica el tono
que debe ser generado.
71
TRISA = $FE
Inicio:
DTMFOut
PORTA.0, [0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]
Pause 2000
DTMFOut
Pause 2000
GoTo Inicio
End
72
Figura 5.15.
73
Figura 5.16.
74
Figura 5.17.
Figura 5.18.
75
Button
Sintaxis:
La instruccin Button
genera auto-repeticin.
76
Figura 5.19.
77
PULSout
Sintaxis:
78
Para este proyecto hemos preparado tres ejemplos los cuales estn basados
en el circuito de la figura 5.20.
Figura 5.20.
Tabla 5.8.
79
Cantidad
1
1
2
1
1
1
A Var Byte
A = 0
PORTB.1 = 0
Inicio:
Button PORTB.0,1,2,1,A,0,Tiempo
PulsOut PORTB.1,150 ' Genera un pulso de 1.5ms o 150 decenas de
' microsegundos.
Tiempo:
Pause 10
GoTo Inicio
End
80
Figura 5.21.
81
Figura 5.22.
Button PORTB.0,1,2,1,A,0,Tiempo
82
Figura 5.23.
83
Figura 5.24.
84
A Var Byte
A = 0
PORTB.1 = 0
Inicio:
Button PORTB.0,1,2,2,A,0,Tiempo
PulsOut PORTB.1,150
Tiempo:
Pause 10
GoTo Inicio
End
Button PORTB.0,1,2,2,A,0,Tiempo
La secuencia para este programa es la siguiente:
85
Figura 5.25.
86
A Var Byte
A = 0
PORTB.1 = 0
Inicio:
Button PORTB.0,1,3,1,A,0,Tiempo
PulsOut PORTB.1,250
Tiempo:
Pause 10
GoTo Inicio
End
87
Figura 5.26.
88
Figura 5.27.
89
Figura 5.28.
90
Figura 5.29.
Proyecto # 8
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
LED
Resistencia de 220 Ohm
Fuente regulada de 5 Vdc
Tabla 5.9.
91
Cantidad
1
1
2
3
3
1
Branch
Sintaxis:
TRISB = $00
PORTB = $00
I = 0
Inicio:
Branch I,[Led1,Led2,Led3]
Led1:
PORTB = %00000001
Pause 1000
PORTB = %00000000
I = I + 1
GoTo inicio
'
'
'
'
'
PORTB = %00000010
Pause 1000
PORTB = %00000000
I = I + 1
GoTo inicio
'
'
'
'
'
Led2:
92
Led3:
PORTB = %00000100
Pause 1000
PORTB = %00000000
I = 0
'
'
'
'
GoTo Inicio
End
93
5.9.- Proyecto #9: La instruccin PWM, puede ser usada para generar
voltajes analgicos implementando el circuito conectado al pin RB0 de la
figura 5.30. A continuacin realizaremos un ejemplo de aplicacin de la
instruccin PWM para generar un voltaje determinado, aplicando una serie de
clculos sencillos.
Figura 5.30.
Proyecto # 9
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Resistencia de 10K Ohm
Capcitor Electroltico de 10 uF
Fuente regulada de 5 Vdc
Tabla 5.10.
94
Cantidad
1
1
2
1
1
1
PWM
Sintaxis:
Vfuente nivel
255
donde,
Vout: voltaje de salida.
Vfuente: voltaje de la fuente de alimentacin del circuito.
Nivel: constante entre 0 y 255.
95
Inicio:
PWM PORTB.0,179,100
GoTo Inicio
End
96
Mdulos LCD
Capitulo VI
6.1.- Pantallas LCD: Las pantallas LCD alfanumricas, son las ms utilizadas
hoy en da en el desarrollo de proyectos o equipos electrnicos en los cuales
se hace necesario visualizar mensajes de texto cortos, que proporcionen la
informacin adecuada sobre un evento determinado. Las pantallas ms
comunes suelen ser de 1x16, de 2x16 y de 4x16 (Filas x Columnas). Todas
estas configuraciones tambin se encuentran para 20 columnas y hasta para
40 columnas. Aunque en esta edicin solo estudiaremos el uso de pantallas
alfanumricas, tambin resulta interesante mencionar que existen en el
mercado pantallas grficas (GLCD), como la que se observa en la figura 6.3, y
donde se debe aplicar un mtodo de control diferente al de las pantallas
alfanumricas.
Figura 6.2.
97
98
Pin 7 al14: "Bus de Datos, el Pin 7 hasta el Pin 14 representan 8 lneas que
se utilizan para colocar el dato que representa una instruccin para el modulo
LCD o un carcter alfanumrico.
Pin 15-16: "BackLight", en muchos modelos de LCD, los pines 15 y 16 son
respectivamente el nodo y el Ctodo, aunque se pueden encontrar en el
mercado modelos de pantallas LCD donde esta condicin es configurable
desde la parte posterior del circuito impreso a travs de Jumpers, o
conexiones donde podemos invertir los Pines, de manera tal que el Pin 15 sea
el Ctodo y el Pin 16 el nodo, como se muestra en la figura 6.5.
Figura 6.5.
6.3.- Conexin 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 debern estar conectados en un solo
puerto y nunca en puertos diferentes. Si deseamos trabajar solo con los
cuatro bits ms significativos del bus, estos debern ser conectados en los
cuatro bits menos significativos de un puerto o en los cuatro bits ms
significativos del puerto seleccionado.
Los pines E (Pin 6) y RS (Pin 4) pueden estar conectados en cualquier puerto
del microcontrolador. Por ltimo, el Pin R/W deber estar conectado a tierra
(GND) para indicar a la pantalla LCD que estaremos escribiendo, esto debido
a que estaremos trabajando inicialmente solo con la instruccin Lcdout.
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
mdulo LCD alfanumrico y un microcontrolador, se ha realizado como se muestra
en el diagrama esquemtico 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
continuacin:
DEFINE LCD_DREG
PORTA
DEFINE LCD_BITS
DEFINE LCD_DBIT
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG
PORTB
DEFINE LCD_EBIT
100
Figura 6.6.
Proyecto # 10
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x4
Resistencia de 1K Ohm
Potencimetro de 5K Ohm
Fuente regulada de 5 Vdc
Tabla 6.1.
101
Cantidad
1
1
2
1
1
1
1
LCDout
Sintaxis:
Accin
Limpia la pantalla
Retorna al inicio de la primera lnea
Apaga el Cursor
Cursor bajo (Underline "_") activo
Cursor intermitente activo
Mueve el cursor un espacio a la izquierda
Mueve el cursor un espacio a la derecha
Mueve el cursor al inicio de la segunda lnea
Mueve el cursor al inicio de la tercera lnea
Mueve el cursor al inicio de la cuarta lnea
Tabla 6.2.
102
1"
2"
3"
4"
Pause 500
LCDOut $fe, 1
LCDOut $fe, 2
LCDOut
103
Figura 6.8.
Figura 6.9.
104
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 lgico. Adicionalmente se establecen dos
condiciones que se deben cumplir para que la variable pueda aumentar su
valor o disminuir:
105
,
Lcdout $fe,$C0,"Dato: ",#Dato
Figura 6.10.
106
Proyecto # 11 - 12
Componente
PIC16F877A
Cristal de 8 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Resistencia de 10K Ohm
Potencimetro de 5K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc
Cantidad
1
1
2
1
2
1
2
1
Tabla 6.3.
' Programa en Pic Basic Pro:
'****************************************
'* Nombre
: Proyecto11.pbp
*
'* Autor
: Nombre del Autor
*
'* Copyright : Copyright (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT
PORTD
4
4
DEFINE
DEFINE
DEFINE
DEFINE
PORTD
2
PORTD
3
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
'
'
'
'
'
'
'
'
Define Osc 8
TRISB = $FF
TRISD = $00
Dato = 25
Lcdout $fe, 1
Inicio:
107
Lcdout $fe,2
"
Suma:
Dato = Dato + 1
Pause 350
Return
'
'
'
'
'
'
'
'
'
'
Resta:
Dato = Dato - 1
Pause 350
Return
End
"
108
Lea detenidamente los comentarios de cada lnea 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).
' Programa en Pic Basic Pro:
'****************************************
'* Nombre
: Proyecto12.pbp
*
'* Autor
: Nombre del Autor
*
'* Copyright : Copyright (Ao)
*
'* Fecha
: Fecha
*
'* Versin
: 1.0
*
'****************************************
109
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT
PORTD
4
4
DEFINE
DEFINE
DEFINE
DEFINE
PORTD
2
PORTD
3
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
Symbol P1 = PORTB.0
Symbol P2 = PORTB.1
Define Osc 8
'
'
'
'
'
'
'
'
TRISB = $FF
TrisD = $00
LCDOut $fe, 1
Inicio:
LCDOut $fe, 2
' Posiciona el cursor en el inicio
LCDOut
"P1: Ver Mensaje1"
LCDOut $fe,$C0, "P2: Ver Mensaje2"
If P1 = 1 Then Call Mensaje1
If P2 = 1 Then Call Mensaje2
GoTo Inicio
Mensaje1:
LCDOut $fe, 2
LCDOut
LCDOut $fe,$C0,
Pause 5000
Return
Mensaje2:
LCDOut $fe, 2
LCDOut
LCDOut $fe,$C0,
Pause 5000
Return
End
110
LCDOut
LCDOut
Binario:
LCDOut
111
Figura 6.14.
Proyecto # 13 - 14
Componente
PIC16F877A
Cristal de 8 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Potencimetro de 5K Ohm
Fuente regulada de 5 Vdc
Tabla 6.4.
112
Cantidad
1
1
2
1
1
1
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT
PORTD
4
4
DEFINE
DEFINE
DEFINE
DEFINE
PORTD
2
PORTD
3
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
'
'
'
'
'
'
'
'
Define Osc 8
TrisD = $00
LCDOut $fe, 1
LCDOuT $fe, 2
LCDOut
Inicio:
"
"
Pause 4000
LCDOuT $fe, 2
LCDOut
"Binario:",BIN Dato
GoTo Inicio
End
113
"
PORTD
4
4
DEFINE
DEFINE
DEFINE
DEFINE
PORTD
2
PORTD
3
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
'
'
'
'
'
'
'
'
Define Osc 8
TrisD = $00
Var Byte
LCDOut $fe, 1
Inicio:
'
'
'
'
For I = 33 To 125
Lcdout $fe,2
Lcdout "Dec:",#I," Hex:",HEX I,"
Lcdout $fe,$C0,"ASCII: ", I,"
Pause 1000
"
"
Next I
Fin:
GoTo Fin
End
114
Figura 6.15.
115
Proyecto # 15 - 16
Componente
PIC16F877A
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x4
Resistencia de 10K Ohm
Potencimetro de 5K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc
Cantidad
1
1
1
2
1
2
1
2
1
Tabla 6.5.
116
Count
Sintaxis:
Pin: especifica el pin del puerto en el cual se introducirn los pulsos. Este pin
es designado como entrada automticamente por la instruccin Count.
Duracin: es el tiempo en milisegundos, durante el cual se realizar el conteo
de pulsos sobre el pin especificado.
Variable: es una variable definida por el programador en la cual se grabar el
resultado del conteo.
Programa para el contador de pulsos (PIC16F877A):
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT
PORTD
4
4
DEFINE
DEFINE
DEFINE
DEFINE
PORTD
2
PORTD
3
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
Define Osc 4
'
'
'
'
'
'
'
'
Lcdout $fe, 1
Inicio:
Count
117
Lcdout "Frecuencia
"
"
End
TRISB = %11111101
PORTB.1 = 0
Base = 100
Espera = 1
Inicio:
If PORTB.0 = 1 Then Call Suma
118
Suma:
Pause 300
' Pausa de 300 milisegundos
Base = Base + 100
' Incrementa la variable "Base"
If Base = 10100 Then Base = 10000 ' Establece un lmite mximo al valor cargado
' en la variable "Base".
Espera = Base / 100
' Divide el valor cargado en la variable
' "Base" entre 100 y lo carga en la variable
' "Espera", para que la pausa que se genera
' despus de cada pulso sea igual al tiempo
' del pulso.
Return
Resta:
Pause 300
Base = Base - 100
If Base = 0 Then Base = 100
Espera = Base / 100
'
'
'
'
'
'
'
'
'
Return
End
119
120
Figura 6.16.
PULSIN
Sintaxis:
Pin: especifica el pin del puerto en el cual se introducir el pulso a ser medido.
Nivel: define si la medicin se hace en nivel alto o bajo. (1 = alto, 0 = bajo).
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.
Analice el siguiente programa:
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT
PORTD
4
4
DEFINE
DEFINE
DEFINE
DEFINE
PORTD
2
PORTD
3
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
Define OSC 4
'
'
'
'
'
'
'
'
Pause 200
LCDOut $fe, 1
122
Inicio:
LECTURA = 0
PulsIn PORTB.1,1,LECTURA
LCDOut $fe, 2
"
"
Pause 1000
GoTo Inicio
End
123
6.11.- Proyecto #17: Realice el montaje para el circuito la figura 6.17, con el
cual estudiaremos la instruccin POT a travs de un ejemplo de
programacin, con el cual se pretende tomar lectura de un elemento resistivo,
el cual en este caso ser un potencimetro de 10Kohm.
Figura 6.17.
124
Proyecto # 17
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Potencimetro de 5K Ohm
Potencimetro de 10K Ohm
Capacitor cermico de 0,1 uF
Fuente regulada de 5 Vdc
Cantidad
1
1
2
1
1
1
1
1
Tabla 6.6.
POT
Sintaxis:
125
PORTD
4
4
DEFINE
DEFINE
DEFINE
DEFINE
PORTD
2
PORTD
3
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
'
'
'
'
'
'
'
'
Define OSC 4
ESCALA = 127
LCDOut $fe, 1
Inicio:
Pot PORTB.0,ESCALA,DATO
LCDOut $fe, 2
LCDOut "Lectura: ",#DATO,"
GoTo inicio
End
"
126
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
C5 C4 C3 C2 C1
.............
Figura 6.18.
127
Smbolo
$02
$06
$1A
$1A
$1A
$06
$02
$00
Dato
Binario
Bytes en la
CGRAM
00000010
00000110
00011010
00011010
00011010
00000110
00000010
00000000
$40
$41
$42
$43
$44
$45
$46
$47
Tabla 6.8.
128
LCDOut $fe, 1
LCDOut $fe, 2
129
Figura 6.19.
Proyecto # 18
Componente
PIC16F877A
Cristal de 8 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Resistencia de 10K Ohm
Potencimetro de 5K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc
Tabla 6.9.
130
Cantidad
1
1
2
1
2
1
2
1
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
representacin de un pequeo parlante y cuatro rectngulos, encargados de
indicar el nivel de volumen.
Figura 6.20.
Figura 6.21.
Figura 6.22.
Figura 6.23.
131
Smbolo
$02
$06
$1A
$1A
$1A
$06
$02
$00
Dato
Binario
Bytes en la
CGRAM
00000010
00000110
00011010
00011010
00011010
00000110
00000010
00000000
$40
$41
$42
$43
$44
$45
$46
$47
Figura 2:
Dato
HEX
$00
$00
$00
$00
$00
$00
$1F
$1F
Smbolo
Dato
Binario
Bytes en la
CGRAM
00000000
00000000
00000000
00000000
00000000
00000000
00011111
00011111
$48
$49
$4A
$4B
$4C
$4D
$4E
$4F
Figura 3:
Dato
HEX
Smbolo
$00
$00
$00
$00
$1F
$1F
$1F
$1F
Dato
Binario
Bytes en la
CGRAM
00000000
00000000
00000000
00000000
00011111
00011111
00011111
00011111
$50
$51
$52
$53
$54
$55
$56
$57
Figura 4:
Dato
HEX
$00
$00
$1F
$1F
$1F
$1F
$1F
$1F
Smbolo
Dato
Binario
Bytes en la
CGRAM
00000000
00000000
00011111
00011111
00011111
00011111
00011111
00011111
$58
$59
$5A
$5B
$5C
$5D
$5E
$5F
133
Figura 5:
Dato
HEX
Smbolo
$1F
$1F
$1F
$1F
$1F
$1F
$1F
$1F
Dato
Binario
Bytes en la
CGRAM
00011111
00011111
00011111
00011111
00011111
00011111
00011111
00011111
$60
$61
$62
$63
$64
$65
$66
$67
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT
PORTD
4
4
DEFINE
DEFINE
DEFINE
DEFINE
PORTD
2
PORTD
3
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
Define Osc 8
'
'
'
'
'
'
'
'
134
Symbol P1 = PORTB.0
Symbol P2 = PORTB.1
Volumen = 1
$fe,
$fe,
$fe,
$fe,
$fe,
$40,
$48,
$50,
$58,
$60,
$02,
$00,
$00,
$00,
$1F,
LCDOut $fe, 1
LCDOut "
Volumen:
$06,
$00,
$00,
$00,
$1F,
"
$1A,
$00,
$00,
$1F,
$1F,
$1A,
$00,
$00,
$1F,
$1F,
$1A,
$00,
$1F,
$1F,
$1F,
$06,
$00,
$1F,
$1F,
$1F,
$02,
$1F,
$1F,
$1F,
$1F,
$00
$1F
$1F
$1F
$1F
'Figura
'Figura
'Figura
'Figura
'Figura
1.
2.
3.
4.
5.
Inicio:
'
'
'
'
'
LCDOut $fe, 2
LCDOut $fe,$C5, 0
LCDOut $fe,$C6, 1
SubeVol:
Volumen = Volumen + 1 ' Suma 1 al contenido de la variable "Volumen".
If Volumen = 2 Then Call Nivel1
If Volumen = 3 Then Call Nivel2
If Volumen = 4 Then Call Nivel3
Return
Nivel1:
LCDOut $fe,$C7, 2
Pause 350
Return
135
Nivel2:
LCDOut $fe,$C8, 3
Pause 350
Return
Nivel3:
LCDOut $fe,$C9, 4
Pause 350
Return
BajaVol:
Volumen = Volumen - 1 ' Resta 1 al contenido de la variable "Volumen".
If Volumen = 3 Then Call Borra1
If Volumen = 2 Then Call Borra2
If Volumen = 1 Then Call Borra3
Return
Borra1:
LCDOut $fe,$C9," "
Pause 350
Return
Borra2:
LCDOut $fe,$C8," "
Pause 350
Return
Borra3:
LCDOut $fe,$C7," "
Pause 350
Return
End
136
Figura 6.24.
Proyecto # 19
Componente
PIC16F877A
Cristal de 8 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x4
Potencimetro de 5K Ohm
Fuente regulada de 5 Vdc
Tabla 6.10.
137
Cantidad
1
1
2
1
1
1
Figura 6.25.
138
Figura 6.26.
139
Figura 6.27.
140
Los datos a ser almacenados en las ocho posiciones de la CGRAM son los
siguientes:
Figura 1:
Dato
HEX
Figura A
$00
$00
$10
$0F
$0F
$0D
$18
$10
Dato
Binario
00000000
00000000
00010000
00001111
00001111
00001101
00011000
00010000
Bytes en la
CGRAM
$40
$41
$42
$43
$44
$45
$46
$47
Palabra 0: $00,$00,$10,$0F,$0F,$0D,$18,$10
Figura 2:
Dato
HEX
$04
$0E
$1F
$1C
$1C
$1C
$06
$05
Figura B
Dato
Binario
00000100
00001110
00011111
00011100
00011100
00011100
00000110
00000101
Palabra 1: $04,$0E,$1F,$1C,$1C,$1C,$06,$05
141
Bytes en la
CGRAM
$48
$49
$4A
$4B
$4C
$4D
$4E
$4F
Figura 3:
Dato
HEX
Figura C
$00
$00
$10
$0F
$0F
$0D
$04
$06
Dato
Binario
00000000
00000000
00010000
00001111
00001111
00001101
00000100
00000110
Bytes en la
CGRAM
$50
$51
$52
$53
$54
$55
$56
$57
Palabra 2: $00,$00,$10,$0F,$0F,$0D,$04,$06
Figura 4:
Dato
HEX
$04
$0E
$1F
$1C
$1C
$1C
$08
$18
Figura D
Dato
Binario
00000100
00001110
00011111
00011100
00011100
00011100
00001000
00011000
Palabra 3: $04,$0E,$1F,$1C,$1C,$1C,$08,$18
142
Bytes en la
CGRAM
$58
$59
$5A
$5B
$5C
$5D
$5E
$5F
Figura 5:
Dato
HEX
Figura E
$04
$0E
$1F
$07
$07
$07
$02
$03
Dato
Binario
00000100
00001110
00011111
00000111
00000111
00000111
00000010
00000011
Bytes en la
CGRAM
$60
$61
$62
$63
$64
$65
$66
$67
Palabra 4: $04,$0E,$1F,$07,$07,$07,$02,$03
Figura 6:
Dato
HEX
$00
$00
$01
$1E
$1E
$16
$04
$0C
Figura F
Dato
Binario
00000000
00000000
00000001
00011110
00011110
00010110
00000100
00001100
Palabra 5: $00,$00,$01,$1E,$1E,$16,$04,$0C
143
Bytes en la
CGRAM
$68
$69
$6A
$6B
$6C
$6D
$6E
$6F
Figura 7:
Dato
HEX
Figura G
$04
$0E
$1F
$07
$07
$07
$0C
$14
Dato
Binario
00000100
00001110
00011111
00000111
00000111
00000111
00001100
00010100
Bytes en la
CGRAM
$70
$71
$72
$73
$74
$75
$76
$77
Palabra 6: $04,$0E,$1F,$07,$07,$07,$0C,$14
Figura 8:
Dato
HEX
$00
$00
$01
$1E
$1E
$16
$03
$01
Figura H
Dato
Binario
00000000
00000000
00000001
00011110
00011110
00010110
00000011
00000001
Palabra 7: $00,$00,$01,$1E,$1E,$16,$03,$01
144
Bytes en la
CGRAM
$78
$79
$7A
$7B
$7C
$7D
$7E
$7F
$80
$C0
$90
$D0
$81
$C1
$91
$D1
$82
$C2
$92
$D2
$83
$C3
$93
$D3
$84
$C4
$94
$D4
$85
$C5
$95
$D5
$86
$C6
$96
$D6
$87
$C7
$97
$D7
$88
$C8
$98
$D8
$89
$C9
$99
$D9
$8A
$CA
$9A
$DA
$8B
$CB
$9B
$DB
$8C
$CC
$9C
$DC
$8D
$CD
$9D
$DD
$8E
$CE
$9E
$DE
$8F
$CF
$9F
$DF
Figura 6.28.
145
PORTD
4
4
DEFINE
DEFINE
DEFINE
DEFINE
PORTD
2
PORTD
3
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
'
'
'
'
'
'
'
'
var
var
var
var
Byte
Byte
Byte
Byte
=
=
=
=
$C0
$C1
$C2
$C3
Pause 500
$FE,$40,$00,$00,$10,$0F,$0F,$0D,$18,$10
$FE,$48,$04,$0E,$1F,$1C,$1C,$1C,$06,$05
$FE,$50,$00,$00,$10,$0F,$0F,$0D,$04,$06
$FE,$58,$04,$0E,$1F,$1C,$1C,$1C,$08,$18
'
'
'
'
Palabra
Palabra
Palabra
Palabra
0
1
2
3
de
de
de
de
la
la
la
la
CGRAM
CGRAM
CGRAM
CGRAM
LCDOUT
LCDOUT
LCDOUT
LCDOUT
$FE,$60,$04,$0E,$1F,$07,$07,$07,$02,$03
$FE,$68,$00,$00,$01,$1E,$1E,$16,$04,$0C
$FE,$70,$04,$0E,$1F,$07,$07,$07,$0C,$14
$FE,$78,$00,$00,$01,$1E,$1E,$16,$03,$01
'
'
'
'
Palabra
Palabra
Palabra
Palabra
4
5
6
7
de
de
de
de
la
la
la
la
CGRAM
CGRAM
CGRAM
CGRAM
inicio:
146
LCDOUT $fe, 1
LCDOUT $FE,POS1,
LCDOUT $FE,POS2,
Pause 300
LCDOUT $fe, 1
LCDOUT $FE,POS3,
LCDOUT $FE,POS4,
Pause 300
0
1
2
3
=
=
=
=
POS1
POS2
POS3
POS4
+
+
+
+
3
3
3
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
' posicin inicial en la pantalla LCD:
RETRO:
POS1
POS2
POS3
POS4
=
=
=
=
$CF
$CE
$CD
$CC
RETROCEDE:
LCDOUT $fe, 1
LCDOUT $FE,POS1, 7
LCDOUT $FE,POS2, 6
Pause 300
LCDOUT $fe, 1
LCDOUT $FE,POS3, 5
LCDOUT $FE,POS4, 4
Pause 300
=
=
=
=
POS1
POS2
POS3
POS4
3
3
3
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 posicin inicial en la
' pantalla LCD:
147
REINICIA:
POS1
POS2
POS3
POS4
=
=
=
=
$C0
$C1
$C2
$C3
148
Teclado Matricial
Capitulo VII
Figura 7.1.
Figura 7.2.
149
Puerto B
RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7
TrisB
0 (Salida)
0 (Salida)
0 (Salida)
1 (Entrada)
1 (Entrada)
1 (Entrada)
1 (Entrada)
1 (Entrada)
Teclado 3x4
Columna 1
Columna 2
Columna 3
Fila 1
Fila 2
Fila 3
Fila 4
Sin Conexin
Tabla 7.1.
Observe en el diagrama esquemtico 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 lgico presente en cada una de ellas.
150
Figura 7.3.
' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1
151
' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1
' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0
152
TRISB = %01111000
TRISD = %00000000
Inicio:
Call Teclado
Pause 300
GoTo Inicio
Teclado:
PORTB.0 = 0
PORTB.1 = 1
PORTB.2 = 1
If
If
If
If
PORTB.3
PORTB.4
PORTB.5
PORTB.6
=
=
=
=
' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1
0
0
0
0
PORTB.0 = 1
PORTB.1 = 0
PORTB.2 = 1
If
If
If
If
PORTB.3
PORTB.4
PORTB.5
PORTB.6
=
=
=
=
PORTB.3
PORTB.4
PORTB.5
PORTB.6
=
=
=
=
PORTD
PORTD
PORTD
PORTD
=
=
=
=
%11111001
%10011001
%11111000
%10011100
'
'
'
'
tecla
tecla
tecla
tecla
"1"
"4"
"7"
"*"
'
'
'
'
tecla
tecla
tecla
tecla
"2"
"5"
"8"
"0"
'
'
'
'
tecla
tecla
tecla
tecla
"3"
"6"
"9"
"#"
' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1
0
0
0
0
PORTB.0 = 1
PORTB.1 = 1
PORTB.2 = 0
If
If
If
If
Then
Then
Then
Then
Then
Then
Then
Then
PORTD
PORTD
PORTD
PORTD
=
=
=
=
%10100100
%10010010
%10000000
%11000000
' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0
0
0
0
0
Then
Then
Then
Then
PORTD
PORTD
PORTD
PORTD
=
=
=
=
%10110000
%10000010
%10011000
%10100011
Return
End
153
Figura 7.4.
Proyecto # 20 - 21 - 22 - 23
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Resistencia de 1K Ohm
Potencimetro de 5K Ohm
Teclado Matricial 3x4
Fuente regulada de 5 Vdc
Tabla 7.2.
154
Cantidad
1
1
2
1
4
1
1
1
TRISA = %00000000
TRISB = %00000000
TRISD = %01111000
var1 = 0
Pause 200
Lcdout $fe, 1
Lcdout $fe, 2
Lcdout
Lcdout $fe,$C0,
PAUSE 3000
Inicio:
Call Teclado
Lcdout $fe, 2
' Posiciona el cursor en el inicio
Lcdout
"Tecla Pulsada: "
Lcdout $fe,$C0, "--> ",#var1,"
"
GoTo Inicio
Teclado:
PORTD.0 = 0
PORTD.1 = 1
PORTD.2 = 1
If
If
If
If
PORTD.3
PORTD.4
PORTD.5
PORTD.6
=
=
=
=
PORTD.0 = 1
PORTD.1 = 0
PORTD.2 = 1
' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1
0
0
0
0
Then
Then
Then
Then
VAR1
VAR1
VAR1
VAR1
=
=
=
=
1
4
7
10
'
'
'
'
' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1
155
tecla
tecla
tecla
tecla
"1"
"4"
"7"
"*"
If
If
If
If
PORTD.3
PORTD.4
PORTD.5
PORTD.6
=
=
=
=
0
0
0
0
PORTD.0 = 1
PORTD.1 = 1
PORTD.2 = 0
If
If
If
If
PORTD.3
PORTD.4
PORTD.5
PORTD.6
Return
End
Then
Then
Then
Then
VAR1
VAR1
VAR1
VAR1
=
=
=
=
2
5
8
11
'
'
'
'
tecla
tecla
tecla
tecla
"2"
"5"
"8"
"0"
'
'
'
'
tecla
tecla
tecla
tecla
"3"
"6"
"9"
"#"
' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0
=
=
=
=
0
0
0
0
Then
Then
Then
Then
VAR1
VAR1
VAR1
VAR1
=
=
=
=
3
6
9
12
156
Memoria de Datos
Capitulo VIII
0000:
0008:
0010:
0018:
0020:
0028:
0030:
0038:
157
0000:
0008:
0010:
0018:
0020:
0028:
0030:
0038:
0040:
0048:
0050:
0058:
0060:
0068:
0070:
0078:
0080:
0088:
0090:
0098:
00A0:
00A8:
00B0:
00B8:
00C0:
00C8:
00D0:
00D8:
00E0:
00E8:
00F0:
00F8:
158
WRITE
Sintaxis:
Ejemplo:
Write $00,1
Write $21,155
Write $A0,VAR1
READ
Sintaxis:
159
Ejemplo:
Read $00, VAR1
Figura 8.1.
160
Lcdout $fe, 1
Lcdout $fe, 2
Lcdout
Lcdout $fe,$C0,
Pause 3000
161
Para comprobar que estos datos estn en la memoria de datos EEPROM del
microcontrolador, tambin 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 pequea 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.
DIRECCION = $00
DATO = 1
Declaramos
Declaramos
Declaramos
Declaramos
la
la
la
la
Variable
Variable
Variable
Variable
I
VAR1
DIRECCION
DATO
Lcdout $fe, 1
Lcdout $fe, 2
Lcdout
Lcdout $fe,$C0,
Pause 3000
'
'
'
'
163
End
Figura 8.3.
164
Declaramos
Declaramos
Declaramos
Declaramos
la
la
la
la
Variable
Variable
Variable
Variable
I
VAR1
DIRECCION
DATO
Lcdout $fe, 1
Lcdout $fe, 2
Lcdout
Lcdout $fe,$C0,
Pause 3000
DIRECCION = $00
Inicio:
Lcdout $fe, 1
Lcdout $fe, 2
Lcdout
Lcdout $fe,$C0,
espera1:
Call Teclado
If
If
If
If
VAR1
VAR1
VAR1
VAR1
=
=
=
=
0 Then espera1
10 Then espera1
11 Then VAR1 = 0
12 Then espera1
"
Write DIRECCION,VAR1
' Escribe el valor en la memoria de datos
DIRECCION = DIRECCION + 1
' Aumentamos la posicin en una unidad
Pause 1000
' Espera 1 segundo para simular un tiempo de grabacin
165
If DIRECCION = $0F Then Aviso ' Revisa si llegamos al lmite asignado por
' el programador en la memoria de datos
GoTo inicio
Aviso:
Lcdout $fe, 1
Lcdout $fe, 2
Lcdout
Lcdout $fe,$C0,
Parada:
GoTo Parada
Teclado:
VAR1 = 0
PORTD.0 = 0
PORTD.1 = 1
PORTD.2 = 1
If
If
If
If
PORTD.3
PORTD.4
PORTD.5
PORTD.6
' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1
=
=
=
=
0
0
0
0
PORTD.0 = 1
PORTD.1 = 0
PORTD.2 = 1
If
If
If
If
PORTD.3
PORTD.4
PORTD.5
PORTD.6
PORTD.3
PORTD.4
PORTD.5
PORTD.6
Return
VAR1
VAR1
VAR1
VAR1
=
=
=
=
1
4
7
10
'
'
'
'
tecla
tecla
tecla
tecla
"1"
"4"
"7"
"*"
'
'
'
'
tecla
tecla
tecla
tecla
"2"
"5"
"8"
"0"
'
'
'
'
tecla
tecla
tecla
tecla
"3"
"6"
"9"
"#"
' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1
=
=
=
=
0
0
0
0
PORTD.0 = 1
PORTD.1 = 1
PORTD.2 = 0
If
If
If
If
Then
Then
Then
Then
Then
Then
Then
Then
VAR1
VAR1
VAR1
VAR1
=
=
=
=
2
5
8
11
' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0
=
=
=
=
0
0
0
0
Then
Then
Then
Then
VAR1
VAR1
VAR1
VAR1
=
=
=
=
3
6
9
12
End
166
Una vez compilado y puesto a prueba el programa, los valores podrn ser
introducidos a la memoria de datos a travs del teclado matricial, y el lmite de
datos a ser grabados ser de 16 registros, ya que hemos fijado como lmite la
direccin $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.
Recuerde que un microcontrolador PIC16F877 tiene una capacidad de
memoria de datos de 256 bytes, por lo tanto el lmite que hemos fijado en el
programa anterior puede ser llevado a su capacidad mxima de ser
necesario.
167
Figura 8.4.
168
Proyecto # 24
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Resistencia de 1K Ohm
Potencimetro de 5K Ohm
Teclado Matricial 3x4
Transistor 2N3904
Buzzer 5 Vdc
Fuente regulada de 5 Vdc
Cantidad
1
1
2
1
4
1
1
1
1
1
Tabla 8.3.
169
0000:
0008:
0010:
0018:
0020:
0028:
0030:
0038:
0040:
0048:
0050:
0058:
0060:
0068:
0070:
0078:
0080:
0088:
0090:
0098:
00A0:
00A8:
00B0:
00B8:
00C0:
00C8:
00D0:
00D8:
00E0:
00E8:
00F0:
00F8:
170
X VAR Byte
VAR1 VAR Byte
DIGITO VAR Byte[7]
CLV VAR Byte[7]
' Guardamos cada digito de la clave en las posiciones elegidas previamente:
Write
Write
Write
Write
Write
Write
10,
11,
12,
13,
14,
15,
1
2
3
4
5
6
'
'
'
'
'
'
Clave:
X = 0
Read 10,
Read 11,
Read 12,
Read 13,
Read 14,
Read 15,
CLV[1]
CLV[2]
CLV[3]
CLV[4]
CLV[5]
CLV[6]
'
'
'
'
'
'
'
inicializamos la variable X = 0
leemos el primer dgito y lo guardamos en CLV[1]
leemos el segundo dgito y lo guardamos en CLV[2]
leemos el tercer dgito y lo guardamos en CLV[3]
leemos el cuarto dgito y lo guardamos en CLV[4]
leemos el quinto dgito y lo guardamos en CLV[5]
leemos el sexto dgito y lo guardamos en CLV[6]
Limpia la LCD
Posiciona el cursor en el inicio
"Introduzca su
"
"Clave de Acceso:"
171
Consulta:
Call Teclado
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
Call Beep
'
'
'
'
'
'
X = X + 1
DIGITO[X] = VAR1
'
'
'
'
'
'
Comprobar:
If DIGITO[1] = CLV[1] Then pase1:GoTo error
pase1:
If DIGITO[2] = CLV[2] Then pase2:GoTo error
pase2:
If DIGITO[3] = CLV[3] Then pase3:GoTo error
pase3:
If DIGITO[4] = CLV[4] Then pase4:GoTo error
pase4:
If DIGITO[5] = CLV[5] Then pase5:GoTo error
pase5:
If DIGITO[6] = CLV[6] Then correcto:GoTo error
' Si los seis dgitos han sido correctos
' se ejecuta la subrutina correspondiente.
172
Correcto:
Pause 500
LCDOut $fe, 1 ' Limpia la LCD
LCDOut $fe, 2 ' Posiciona el cursor en el inicio
LCDOut
" * * * * * *
"
Correcta!"
Call beep
Pause 3000
GoTo inicio
Error:
Pause 500
LCDOut $fe, 1 '
LCDOut $fe, 2 '
LCDOut
LCDOut $fe,$C0,
Limpia la LCD
Posiciona el cursor en el inicio
" * * * * * *
"
"
ERROR!
"
Call beep
Call beep
Call beep
Pause 1500
GoTo clave
PORTD.3
PORTD.4
PORTD.5
PORTD.6
=
=
=
=
' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1
0
0
0
0
Then
Then
Then
Then
VAR1
VAR1
VAR1
VAR1
=
=
=
=
1
4
7
10
'
'
'
'
173
tecla
tecla
tecla
tecla
"1"
"4"
"7"
"*"
PORTD.0 = 1
PORTD.1 = 0
PORTD.2 = 1
If
If
If
If
PORTD.3
PORTD.4
PORTD.5
PORTD.6
' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1
=
=
=
=
0
0
0
0
PORTD.0 = 1
PORTD.1 = 1
PORTD.2 = 0
If
If
If
If
PORTD.3
PORTD.4
PORTD.5
PORTD.6
Return
Then
Then
Then
Then
VAR1
VAR1
VAR1
VAR1
=
=
=
=
2
5
8
11
'
'
'
'
tecla
tecla
tecla
tecla
"2"
"5"
"8"
"0"
'
'
'
'
tecla
tecla
tecla
tecla
"3"
"6"
"9"
"#"
' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0
=
=
=
=
0
0
0
0
Then
Then
Then
Then
VAR1
VAR1
VAR1
VAR1
=
=
=
=
3
6
9
12
End
174
Interrupciones
Capitulo IX
pueden
aumentar
en
175
GIE:
1 = habilita todas las interrupciones.
0 = deshabilita las interrupciones.
EEIE:
1 = habilita la interrupcin por escritura de la EEPROM.
0 = deshabilita la interrupcin por escritura de la EEPROM.
TOIE:
1 = habilita la interrupcin por temporizador TMR0.
0 = deshabilita la interrupcin por temporizador TMR0.
INTE:
1 = habilita la interrupcin por RB0/INT.
0 = deshabilita la interrupcin por RB0/INT.
RBIE:
1 = habilita la interrupcin por puerto B (RB4-RB7).
0 = deshabilita la interrupcin por puerto B.
TOIF: (Bandera de interrupcin por desborde del TMR0)
1 = cuando TMR0 pasa de FFh a 00h.
Este bit debe ponerse a cero por software.
INTF: (Bandera de interrupcin por RB0/INT)
1 = cuando ocurre una interrupcin en RB0/INT.
Este bit debe ponerse a cero por software.
RBIF: (Bandera de interrupcin por puerto B)
1 = cuando las entradas RB7 a RB4 cambian de estado.
Este bit debe ponerse a cero por software.
176
Figura 9.2.
177
Proyecto # 25
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
LED
Resistencia de 220 Ohm
Resistencia de 10K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc
Cantidad
1
1
2
2
2
1
1
1
Tabla 9.1.
Figura 9.3.
178
TRISA = %00000000
TRISB = %00000000
I VAR Byte
Symbol LED1 = PORTA.0
Symbol LED2 = PORTA.1
Symbol INTEDG = OPTION_REG.6 ' Bit 6 del registro Option
' El bit 6 (INTEDG) del registro Option define si la interrupcin ser
' activada por flanco positivo o negativo.
On Interrupt GoTo Interrup
INTCON = %10010000
PORTA = $00
LED1 = 0
LED2 = 0
INTEDG = 0
Inicio:
LED1 = 1
Pause 1000
LED1 = 0
Pause 1000
GoTo Inicio
'
'
'
'
'
Enciende el Led1
Pausa de 1000 ms (1 segundo)
Apaga el Led1
Pausa de 1000 ms (1 segundo)
Salta a la etiqueta inicio
Enable
Resume
Enciende
Pausa de
Apaga el
Pausa de
el Led2
200 ms
Led1
200 ms
End
179
Figura 9.4.
180
El Bit TOSE del registro OPTION, elige el tipo de flanco activo cuando el
contador TMR0 es incrementado a travs 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 seal aplicada.
TOCKI es una seal generada por un circuito externo aplicada al pin
RA4/TOCKI. A travs de esta entrada es posible contar el nmero de pulsos
que lleguen a ella, y producir una interrupcin por desborde cuando el
contador pasa de 255 ($FF) a 0 ($00). Se utiliza cuando deseamos que el
registro TMR0 se comporte como contador, y esto es posible configurando el
Bit TOCS del registro OPTION (TOCS = 1).
FOSC/4 es una seal 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).
PRESCALER el un divisor programable de frecuencia el cual se configura
seleccionando los bits PS2, PS1 y PS0 (bits menos significativos del Registro
OPTION). Para programar el PRESCALER, contamos con una tabla que
define los valores del Divisor (ver tabla 9.2).
PSA asigna el divisor de frecuencias y tambin puede ser programado a
travs del bit 3 del registro OPTION.
Bit 6
INTEDG
Bit 5
TOCS
Bit 4
TOSE
Bit 3
PSA
Figura 9.5.
RBP0#:
1 = resistencias Pull-Up del puerto B activadas.
0 = resistencias Pull-Up del puerto B desactivadas.
181
Bit 2
PS2
Bit 1
PS1
Bit 0
PS0
0
0
1
1
0
0
1
1
0
1
0
1
0
1
0
1
Divisor de
TMR0
1:2
1:4
1:8
1:16
1:32
1:64
1:128
1:256
Tabla 9.2.
182
Divisor de
WDT
1:1
1:2
1:4
1:8
1:16
1:32
1:64
1:128
9.8.- Proyecto #26. Para dar un ejemplo de aplicacin 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.
2.
3.
4.
5.
Encender el Led.
Esperar un segundo (1000 milisegundos).
Apagar el Led.
Esperar un segundo (1000 milisegundos).
Repetir todo el proceso.
183
Figura 9.6.
184
Proyecto # 26
Componente
Cantidad
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
LED
Resistencia de 220 Ohm
Fuente regulada de 5 Vdc
1
1
2
1
1
1
Tabla 9.3.
' Programa en Pic Basic Pro
Define Osc 4
I var Byte
OPTION_REG = %0000111
INTCON = %10100000
Disable
Inicio:
High LED
Call Retardo
Low LED
Call Retardo
GoTo Inicio
'
'
'
'
'
Enciende el Led
Llama a la rutina de retardo
Apaga el Led
Llama a la rutina de retardo
Salta a la etiqueta inicio.
Retardo:
For I = 1 To 20 ' Repetimos la interrupcin 20 veces para
' obtener un retardo de 1 segundo.
Call Retardo1
Next I
Return
Retardo1: '
'
'
'
'
Retardo de 50 ms
TMR0 se desborda cada 50 ms. Para calcular este valor
Utilizamos la formula:
Tiempo = 4 x Periodo x Valor a cargar en TMR0 x Valor del Divisor
El clculo del dato a cargar en TMR0 es:
185
TMR0 = 61
Espera:
If TOIF = 1 Then Reseteo
GoTo Espera
Reseteo:
TOIF = 0
Return
Resume
End
Bit 7
GIE
INTCON = %10001000
186
Figura 9.8.
187
Proyecto # 27
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
LED
Resistencia de 220 Ohm
Resistencia de 10K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc
Cantidad
1
1
2
2
2
4
4
1
Tabla 9.4.
En este circuito las entradas RB4, RB5, RB6 y RB7 estn normalmente en 0;
para producir una interrupcin bastar con activar cualquiera de los
pulsadores, para poner un 1 en la entrada correspondiente.
TRISA = %00000000
TRISB = %11110000
I VAR Byte
'
'
'
'
'
Enciende el Led 1
Pausa de 1 segundo
Apaga el Led 1
Pausa de 1 segundo
Salta a la etiqueta "Inicio"
188
Interrup:
Disable
For I = 1 To 6
LED2 = 1
Pause 1000
LED2 = 0
Pause 1000
Next I
'
'
'
'
Enciende
Pausa de
Apaga el
Pausa de
el Led 2
1 segundo
Led 2
1 segundo
189
Capitulo X
190
Figura 10.3.
Figura 10.4.
192
Proyecto # 28 - 29
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
Resistencia de 4,7K Ohm
Potencimetro de 5K Ohm
Memoria EEPROM 24LC256
Fuente regulada de 5 Vdc
Cantidad
1
1
2
1
2
1
1
1
Tabla 10.1.
I2CWRITE
Sintaxis:
I2CWrite SDA, SCL, Control, Direccin, [dato], {etiqueta de salto opcional}
La instruccin I2CWrite enviar el dato de control y la direccin en la cual se
almacenar el dato cargado en la variable previamente cargada.
193
Pause 200
LCDOut $fe, 1
Control = $A0
Direc = $10
Dato = $23
'
'
'
'
Inicio:
Dato de Control
Direccin en la memoria externa
Dato a ser cargado en la direccin
especificada ($23 = 35 Decimal)
GoTo Loop
End
194
Bit 0 (R/W)
0
I2CREAD
Sintaxis:
I2Cread SDA, SCL, Control, Direccin, [dato], {etiqueta de salto opcional}
La instruccin I2Cread enviar el dato de control y la direccin especfica a un
dispositivo conectado a un bus I2C y almacenar el dato obtenido en una
variable definida. Al utilizar la etiqueta opcional, el programa saltar si no se
recibe ninguna respuesta del dispositivo consultado.
A1 Var Byte
Direc var Word
Control Var Byte
Pause 200
195
LCDOut $fe, 1
Inicio:
Direc = $10
Control = $A0
GoTo Ciclo
End
I VAR Byte
A1 VAR Byte
Direc VAR Word
Control VAR Byte
Dato VAR Byte
'
'
'
'
'
Declaracin
Declaracin
Declaracin
Declaracin
Declaracin
de
de
de
de
de
variable
variable
variable
variable
variable
"I"
"A1"
"Direc"
"Control"
"Dato"
Pause 200
LCDOut $fe, 1
Direc = $00
Control = $A0
Dato = 1
Escribir:
For I = 0 To 50
' Repeticin
'
'
'
'
Pausa de 10 milisegundos
Condicional
Suma 1 a la variable "Direc"
Suma 2 a la variable "Dato"
196
Leer:
LCDOUT $fe, 2,"Datos Grabados"
Pause 2000
LCDOut $fe, 2,"Inicia Lectura"
Pause 2000
Direc = $00
For I = 0 To 50
End
197
Figura 10.6.
Proyecto # 30
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
Resistencia de 4,7K Ohm
Potencimetro de 5K Ohm
Memoria EEPROM 24LC256
Fuente regulada de 5 Vdc
Tabla 10.2.
198
Cantidad
1
1
2
1
2
1
2
1
I VAR Byte
A1 VAR Byte
Direc VAR Word
Control VAR Byte
Dato VAR Byte
'
'
'
'
'
Pause 200
LCDOut $fe, 1
Declaracin
Declaracin
Declaracin
Declaracin
Declaracin
de
de
de
de
de
variable
variable
variable
variable
variable
"I"
"A1"
"Direc"
"Control"
"Dato"
memoria1:
' Escribimos en la memoria 1 (Pin A0 = 0; Pin A1 = 0; Pin A2 = 0)
' xxxxAAAx
' xxxx210x
Control = %10100000
Direc = $00
Dato = 1
For I = 0 To 20
' Repeticin
confirma1:
' Muestra mensaje por la LCD
LCDOUT $fe, 2,"Datos Grabados"
LCDOut $fe,$C0,"Memoria 1
"
Pause 2000
' Pausa de 2 segundos
' Escribimos en la memoria 2 (Pin A0 = 1; Pin A1 = 0; Pin A2 = 0)
memoria2:
' xxxxAAAx
' xxxx210x
Control = %10100010
199
Direc = $00
Dato = 150
For I = 0 To 20
'
'
'
'
Pausa de 10 milisegundos
Condicional
Suma 1 a la variable "Direc"
Suma 2 a la variable "Dato"
confirma2:
LCDOUT $fe, 2,"Datos Grabados"
LCDOut $fe,$C0,"Memoria 2
"
Pause 2000
' Repeticin
' Repeticin
200
201
Capitulo XI
Figura 11.1.
202
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
250
251
252
253
254
255
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
1
2
3
4
Decimal
Tabla 11.1.
203
0
0
0
0
0
0
0
0
0
1
0
0
1
1
0
0
1
0
1
0
1
1
1
1
1
1
0
0
1
1
1
1
1
1
0
0
1
1
0
1
0
1
0
1
1018
1019
1020
1021
1022
1023
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
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
1
0
0
1
1
0
0
1
0
1
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
0
0
1
1
1
1
1
1
0
0
1
1
0
1
0
1
0
1
0
1
2
3
4
Decimal
Tabla 11.2.
Resolucin =
Vimax
2n
Resolucin =
5V
28
204
Resolucin =
5V
256
Vimax
2n
Resolucin =
5V
210
Resolucin =
5V
1024
205
Figura 11.2.
Vimax
2n
206
Resolucin =
Resolucin =
2.5V
210
2.5V
1024
La resolucin del conversor A/D sera 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 conversin A/D, basados en el diagrama de bloques de la figura
11.2:
Lo primero, ser configurar los canales de entrada que utilizaremos para
introducir la seal analgica al conversor A/D y los canales para voltajes de
referencia, en el caso de ser necesario. Esto se hace seleccionando la
combinacin correspondiente en los bits PCFG3, PCFG2 PCFG1 y PCFG0
del registro de control ADCON1 (figura 11.3).
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADFM
------
------
------
PCFG3
PCFG2
PCFG1
PCFG0
Figura 11.3.
207
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
x
0
1
0
1
0
1
0
1
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
AN6
AN5
AN4
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
A
A
D
D
D
D
D
A
A
A
A
D
D
D
D
A
A
A
A
D
D
D
A
A
A
A
A
D
D
D
AN3
AN2
A
A
Vref+ A
A
A
Vref+ A
A
D
Vref+ D
D
D
Vref+ VrefA
A
Vref+ A
Vref+ VrefVref+ VrefVref+ VrefD
D
Vref+ Vref-
AN1
AN0
A
A
A
A
A
A
D
A
A
A
A
A
A
D
D
A
A
A
A
A
A
D
A
A
A
A
A
A
A
A
Vref+ Vref-
Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
RA3
RA3
RA3
Vdd
RA3
Vss
Vss
Vss
Vss
Vss
Vss
Vss
RA2
Vss
Vss
RA2
RA2
RA2
Vss
RA2
Tabla 11.3.
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADCS1
ADCS0
CHS2
CHS1
CHS0
GO/DONE
------
ADON
Figura 11.4.
Canal/Pin
Canal 0 (AN0)/RA0
Canal 1 (AN1)/RA1
Canal 2 (AN2)/RA2
Canal 3 (AN3)/RA3
Canal 4 (AN4)/RA5
Canal 5 (AN5)/RE0
Canal 6 (AN6)/RE1
Canal 7 (AN7)/RE2
=
=
=
=
=
=
=
=
Tabla 11.4.
208
ADCin 0, temperatura
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADCS1
ADCS0
CHS2
CHS1
CHS0
GO/DONE
------
ADON
Figura 11.5.
ADCS1 ADCS0
Conversin del Reloj
0
0
=
Fosc/2
0
1
=
Fosc/8
1
0
=
Fosc/32
1
1
=
FRC
Tabla 11.5.
209
Canal/Pin
Canal 0 (AN0)/RA0
Canal 1 (AN1)/RA1
Canal 2 (AN2)/RA2
Canal 3 (AN3)/RA3
Canal 4 (AN4)/RA5
Canal 5 (AN5)/RE0
Canal 6 (AN6)/RE1
Canal 7 (AN7)/RE2
=
=
=
=
=
=
=
=
Tabla 11.6.
Bit 7
Bit 6
Bit 5
Bit 4
Bit 3
Bit 2
Bit 1
Bit 0
ADFM
------
------
------
PCFG3
PCFG2
PCFG1
PCFG0
Figura 11.6.
210
1 = Justifica a la derecha.
0 = Justifica a la Izquierda.
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1
0
0
0
0
1
1
1
0
0
0
0
1
1
1
1
0
0
1
1
0
0
1
0
0
1
1
0
0
1
1
0
1
0
1
0
1
x
0
1
0
1
0
1
0
1
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
AN6
AN5
AN4
AN3
AN2
AN1
AN0
A
A
D
D
D
D
D
A
D
D
D
D
D
D
D
A
A
D
D
D
D
D
A
A
A
A
D
D
D
D
A
A
A
A
D
D
D
A
A
A
A
A
D
D
D
A
Vref+
A
Vref+
A
Vref+
D
Vref+
A
Vref+
Vref+
Vref+
Vref+
D
Vref+
A
A
A
A
D
D
D
VrefA
A
VrefVrefVrefD
Vref-
A
A
A
A
A
A
D
A
A
A
A
A
A
D
D
A
A
A
A
A
A
D
A
A
A
A
A
A
A
A
Vref+ Vref-
Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
Vdd
RA3
RA3
RA3
RA3
Vdd
RA3
Vss
Vss
Vss
Vss
Vss
Vss
Vss
RA2
Vss
Vss
RA2
RA2
RA2
Vss
RA2
Tabla 11.7.
A = Entrada Analgica
D = I/O Digital
Define ADC_BITS 8
211
Figura 11.7.
Conversin a 10 Bits:
Define ADC_BITS 10
Cuando realizamos la conversin A/D a 10 bits, el resultado de la conversin
se almacena en dos registros, ADRESH y ADRESL, los cuales unidos forman
un solo registro de 16 bits, solo que en la parte alta de ste, los 6 bits mas
significativos (Bit 2 al Bit 7 de ADRESH, figura 11.8) no son tomados en
cuent, es decir, son considerados como 0. Esto da como resultado que el
valor mximo a ser almacenado en l ser: 0000001111111111, es decir,
1023.
0
Figura 11.8.
212
0
Figura 11.9.
Figura 11.10.
Ejemplo:
Define ADC_SAMPLEUS 50
213
Figura 11.11.
214
Proyecto # 31
Componente
PIC16F877A
Cristal de 10 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
Resistencia de 220 Ohm
Potencimetro de 5K Ohm
Fuente regulada de 5 Vdc
Cantidad
1
1
2
1
2
2
1
Tabla 11.8.
ADCin
Sintaxis:
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT
PORTD
4
4
DEFINE
DEFINE
DEFINE
DEFINE
DEFINE
PORTB
1
PORTB
0
2
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
LCD_LINES
'
'
'
'
'
'
'
'
'
215
DEFINE ADC_BITS 8
DEFINE ADC_SAMPLEUS 50
VAR Byte
ADCON1 = %00000000
LCDOut $fe, 1
ADCIN 0, A
Inicio:
LCDOut $fe, 2
LCDOUT "C-AD a 8 Bit:
"
LCDOUT $fe,$C0,"
",Dec A,"
PAUSE 100
"
'
'
'
'
GoTo Inicio
End
216
Esto significa que podemos configurar el conversor A/D a 10 Bits, lo cual nos
lleva a considerar los siguientes cambios:
1. Debemos definir ADC_BITS = 10.
2. La variable en la cual ser almacenado el resultado, debe ser del tipo
Word (16 Bits), ya que una vez que se desborde el registro ADRESL,
se requerir disponer de ms bits, debido a que el resultado para una
conversin de 10 bits vara entre 0 y 1023.
3. Debemos recordar justificar el resultado de la conversin A/D a la
derecha, configurando el bit 7 del registro ADCON1, es decir, ADFM =
1.
4. El mensaje mostrado en la primera lnea de la pantalla LCD deber ser:
C-AD a 10 Bit:.
Analice el siguiente programa en el cual se pueden observar los cambios
antes mencionados:
DEFINE OSC 10
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT
PORTD
4
4
DEFINE
DEFINE
DEFINE
DEFINE
DEFINE
PORTB
1
PORTB
0
2
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
LCD_LINES
'
'
'
'
'
'
'
'
'
Define ADC_BITS 10
DEFINE ADC_SAMPLEUS 50
VAR Word
ADCON1 = %10000000
LCDOut $fe, 1
ADCIN 0, A
Inicio:
217
LCDOut $fe, 2
LCDOUT "C-AD a 10 Bit:
"
LCDOUT $fe,$C0,"
",Dec A,"
PAUSE 100
GoTo Inicio
"
'
'
'
'
End
218
Comunicacin Serial
Transmisin y Recepcin de Datos
Capitulo XII
tener una transferencia de datos segura con otros osciladores de mayor valor,
ser necesario utilizar la directiva Define Osc al inicio del programa.
Ejemplo:
Define Osc 20
Sintaxis:
Pin: en este campo definiremos cual ser el pin de entrada entre los puertos
disponibles del microcontrolador. Ejemplo: PortB.1
Modo: define la velocidad de transmisin en baudios.
Valor Numrico
0
1
2
3
4
5
6
7
Modo
T2400
T1200
T9600
T300
N2400
N1200
N9600
N300
Tasa de Bps
2400
1200
9600
300
2400
1200
9600
300
Tabla 12.1.
Ejemplo:
Serin PortC.1, 0, variable Velocidad de transmisin: 2400 bps
Serin PortA.1, 1, variable Velocidad de transmisin: 1200 bps
Serin PortE.0, 2, variable Velocidad de transmisin: 9600 bps
Serin PortC.4, 3, variable Velocidad de transmisin: 300 bps
El campo Modo tambin puede ser definido como se muestra en la columna
2 de la tabla 12.1, incluyendo la librera MODEDEFS.BAS en el inicio del
programa
(Include "modedefs.bas"), o utilizando directamente la
instruccin SYMBOL como se muestra a continuacin:
220
Symbol
Symbol
Symbol
Symbol
Symbol
Symbol
Symbol
Symbol
T2400
T1200
T9600
T300
N2400
N1200
N9600
N300
=
=
=
=
=
=
=
=
0
1
2
3
4
5
6
7
'
'
'
'
'
'
'
'
Dato
Dato
Dato
Dato
Dato
Dato
Dato
Dato
verdadero
verdadero
verdadero
verdadero
invertido
invertido
invertido
invertido
(Driven
(Driven
(Driven
(Driven
(Driven
(Driven
(Driven
(Driven
True)
True)
True)
True)
inverted)
inverted)
inverted)
inverted)
Figura 12.1.
222
Proyecto # 32
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
Resistencia de 220 Ohm
Capacitor Electroltico de uF
Conector DB-9M
IC MAX232
Fuente regulada de 5 Vdc
Tabla 12.2.
Figura 12.2.
223
Cantidad
1
1
2
1
1
5
1
1
1
Symbol T9600
dato var Byte
= 2
pause 500
LCDOut $fe, 1
inicio:
' espera datos durante 1 ms
"
Como velocidad de transmisin, hemos elegido utilizar 9600 bps, por lo cual
debemos definir este valor en nuestro programa.
Las seales con las que acta el puerto del PC son digitales y la tensin con
la cual trabaja es +12V y -12V; adicionalmente resulta importante saber que la
lgica es invertida, es decir:
+12 V Lgica = 0
-12 V Lgica = 1
224
Figura 12.3.
Figura 12.4.
225
Figura 12.5.
Figura 12.6.
226
Figura 12.7.
Figura 12.8.
227
Figura 12.9.
Figura 12.10.
Figura 12.11.
228
Figura 12.12.
Figura 12.13.
229
Figura 12.14.
Figura 12.15.
230
Por ltimo, haga clic en el botn Iniciar (ver figura 12.16), para hacer
funcionar el teclado 3x4 desde el cual se enviarn datos hacia el
microcontrolador.
Al hacer clic en cualquiera de los botones del teclado, estar enviando al
microcontrolador el dato correspondiente el cual podr ser observado en la
pantalla LCD de su circuito.
231
Figura 12.16.
232
Pin: en este campo definiremos cual ser el pin de salida entre los puertos
disponibles del microcontrolador. Ejemplo: PortB.5
Modo: define la velocidad de transmisin en baudios y emplea la misma tabla
de la instruccin Serin (Tabla 12.1).
Variable: En este campo se especifica la variable que contiene los datos que
sern enviados a travs de pin especificado. Ejemplo:
SerOut PORTC.6, T9600, [variable]
Symbol T9600
I VAR Byte
= 2
inicio:
For I = 0 To 9
' Repeticin de 0 a 9
Next I
233
GoTo inicio
End
Figura 12.17.
234
Proyecto # 33
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Capacitor Electroltico de uF
Conector DB-9M
IC MAX232
Fuente regulada de 5 Vdc
Cantidad
1
1
2
5
1
1
1
Tabla 12.3.
Figura 12.18.
235
Define Osc 4
Symbol N9600
dato var Byte
I var Byte
= 6
Inicio:
For I = 0 To 9
' Repeticin de 0 a 9
Next I
GoTo Inicio
End
236
Figura 12.19.
237
Figura 12.20.
Figura 12.21.
238
Figura 12.22.
239
Figura 12.23.
240
Figura 12.24.
241
Proyecto # 34
Componente
PIC16F877A
Cristal de 4 Mhz
Capacitor cermico de 33 pF
Pantalla LCD 16x2
Resistencia de 220 Ohm
Capacitor Electroltico de uF
Conector DB-9M
IC MAX232
Potencimetro de 5K Ohm
Fuente regulada de 5 Vdc
Cantidad
1
1
2
1
1
5
1
1
1
1
Tabla 12.4.
DEFINE OSC 4
DEFINE LCD_DREG
DEFINE LCD_BITS
DEFINE LCD_DBIT
PORTD
4
4
DEFINE
DEFINE
DEFINE
DEFINE
DEFINE
PORTD
2
PORTD
3
2
LCD_RSREG
LCD_RSBIT
LCD_EREG
LCD_EBIT
LCD_LINES
Symbol T9600
= 2
'
'
'
'
'
'
'
'
'
Define ADC_BITS 10
DEFINE ADC_SAMPLEUS 50
VAR Word
242
ADCON1 = %10000000
LCDOut $fe, 1
inicio:
ADCIN 0, A
LCDOut $fe, 2
LCDOUT "C-AD a 10 Bit:
"
LCDOUT $fe,$C0,"Dato: ",Dec A,"
"
pause 500
GoTo inicio
End
243
Para esto debemos conectar el cable serial entre el circuito y el PC, desde la
cual realizaremos una nueva conexin con el HyperTerminal, como se
muestra en figura 12.25:
Figura 12.25.
244
Figura 12.26.
Figura 12.27.
Figura 12.28.
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 clculo el control Microsoft
communications control, Version 6.0. Para esto debemos seguir los
siguientes pasos:
247
Figura 12.30.
248
Figura 12.31.
249
Figura 12.32.
250
Figura 12.33.
251
Figura 12.34.
252
Figura 12.35.
Figura 12.36.
Al hacer doble clic sobre el nuevo botn, estamos entrando al editor de Visual
Basic, en el cual podemos agregar las siguientes lneas de programa, las
cuales permitirn abrir el puerto al hacer clic sobre el botn que hemos
agregado para tal fin:
254
Figura 12.37.
255
Figura 12.38.
Figura 12.39.
256
Figura 12.40.
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)
259
Figura 12.41.
260
Figura 12.42.
=(B40*5)/1024
=(B39*5)/1024
=(B38*5)/1024
=(B37*5)/1024
261
=(B36*5)/1024
=(B35*5)/1024
=(B34*5)/1024
=(B33*5)/1024
=(B32*5)/1024
=(B31*5)/1024
=(B30*5)/1024
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
Grficos (Figura 12.45), donde aparecer una ventana en la cual podremos
elegir el tipo de grfico que deseamos utilizar. Seleccione la ficha Tipos
personalizados y haga clic en la opcin Lneas suavizadas de la lista
(Figura 12.46).
263
Figura 12.45.
Figura 12.46.
264
Figura 12.47.
265
Figura 12.48.
Figura 12.49.
Figura 12.50.
267
Servomotores
Capitulo XIII
13.1.- Qu es un Servomotor?
Un servomotor es un dispositivo electromecnico capaz de rotar su eje a una
posicin especfica a lo largo de su recorrido, inyectando un tren de pulsos
controlados, a un circuito de control que posee dentro de su caja o chasis.
Esta seal se introduce a travs de un cable de control que se distingue entre
los tres cables que posee y que segn la marca del servomotor puede ser de
color blanco o amarillo. Los cables de alimentacin se distinguen por sus
colores rojo (Positivo) y negro (Negativo).
Un servomotor estndar tiene dimensiones muy apropiadas para realizar
proyectos de robtica, y aunque se pueden encontrar en diferentes tamaos,
es importante resaltar que la fuerza de un servo en su eje no es directamente
proporcional al tamao del mismo. Esto significa que su fuerza depende en
gran sentido de su diseo interior, es decir, de la mecnica y material que
componen sus engranajes.
Veamos a continuacin algunas caractersticas tcnicas importantes en un
servomotor estndar:
Control: Control por ancho de pulso.
Pulso: 3-5 Voltios Pico a Pico.
Voltaje de operacin: 4.8 a 6.0 Voltios.
268
Figura 13.1.
Para controlar la posicin 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 posicin, siempre y cuando est presente el tren de pulsos. El
recorrido ser en la mayora de los modelos de 180 y los tiempos
correspondientes al pulso en la seal para las posiciones principales (0, 90 y
269
Tabla 13.1.
Figura 13.3.
270
Figura 13.4.
Figura 13.5.
271
Figura 13.6.
Proyecto # 35
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Servomotor
Fuente regulada de 5 Vdc
Tabla 13.2.
272
Cantidad
1
1
2
1
1
PAUSEUS
Sintaxis:
PAUSEUS periodo
PULSO = 1550
Inicio:
High PORTB.0
PauseUs PULSO
Low PORTB.0
Pause 20
'
'
'
'
RB0 =
Pausa
RB0 =
Pausa
1
en microsegundos
0
de 20 milisegundos
GoTo Inicio
End
273
Figura 13.7.
Volt/Div: 2V
Time/Div: 5ms
Perodo: 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
Al aplicar el tren de pulsos al servomotor, su eje rotar hasta una posicin en
el punto medio de su recorrido total.
Si analizamos el programa, podremos observar que la instruccin PauseUs
realiza una parada durante un tiempo definido por la variable Pulso, cuyo
valor es de 1550, es decir, se est generando una pausa de 1550
microsegundos, o lo que es igual, 1,55 milisegundos.
Seguidamente hacemos una pausa de 20 milisegundos antes de enviar
nuevamente el pulso al Pin RB0.
274
DEFINE OSC 4
Inicio:
PulsOut PORTB.0,65
Low PORTB.0
Pause 20
GoTo Inicio
'
'
'
'
'
End
275
Figura 13.8.
276
Proyecto # 36
Componente
Cantidad
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
Resistencia de 10K Ohm
Potencimetro de 5K Ohm
Servomotor
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc
1
1
2
1
3
1
1
2
1
Tabla 13.3.
Programa en PBP:
DEFINE OSC 4
TRISB = %11110110
PULSO = 1550
Pause 200
LCDOut $fe, 1
Inicio:
High PORTB.0
PauseUs PULSO
Low PORTB.0
Pause 15
'
'
'
'
' RB0 = 1
' Pausa en microsegundos
' RB0 = 0
' Pausa de 15 milisegundos
277
SUMA:
PULSO = PULSO + 100
Pause 40
Return
RESTA:
PULSO = PULSO - 100
Pause 40
Return
TRISB = %11110110
PULSO = 155
Pause 200
LCDOut $fe, 1
Inicio:
PulsOut PORTB.0, PULSO
Low PORTB.0
Pause 15
'
'
'
'
278
SUMA:
PULSO = PULSO + 10
Pause 40
Return
RESTA:
PULSO = PULSO - 10
Pause 40
Return
279
Figura 13.9.
280
Proyecto # 37
Componente
Cantidad
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
Resistencia de 10K Ohm
Potencimetro de 5K Ohm
Pulsador Normalmente Abierto
Fuente regulada de 5 Vdc
Tabla 13.4.
PULSO = 155
pause 200
LCDOut $fe, 1
Inicio:
SerIn PORTB.7, T9600, 16, Sigue, PULSO
Sigue:
LCDOUT $fe, 2,"PULSO: ",#PULSO,"0 uS
" ' Muestra dato.
PulsOut PORTB.1, PULSO
' Genera pulso en RB1
GoTo Inicio
' Salto a inicio
End
281
2
2
4
1
3
1
2
1
= 2
PULSO = 155
inicio:
If PORTA.0 = 1 And PULSO < 250 Then Call suma
' Si RA0 = 1 significa que se ha activado el pulsador
' conectado a l. La condicin se cumple slo si el pulsador
' est activado y la variable "Pulso" es menor a 250.
If PORTA.1 = 1 And PULSO > 60 Then Call resta
' Si RA1 = 1 significa que se ha activado el pulsador
' conectado a l. La condicin se cumple slo si el pulsador
' est activado y la variable "Pulso" es mayor a 60.
GoTo inicio
suma:
PULSO = PULSO + 10
SerOut PORTA.2, T9600, [PULSO] ' Enva dato serial por RA2
PAUSE 40
' Pausa de 40 milisegundos
Return
' Retorno
resta:
PULSO = PULSO - 10
' Resta 10 a la variable "Pulso"
SerOut PORTA.2, T9600, [PULSO] ' Enva dato serial por RA2
PAUSE 40
' Pausa de 40 milisegundos
Return
' Retorno
End
282
Figura 13.10.
283
Proyecto # 38
Componente
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
IC MAX232
Capacitor electroltico de 0,1 uF
Potencimetro de 5K Ohm
Conector DB-9M
Fuente regulada de 5 Vdc
Cantidad
1
1
2
1
5
1
1
1
Tabla 13.5.
inicio:
SerIn PORTB.7, T9600, 18, sigue, PULSO
sigue:
PulsOut PORTB.1, PULSO
GoTo inicio
End
284
Figura 13.11.
285
Figura 13.12.
Figura 13.13.
286
Figura 13.14.
Figura 13.15.
287
Figura 13.16.
Figura 13.17.
Figura 13.18.
Figura 13.19.
288
Figura 13.20.
289
Figura 13.21.
End Sub
______________________________________________________________________________
290
291
Nota Importante:
Recuerde que el dato a ser cargado en la instruccin PulsOut del programa
de control del PIC16F84A, se mide en decenas de microsegundos para un
oscilador de 4 Mhz, por ejemplo:
PulsOut PORTB.1, 100
Esto significa que el tiempo del pulso generado ser de 100 decenas de
microsegundos:
10 microsegundos x 100 = 1000 microsegundos 1 milisegundo.
Por lo tanto, los datos que enviamos al microcontrolador a travs del puerto
serial desde la aplicacin 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 razn por la cual hemos multiplicado por diez el dato a ser
mostrado en la caja de texto, especificando adems la unidad de tiempo
correspondiente, que en este caso se expresa con la palabra
Microsegundos.
Paso 7: generamos el archivo ejecutable desde el men Archivo Generar
Nombre del archivo.exe.
292
Captulo XIV
Figura 14.1.
El voltaje de alimentacin 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 estndar 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
Figura 14.5.
296
Circuito Receptor:
Figura 14.6.
297
Proyecto # 39
Componente
PIC16F877A
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
TXM-418-LR-S con antena
RXM-418-LR-S con antena
Pantalla LCD 16x2
Potencimetro de 5K Ohm
Resistencia de 390 Ohm
Resistencia de 750 Ohm
Resistencia de 10K Ohm
Fuente regulada de 3.3 Vdc / 5 Vdc
Cantidad
1
1
2
4
1
1
2
2
2
1
1
2
Tabla 14.1.
= 2
I VAR Byte
Pause 200
LCDOut $fe, 1
inicio:
298
For I = 0 To 9
' Repeticin de 0 a 9
Pause 1000
Next I
GoTo inicio
End
= 2
pause 500
LCDOut $fe, 1
inicio:
SerIn PORTB.7, T9600, dato
"
End
Como podemos observar en los diagramas de los circuitos, los mdulos TXM418-LR-S y RXM-418-LR-S conforman el medio a travs del cual viajan los
datos, sustituyendo al cable, cuyas limitaciones son de apenas unos pocos
metros cuando se requiere de comunicacin serial RS-232.
299
Figura 14.7.
300
Circuito Receptor:
Figura 14.8.
301
Proyecto # 40
Componente
PIC16F877A
PIC16F84A
Cristal de 4 Mhz
Capacitor cermico de 22 pF
Pantalla LCD 16x2
TXM-418-LR-S con antena
RXM-418-LR-S con antena
Resistencia de 1K Ohm
Resistencia de 390 Ohm
Resistencia de 750 Ohm
Resistencia de 10K Ohm
Potencimetro de 5K Ohm
Teclado Matricial 3x4
Fuente regulada de 3.3 Vdc / 5 Vdc
Cantidad
1
1
2
4
2
1
1
4
2
1
1
2
1
2
Tabla 14.2.
= 2
TRISD = %01111000
pause 500
LCDOut $fe, 1
inicio:
Call teclado
PAUSE 100
302
GoTo inicio
teclado:
' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1
PORTD.0 = 0
PORTD.1 = 1
PORTD.2 = 1
If
If
If
If
PORTD.3
PORTD.4
PORTD.5
PORTD.6
=
=
=
=
0
0
0
0
PORTD.0 = 1
PORTD.1 = 0
PORTD.2 = 1
If
If
If
If
PORTD.3
PORTD.4
PORTD.5
PORTD.6
TECLA
TECLA
TECLA
TECLA
=
=
=
=
1
4
7
10
'
'
'
'
tecla
tecla
tecla
tecla
"1"
"4"
"7"
"*"
'
'
'
'
tecla
tecla
tecla
tecla
"2"
"5"
"8"
"0"
'
'
'
'
tecla
tecla
tecla
tecla
"3"
"6"
"9"
"#"
' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1
=
=
=
=
0
0
0
0
PORTD.0 = 1
PORTD.1 = 1
PORTD.2 = 0
If PORTD.3
If PORTD.4
If PORTD.5
If PORTD.6
Return
End
Then
Then
Then
Then
Then
Then
Then
Then
TECLA
TECLA
TECLA
TECLA
=
=
=
=
2
5
8
11
' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0
=
=
=
=
0
0
0
0
Then
Then
Then
Then
TECLA
TECLA
TECLA
TECLA
=
=
=
=
3
6
9
12
303
= 2
Pause 200
LCDOut $fe, 1
inicio:
SerIn PORTB.7, T9600, dato
"
End
304
Figura 14.9.
305
Figura 14.10.
306
= 2
TRISD = %01111000
Pause 200
LCDOut $fe, 1
inicio:
Call teclado
teclado:
tecla = 0
PORTD.0 = 0
PORTD.1 = 1
PORTD.2 = 1
If
If
If
If
PORTD.3
PORTD.4
PORTD.5
PORTD.6
PORTD.0 = 1
PORTD.1 = 0
PORTD.2 = 1
' Columna 1 = 0
' Columna 2 = 1
' Columna 3 = 1
=
=
=
=
0
0
0
0
Then
Then
Then
Then
TECLA
TECLA
TECLA
TECLA
=
=
=
=
1
4
7
10
'
'
'
'
tecla
tecla
tecla
tecla
"1"
"4"
"7"
"*"
' Columna 1 = 1
' Columna 2 = 0
' Columna 3 = 1
307
PORTD.3
PORTD.4
PORTD.5
PORTD.6
' Columna 1 = 1
' Columna 2 = 1
' Columna 3 = 0
=
=
=
=
0
0
0
0
Then
Then
Then
Then
TECLA
TECLA
TECLA
TECLA
=
=
=
=
3
6
9
12
'
'
'
'
tecla
tecla
tecla
tecla
"3"
"6"
"9"
"#"
Return
End
= 2
Pause 500
LCDOut $fe, 1
PORTD = 0
inicio:
SerIn PORTB.7, T9600, dato
If DATO = %10011001 Then sigue
308
sigue:
SerIn PORTB.7, T9600, dato
If
If
If
If
If
If
If
If
dato
dato
dato
dato
dato
dato
dato
dato
=
=
=
=
=
=
=
=
1
2
3
4
5
6
7
8
Then
Then
Then
Then
Then
Then
Then
Then
Toggle
Toggle
Toggle
Toggle
Toggle
Toggle
Toggle
Toggle
PORTD.0
PORTD.1
PORTD.2
PORTD.3
PORTD.4
PORTD.5
PORTD.6
PORTD.7
'
'
'
'
'
'
'
'
Invierte
Invierte
Invierte
Invierte
Invierte
Invierte
Invierte
Invierte
el
el
el
el
el
el
el
el
Bit
Bit
Bit
Bit
Bit
Bit
Bit
Bit
en
en
en
en
en
en
en
en
RD0
RD1
RD2
RD3
RD4
RD5
RD6
RD7
309
Captulo XV
@
Sintaxis:
@ instruccin en lenguaje ensamblador
Esta instruccin es utilizada para insertar dentro del cdigo PicBasic, lneas
de programa en lenguaje ensamblador. En este caso, cada lnea en lenguaje
ensamblador debe llevar el smbolo @ al inicio.
Ejemplo:
Led Var Byte
TRISB = $00
Led = $00
@bsf _Led,0
Pause 1000
PORTB = Led
Pause 1000
@bcf _Led,0
PORTB = Led
GoTo Inicio
'
'
'
'
'
'
'
Inicio:
pone en 1 el bit 0 de la variable Led
Pausa de 1 segundo
Saca dato por el puerto B
Pausa de 1 segundo
pone en 0 el bit 0 de la variable Led
Saca dato por el puerto B
Salto a inicio
End
310
ADCin
Sintaxis:
ADCin canal, Variable
Lee una entrada del conversor A/D y el resultado es almacenado en una
variable.
Esta instruccin solo es vlida para microcontroladores que tienen convertidor
A/D, por ejemplo, el PIC16F877, el PIC18F442, el PIC18F452, el PIC18F458
entre otros.
Asm EndAsm
Sintaxis:
Asm
*
*
Instrucciones en lenguaje ensamblador
*
*
EndAsm
311
Branch
Sintaxis:
Branch Variable,[Etiqueta1, Etiqueta2,EtiquetaN]
La instruccin Branch hace un salto a una etiqueta dependiendo del valor de
la variable, es decir, si la variable es igual a 0, el salto se hace a la etiqueta 1;
si la variable es igual a 1, el salto se hace a la etiqueta 2; si la variable es
igual a 2, el salto se hace a la etiqueta 3, y as sucesivamente.
Ejemplo:
I var Byte
TRISB = $00
PORTB = $00
I = 0
inicio:
Branch I,[Led1,Led2,Led3]
Led1:
PORTB = %00000001
pause 1000
PORTB = %00000000
I = I + 1
GoTo inicio
'
'
'
'
'
PORTB = %00000010
pause 1000
PORTB = %00000000
I = I + 1
GoTo inicio
'
'
'
'
'
PORTB = %00000100
pause 1000
PORTB = %00000000
I = 0
GoTo inicio
'
'
'
'
'
Led2:
Led3:
End
312
Button
Sintaxis:
La instruccin Button
genera auto-repeticin.
+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 tambin al inicio del
programa para uso exclusivo de la instruccin Button, por lo cual no deber
ser utilizada con otro fin en el programa. Siempre debe ser inicializada antes
del comando Button.
Accin: indica el estado del botn cuando ste no es presionado.
Etiqueta: la instruccin realiza un salto a la etiqueta definida en este campo
cuando el pulsador no ha sido presionado.
Ejemplo:
TRISB = %11111101
A0 Var Byte
Lcdout $fe,1
A0 = 0
inicio:
Button PORTB.0,1,2,2,A0,0,NoPres
PulsOut PORTB.1,150
NoPres:
Pause 10
GoTo inicio
End
314
Call
Sintaxis:
Call etiqueta
La instruccin Call, llama a una subrutina la cual est identificada con una
etiqueta, y una vez culminada la subrutina la cual contiene al final la
instruccin Return, vuelve a la siguiente lnea despus del llamado.
Ejemplo:
inicio:
Call Teclado
If A0 = 1 Then led1
.
.
.
Teclado:
.
.
.
.
Return
End
Clear
Sintaxis:
Clear
La instruccin Clear inicializa todos los registros de la RAM a cero, es decir,
todas las variables simultneamente pasarn a ser cero.
315
ClearWDT
Sintaxis:
ClearWDT
La instruccin ClearWDT inicializa el Perro Guardin (Watchdog Timer).
Count
Sintaxis:
Count pin, duracin, variable
La instruccin Count puede medir la frecuencia de una seal simple
determinando el nmero de pulsos por segundo. Se pueden medir frecuencias
de hasta 25 khz con un oscilador de 4 MHz. Para un oscilador de 20 MHz la
frecuencia mxima a ser medida ser de 125 khz.
Pin: especifica el pin del puerto en el cual se introducirn los impulsos. Este
pin es designado como entrada automticamente por la instruccin Count.
Duracin: es el tiempo durante el cual se realizar el conteo de impulsos
sobre el pin especificado.
Variable: es una variable definida por el programador en la cual se grabar el
resultado del conteo.
316
Data
Sintaxis:
Data {@Direccin inicial}, constante1, constante2,constanteN
La instruccin Data
solo puede ser utilizada para las familias de
microcontroladores que incorporan memoria EEPROM en su arquitectura.
Para los microcontroladores que no cuentan con esta memoria, existe la
posibilidad de agregar una memoria EEPROM externa a travs del protocolo
de comunicacin I2C.
Bsicamente esta instruccin guarda varias constantes a partir de una
direccin que especificamos en el campo correspondiente.
Ejemplo:
Data @10,1,3,5,7,9
En este ejemplo, la instruccin Data almacenar los valores 1, 3, 5, 7 y 9 en
las direcciones de memoria 10, 11, 12, 13 y 14 respectivamente.
DTMFout
Sintaxis:
DTMFout pin, {On-ms, Off-ms}, [tono, tono,...tono]
La instruccin DTMFout genera tonos DTMF en secuencia y a travs de un
puerto cualquiera del microcontrolador.
Pin: especifica el pin del puerto en el cual se emitirn los tonos DTMF.
On-ms: es una variable, constante o expresin que especifica la duracin de
cada tono en milisegundos. En caso de no utilizar este parmetro, el tiempo
por defecto de cada tono es de 200 ms.
317
Dgito en la
Instruccin
DTMFout
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
0
Dgito en un
Teclado
Telefnico
1
2
3
4
5
6
7
8
9
0
*
#
A
B
C
D
Frecuencias
Bajas
Frecuencias
Altas
697 HZ
697 HZ
697 HZ
770 HZ
770 HZ
770 HZ
852 HZ
852 HZ
852 HZ
941 HZ
941 HZ
941 HZ
697 HZ
770 HZ
852 HZ
941 HZ
1209 HZ
1336 HZ
1477 HZ
1209 HZ
1336 HZ
1477 HZ
1209 HZ
1336 HZ
1477 HZ
1209 HZ
1336 HZ
1477 HZ
1633 HZ
1633 HZ
1633 HZ
1633 HZ
Tabla 15.1.
318
Figura 15.2.
Ejemplo:
DTMFout
PortC.0, [0,1,2,3,4,5,6,7,8,9]
Ejemplo:
DTMFout
PortC.0,400,150, [6,4,3,8,7,1,0]
319
Los tonos tendrn una duracin de 400 milisegundos cada uno y un tiempo en
silencio entre ellos de 150 milisegundos.
R1
1K
R2
1K
Al Pin
C1
0.1 uF
GND
C2
0.1 uF
GND
C1
Al Pin
10 uF
C2
10 uF
Parlante
GND
Figura 15.3.
320
EEPROM
Sintaxis:
EEPROM direccin,[constante1, constante2,.constanteN]
La instruccin EEPROM es capaz de almacenar datos en la memoria de
datos de un microcontrolador siempre y cuando ste cuente con esta
caracterstica y a partir de la direccin indicada, almacena constantes
especficas en las posiciones consecutivas a la inicial.
Es importante resaltar que los datos solo son almacenados al momento de
grabar el microcontrolador en nuestro programador para microcontroladores
PIC, por lo tanto, para realizar lecturas o grabaciones de nuevos datos
durante la ejecucin de un programa se debe recurrir a las instrucciones Read
y Write.
END
Sintaxis:
End
La instruccin END detiene la ejecucin de un programa y pone el
microcontrolador en bajo consumo de energa.
FREQOUT
Sintaxis:
FreqOut pin, On-ms, Frecuencia1, Frecuencia2
La instruccin FreqOut genera una o dos seales de frecuencia entre 0 y
32767 Hz previamente definidas, durante un perodo de tiempo tambin
definido.
321
322
FOR NEXT
Sintaxis:
Inicio:
For Z = 0 To 10
PORTD.0 = 1
Pause 1000
PORTD.0 = 0
Pause 1000
'
'
'
'
Next Z
End
323
Gosub
Sintaxis:
Gosub etiqueta
La instruccin Gosub ejecuta subrutinas dentro de un programa principal
donde la ubicacin de las mismas estar definida por la etiqueta
correspondiente. Una vez ejecutada la subrutina y encontrada la instruccin
Return, la ejecucin del programa contina en la lnea siguiente a la
instruccin Gosub.
GOTO
Sintaxis:
GOTO etiqueta
La instruccin Goto contina la ejecucin de un programa a partir de la
etiqueta especificada. Esta instruccin no tiene retorno.
HIGH
Sintaxis:
HIGH pin
La instruccin High pone en uno lgico el pin especificado, el cual configura
automticamente como salida.
Ejemplo:
Inicio:
HIGH PORTA.0
324
GoTo inicio
End
I2CREAD
Sintaxis:
I2Cread SDA, SCL, Control, Direccin, [dato], {etiqueta de salto opcional}
La instruccin I2Cread enviar el dato de control y la direccin especfica a
un dispositivo conectado a un bus I2C y almacenar el dato obtenido en una
variable definida. Al utilizar la etiqueta opcional, el programa saltar si no se
recibe ninguna respuesta del dispositivo consultado.
Ejemplo:
SDA VAR PORTB.0
SCL VAR PORTB.1
A1 VAR Byte
Direc VAR Word
Control VAR Byte
Pause 500
LCDOut $fe, 1
Direc = $10
Control = $A0
inicio:
GoTo ciclo
End
325
I2CWRITE
Sintaxis:
I2CWrite SDA, SCL, Control, Direccin, [dato], {etiqueta de salto opcional}
La instruccin I2CWrite enviar el dato de control y la direccin en la cual se
almacenar el dato cargado en la variable previamente cargada.
Ejemplo:
SDA VAR PORTB.0
SCL VAR PORTB.1
Direc var Word
Control Var Byte
inicio:
Direc = $10
Control = $A0
pause 10
Loop:
' Escribe la
' memoria
GoTo Loop
End
IF THEM ELSE
Sintaxis:
If expresin 1 {AND / OR expresin 2} Then etiqueta
Con la instruccin If Them podemos seleccionar uno, dos o mas posibles
comportamientos de programa, tomando decisiones en una estructura de
programacin sencilla y la cual ser considerada casi en la totalidad de los
programas.
326
Espera:
GoTo Espera
End
Ejemplo 2:
inicio:
Input PORTA.0
If PORTA.0 = 1 Then
GoTo Espera
Else
' de lo contrario...
GoTo inicio
EndIf
Espera:
GoTo Espera
End
327
Ejemplo 3:
A VAR Byte
inicio:
Input PORTA.0
If PORTA.0 = 1 Then
A = A + 1
If A = 10 Then Espera
EndIf
GoTo inicio
Espera:
GoTo Espera
End
INPUT
Sintaxis:
INPUT PIN
Designa un pin especfico como entrada.
Ejemplo:
inicio:
Input PORTA.0
Espera:
GoTo Espera
End
328
LCDIN
Sintaxis:
LCDin direccin, [variable1, variable2,]
La instruccin LCDin carga el dato almacenado en una direccin de la
memoria RAM de la LCD en una variable previamente definida.
Ejemplo:
A VAR Byte
inicio:
LCDIn $10,[A]
Espera:
GoTo Espera
End
329
LCDout
Sintaxis:
LCDout comando, dato
La instruccin Lcdout enva datos especficos a una pantalla LCD
Alfanumrica para que puedan ser mostrados en la misma.
Comando
$FE, 1
$FE, 2
$FE, $0C
$FE, $0E
$FE, $0F
$FE, $10
$FE, $14
$FE, $C0
$FE, $90
$FE, $D0
Accin
Limpia la pantalla
Retorna al inicio de la primera lnea
Apaga el Cursor
Cursor bajo (Underline "_") activo
Cursor intermitente activo
Mueve el cursor un espacio a la izquierda
Mueve el cursor un espacio a la derecha
Mueve el cursor al inicio de la segunda lnea
Mueve el cursor al inicio de la tercera lnea
Mueve el cursor al inicio de la cuarta lnea
Tabla 15.2.
Ejemplo:
Pause 200
LCDOut
LCDOut
LCDOut
LCDOut
LCDOut
LCDOut
$fe, 1
$fe, 2
Inicio:
GoTo Inicio
End
330
LOW
Sintaxis:
LOW pin
La instruccin LOW coloca en cero lgico un pin especfico.
Ejemplo:
inicio:
Low PORTA.0
espera:
GoTo espera
End
NAP
Sintaxis:
NAP periodo
La instruccin NAP pone el microcontrolador en modo de bajo consumo de
energa por periodos de tiempo definidos en la siguiente tabla:
331
Periodo
0
1
2
3
4
5
6
7
Retardo (ms)
18
36
72
144
288
576
1152
2304
Tabla 15.3.
Ejemplo:
inicio:
NAP 6
espera:
GoTo espera
End
OUTPUT
Sintaxis:
OUTPUT pin
La instruccin OUTPUT configura un pin especfico como salida.
Ejemplo:
inicio:
OUTPUT PORTA.0
espera:
GoTo espera
End
332
PAUSE
Sintaxis:
PAUSE periodo
La instruccin Pause realiza una pausa en el programa por un periodo
definido en milisegundos. Esta instruccin no pone al microcontrolador en
modo de bajo consumo de energa.
Ejemplo:
inicio:
High PORTA.0
' RA0 = 1
Pause 1000
Low PORTA.0
' RA0 = 0
Pause 1500
GoTo inicio
End
PAUSEUS
Sintaxis:
PAUSEUS periodo
La instruccin PauseUs realiza una pausa en el programa por un periodo
definido en microsegundos. Esta instruccin no pone al microcontrolador en
modo de bajo consumo de energa.
Ejemplo:
333
inicio:
High PORTA.0
' RA0 = 1
PauseUs 200
Low PORTA.0
' RA0 = 0
PauseUs 1500
GoTo inicio
End
POT
Sintaxis:
POT pin, escala, variable
La instruccin POT lee un potencimetro, foto celda, termistor, o cualquier
otro dispositivo capaz de variar su valor resistivo. Bsicamente esta
instruccin calcula el tiempo de descarga del condensador C1 el cual vara
segn el valor resistivo presente en la resistencia variable.
Pin: especifica el pin del puerto en el cual se va a conectar el potencimetro.
Escala: Es una variable o constante que aumenta o disminuye el rango de
lectura en un porcentaje determinado. Esta escala es utilizada para ajustar el
rango de salida en la lectura del dispositivo, y es afectada directamente por
las constantes RC. El valor de la escala ser correcto cuando el valor cargado
en la variable se aproxime a cero, cuando la resistencia medida sea mnima; y
tambin cuando el valor de la variable se aproxime a 255, cuando la
resistencia medida sea mxima.
Variable: es una variable en la cual se almacena el resultado obtenido de la
lectura del potencimetro o componente resistivo.
334
PULSIN
Sintaxis:
PULSIN pin, nivel, variable
La instruccin PULSIN mide la duracin de un pulso alto o bajo con una
resolucin de 10 microsegundos para un oscilador de 4 Mhz y el valor
obtenido es almacenado en una variable definida de 8 bits (variable tipo byte)
o 16 bits (variable tipo Word).
Pin: especifica el pin del puerto en el cual se introducirn los pulsos.
Nivel: define si la medicin se hace en nivel alto o bajo. (1 = alto, 0 = bajo).
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:
Define OSC 4
Pause 200
LCDOut $fe, 1
Inicio:
LECTURA = 0
PulsIn PORTB.0,1,LECTURA
LCDOut $fe, 2
' Posiciona el cursor en el inicio
LCDOut "Lect. en ms:",#LECTURA," "
' Muestra mensaje y
' dato por pantalla
Pause 1000
' Pausa de 1 segundo
GoTo Inicio
' Salta a inicio
End
335
PULSOUT
Sintaxis:
PULSOUT pin, nivel, variable
La instruccin PULSOUT genera pulsos con una duracin definida en
decenas de microsegundos. (Tiene una resolucin de 10 microsegundos
para un oscilador de 4 Mhz).
Ejemplo:
DEFINE OSC 4
Inicio:
PulsOut PORTB.0,100
Pause 1
GoTo Inicio
End
'
'
'
'
PWM
Sintaxis:
PWM pin, nivel, ciclo
La instruccin PWM enva pulsos PWM (Pulse Width Modulation) a un pin
especfico.
Pin: especifica el pin del puerto en el cual se genera PWM.
Nivel: es una variable o constante que determina la duracin del pulso en su
nivel alto, es decir, partiendo de nivel = 1 si se incrementa este valor, el ancho
de pulso positivo se incrementa hasta nivel = 254 donde el ciclo de trabajo es
336
Ejemplo:
DEFINE OSC 4
Inicio:
PWM PORTB.0,127,100
GoTo Inicio
End
RANDOM
Sintaxis:
RANDOM variable
La instruccin RANDOM almacena nmeros aleatorios en una variable de 16
Bits (Word).
Ejemplo:
A0 VAR Word
Pause 200
LCDOut $fe, 1
Inicio:
Random A0
337
LCDOut $fe, 2
' Posiciona el cursor en el inicio
LCDOut "RANDOM: ",#A0,"
"
' Muestra mensaje y
' dato por pantalla
Pause 1500
GoTo Inicio
End
READ
Sintaxis:
READ direccin, variable
La instruccin READ permite leer datos desde la memoria EEPROM de
datos de un microcontrolador almacenndolos en una variable previamente
definida.
Ejemplo:
' Declaracin de Variables:
I VAR Byte
DIRECCION VAR Byte
DATO VAR Byte
WRITE
WRITE
WRITE
WRITE
WRITE
1,
2,
3,
4,
5,
3
5
7
9
11
'
'
'
'
'
Escribe
Escribe
Escribe
Escribe
Escribe
en
en
en
en
en
la
la
la
la
la
memoria
memoria
memoria
memoria
memoria
de
de
de
de
de
datos
datos
datos
datos
datos
DIRECCION = 1
Pause 200
LCDOut $fe, 1
Inicio:
For I = 1 To 5
338
Read DIRECCION,DATO
LCDOut $fe, 2
"
DIRECCION = DIRECCION + 1
Pause 1500
Next I
End
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
La instruccin REVERSE cambia el estado de un pin I/O, es decir, si el pin
es entrada, ste pasa a ser salida. Si un pin es salida, ste pasa a ser
entrada.
Ejemplo:
TRISB = %00000000
Inicio:
High PORTB.5
Pause 1000
Low PORTB.5
Reverse PORTB.5
End
'
'
'
'
RB5 = 1
Pausa de 1 segundo
RB5 = 0
RB5 ahora es entrada
SELECT CASE
Sintaxis:
SELECT CASE variable
La instruccin SELECT CASE es un condicional que permite seleccionar
entre un nmero determinado de subrutinas.
Ejemplo:
' Declaracin de Variables
I VAR Byte
Z VAR Byte
Pause 200
LCDOut $fe, 1
340
Z = 0
Inicio:
Z = Z + 1
If Z = 4 Then Final
Select Case Z
Case 1
LCDOut $fe, 2
LCDOut "Select Case 1"
Pause 1500
GoTo Inicio
'
'
'
'
'
'
'
'
'
'
'
'
Case 2
LCDOut $fe, 2
LCDOut "Select Case 2"
Pause 1500
GoTo Inicio
Case 3
LCDOut $fe, 2
LCDOut "Select Case 3"
Pause 1500
GoTo Inicio
End Select
Final:
GoTo Final
End
341
SERIN
Sintaxis:
SERIN pin, modo,{tiempo, etiqueta}, variable
La instruccin SerIn se encarga de recibir uno o mas valores a travs de un
pin especfico usando el formato asncrono estndar 8N1 que significa 8 bits
de datos, sin revisin de paridad y 1 bit de parada (stop). SerIn trabaja por
defecto con un oscilador de 4 Mhz y para 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
Modo: define la velocidad de transmisin en baudios.
Tiempo: este campo es opcional al igual que el campo etiqueta y su objetivo
es establecer un tiempo en milisegundos definido por el programador, el cual
una vez vencido, har que se realice un salto a la etiqueta tambin definida
por el programador.
Variable: en este campo se especifica la variable en la cual se desea sean
almacenados los datos recibidos.
Ejemplo:
Symbol T9600
dato var Byte
= 2
Pause 500
LCDOut $fe, 1
Inicio:
SerIn PORTC.7, T9600, dato
342
"
End
SEROUT
Sintaxis:
SEROUT pin, modo, [variable]
La instruccin SerOut se encarga de enviar uno o mas valores a travs de
un pin especfico usando el formato asncrono estndar 8N1 que significa 8
bits de datos, sin revisin 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.
Modo: define la velocidad de transmisin en baudios y emplea la misma tabla
de la instruccin SerIn.
Variable: en este campo se especifica la variable que contiene los datos que
sern enviados a travs de pin especificado.
Ejemplo:
Symbol T9600
I VAR Byte
= 2
Inicio:
For I = 0 To 9
' Repeticin de 0 a 9
Next I
343
GoTo Inicio
End
SLEEP
Sintaxis:
SLEEP perodo
La instruccin SLEEP lleva a un estado de bajo consumo de energa a un
microcontrolador por un perodo de tiempo definido en segundos.
Ejemplo:
Inicio:
Sleep 10
Espera:
GoTo Espera
End
SWAP
Sintaxis:
SWAP variable, variable
La instruccin SWAP intercambia el contenido de dos variables.
Ejemplo:
A1 VAR Byte
B1 VAR Byte
344
A1 = 10
B1 = 15
Pause 200
LCDOut $fe, 1
Inicio:
Swap A1,B1
End
TOGGLE
Sintaxis:
TOGGLE pin
La instruccin TOGGLE invierte el estado lgico de un pin especfico, es
decir, si un pin se encuentra en estado lgico cero (0), ste pasa a ser uno
lgico (1) y viceversa.
Ejemplo:
High PORTA.0
Inicio:
Toggle PORTA.0
Pause 1000
345
GoTo Inicio
End
WHILE-WEND
Sintaxis:
WHILE
condicin
...instrucciones...
WEND
La instruccin WHILE WEND mantiene la ejecucin de las instrucciones
involucradas, es decir, entre While y Wend, hasta que se cumpla la condicin
establecida.
Ejemplo:
A VAR Byte
A = 0
Pause 200
LCDOut $fe, 1
Inicio:
While A < 5
High PORTB.0
Pause 1000
Low PORTB.0
PAUSE 1000
'
'
'
'
A = A + 1
RB0 =
Pausa
RB0 =
Pausa
1
de 1 segundo
0
de 1 segundo
Wend
346
End
WRITE
Sintaxis:
WRITE direccin, variable
La instruccin WRITE almacena datos en la memoria EEPROM de un
microcontrolador en una direccin especfica.
Ejemplo:
Inicio:
WRITE
WRITE
WRITE
WRITE
WRITE
1,
2,
3,
9,
5,
$03
$A1
7
13
$F0
'
'
'
'
'
Escribe
Escribe
Escribe
Escribe
Escribe
en
en
en
en
en
la
la
la
la
la
direccin
direccin
direccin
direccin
direccin
espera:
GoTo espera
End
347
Apndice 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:
El programador se identifica en el software como P16PRO y usted deber
seleccionarlo en el campo correspondiente como se muestra en la Figura
A.10.
Figura A.10.
354
Figura A.11.
355
Figura A.12.
El software tambin cuenta con ayuda visual para saber la posicin 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 posicin adecuada para evitar daos
irreversibles en el dispositivo.
356
Figura A.13.
357
Apndice B
Tabla ASCII
Key
NUL (null)
Ctrl-@
Ctrl-A
Ctrl-B
Ctrl-C
Ctrl-D
ENQ (enquiry)
Ctrl-E
ACK (acknowledge)
Ctrl-F
BEL (bell)
Ctrl-G
Ctrl-H
BS (backspace)
HT (horizontal tab)
Ctrl-I
10
LF (line feed)
Ctrl-J
Ctrl-K
11
VT (vertical tab)
12
FF (form feed)
Ctrl-L
13
CR (carriage return)
Ctrl-M
14
SO (shift out)
Ctrl-N
15
SI (shift in)
Ctrl-O
16
10
Ctrl-P
17
11
Ctrl-Q
18
12
Ctrl-R
19
13
Ctrl-S
20
14
Ctrl-T
21
15
22
16
Ctrl-V
23
17
Ctrl-W
24
18
CAN (cancel)
Ctrl-X
25
19
EM (end of medium)
Ctrl-Y
26
1A SUB (substitute)
Ctrl-Z
27
1B
Ctrl-[
28
1C FS (file separator)
Ctrl-\
29
1D GS (group separator)
Ctrl-]
30
1E
RS (record separator)
Ctrl-^
31
1F
US (unit separator)
Ctrl-_
ESC (escape)
Tabla B.1.
Fuente: http://www.melabs.com/resources/pbpmanual/
358
32
20
Space
64
40
96
60
33
21
65
41
97
61
34
22
"
66
42
98
62
35
23
67
43
99
63
36
24
68
44
100
64
37
25
69
45
101
65
38
26
&
70
46
102
66
39
27
'
71
47
103
67
40
28
72
48
104
68
41
29
73
49
105
69
42
2A
74
4A
106
6A
43
2B
75
4B
107
6B
44
2C
76
4C
108
6C
45
2D
77
4D
109
6D
46
2E
78
4E
110
6E
47
2F
79
4F
111
6F
48
30
80
50
112
70
49
31
81
51
113
71
50
32
82
52
114
72
51
33
83
53
115
73
52
34
84
54
116
74
53
35
85
55
117
75
54
36
86
56
118
76
55
37
87
57
119
77
56
38
88
58
120
78
57
39
89
59
121
79
58
3A
90
5A
122
7A
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
Apndice C
360
361
Bibliografa
INTERNET:
Microchip Technology Inc., http://www.microchip.com
microEngineering Labs, Inc., http://www.melabs.com
Mecanique, http://www.mecanique.co.uk
Picallw, http://www.picallw.com
Wikipedia, http://es.wikipedia.org
Linx Technologies, http://www.linxtechnologies.com
Empresas:
microEngineering Labs, Inc.
Box 60039
Colorado Springs CO 80960
Tel. (719) 520-5323
Fax. (719) 520-1867
http://www.melabs.com
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