Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Primeros PDF
Primeros PDF
Captulo V
Programacin en PIC
Los primeros pasos
63
64
EMPEZAR
Encabezado
Inicializacin
Encender LED
Rutina de retardo
Apagar LED
Rutina de retardo
65
org
goto
org
inicio
movlw
tris
otra
movlw
movwf
call
movlw
movwf
call
goto
retardo
movlw
tres
movwf
movlw
dos
movwf
movlw
uno
movwf
decfsz
goto
0
;el vector de reset es la direccin 00
inicio ;se enva al inicio del programa
7
;empieza el programa en la posicin de
;memoria 7
00
;se carga el registro W con el valor 00
ptob
;se programan los pines del puerto B como
;salidas
01
;se carga el registro W con el valor 01
ptob
;se pasa ese valor al puerto B para encender
;el LED que se encuentra conectado al pin RB0
retardo ;se mantiene el LED encendido por un momento
00
;se carga el registro W con el valor 00
ptob
;se carga el registro puerto B con cero para
;apagar el LED
retardo ;se mantiene el LED apagado por un momento
otra
;se contina el programa en otra, es decir que
;se queda ejecutando la misma accin
;esta rutina genera un tiempo de espera
valor1 ;se carga el registro W con el nmero valor1,
;es decir con 30
reg1
;se traslada ese nmero al registro reg1
valor2 ;se carga el registro W con el nmero valor2,
;es decir con 40
reg2
;se traslada ese nmero al registro reg2
valor3 ;se carga el registro W con el nmero valor3,
;es decir con 50
reg3
;se traslada ese nmero al registro reg3
reg3
;se decrementa el registro reg3 y si el valor
;es cero se salta a la
uno
;instruccin siguiente, si no es cero se
;contina decrementando
reg2
;igual que el anterior
dos
reg1
;igual que el anterior
tres
0
decfsz
goto
decfsz
goto
retlw
end
;====================================================================
Encabezado
Iniciacin
Encender LED
Llamar retardo
Apagar LED
Llamar retardo
Volver a encender
el LED
Rutina de
retardo
Final del
programa
C
B
A
67
Retardo. En la figura 3 se muestra la rutina de retardo mencionada anteriormente. Debido a la gran velocidad con la cual se ejecutan las instrucciones en
el microcontrolador (un milln por segundo, con un reloj de 4 MHz), es necesario efectuar, con mucha frecuencia, retardos que nos permitan observar algunos fenmenos lentos, tales como el encendido de LEDs, lmparas, rels,
etc. Tales retardos se logran cargando, con un determinado valor, posiciones
auxiliares de memoria RAM o registros, decrementndolos posteriormente y
consultando el momento en el cual llegan a cero; dependiendo del resultado de
la consulta, el programa puede dirigirse a dos sitios diferentes, como puede
observarse en el diagrama de flujo de la figura 4. En ella se han resaltado tres
pequeos bloques, que corresponden a una sola instruccin en la familia del
microcontrolador PIC: decfsz. Esta instruccin decrementa un registro y consulta si el contenido de ste ha llegado a cero; si es as, omite la siguiente
instruccin; si no lo es, la ejecuta. Esto permite implementar bifurcaciones de
acuerdo al cumplimiento de una condicin.
EMPEZAR
es REG3 = 0
?
No
Si
DEC REG2
es REG2 = 0
?
No
Si
DEC REG1
es REG1 = 0
?
No
Si
TERMINAR
Para conocer el tiempo que se tarda toda la rutina, podemos hacer algunos clculos, siempre expresando las cantidades en trminos de los ciclos de instruccin y
para ello debemos saber cuanto tarda cada una de ellas. Afortunadamente, todas las
instrucciones de los microcontroladores PIC se ejecutan en un ciclo, excepto cuando se realiza un salto, en cuyo caso la instruccin utiliza dos ciclos.
Con lo anterior, debemos empezar por la rutina ms interna, marcada con la letra
A en la figura 3. Mientras que no se cumpla la condicin, la instruccin decfsz reg3
consume 1 ciclo y la instruccin goto se ejecuta en dos ciclos; esta rutina interna
gasta entonces tres ciclos, ejecutndose un nmero de veces que est dado por el
valor contenido en el registro valor3, en este caso el valor hexadecimal 50 (observe
la definicin de ste en la cabecera y recuerde que por defecto se asumen cantidades
hexadecimales). El nmero total de ciclos consumidos por esta rutina ser entonces
el producto:
Nmero ciclos A
= 3 x valor3
= 3 x 80 (el decimal de 50Hex)
= 240 ciclos de instruccin
= 245 x valor2
= 245 x 64 (el decimal de 40Hex)
= 15860 ciclos de instruccin
De igual manera, podemos considerar que para la subrutina C (que abarca tanto
la A como la B) se tienen un nmero de ciclos de 15865 (15860 + 5); considerando
que el nmero total de ciclos depende del registro valor1, se tiene:
Nmero ciclos C
= 15865 x valor1
= 15865 x 48 (el decimal de 30Hex)
= 761520 ciclos de instruccin
69
caso el ciclo de instruccin es de 1 microsegundo. Para el ejemplo anterior, se tendra entonces que la rutina de retardo se tardara un poco ms de 765520 s, ms que
suficientes para visualizar el encendido y apagado de un LED.
Cuando se requiere gran precisin en el cumplimiento de rutinas de tiempo, se
acude a un oscilador a cristal para el oscilador del microcontrolador. Cuando la
precisin no es una preocupacin, se puede acudir a una sencilla red RC, para proporcionar la frecuencia del oscilador. En este ltimo caso, la frecuencia de oscilacin depender de las tolerancias de la resistencia y del condensador, al igual que la
temperatura y el nivel de voltaje de la alimentacin. En caso de implementar una red
RC, el fabricante sugiere para la resistencia valores comprendidos entre 5 K y 100 k,
y para el condensador un valor mnimo de 20 pF.
End. Aunque sta no es propiamente una instruccin, s es necesaria para el ensamblador; si ste no la encuentra, emite un mensaje de error.
As, estara descrito todo el programa. Despus de escribirlo en el editor de textos deber ensamblarlo, con lo cual se genera el cdigo objeto propio del microcontrolador. Si no ha cometido errores de sintaxis, estar listo para fijar este cdigo en
el microcontrolador por medio del sistema de desarrollo; para ste ltimo paso debe
asegurarse que los fusibles posean la siguiente configuracin:
Osc
Watchdog
CP
Power-Up-Timer
XT
OFF
OFF
ON
Rotacin = 01
Rutina de retardo
Rotar a la izquierda
Fin de la
Rotacin
?
No
Si
XT
OFF
OFF
ON
71
equ
06
rota
equ
0a
reg1
equ
0b
reg2
equ
0c
reg3
equ
0d
valor1
equ
30
;aqu se asignan nombres a los valores
valor2
equ
40
;constantes
valor3
equ
10
;------------------------------------reset
org
goto
org
inicio
movlw
tris
otra
movlw
movwf
movf
hol
movwf
call
rlf
btfss
goto
goto
retardo
movlw
tres
movwf
movlw
dos
movwf
movlw
uno
movwf
decfsz
goto
decfsz
goto
decfsz
goto
retlw
end
;=============================================================
EMPEZAR
Leer pulsadores
XT
OFF
OFF
ON
73
equ
equ
02
05
;================================================================
;Este programa realiza una secuencia luminosa en los LED's, al llegar al
;ltimo se emite un sonido. Adems, cuando se oprime una tecla se cambia
;el sentido de giro de la secuencia
list
p=16c84
carry
cero
bandera
rtcc
pc
sta
port_a
port_b
rota
cuenta
tiempo
reg1
reg2
reg3
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
equ
0
2
6
1
2
3
5
6
18h
19h
1ah
1bh
1ch
1dh
;-------------------------------------------------------------------
inicio
bcf
movlw
tris
movlw
tris
movlw
movwf
movlw
movwf
sta, bandera
0
port_b
3
port_a
0feh
rota
1
tiempo
ceros
movlw
movwf
2
reg3
uno
movf
andlw
xorlw
addwf
goto
goto
goto
goto
port_a,w
3
3
pc
dos_a
siete_a
siete_b
siete_c
;leer puerto a
;elimina la parte alta
;invierte el dato
;se suma al pc para salto
;si no hubo tecla
;si tecla derecha
;si tecla izquierda
;si las dos teclas
dos_a
decfsz
goto
decfsz
goto
decfsz
goto
reg1
uno
reg2
uno
reg3
uno
;decrementa
;si no cero
;decrementa
;si no cero
;decrementa
;si no cero
dos_b
dos_c
75
dos_d
bsf
btfsc
goto
sta,carry
;activa o coloca carry en 1
sta, bandera ;salta si bandera est desactivada
cuatro
;si activada bifurca a cuatro
tres
rlf
btfss
goto
incf
goto
rota
sta,carry
tres_b
tiempo
seis
rlf
movlw
movwf
call
goto
rota
1
tiempo
pito
seis
cuatro
rrf
btfss
goto
cuatro_a decf
goto
rota
sta,carry
cuatro_b
tiempo
seis
cuatro_b rrf
movlw
movwf
cinco
call
goto
rota
8
tiempo
pito
seis
seis
rota,w
port_b
ceros
tres_a
tres_b
movf
movwf
goto
siete_a
bsf
goto
sta,bandera
dos_a
siete_b
bcf
goto
sta,bandera
dos_a
siete_c
movf
rlf
rlf
rlf
addwf
addwf
tiempo,w
tiempo
tiempo
tiempo
tiempo
tiempo
ocho
comf
movwf
clrf
call
decfsz
goto
movlw
movwf
call
movlw
movwf
sleep
tiempo,w
port_b
cuenta
base
tiempo
ocho
0ffh
port_b
pito
4
port_a
nueve
76
base
bas
movlw
movwf
movlw
movwf
call
8
port_a
d110'
cuenta
base
;b1000' cargar a w
;para activar el pito
;cargar con el decimal 110
;para que el pito
;dure 1 segundo/(125-110)
clrf
retlw
port_a
3
clrf
movlw
option
rtcc
5
rtcc,w
d125'
sta,cero
bas
cuenta
cuenta,w
d125'
sta,cero
base
4
;leer el rtcc
;comparar con el decimal 125
;si es igual salta
;si no igual, vuelve a leer
;incrementa la cuenta
;carga a w con valor de cuenta
;comparar con el decimal 125
;si es igual salta
;si no igual, vuelve a configurar cuenta
;al terminar regresa
movf
xorlw
btfss
goto
incf
movf
xorlw
btfss
goto
retlw
end
;-----------;
Fusibles de programacin
;
Osc
XT
;
Watchdog
OFF
;
CP
OFF
;
Power-Up-Timer
ON
;=====================================================================
;===========================================================
77
78