Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Proye84 PDF
Proye84 PDF
Captulo 2
Proyectos con
el PIC16F84
23
24
+5V
Interruptores 1K
+5V
1K
VDD
13 RB7
12 RB6
RA2
11 RB5
10 RB4
9 RB3
8 RB2
RA1
RA0
17
18
16
17
15
+5V
330 LED
PIC16F84
7 RB1
6 RB0
RA4/TOCKI
20pF
4MHz
RA3
Buffer
ULN2803
18
1
2
MCLR
16 OSC1
15 OSC2
20pF
4
+5V
10K
VSS
5
100
RESET
25
Programar
puertos
Leer puerto B
(interruptores)
Invertir el valor
ledo
Pasar dato al
puerto A
org
goto
0
inicio
org
inicio
bsf
movlw
movwf
movlw
movwf
bcf
status,5
0f0h
trisa
0ffh
trisb
status,5
;se
;se
;se
;se
;se
;se
ciclo
movf
xorlw
ptob,w
0ffh
movwf
goto
ptoa
ciclo
end
;=============================================================================
;
Fusibles de programacin
;
Osc
XT
;
Watchdog
OFF
;
Code protect
OFF
;
Power-Up-Timer
ON
;
Micro.
PIC16F84
;======================================================================
+5V
13
12
11
10
9
+5V
8
Pulsador
1K
7
6
RB7
14
VDD
RB6
RA2
RB5
RA1
RB4
RA0
20pF
15
18
17
RB2
RB1
RA4/TOCKI
16
VCC
GND
8
f 15
14
g
CC
+5V
+5V
VSS
5
Ctodo comn
OSC1
OSC2
330
d 10
e 9
RB0
a 13
b 12
c 11
9368
PIC16F84
MCLR
16
RB3
20pF
4MHz
RA3
100
2N3904
2.7K
10K
RESET
27
Programar
puertos
Inicia conteo
en 0
Tecla
NO
presionada
?
SI
Incrementar
contador
Retardo (ms)
retardo
top2
top
28
org
5
;el programa empieza en la direccin de memoria 5
;subrutina de retardo de 100 milisegundos
movlw
D100'
;el registro loops contiene el nmero
movwf
loops
;de milisegundos del retardo
movlw
D110'
;
movwf
loops2
;
nop
nop
nop
nop
nop
nop
decfsz
loops2
;pregunta si termin 1 ms
goto
top
decfsz
loops
;pregunta si termina el retardo
goto
top2
retlw
0
ciclo
pulsa
bsf
movlw
movwf
movlw
movwf
bcf
clrf
movf
movwf
call
status,5
0f0h
trisa
0ffh
trisb
status,5
conta
conta,w
ptoa
retardo
btfsc
goto
call
btfsc
goto
incf
movf
xorlw
btfsc
goto
goto
end
ptob,0
pulsa
retardo
ptob,0
pulsa
conta
conta,w
0ah
status,z
inicio
ciclo
;======================================================================
;
Fusibles de programacin
;
Osc
XT
;
Watchdog
OFF
;
Code protect
OFF
;
Power-Up-Timer
ON
;
Micro.
PIC16F84
;======================================================================
29
1K
13
12
11
10
+5V
9
8
1K
7
6
RB7
14
VDD
RA2
RB5
RA1
RB4
RA0
15
18
17
RB2
RB1
16
VCC
PIC16F84
RA4/TOCKI 3
RB0
GND
8
100
e 9
15
f
14
g
+5V
2N3904
+5V
VSS
5
Ctodo comn
OSC1
OSC2
a 13
b 12
c 11
d 10
9368
RB3
MCLR
16
20pF
RA3
RB6
20pF
4MHz
+5V
+5V
+5V
100
2.7K
10K
RESET
Programar
puertos
Iniciar display
Leer puertos
Tecla
NO
presionada
?
SI
Mostrar datos
en display
org
goto
org
0
inicio
5
retardo
31
top2
top
inicio
ciclo
leer
sigue
salir
movwf
movlw
movwf
nop
nop
nop
nop
nop
nop
decfsz
goto
decfsz
goto
retlw
loops
D110'
loops2
loops2
top
loops
top2
0
;pregunta si termin 1 ms
bsf
movlw
movwf
movlw
movwf
bcf
status,5
0f0h
trisa
0ffh
trisb
status,5
;se
;se
;se
;se
;se
;se
movlw
movwf
movf
movwf
call
0ffh
conta
conta,w
ptoa
retardo
movf
xorlw
btfsc
goto
ptob,w
0ffh
status,z
inicio
movwf
clrf
rrf
rota
conta
rota
btfsc
goto
status,c
salir
incf
conta
goto
sigue
goto
ciclo
end
;======================================================================
;
Fusibles de programacin
;
Osc
XT
;
Watchdog
OFF
;
Code protect
OFF
;
Power-Up-Timer
ON
;
Micro.
PIC16F84
;======================================================================
PIC16F84
RA0
RA1
RA2
RA3
+5V
Ctodo comn
100
13 a
12 b
16
VCC
9 e
15
f
14
g
+5V
2N3904
2.7K
14
VDD MCLR
D
C
11 c
10 d
+5V
B
A
13
12
11
10
RB7
RA0
RB6
RB5
RA1
RB4
9368
RA2
PIC16F84
GND
3
8
RA3
20pF
RB0
16
4MHz
15
20pF
0
1
OSC1
RB1
OSC2
RB2
RB3
VSS
5
33
El proceso se realiza a una gran velocidad, por lo que se tiene la sensacin que
todo el teclado se est sensando permanentemente. En el programa realizado, por
ejemplo, la exploracin total del teclado tarda menos de 60 s, si consideramos que
el oscilador es de 4 MHz.
Otro aspecto que no se puede olvidar, son los rebotes causados por la pulsacin
de una tecla. Cuando una tecla se oprime, sus contactos actan como resortes, y la
unin elctrica no es estable; se generan una serie de uniones y desuniones mecnicas durante un intervalo significativo de tiempo. Estos rebotes pueden dar lugar a
que, en una aplicacin real, el programa los interprete como si se hubieran generado
muchas pulsaciones, si es que no se toman los correctivos del caso. Para ello existen
34
LECTURA
DEL TECLADO
Colocar cero en
la primera fila
Desplazar
cero en filas
SI
El cero
est en la
cuarta
fila
?
Leer columnas
NO
NO
Alguna
columna est
en cero
?
SI
Rutina de
tratamiento de
tecla
TERMINAR
35
equ
equ
equ
equ
equ
85h
86h
02h
00h
00h
reset
org
goto
org
0
inicio
5
retardo
top2
top
tabla
inicio
ciclo
escan
probar
leer
salir
36
addwf
nop
retlw
retlw
nop
retlw
nop
nop
nop
retlw
pc
;sumar W al PC
0
1
;primera columna
;segunda columna
;tercera columna
;cuarta columna
bsf
movlw
movwf
movlw
movwf
bcf
movlw
movwf
swapf
movwf
call
clrf
movlw
movwf
movf
movwf
nop
movf
andlw
xorlw
btfss
goto
btfss
goto
bsf
rlf
movlw
addwf
goto
call
addwf
status,5
0f0h
trisa
0fh
trisb
status,5
00h
tecla
tecla,w
ptob
retardo
filas
b1110
rota
rota,w
ptoa
ptob,w
0fh
0fh
status,z
salir
rota,3
escan
status,c
rota
4
filas,1
probar
tabla
filas,w
tecla
ciclo
;======================================================================
;
Fusibles de programacin
;
Osc
XT
;
Watchdog
OFF
;
Code protect
OFF
;
Power-Up-Timer
ON
;
Micro.
PIC16F84
;======================================================================
VDD MCLR
RB7
RB6
RB5
RB4
RB3
RB2
RB1
RB0
PIC16F84
100
2.7K
2N3904
2N3904
2N3904
2N3904
RA3
2.7K
2.7K
RA2
20pF
16
4MHz
15
20pF
2.7K
OSC1
RA1
OSC2
RA0
VSS
5
37
las bases de stos para que el transistor se comporte como un interruptor cerrado
y se presente dicha corriente. Pero an cuando los transistores se comporten
como interruptores cerrados, no se encender ningn display si la salida del
puerto que maneja los segmentos tiene niveles lgicos bajos (ceros); para encenderlo, es necesario colocar un nivel lgico alto en el pin de salida correspondiente a cada segmento.
As por ejemplo, si queremos mostrar un tres en el segundo display menos significativo debemos establecer bsicamente los siguientes pasos:
Colocar el nmero binario 0010 en el puerto que controla los transistores
Enviar el nmero binario 01001111 por el puerto que controla los segmentos
Un buen observador encontrar que aunque los anteriores pasos consiguen el
objetivo propuesto (mostrar en la pantalla el 3-, en donde la lnea quiere decir
espacios en blanco), este proceso puede conllevar efectos indeseados. Aqu, por
ejemplo, si el puerto que controla los segmentos tena un valor diferente del
binario 00000000 o de 01001111, entre la ejecucin de los dos pasos dados se
mostrar en el display un nmero o un smbolo que es diferente del valor deseado. Por ello, es conveniente apagar momentneamente los segmentos, de tal
manera que nos permita seleccionar adecuadamente el display en cuestin y posterior a esto, enviar el dato correcto a los segmentos; por lo tanto, un paso 0 que
se debe agregar a este proceso es colocar el nmero binario 00000000 en el
puerto que controla los segmentos.
Otra opcin que permite obtener el mismo resultado, con un proceso diferente,
sera la siguiente:
0. Colocar el nmero binario 0000 en el puerto que controla los transistores
1. Enviar el nmero binario 01001111 por el puerto que controla los segmentos
2. Colocar el nmero binario 0010 en el puerto que controla los transistores
Ambos procesos conllevan al mismo objetivo propuesto, eliminando la posibilidad de los efectos indeseados.
Ahora, si pretendemos visualizar no uno sino los cuatro displays de siete segmentos, es necesario empezar a controlar los transistores secuencialmente a la vez
que se enva por el puerto que controla los segmentos los datos correspondientes
al display en cuestin, realizando este proceso a una velocidad tal que de nuevo
parezca que el proceso se est realizando simultneamente sobre todos los displays. El tiempo en que necesitamos sostener el dato en cada display puede variar
significativamente, dependiendo fundamentalmente del valor de las resistencias
limitadoras, del nmero de dgitos que se tengan por mostrar y de las caractersticas propias del display; experimentalmente se encuentra que mostrar cada dgito
durante 3 milisegundos, cuando se tienen resistencias limitadoras de 100 ohm,
proporcionan un brillo aceptable de un display estndar y una buena visualizacin a una distancia prudente.
38
Visualizacin
en DISPLAY
Apuntar al
primer digito
Colocar uno en
transistor que
habilita el display
menos significativo
Leer dato
sealado por
puntero
Incrementar
puntero
Enviar dato
a segmentos
Retardo para
visualizacin
Rotar uno
en
transistores
Enviar ceros a
los segmentos
NO
el
uno de
habitacin de
display est
en el cuarto
transistor
?
SI
39
retardo
top2
top
org
goto
0
inicio
org
tabla
inicio
bsf
movlw
movwf
movlw
movwf
bcf
movlw
movwf
movlw
01
dig1
02
40
empe
disp
movwf
movlw
movwf
movlw
movwf
dig2
03
dig3
04
dig4
movlw
movwf
movlw
movwf
movlw
movwf
movlw
movwf
movf
movwf
movf
;call
movwf
call
btfsc
goto
bcf
rrf
incf
goto
00
ptoa
08h
rota
dig1
fsr
00h
ptob
rota,w
ptoa
indo,w
tabla
ptob
retardo
rota,0
empe
status,c
rota
fsr
disp
end
;======================================================================
;
Fusibles de programacin
;
Osc
XT
;
Watchdog
OFF
;
Code protect
OFF
;
Power-Up-Timer
ON
;
Micro.
PIC16F84
;======================================================================
41
14
VDD MCLR
RB3
RB2
RB1
RB0
16
g
f
e
d
9368 c
b
a
3 8
PIC16F84
100
g
f
e
d
c
b
a
2.7K
2N3904
2N3904
2N3904
2.7K
2.7K
RA3
2.7K
20pF
RA2
16
4MHz
15
20pF
OSC1
RA1
OSC2
RA0
VSS
5
RB0
RB1
RB2
RB3
RA0
RA1
RA2
RA3
RB4
RB5
RB6
RB7
+5V
a
b
A
c
B
d
7447
e
C
f
D
g
+5V
+5V
a
b
c
d
e
f
g
+5V
2N3904
Aqu se resumen los anteriores ejemplos para crear uno slo. El disparo del transistor es simultneo con la salida del dato para activar cada segmento dentro del
display, as que no es necesario preocuparse con apagar previamente los LED, antes
de rotar el cero en las bases de los transistores.
Aqu dejamos al experimentador el desarrollo de los programas necesarios para
leer el teclado y visualizar de manera simultnea la informacin en el display;
puede tomar los programas anteriores como base. Con la prctica encontrar que
puede mejorar estas rutinas y configuraciones, logrando minimizar el diseo y los
costos, y maximizar el rendimiento.
43
1 A0
VCC 8
2 A1
WP 7
3 A2
SCL 6
4
1 VSS
SDA 5
1,2,3
4
5
6
7
A0, A1, A2
VSS
SDA
SCL
WP*
VCC
24XX
Este dispositivo no requiere de un pin habilitador o chip select, ya que en este esquema
la transferencia de informacin solo se puede iniciar cuando el bus est libre. En este caso,
como cada dispositivo tiene su direccin determinada mediante los pines A0, A1 y A2;
solamente responder la memoria cuya direccin coincida con la direccin que va encabezando la trama de informacin. En la figura 2.21 se muestra la capacidad de almacenamiento de estos dispositivos y las posibilidades de direccionamiento que tienen.
Referencia
Capacidad
en K bits
Bloques
internos
24LC01B, 24C01
24LC02B, 24C02
24LC04B, 24C04
24LC08B
24LC16B
1
2
4
8
16
1
1
2
4
8
A0
A1
A2
10 10 10
10 10 10
X 10 10
X
X 10
X
X
X
Dispositivos
en el bus
8
8
4
2
1
45
SCL
SDA
1
A2 A1 A0 W Ack A7 A6 A5 A4 A3 A2 A1 A0 Ack
1. Start bit
2. Cdigo 1010 (propio de las 24XX)
3. Direccin del dispositivo en el bus
4. W = 0 para escribir
d7 d6 d5 d4 d3 d2 d1 d0 Ack d7 d6 d5 d4 d3 d2 d1 d0 Ack d7
Primer byte de datos
B. Escritura de byte
SCL
SDA
1 0
SD
*1
0 A2 A1 A0 R Ack d7 d6 d5 d4 d3 d2 d1 d0 Ack d7
1. Start bit
2. Cdigo 1010 (propio de las 24XX)
3. Direccin del dispositivo en el bus
4. R = 1 para leer
7 8
C. Lectura de byte
A0
VCC
A1
WP
A2
SCL
VSS
SDA
+5V
8
7
4.7K
13
12
RB7
+5V
+5V
14
VDD
16
VCC
RA3
RA2 1
RA1 18
RB6
READ
9 RB3
8
RB2
7
RB1
6
RB0
+5V
1K
READ/WRITE
RA4/TOCKI
c 11
3
3
Ctodo comn
a 13
b 12
9368
PIC16F84
20pF
GND
8
d 10
9
e
15
f
g 14
+5V
MCLR 4
16
4MHz
6 D
2 C
1 B
17 7
A
RA0
11 RB5
10 RB4
+5V
15
+5V
OSC1
OSC2
VSS
100
2N3906
2.7K
10K
RESET
20pF
WAIT
top2
top
org
goto
org
00h
;Vector de reset
INICIO
03h
movlw
movwf
nop
nop
.110
loops2
47
;pregunta si termino 1 ms
.100
loops
WAIT
0
BSTART
BSTOP
BITOUT
clkout
48
loops2
top
loops
top2
0
ptob,sclk
0
BITIN
TX
TXLP
RX
RXLP
LEER
49
INICIO
ini2
ciclo
pulsa
50
slave,w
txbuf
TX
;selecciona el dispositivo
;
;envia esa informacin a la memoria
RX
eeprom,do
BITOUT
BSTOP
0
status,5
0f0h
trisa
07fh
trisb
status,5
b10100000'
slave
addr
LEER
0ah
rxbuf,w
status,c
ciclo
conta
datao
ESCRIB
LEER
rxbuf,w
conta
ptoa
retardo
ptob,0
pulsa
retardo
ptob,0
pulsa
conta
conta,w
datao
ESCRIB
conta,w
0ah
status,z
ciclo
ini2
51
Pin 14
Pin 1
Pin 14
Pin 1
cin, sta se maneja a travs de dos pines que normalmente se conectan a +5V y a
tierra. Para evitar que se presenten altas temperaturas, debido a la luz posterior, estos
pines se deben manejar de manera pulsante (encendiendo y apagando), con una frecuencia de aproximadamente 60 Hz. Otra opcin mucho ms sencilla es utilizar una
resistencia de 10 ohmios (a 1/2W) para alimentar el positivo del backlight.
Los pines de conexin de estos mdulos incluyen un bus de datos de 8 bits, un pin
de habilitacin (E), un pin de seleccin, que indica que el dato es una instruccin
o un caracter del mensaje (RS) y un pin que indica si se va a escribir o leer en el
mdulo LCD (R/W). La figura 2.26 describe la funcin de cada uno de ellos.
Terminal Smbolo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Vss
Vdd
Vo
RS
R/W
E
D0
D1
D2
D3
D4
D5
D6
D7
Nombre y Funcin
Tierra, 0V
Alimentacin +5V
Ajuste de Voltaje de contraste
Seleccin Dato/Control
Lectura/escritura en LCD
Habilitacin
D0 Bit menos significativo
D1
D2
D3
D4
D5
D6
D7 Bit ms significativo
a) Instruccin
de control
RS
R/W
450ns
140ns
E
BUS_DATOS
b) Dato
VALIDO
RS
R/W
450ns
140ns
E
BUS_DATOS
VALIDO
53
Segn la operacin que se desee realizar sobre el mdulo de cristal lquido, los
pines de control E, RS y R/W deben tener un estado determinado. Adems, debe
tener en el bus de datos un cdigo que indique un caracter para mostrar en la
pantalla o una instruccin de control. En la figura 2.27 se muestra el diagrama de
tiempos que se debe cumplir para manejar el mdulo.
El mdulo LCD responde a un conjunto especial de instrucciones, estas deben ser
enviadas por el microcontrolador o sistema de control al display, segn la operacin que se requiera. Estas instrucciones se emplean en los ejemplos que realizaremos ms adelante, en ellos se explica la forma de utilizarlas. En la figura 2.28 se
muestran las instrucciones del mdulo.
La interface entre el microcontrolador y el display de cristal lquido se puede
hacer con el bus de datos trabajando a 4 u 8 bits. Las seales de control trabajan de la misma forma en cualquiera de los dos casos, la diferencia se establece en el momento de iniciar el sistema, ya que existe una instruccin que permite establecer dicha configuracin. Estas conexiones se explican ms adelante en forma detallada.
Control y dato
INSTRUCCIONES
Seal de
control
DATO/DIRECCION
DESCRIPCION
RS
RW
D7
D6
D5
D4
D3
D2
D1
D0
Borrar pantalla
Cursor a casa
Seleccionar modo
1/D
Encender/apagar pantalla
Desplazar Cursor/Pantalla
S/C
R/L
D/L
Acticar funcin
CG RAM
DD RAM
Bandera de ocupado
BF
AC
Escritura de Dato
Lectura de Dato
Lectura de la bandera Busy Flag, indicando que operaciones internas son realizadas,
y lectura de los contenidos del contador de direcciones.
Escribe datos en la RAM DD o en la RAM CG.
Lectura de datos desde la RAM DD o la RAM CG
RL =
=
DL =
=
BF =
=
1 Incrementa
0 Decrementa
1 Desplaza el mensaje en la pantalla
0 Mensaje fijo en la pantalla
1 Encender (activar) la pantalla
0 Apagar la pantalla (desactivar)
1 Activar cursor
0 Desactivar cursor
1 Parpadea caracter sealado por el cursor
0 No parpadea el caracter
1 Desplaza pantalla
0 Mueve cursor
1 Desplazamiento a la derecha
0 Desplazamiento a izquierda
1 Datos de ocho bits
0 Datos de cuatro bits
1 Durante operacin interna del mdulo
0 Finalizada la operacin interna
00H 01H 02H 03H 04H 05H 06H 07H 08H 09H 0AH 0BH 0CH 0DH 0EH 0FH 10H ... 1FH
R
E
V
I
S
T
A
E
&
C
20H 52H 45H 56H 49H 53H 54H 41H 20H 20H 45H 20H 26H 20H 43H 20H
40H 41H 42H 43H 44H 45H 46H 47H 48H 49H 4AH 4BH 4CH 4DH 4EH 4FH 50H ... 5FH
0
#
A N
I
V
E R S
A
R
I
3
20H 41H 4EH 49H 56H 45H 52H 53H 41H 52H 49H 4FH 20H 23H 33H 20H
Posicin de memoria de la segunda lnea
55
teres. El dato se puede deducir con la lista de las instrucciones que se muestra en la
figura 3. La rutina llamada CONTROL, se encarga de generar las seales y los
tiempos necesarios para que exista una correcta comunicacin.
3. El segundo dato (07H), le dice al mdulo que el mensaje se va a desplazar en la
pantalla.
4. El tercer dato (0CH), hace que se encienda el display.
5. El siguiente paso es entrar en un ciclo que hace una lectura de la tabla donde se
encuentra el mensaje y lo lleva a la memoria del mdulo LCD. Cuando se termina
de enviar todos los caracteres, se inicia el ciclo nuevamente.
Las rutinas CONTROL y DATO emplean las mismas instrucciones. La nica
diferencia es que cada una le da el nivel lgico adecuado al pin RS, que indica si el
dato enviado es un caracter del mensaje (un dato) o una instruccin de control.
En el modo que desplaza el mensaje en la pantalla se tiene un tiempo de espera
un poco largo antes de que aparezcan los caracteres en la pantalla, esto se debe a que
primero se llena o se carga la memoria de datos de la parte no visible.
+5V
+5V
2
+VCC
14
VDD MCLR
13
14
12
13
11
12
10
11
10
RB1 7
RB0 6
D1
D0
18
4 MCLR
17
RA0
VSS
5
RS
20pF
RB6
16
RB5
OSC1
4 MHz
+5V
RB4
OSC2
PIC16F84
20pF
15
RB3
RB2
10K
RESET
100
RA1
D7
D6
D5
D4
D3
D2
Mdulo LCD
RB7
+5V
VO
5K
Ajuste de
contraste
R/W GND
1
5
56
equ
equ
equ
equ
equ
equ
equ
13h
2h
0h
0h
1h
1h
0h
org
goto
org
00
inicio
05h
retardo movlw
movwf
decre
decfsz
goto
retlw
0ffh
r13
r13,r
decre
0
control bcf
goto
dato
bsf
dato2
bsf
movwf
call
bcf
call
retlw
ptoa,rs
dato2
ptoa,rs
ptoa,e
ptob
retardo
ptoa,e
retardo
0
tabla2
pc,r
"C"
"U"
"R"
"S"
"O"
" "
"D"
"E"
" "
"M"
"I"
"C"
"R"
"O"
"C"
"O"
"N"
"T"
"R"
"O"
"L"
"A"
"D"
"O"
"R"
"E"
"S"
" "
"P"
"I"
"C"
" "
"C"
"E"
"K"
"I"
"T"
" "
" "
" "
addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
;
;bandera de cero
;bandera de carry
;para almacenar en w
;para almacenar en el mismo registro
;vector de reset
57
movlw
tris
movlw
tris
begin
movlw
call
movlw
call
movlw
call
muestra movlw
movwf
ciclo
movf
call
call
movlw
movwf
reta1
call
call
decfsz
goto
incf
movlw
xorwf
btfss
goto
goto
end
" "
" "
0
0fch
ptoa
00h
ptob
30h
control
07h
control
0ch
control
0
r0c
r0c,w
tabla2
dato
09fh
r0d
retardo
retardo
r0d,r
reta1
r0c,r
28h
r0c,w
status,z
ciclo
muestra
;programacin de puertos
;segun el circuito
;
;
;inicia display a 8 bits y 1 lnea
;selecciona el modo de desplazamiento
;activa display
;inicia el envio de caracteres
;al mdulo
;hace barrido de la tabla
+5V
14
VDD
2
+VCC
20pF
RB6
16
RB5
OSC1
4 MHz
OSC2
+5V
RB4
10K
RESET
100
14
12
13
11
12
10
11
D7
D6
D5
D4
PIC16F84
20pF
15
13
4 MCLR
VSS
5
RB1
RB0
Mdulo LCD
RB7
+5V
VO
5K
Ajuste de
contraste
E
RS
R/W
5
GND
1
00
inicio
05h
retardo movlw
movwf
decre
decfsz
goto
retlw
0ffh
r13
r13,r
decre
0
limpia
limpi
r0c
" "
dato
r0c,r
50h
r0c,w
clrf
movlw
call
incf
movlw
xorwf
;vector de reset
;va a iniciar programa principal
59
status,z
limpi
0
control bcf
goto
dato
bsf
dato2
bsf
movwf
movlw
andwf
movf
andlw
iorwf
call
bcf
call
bsf
movlw
andwf
swapf
andlw
iorwf
call
bcf
call
retlw
ptob,rs
dato2
ptob,rs
ptob,e
r0e
0fh
ptob,r
r0e,w
0f0h
ptob,r
retardo
ptob,e
retardo
ptob,e
0fh
ptob,r
r0e,w
0f0h
ptob,r
retardo
ptob,e
retardo
0
tabla
addwf
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
retlw
pc,r
" "
" "
"R"
"E"
"V"
"I"
"S"
"T"
"A"
" "
"E"
"&"
"C"
" "
" "
" "
" "
"C"
"E"
"K"
"I"
"T"
" "
"-"
" "
"P"
"E"
"R"
"E"
"I"
"R"
"A"
" "
0
movlw
tris
movlw
tris
movlw
0ffh
ptoa
0ch
ptob
02h
inicio
begin
60
;programacin de puertos
;segun el circuito
;
;
;inicia display a 4 bits
******
******
******
******
control
28h
control
0ch
control
06h
control
limpia
r0c
r0c,w
tabla
dato
0ffh
r0d
retardo
r0d,r
reta1
r0c,r
11h
r0c,w
status,c
ciclo
11h
r0c,w
status,z
line2
0c0h
control
21h
r0c,w
status,z
;borra display
;inicia contador de caracteres
;hace barrido de la tabla
ciclo
080h
control
blank
;
;ubica puntero de ram en la primera fila
pic16F84
wdt = off
osc = xt
cp = off
********
*******
*******
******
61
62
MSB
LSB
+5V
Idle
0V
Bit de
arranque
Bit de
parada
63
15 V
0
5V
0V
Indeterminado
5 V
1
15 V
65
lgico 0 y voltajes mayores a 2.0 para representar el valor lgico 1. Por lo general,
cuando se trabaja con familias TTL y CMOS se asume que un 0 es igual a cero
voltios y un 1 a +5 V.
Cuando la comunicacin que se pretende hacer es muy corta, se pueden conectar
directamente el transmisor y el receptor para hacer la transferencia de bits usando
los mismos niveles lgicos tradicionales de 0 y 5 V. Pero cuando la distancia es
mayor a los dos metros, la informacin digital se afecta notablemente por accin de
la atenuacin en el cable, el ancho de banda del mismo y la velocidad con que se
transmita. La interface RS-232C es una de las diferentes soluciones que hay para
esta situacin. Bsicamente consiste en cambiar los niveles lgicos de la salida o
envo de 0 y 5V a dos niveles de voltaje de magnitud mayor: uno positivo (+V) para
representar el cero lgico y uno negativo (-V) para representar el uno. En el equipo
receptor de la informacin se realiza el proceso contrario, los niveles positivos y
negativos que lleguen se convierten a los niveles lgicos tradicionales de 0 y 5V,
figura 2.36. Los niveles de voltaje son simtricos con respecto a tierra y son al
menos de +3V para el "0" binario y -3V para el "1". En la figura 2.37 se muestra un
ejemplo de la transmisin de un caracter sobre una lnea RS-232, incluyendo sus
respectivos niveles de voltaje.
EQUIPO 1
EQUIPO 2
+V
+V
~
~
1 = -V, 0 = +V
RECIBE
TRANSMITE
-V
-V
+V
+V
RECIBE
1 > 2.0V
0 < 0.8V
TRANSMITE
~
~
1 > 2.0V
0 < 0.8V
-V
-V
TIERRA
LSB
MSB
+5V
0V
-5V
Bit de
arranque
Bit de
parada
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
N Pin
1
2
3
4
5
6
7
8
9
Nombre de la seal
Detector de portadora (CD)
Recepcin de Datos (RxD)
Transmisin de Datos (TxD)
Datos listos en terminal (DTR)
Tierra (GND)
Datos listos para enviar (DSR)
Solicitud de envo (RTS)
Listo para envo (CTS)
Detector de tono (RI)
67
15 GND
C1- 3
14 T1OUT
C2+ 4
C2- 5
V- 6
MAXIM
MAX220
MAX232
MAX232A
T2OUT 7
13 R1IN
+
C1
12 R1OUT
11 T1IN
VCC 16
1
C1+
3 C1-
+
C2
4 C2+
5
10 T2IN
C2-
9 R2OUT
R2IN 8
C5
16 VCC
DOBLADOR DE
VOLTAJE
+5V A +10V
V+ 2 +10V
INVERSOR DE
VOLTAJE
+10V A -10V
+5V
400K
V-
11 T1IN
DIP/SO
ENTRADAS
TTL/CMOS
10 T2IN
+5V
400K
6 -10V
+ C4
T1OUT 14
T2OUT 7
SALIDAS
RS-232
CAPACITANCIA (F)
DISPOSITIVO C1
MAX220
4.7
C2
C3
C4
C5
4.7
10
10
4.7
MAX232
1.0
1.0
1.0
1.0
1.0
MAX232A
0.1
0.1
0.1
0.1
0.1
12 R1OUT
SALIDAS
TTL/CMOS
R1IN 13
5K
9 R2OUT
R2IN 8
5K
GND
15
ENTRADAS
RS-232
-0.3 a +6V
-0.3V a ( VCC - 0.3V)
30V
Voltajes de salida:
Tout
Rout
Proteccin Corto
Disipacin de Potencia
15V
-0.3V a (Vcc + 0.3V)
Continua
842 mW
TRANSMISOR
Voltaje de salida (carga 3K)
Entrada BAJA
Entrada ALTA
Velocidad
RECEPTOR
Rango de entrada
Entrada BAJA
Entrada ALTA
Resistencia de Entrada
Min.
Tp.
Mx.
5V
8V
1.4V
1.4V
200 Kb/seg.
0.8V
2V
30V
0.8V
1.3V
1.8V
5K
3K
2.4V
7K
MICROCONTROLADOR
VCC
1
10 F
16
C1+
3
C111
T1IN
12
9 R1OUT
R2OUT
10
T2IN
4
C2+
RX
TX
+
10 F -
+
10 F
+5V
+
- 10 F
5 C2-
T1OUT 14
13
R2IN 8
T2OUT 7
15
GND
MAX232
RS-232
IN
OUT
GND
+
- 10 F
GND
69
+
10F
+
1 C1+
+
10F 2
V+
3 C14 C2+
10F 5
C2-
6 V7 T2OUT
8 R21N
9
8
7
6
+5V
MAX232
+5V
VCC 16
GND 15
VDD
16
VCC
RB7
RB6
RA2
R1OUT 12
T11N 11
RB5
RA1
RB4
RA0
T2IN 10
R2OUT 9
+5V
6 D
2 C
RA3
1 B
7 A
9368
RB3
RB2
RB1
PIC16F84
RA4/TOCKI
Hacer estos
puentes en el
conector
20pF
4MHz
Conector DB9
hembra
Conectar al
computador
MCLR
3
GND
3
8
b
c
d
e
13
12
11
10
9
15
14
+5V
+5V
VSS
Ctodo comn
OSC1
OSC2
RB0
+5V
T1OUT 14
T11N 13
1K
+5V
10F
100
2N3906
2.7K
10K
RESET
20pF
71
siguiente significado:
cmd
Especifica la operacin a realizar
abyte
Es un caracter que se envia o recibe por el puerto serial
port
Es la identificacin del puerto serial (desde 0 para COM1
hasta 3 para COM4)
El parmetro cmd puede tener los siguientes valores y significados:
0
1
2
3
Para la inicializacin del puerto, el caracter abyte toma los siguientes valores y
los suma para obtener el dato correspondiente:
0x02
7 bits de datos
0x03
8 bits de datos
__________________
0x00
1 bit de parada
0x04
2 bits de parada
__________________
0x00
Sin paridad
0x08
Paridad impar
0x18
Paridad par
__________________
0x00
0x20
0x40
0x60
0x80
0xA0
0xC0
0xE0
110 bps
150 bps
300 bpss
600 bps
1200 bps
2400 bps
4800 bps
9600 baudios
73
Para configurar el puerto COM1 con los parmetros del ejemplo dado anteriormente, bastar con la instruccin:
bioscom(0,0x83,0);
Los programas en lenguaje C tienen su programa fuente con extensin .C, en este
caso el programa que recibe los datos del microcontrolador por el puerto COM1 se
llama RECIBE1.C. El programa que puede ejecutar el usuario se llama RECIBE1.EXE
y se puede correr desde el sistema operativo DOS. El listado completo se muestra en
la figura 2.44. Si se desea recibir los datos por el COM2 se debe usar la versin del
programa llamada RECIBE2.C y RECIBE2.EXE que tambin van en el disquete que
acompaa el curso. En la figura 2.45 se muestra un pantallazo del programa.
/* LA COMPUTADORA RECIBE LOS DATOS SERIALES ENVIADOS POR EL PIC */
#include <conio.h>
#include <stdio.h>
#include <dos.h>
#include <math.h>
#include <bios.h>
int puerto,COM1,COM2;
int k,j,dato;
/*definicin de variables*/
int config;
int COM1,COM2;
char lectura[1];
char dato1[2];
char leer()
{
do{
dato=bioscom(2,0x83,puerto);
/*leer dato recibido*/
} while (((dato<31)|(dato>127))&(!kbhit()));
return(dato);
}
void main(void)
{
COM1=0;
COM2=1;
puerto=COM1;
/* definir cual puerto se utiliza */
clrscr();
/*limpiar pantalla*/
config=0x83; /*configurar puerto: 1200 baudios,dato de 8 bits,
no paridad, 1 bit de parada*/
bioscom(0,config,puerto);
/*configuracion de los puertos*/
gotoxy(14,4);
printf("Curso de Microcontroladores PIC - CEKIT");
gotoxy(8,6);
printf("La computadora recibe los datos enviados por el micro - COM1");
gotoxy(29,8);
printf("Escape = Salir");
gotoxy(23,10);
printf("El dato del contador es:");
do{
if(!kbhit()) dato1[0]=leer();
if(!kbhit())
{
gotoxy(40,12);
printf("%1s",dato1);
}
}while(!kbhit());
clrscr();
printf("Elaborado por: Edison Duque");
}
75
equ
equ
equ
org
goto
org
0h
1h
6h
00
inicio
05h
;para almacenar en w
;para almacenar en el mismo registro
;vector de reset
;va a iniciar programa principal
unoymedio
;rutina para retardar bit y medio con un cristal de 4.00 mhz.
movlw
.249
;carga para 1250 seg. aproximadamente
goto
startup
;ir a ejecutar el tiempo
delay1 movlw
.166
;carga para 833 s aproximadamente
startup movwf
r0e
;llevar valor de carga al retardo
redo
nop
;limpiar circuito de vigilancia
nop
decfsz r0e
;decrementar retardo, saltar si cero
goto
redo
;repetir hasta terminar
retlw
0
;retornar
recibir nop
clrf
btfsc
goto
call
rcvr
movlw
movwf
rnext
bcf
btfsc
bsf
rrf
call
decfsz
goto
retlw
inicio
ciclo
bsf
movlw
movwf
movlw
movwf
bcf
clrf
clrf
call
movlw
subwf
movwf
goto
end
recep
ptob,rx
recibir
unoymedio
8
conta
status,c
ptob,rx
status,c
recep
delay1
conta
rnext
0
status,rp0
00h
trisa
0ffh
trisb
status,rp0
recep
ptoa
recibir
30h
recep,w
ptoa
ciclo
*/
#include <conio.h>
#include <stdio.h>
#include <bios.h>
int COM1,COM2,Puerto;
/*definicin de variables*/
int j,envio,configuracion;
int contador;
char tecla;
void main(void)
{
clrscr();
COM1=0;
COM2=1;
Puerto=COM1;
/*limpiar pantalla*/
/*constantes de los puertos del PC*/
/*Indicar si es COM1 o COM2*/
configuracion=0x83;
bioscom(0,configuracion,Puerto);
/*conf.puerto: 1200,8,N,1*/
/*inicializa el COM del PC*/
gotoxy(20,2);
printf( Curso de Microcontroladores PIC
);
gotoxy(8,5);
printf("Envio de datos seriales hacia el microcontrolador - COM1");
gotoxy(10,7);
printf("Enter = Incremento del contador
Escape = Salir");
gotoxy(24,10);
printf("El dato del contador es:");
contador=0;
do{
while(!kbhit());
clrscr();
printf("Elaborado por: Edison Duque");
}
77
+5V
Ctodo comn
VDD
+5V
1K
VCC
RA3
RB6
RA2
RB5
RA1
RB4
RA0
RB7
RB2
PIC16F84
RB1
9368
RB3
RA4/TOCKI
3 GND
RB0/INT
+5V
20pF
MCLR
2.7K
OSC1
OSC2
20pF
2N3904
+5V
VSS
10K
100
RESET
Figura 2.49. Circuito del contador decimal que se utiliza en los ejercicios
Uso de las interrupciones
Estos microcontroladores poseen varias fuentes de interrupcin: interrupcin externa, finalizacin del temporizador/contador, cambio en las lneas RB4 a RB7 y finalizacin de escritura en la EEPROM de datos. El registro 0Bh o INTCON contiene
los bits que corresponden a las banderas de estado de las interrupciones y los bits de
habilitacin para cada una de ellas, figura 1.14. Slo la bandera de finalizacin de la
escritura reside en el registro 88h o EECON1.
78
Si el bit GIE (Global Interrupt Enable) se coloca en 0 deshabilita todas las interrupciones. Cuando una interrupcin es atendida el bit GIE se coloca en 0 automticamente para deshabilitar otras interrupciones que se puedan presentar, la direccin
actual del PC se carga en la pila o stack y el PC se carga con el valor 04h, por lo
tanto, la parte del programa que atiende las interrupciones se debe esribir a partir de
dicha direccin. Una vez en la rutina de servicio, la fuente de interrupcin se puede
determinar examinando las banderas. Como la bandera que indica la causa se encuentra en "1", el programa debe encargarse de ponerla en "0" nuevamente antes de
salir de la rutina que atiende las interrupciones, esto es para evitar que se vuelva a
atender la misma interrupcin en repetidas veces.
La instruccin RETFIE permite al usuario retornar de la interrupcin, a la vez que
habilita de nuevo las interrupciones, ya que pone el bit GIE en "1" automticamente. A
continuacin veremos ejemplos de como trabajan algunas de las interrupciones:
Interrupcin externa. Acta en el pin RB0/INT y puede ser configurada para activarse con el flanco de subida o el de bajada, de acuerdo al bit INTEDG del registro
OPTION, figura 1.15. Cuando se presenta un flanco vlido en el pin INT, la bandera
INTF (INTCON,1) se coloca en "1" y el contador de programa o PC salta a la direccin 04h. En ese momento se puede hacer la verificacin de la causa de la interrupcin consultando el estado de la bandera, si es del caso tambin se debe probar el
estado de alguno de los pines del microcontrolador para confirmar. La interrupcin
se puede habilitar o deshabilitar utilizando el bit de control INTE (INTCON,4) en
"0". Cuando se atiende la interrupcin en la rutina de servicio, el programa debe
poner la bandera INTF en "0", antes de regresar al programa principal.
El ejercicio que se ha tomado como ejemplo consiste en un contador decimal (0
a 9), el cual se incrementa cada vez que se presenta una interrupcin a travs del pin
INT, provocada por un pulsador externo conectado a dicho pin y que tiene una resistencia de 1 kohm conectada a la fuente de alimentacin para fijar un nivel lgico
alto en estado de reposo, en la figura 2.49 se tiene un recuadro con el pulsador que se
ha conectado al pin RB0/INT.
El programa que se graba en el microcontrolador se muestra en la figura 2.50 y
tiene las siguientes caractersticas:
- Una subrutina de retardo de 100 milisegundos que sirve para comprobar que el
pulsador si fue oprimido y descartar los pulsos de rebote.
- Al inicio se programan los puertos en los registros TRISA y TRISB, al igual que se
habilita la interrupcin externa con los bits respectivos en registro INTCON y
OPTION.
- El ciclo en que se queda enclavado el programa principal no hace nada, solamente
esperar a que se presente la interrupcin para atenderla.
- La rutina que atiende la interrupcin comprueba que el pulsador est oprimido,
adems de probar que se haya activado la bandera correspondiente a la interrupcin externa. Si las condiciones son favorables, se incrementa el contador y por lo
tanto el nmero que se muestra en el display.
Curso avanzado de Microcontroladores PIC
79
sale
org
goto
org
0
inicio
4
call
btfsc
goto
btfss
goto
incf
movf
xorlw
btfsc
clrf
movf
movwf
call
bcf
retardo
ptob,0
sale
intcon,1
sale
conta
conta,w
0ah
status,z
conta
conta,w
ptoa
retardo
intcon,1
retfie
retardo
top2
top
inicio
80
status,5
0f0h
trisa
0ffh
trisb
80h
opcion
status,5
90h
intcon
clrf
movf
movwf
conta
conta,w
ptoa
ciclo
nop
nop
goto
end
;======================================================================
;
Fusibles de programacin
;
Osc
XT
;
Watchdog
OFF
;
Code protect
OFF
;
Power-Up-Timer
ON
;
Micro.
PIC16F84
;======================================================================
81
sale
org
goto
org
0
inicio
4
call
btfss
goto
incf
movf
xorlw
btfsc
clrf
movf
movwf
call
bcf
retardo
intcon,0
sale
conta
conta,w
0ah
status,z
conta
conta,w
ptoa
retardo
intcon,0
;retardo
;confirma interrupcin por cambio en RB<7:4>
;si no lo es sale
;incrementa el contador
;carga el registro W con el valor del conteo
;hace operacin xor para ver si es igual a 0ah
;prueba si el contador lleg a 0ah (diez)
;si lleg a diez pasa el conteo a 0
;pasa el dato al display
;
;retardo de 100 milisegundos
;la bandera de la interrupcin se debe
;poner en 0 antes de regresar (RBIF)
;regresa al programa principal y habilita otra
;vez la interrupcin al poner el bit GIE en 1
retfie
retardo
top2
top
inicio
ciclo
status,5
0f0h
trisa
0ffh
trisb
status,5
88h
intcon
conta
conta,w
ptoa
ciclo
El ejercicio que realizamos para esta prueba consiste en el incremento del temporizador por medio del reloj interno del microcontrolador, dicho conteo est afectado por la mxima preescala que se puede seleccionar (divisin por 256). Como el
oscilador es un cristal de 4 MHz se tiene un ciclo de instruccin de 1 microsegundo,
por lo tanto, dado que el registro TMR0 es de 8 bits y que la preescala es de 256 , el
tiempo que se tarda en contar hasta 0FFh es de 256x256 microsegundos, es decir
65.536 microsegundos.
El tiempo logrado es muy pequeo para ser percibido , por lo que recurrimos a
establecer un contador dentro de la rutina que atiende las interrupciones, este se
incrementa cada vez que el programa pase por ese sitio, es decir cada 65,5 milisegundos. Cuando llegue a 10 har que se incremente el contador decimal que se ha
venido tratando en los otros ejercicios. De esta manera el experimentador ver que
el display se incrementa cada 0.65 segundos aproximadamente.
En el programa que se muestra en la figura 2.52 se explica cada uno de los pasos
que se llevan a cabo. Los valores con que al inicio se programan el registro INTCON y el registro OPTION, se pueden comparar con las tablas que se muestran en
las figuras 1.14 y 1.15 para entender mejor la funcin de cada uno de ellos.
Consideraciones especiales. Se debe tener en cuenta que el registro de trabajo W y
el registro de estados no se guardan cuando se atiende una interrupcin, por lo tanto
se recomienda almacenar su contenido en algn registro temporal ya que estos pueden sufrir cambios en la rutina que atiende dichas interrupciones, lo que puede causar errores cuando se regresa al programa principal.
Uso del circuito de vigilancia o watchdog timer
El watchdog es una herramienta que se utiliza para restablecer el programa del microcontrolador cuando este se ha salido de su flujo normal o se ha perdido por un
ruido o interferencia electromagntica. Su funcionamiento se habilita por medio de
un fusible de configuracin que se selecciona (ON/OFF) cada vez que se graba el
microcontrolador.
Funciona como un oscilador interno, independiente del oscilador principal del
micro, con un perodo nominal de 18 milisegundos. Cada vez que se cumple el
tiempo del watchdog el microcontrolador sufre un reset, por lo tanto, se debe usar
una instruccin especial que reinicie dicho conteo antes de que se termine. Esa instruccin es CLRWDT. El perodo de 18 milisegundos se puede ampliar hasta casi
2.3 segundos utilizando la preescala del registro OPTION, en el cual existe tambin
un bit que permite seleccionar si la preescala se asigna al watchdog o al temporizador/contador. El uso de la preescala se permite slo para uno de los dos a la vez.
En el programa que se muestra en la figura 2.53 se tiene un ejemplo muy sencillo
que ilustra el funcionamiento del watchdog. Consiste en hacer que el microcontrolador sufra reset continuamente, esto se logra habilitando el circuito de vigilancia en
el momento de grabar el microcontrolador (seleccionando watchdog timer ON).
Cada vez que el programa se reinicia hace que se conmute el dato que se muestra en
Curso avanzado de Microcontroladores PIC
83
sale
org
goto
0
inicio
org
btfss
goto
incf
movf
xorlw
btfss
goto
clrf
incf
movf
xorlw
btfsc
clrf
movf
movwf
bcf
intcon,2
sale
conta2
conta2,w
0ah
status,z
sale
conta2
conta
conta,w
0ah
status,z
conta
conta,w
ptoa
intcon,2
retfie
inicio
bsf
movlw
movwf
movlw
movwf
movlw
movwf
bcf
movlw
movwf
clrf
clrf
movf
movwf
ciclo
nop
nop
goto
ciclo
end
;======================================================================
;
Fusibles de programacin
;
Osc
XT
;
Watchdog
OFF
;
Code protect
OFF
;
Power-Up-Timer
ON
;
Micro.
PIC16F84
;======================================================================
org
goto
0
inicio
inicio
bsf
movlw
movwf
movlw
movwf
movlw
movwf
bcf
btfss
goto
cero
clrf
bcf
;clrwdt
goto
ptoa
cambia,0
cero
uno
movlw
01
;dato para el display
movwf
ptoa
bsf
cambia,0 ;conmuta la bandera de prueba
;clrwdt
;borrar el conteo del watchdog timer
goto
uno
;se queda en este ciclo esperando el reset
end
;======================================================================
;
Fusibles de programacin
;
Osc
XT
;
Watchdog
ON
;
Code protect
OFF
;
Power-Up-Timer
ON
;
Micro.
PIC16F84
;======================================================================
85
retardo
top2
top
org
goto
0
inicio
org
leer
bsf
bsf
bcf
movf
movwf
movwf
return
status,5
eecon1,rd
status,5
eedata,w
conta2
conta
escrib
bsf
bsf
bcf
movlw
movwf
movlw
movwf
055h
eecon2
0aah
eecon2
bsf
87
btfss
goto
bcf
bcf
bcf
retlw
inicio
bsf
movlw
movwf
movlw
movwf
bcf
clrf
call
movlw
subwf
btfss
goto
status,5
0f0h
trisa
0ffh
trisb
status,5
eeadr
leer
0ah
conta2,w
status,c
ciclo
ini2
clrf
clrf
call
conta
eedata
escrib
ciclo
call
movwf
call
leer
ptoa
retardo
pulsa
btfsc
goto
call
btfsc
goto
incf
movf
movwf
call
movf
xorlw
btfss
goto
ptob,0
pulsa
retardo
ptob,0
pulsa
conta
conta,w
eedata
escrib
conta,w
0ah
status,z
ciclo
goto
ini2
;
end
;
;======================================================================
;
Fusibles de programacin
;
Osc
XT
;
Watchdog
OFF
;
Code protect
OFF
;
Power-Up-Timer
ON
;
Micro.
PIC16F84
;======================================================================
88
Rojos
+VCC
Negros
Gris
Gris
Amarillo
Amarillo
Q1
Q2
Q3
Q4
89
Este tipo de motores tiene la ventaja de operar con una sola fuente, mientras que
los motores de dos bobinas requieren polaridad positiva y negativa, hacindose
necesario utilizar circuitos en puente. En la figura 2.55 tambin se muestra la forma
de conectar el motor de 8 cables. Debe notarse que los cables rojos y negros se unen
para conectarlos a la fuente positiva. De aqu se puede deducir como sera la conexin para 6 y 5 cables. El transistor que se utiliza para activar las bobinas es el
tpico TIP122, que es un Darlington con proteccin para el manejo de cargas inductivas (diodo interno). Ntese que se ha invertido el orden de las bobinas de los
transistores Q2 y Q3.
El movimiento del motor se consigue energizando las bobinas en un orden determinado. Esto se puede hacer de dos formas: La primera consiste en activar una
sola bobina a la vez (manejo por ola), la segunda es el manejo de dos fases o bobinas al mismo tiempo. Con este ltimo mtodo se puede conseguir mayor torque,
por eso es el mtodo que empleamos en estos ejemplos. La figura 2.56 muestra los
diagramas de tiempo de los dos mtodos anteriores. De ahora en adelante se supondr que el motor se ha conectado de la forma que se muestra en la figura 2.55; esto
se hace con el fin de no repetir la misma grfica en cada ejercicio.
Q1
Q2
Q3
Q4
(a)
Q1
Q2
Q3
Q4
(b)
Figura 2.56. Secuencias para manejar las bobinas del motor de paso.
a) una fase, b) dos fases
Control del motor a pasos completos
El motor que se escogi para el ejercicio tiene un paso de 7.5, es decir que en un
crculo completo (360) tiene 48 posiciones de reposo. Cada uno de los pasos se logra
cuando se encienden las bobinas correspondientes segn la secuencia. Tambin se
debe aclarar que el punto comn de las bobinas del motor se debe conectar a +5V, ya
que este es el dato suministrado por el fabricante en la placa de datos del mismo.
90
20pF
20pF
4MHz
Q4 Q3 Q2 Q1
1
1
0
0
0
1
1
0
0
0
1
1
1
0
0
1
RB4
RB5
RB3
RB1
RB0
RB2
RB6
RB7
VDD
VSS
OSC1
PIC16F84
MCLR
3.3K
OSC2
Q4
TIP122
RA3
3.3K
Q3
TIP122
RA4/TOCKI
RA0
3.3K
RA1
Q2
TIP122
+5V
3.3K
RA2
Q1
TIP122
Conectar los
transistores a las
bobinas del motor
+5V
Figura 2.57. Diagrama del circuito para mover el motor a paso completo
Como se haba mencionado anteriormente, el control del motor se har con
dos bobinas energizadas al mismo tiempo. Viendo la tabla de la secuencia se
puede deducir que con simples rotaciones de un registro se puede conseguir el
objetivo (ntese que la tabla tiene cuatro valores diferentes). Cada vez que se
encienden las dos bobinas correspondientes a un valor de la tabla, este se mueve un paso. Por lo tanto, dado que el motor es de 48 pasos por vuelta, se debe
repetir los valores de la tabla 12 veces para conseguir que el eje del motor de
un giro completo.
Si se desea que el motor gire en sentido contrario al que se logr con la secuencia
anterior, slo se debe invertir la secuencia, es decir, leer la tabla en sentido inverso
(de abajo hacia arriba). Cuando el motor no est en movimiento se debe garantizar
que todas las bobinas estn desenergizadas. Esto se hace con el fin de evitar posibles
daos del motor.
El primer ejercicio que vamos a implementar consiste en hacer que el motor
de un giro completo en un sentido, permanezca quieto un momento y luego gire
en sentido contrario, para repetir el mismo ciclo. Dado que la secuencia es simple, el programa del microcontrolador tambin lo es. La figura 2.58 muestra el
listado completo.
Curso avanzado de Microcontroladores PIC
91
DE UN MOTOR DE
;BANDERA DE CERO
;BANDERA DE CARRY
;PARA ALMACENAR EN W
;PARA ALMACENAR EN EL REGISTRO
ORG
GOTO
ORG
CLRF
NOP
BTFSS
GOTO
RETLW
00
INICIO
05H
TMRO
MOVLW
MOVWF
CALL
CALL
DECFSZ
GOTO
RETLW
38H
R0D
RETARDO
RETARDO
R0D,R
DECR2
0
;Retardo auxiliar
;del giro del motor
PASOAD
BCF
RRF
BTFSC
BSF
MOVF
MOVWF
CALL
CLRF
RETLW
STATUS,C
R10,R
STATUS,C
R10,3
R10,W
PTOA
RETARDO
PTOA
0
PASOAT
BCF
RLF
BTFSC
BSF
MOVF
MOVWF
CALL
CLRF
RETLW
STATUS,C
R10,R
R10,4
R10,0
R10,W
PTOA
RETARDO
PTOA
0
RETARDO
RETAR1
RETARD2
DECR2
; ***********
INICIO
BEGIN
92
;Vector de reset
;Inicia programa principal
;Retardo de 8.192 ms
;empleando el TMRO
TMRO,7
RETAR1
0
PROGRAMA PRINCIPAL
*******
MOVLW
TRIS
MOVLW
TRIS
MOVLW
OPTION
CLRF
CLRF
BSF
BSF
00H
PTOA
0FFH
PTOB
0C5H
PTOA
R10
R10,2
R10,1
MOVLW
MOVWF
D48'
R11
CALL
DECFSZ
GOTO
CALL
CALL
MOVLW
MOVWF
CALL
DECFSZ
GOTO
CALL
CALL
GOTO
END
VUEL2
PASOAD
R11,R
VUEL
RETARD2
RETARD2
D48'
R11
PASOAT
R11,R
VUEL2
RETARD2
RETARD2
BEGIN
+5V
20pF
3.3K
4MHz
3.3K
+5V
RB5
RB4
RB3
RB1
RB0
VSS
RB2
RB6
RB7
VDD
OSC1
PIC16F84
MCLR
3.3K
OSC2
Q4
TIP122
RA3
Q4 Q3 Q2 Q1
1
0
0
1
1
0
0
0
1
1
0
0
0
1
0
0
0
1
1
0
0
0
1
0
0
0
1
1
0
0
0
1
RA2
3.3K
Q3
TIP122
RA4/TOCKI
3.3K
RA0
Q2
TIP122
RA1
3.3K
Q1
TIP122
+5V
93
Para este ejercicio la idea es hacer que el motor gire en el sentido que se le indique
oprimiendo uno de los dos pulsadores dispuestos para tal fin. El motor debe moverse
tanto tiempo como est oprimido el interruptor correspondiente. Para este ejercicio
empleamos el mismo circuito del ejemplo anterior, pero con unas pequeas variaciones. En la figura 2.59 se muestra el diagrama esquemtico del circuito de control.
En los pines RB7 y RB6 del microcontrolador se han dispuesto los interruptores
pulsadores que se encargan de controlar el sentido y la duracin del movimiento.
Adems, en la grfica se incluye la tabla con la secuencia que se requiere para que el
motor pueda moverse a 1/2 paso. Como se ve, ahora la tabla tiene ocho valores
diferentes. El microcontrolador se debe encargar de hacer la lectura de dichos valores en orden ascendente o descendente para obtener el valor que debe entregar por el
puerto A para manejar las bobinas del motor.
El software que se graba en el microcontrolador aparece en la figura 2.60. Para
este ejemplo se han modificado las rutinas debido a que la secuencia no es una
simple rotacin de las bobinas. Los valores que debe entregar el microcontrolador
se han escrito en una tabla, para que la estructura del programa sea la misma en el
momento que se desee trabajar a 1/4 de paso e inclusive a 1/8 de paso. En estos dos
ltimos casos slo se debe cambiar los valores de la tabla y el lmite mximo del
contador que se encarga de leerla. Como ejercicio el lector puede deducir la secuencia que se empleara en movimientos a 1/4 y 1/8 de paso.
;ESTE PROGRAMA PERMITE CONTROLAR EL GIRO DE UN MOTOR DE PASO, A 1/2 PASO
;
****** PIC16F84
********
; ****** WDT = OFF, OSC = XT, CP = OFF
******
TMRO
PC
STATUS
PTOA
PTOB
R0D
R10
Z
C
W
R
ADE
ATRA
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
EQU
*********
RETARDO
RETAR1
PASOAD
94
1H
2H
3H
5H
6H
0DH
10H
2H
0H
0H
1H
7
6
;BANDERA DE CERO
;BANDERA DE CARRY
;PARA ALMACENAR EN W
;PARA ALMACENAR EN EL REGISTRO
;BITS DEL PTOB
PROGRAMA PRINCIPAL
*********
ORG
GOTO
ORG
00
INICIO
05H
;Vector de reset
;Va a iniciar programa principal
CLRF
NOP
BTFSS
GOTO
RETLW
TMRO
;Retardo de 2.048 ms
;usando el TMRO
TMRO,5
RETAR1
0
INCF
MOVF
CALL
MOVWF
R10,R
R10,W
SECUEN
PTOA
RETARDO
PTOA
07H
R10,W
STATUS,Z
SALIR
0FFH
R10
0
DECF
MOVF
CALL
MOVWF
CALL
CLRF
MOVLW
ANDWF
BTFSS
GOTO
MOVLW
MOVWF
RETLW
R10,R
R10,W
SECUEN
PTOA
RETARDO
PTOA
0FFH
R10,W
STATUS,Z
SALE
08H
R10
0
ADDWF
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
RETLW
PC,R
B00000100'
B00000110'
B00000010'
B00000011'
B00000001'
B00001001'
B00001000'
B00001100'
0
MOVLW
TRIS
MOVLW
TRIS
MOVLW
OPTION
CLRF
MOVLW
MOVWF
00H
PTOA
0FFH
PTOB
0C5H
;programacin de puertos
;segn el circuito
PRUE1
BTFSC
GOTO
CALL
CLRF
GOTO
PTOB,ADE
PRUE2
PASOAD
PTOA
PRUE1
PRUE2
BTFSC
GOTO
CALL
CLRF
GOTO
PTOB,ATRA
PRUE1
PASOAT
PTOA
PRUE2
SALIR
PASOAT
SALE
SECUEN
INICIO
PTOA
03H
R10
END
95
contiene los valores que se deben entregar por el puerto del microcontrolador para
energizar las bobinas correspondientes. Esta tabla es la que se debe modificar para
conseguir movimiento a 1/4 o 1/8 de paso.
Como parte del ejercicio, el estudiante podra insertar un retardo entre cada movimiento (llamando una subrutina con un retardo largo), para ver en detalle como se
mueve el motor y comprobar que en un crculo completo se tienen 96 escalas o
posiciones de reposo.
96