Está en la página 1de 11

;El objetivo de este programa es mostrar en la prctica el funcionamiento del Watchdog en el PIC 16c8!

;El programa entra en un bucle infinito del "ue sale tras cumplirse la tempori#aci$n asignada al %atchdog& "ue en este
;caso sern '6 ms& es decir ( veces la tempori#aci$n nominal!
)I*+ p,16c8
*+-+.* E/. 0'1
2P+ E/. 011
; Programa principal3
245 10
bsf *+-+.*&6 ;7anco de registros 1
movl% b8000010018
mov%f 2P+ ; *e asigna el preescaler a %atchdog con un factor de divisi$n de 13(!
clr%dt ; se iniciali#a el W9
bucle goto bucle
E:9
;;;;; 2+42 E<E=P)2 ;;;;
; E<E=P)2 de interrupciones en el PIC16c8! *e trata de reali#ar una tempori#aci$n de 160ms utili#ando el reloj
; de 100>h# de un PIC
)I*+ p,16c8 ; +ipo de pic "ue vamos a usar
*+-+.* E/. 0'1
I:+C2: E/. 071
+40?2P+ E/. 011 ; +I=E40 en banco 0& 2P+I2: en banco 1
245 0 ; @ector de 4E*E+
goto E=PIEA-
245 ; @ector de interrupciones
goto +4-+I:+
E=PIEA-
bsf *+-+.*&6 ; Pgina de registros 1
movl% b8000000118 ; Prescaler B16 asignado a +=40
mov%f +=40?2P+
movl% b8101000008 ; -ctivamos interrupci$n por +=40
mov%f I:+C2: ; :o es necesario volver a cambiar de pgina por"ue I:+C2: est en p g 0 C 1!
bcf *+-+.*&6 ; *elecci$n de pgina de registros 0
movl% d8((8
mov%f +=40?2P+ ; Cargamos el +=40 con el valor (( decimal
7.C)E goto 7.C)E ; :os "uedaremos a"uD hasta "ue se produ#ca la interrupci$n
+4-+I:+ ; -"ui se incluir n los tratamientos de las interrupciones& de momento nos limitaremos a poner W a 0
;Epara "ue se vea "ue se ha producido la interrupci$nF C esperar a "ue el Watch9og reinicie el PIC!
movl% 0
GI: goto GI:
E:9
;;;; 2tro Ejemplo ;;;;
; Programa "ue muestra el funcionamiento del timer3 4eali#a una tempori#aci$n de 100 ms
list P,16c8 ; tipo de pic
intcon e"u 071
tmr?opt e"u 011
t0if e"u 0(h
status e"u 0'h
org 0
movl% b8000000008
mov%f intcon ; desactiva interrupciones
bsf status&6 ; pgina 1
movl% b8000000118 ; prescaler asignado al timer con un
mov%f tmr?opt ; factor de 16
bcf status&6 ; pgina 0
movl% b8011001008 ; se iniciali#a +=40 con 100
mov%f tmr?opt
bucle btfsc intcom&t0if ; si el bit t0if del intcon es 1
goto fin ; indica "ue el timer se ha sobreH
goto bucle ; pasado C entonces se salta a fin
; si no se vuelve al bucle fin
End
;
; E<E=P)2 (!10
;
; -utor3 =iIel EtBebarria
; EcF =icrosCstems Engineering E7ilbaoF
;
;Ejemplo para simulaci$n CJo =icroPIC +rainer
;
;)a interrupci$n del +=40!
;
;*e trata de comprobar la interrupci$n provocada por el +=40! El programa
;lee el estado de los interruptores conectados a 4-0 C 4- para reflejarlo en
;los leds conectados a 470 C 47 respectivamente! -l mismo tiempo el +=40
;genera una interrupci$n cada 0!06 seg! E60 m*F "ue se repetir 6 veces con objeto
;de hacer intermitencia de (60 m* sobre el led conectado a 47K!
)ist p,16G8 ;+ipo de procesador
include LP16G8!I:CL ;9efiniciones de registros internos
Contador e"u 0B0c ;@ariable para la tempori#aci$n

org 0B00 ;@ector de 4eset
goto Inicio
org 0B0 ;@ector de interrupci$n
Interrupcion bcf I:+C2:&+0IG ;4epone flag del +=40
decfs# Contador&G ;9ecrementa el contador
goto *eguir
Con?si?0 movl% 6
mov%f Contador ;4epone el contador nuevamente
btfsc P24+7&K ;+estea Mltimo estado de 47K
goto 47K?E*?1 ;Est a 1
bsf P24+7&K ;Est a 0& activa 47K
goto *eguir
47K?E*?1 bcf P24+7&K ;9esactiva 47K
*eguir movl% 0B'c
mov%f +=40 ;4epone el +=40 con 1N6
retfie ;4etorno de interrupci$n
Inicio clrf P24+7 ;7orra los latch de salida
bsf *+-+.*&4P0 ;*elecciona banco 1
clrf +4I*7 ;Puerta 7 se configura como salida
movl% b8000111118
mov%f +4I*- ;Puerta - se configura como entrada
movl% b8000001118
mov%f 2P+I2:?4E5 ;Preescaler de (66 para el +=40
bcf *+-+.*&4P0 ;*elecciona banco 0
;El +=40 se incrementa cada 1 u*! *i se emplea un preescaler de (66& deber sufrir 1N6
;incrementos para provocar una interrupci$n cada 60000 u* E60 m*F! *i esta se repite 6
;veces& el tiempo total transcurrido es de (60000 u* E(60 m*F! El complemento del valor
;1N6 en heB! es 0B'c!
movl% 0B'c
mov%f +=40 ;Carga el +=40 con 1N6
movl% 0B06
mov%f Contador ;:O de veces a repetir la interrupci$n
movl% b8101000008
mov%f I:+C2: ;-ctiva la interrupci$n del +=40
)oop clr%dt ;4efresca el W9+
btfsc P24+-&0 ;+estea el estado de 4-0
goto 4-0?E*?1
bcf P24+7&0 ;9esactiva 470
goto +E*+?471
4-0?E*?1 bsf P24+7&0 ;-ctiva 470
+E*+?471 btfsc P24+-&1 ;+estea el estado de 4-1
goto 4-1?E*?1
bcf P24+7&1 ;9esactiva 471
goto )oop
4-1?E*?1 bsf P24+7&1 ;-ctiva 471
goto )oop
end ;Gin del programa fuente
;
; E<E=P)2 (!16
;
; -utor3 =iIel EtBebarria
; EcF =icrosCstems Engineering E7ilbaoF
;
;Ejemplo para simulaci$n CJo =icroPIC +rainer
;
;5eneraci$n de ondas cuadradas de diferentes frecuencias variando el valor del +=40
;
;)a lDnea de salida 470 cambiar de estado a una frecuencia determinada por el valor
;introducido mediante los ' interruptores 4-0H4-(3
;
;4-( 4-1 4-0 Grecuencia Periodo *emiperiodo
;HHH HHH HHH HHHHHHHHHH HHHHHHH HHHHHHHHHHH
;0 0 0 0 >1# HHH HHH
;0 0 1 1 >1# 1000 u* 600 u*
;0 1 0 ( >1# 600 u* (60 u*
;0 1 1 ' >1# ''' u* 166 u*
;1 0 0 >1# (60 u* 1(6 u*
;1 0 1 6 >1# (00 u* 100 u*
;1 1 0 6 >1# 166 u* 8' u*
;1 1 1 K >1# 1' u* K1 u*
;
;En el tratamiento de interrupci$n "ue provocar el desbordamiento del +=40& se puede
;apreciar como se salva el W C el registro de estado& para recuperarlos posteriormente!
;Es lo "ue se llama Lsalvar el conteBtoL
;
)ist p,16G8 ;+ipo de procesador
include LP16G8!I:CL ;9efiniciones de registros internos

@alor e"u 0B0c ;@ariable de frecuencia
W?+emp e"u 0B0d ;W temporal
*tatus?+emp e"u 0B0e ;4egistro de estado temporal
org 0B00 ;@ector de 4eset
goto Inicio
org 0B0 ;@ector de interrupci$n
goto Interrupcion
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;+abla3 esta rutina devuelve el valor a cargar en el +=40 segMn la frecuencia selecH
;cionada! Partiendo de una frecuencia general de =1#& el +=40 evoluciona cada 1 u*!
;*e selecciona una preescaler de ! El valor a cargar en +=40 se obtiene de dividir el
;semiperiodo de la frecuencia deseada entre el preescaler! -l valor obtenido se le
;resta ( por motivos de sincronismo interno del PIC& se convierte a heB! C se compleH
;menta!
+abla3 add%f PC)&G ;Calcula despla#amiento de la tabla
retl% 0B00 ;0 >1#
retl% 0B86 ;1 >1#
retl% 0Bc6 ;( >1#
retl% 0Bda ;' >1#
retl% 0Be ; >1#
retl% 0Bea ;6 >1#
retl% 0Bee ;6 >1#
retl% 0Bf1 ;K >1#
Interrupcion mov%f W?+emp ;*alva el W
s%apf *+-+.*&W
mov%f *tatus?+emp ;*alva el registro de estado
movf @alor&W
mov%f +=40 ;4ecarga el +=40
bcf I:+C2:&+0IG ;9esactiva el flag +=40
movl% b8000000018
Bor%f P24+7&G ;7ascula 470
s%apf *tatus?+emp&W
mov%f *+-+.* ;4ecupera el registro de estado
s%apf W?+emp&G
s%apf W?+emp&W ;4ecupera el registro W
retfie
Inicio clrf P24+7 ;7orra los latch de salida
bsf *+-+.*&4P0 ;*elecciona banco 1
clrf +4I*7 ;Puerta 7 se configura como salida
movl% b8000111118
mov%f +4I*- ;Puerta - se configura como entrada
movl% b8000000018
mov%f 2P+I2:?4E5 ;Preescaler de para el +=40
bcf *+-+.*&4P0 ;*elecciona banco 0
movl% b8001000008
mov%f I:+C2: ;Interrupci$n +=40 habilitada
)oop clr%dt ;4efrescar el W9+
movf P24+-&W
andl% b8000001118
btfss *+-+.*&A ;4-0H4-( , 0 PP
goto *alida?2n ;:o& salida de frecuencia
bcf I:+C2:&5IE ;*i& interrupciones 2GG& frecuencia 2GG
goto )oop
*alida?2n call +abla ;9etermina valor a cargar en +=40
mov%f @alor ;Carga la variable
bsf I:+C2:&5IE ;Interrupciones 2:
goto )oop
end ;Gin del programa fuente
;
; E<E=P)2 (!18
;
; -utor3 =iIel EtBebarria
; EcF =icrosCstems Engineering E7ilbaoF
;
;Ejemplo para simulaci$n CJo =icroPIC +rainer
;
;El +=40 como contador de eventos eBternos
;
;.n sensor optoelectr$nico conectado a 4- genera un pulso cada ve# "ue un objeto se
;iterpone entre el emisor C el receptor de lu#! El +=40 se encarga de contarlos
;dependiendo del valor del preescaler! 9icho valor se ajusta mediante ' interruptores
;E4-0H4-(F conectados a la Puerta -& eBistiendo asD 8 preHdivisiones3
;
; I( I1 I0 9ivisi$n
; HH HH HH HHHHHHHH
; 0 0 0 13(
; 0 0 1 13
; 0 1 0 138
; 0 1 1 1316
; 1 0 0 13'(
; 1 0 1 136
; 1 1 0 131(8
; 1 1 1 13(66
;
; El contaje se va visuali#ando en binario sobre los leds conectado a la Puerta 7 C
;debe multiplicarse por el valor del preescaler seleccionado& para determinar el nMmero
;total de pulsos! El contador se resetea al poner 4-' a L1L! 9ebe tenerse en cuenta el
;Lefecto reboteL "ue se produce en el interruptor 4- de la =icroPIC +rainer!
)ist p,16G8 ;+ipo de procesador
include LP16G8!I:CL ;9efiniciones de registros internos

org 0B00 ;@ector de 4eset
goto Inicio
org 0B06 ;*alva vector de interrupci$n
Inicio clrf P24+7 ;7orra los latch de salida
bsf *+-+.*&4P0 ;*elecciona banco 1
clrf +4I*7 ;Puerta 7 se configura como salida
movl% b8000111118
mov%f +4I*- ;Puerta - se configura como entrada
movl% b8001100008
mov%f 2P+I2:?4E5 ;+=40 contador sensible al descendente de 4-
bcf *+-+.*&4P0 ;*elecciona banco 0
)oop clrf +=40 ;Puesta a 0 del contador
)oop13 clr%dt ;4efresca el W9+
btfsc P24+-&' ;=ira si I' est activo E4E*E+F
goto )oop ;*i Cuenta detenida C puesta a 0
movf P24+-&W ;:o& leer I(HI0 para formar el nuevo valor
andl% b8000001118 ;del preescaler
bsf *+-+.*&4P0 ;*elecciona pgina 1
ior%f 2P+I2:?4E5&G ;-ctuali#a el nuevo valor del preescaler
bcf *+-+.*&4P0 ;*elecciona pgina 0
movf +=40&W ;)ee el valor del contador
mov%f P24+7 ;*alida a leds
goto )oop1
end ;Gin del programa fuente
;
; E<E=P)2 '!1
;
; -utor3 =iIel EtBebarria
; EcF =icrosCstems Engineering E7ilbaoF
;
;Ejemplo para =icroPIC +rainer C +rainer P).*
;
;Introducci$n al manejo del teclado!
;
;1aciendo uso de las rutinas incluidas en el fichero +EC)-92!I:C& se trata de leer el teclaH
;do C& visuali#ar sobre los leds de la puerta 7 el c$digo binario de la tecla pulsada! )a
;visuali#aci$n se mantiene estable durante dos segundos hasta una nueva pulsaci$n!
;
;*e trata de un ejemplo en el "ue la Puerta 7 se reconfigura dinmicamente! Inicialmente es
;configurada como salida para presentaci$n del resultado! Posteriormente& la rutina de
;eBploraci$n del teclado reconfigura 470H47' como entradas C 47H47K como salidas!
)ist p,16G8 ;+ipo de procesador
include LP16G8!I:CL ;9efiniciones de registros internos

>eC?var e"u 0B0c ;Inicio de las variables de manejo del teclado
9elaC?Cont e"u 0B1( ;@ariable para la tempori#aci$n
org 0B00 ;@ector de 4eset
goto Inicio
org 0B06 ;*alva vector de interrupci$n
include L+EC)-92!I:CL ;IncluCe rutinas de manejo del teclado
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;9elaC?var3 Esta rutina de prop$sito general reali#a una tempori#aci$n variable
;entre 60 m* C 1(!8L! *e emplea un preescaler de (66 C al +=40 se le carga con 1N6!
;)a velocidad de trabajo es de =h# C por tanto el +=40 se incrementa cada u*! 9e
;esta forma& el +=40 debe contar 1N6 eventos "ue& con un preescaler de (66 hace una
;intervalo total de 60000 u*J60 m* E1N6 ; (66F! El valor 1N6 haC "ue eBpresarlo
;en 1eB! Ec'F C como el +=40 es ascendente habr "ue cargar su complemento E'C heB!F
;9icho intervalo de 60 m* se repite tantes veces como indi"ue la variable L9elaC?contL&
;es por ello "ue el delaC mDnimo es de 60 m* EL9elaC?cont,1F C el mBima de 1(!8L
;E9elaC?cont,(66F!
9elaC?var3 bcf I:+C2:&+0IG ;9esconecta el flag de rebosamiento
movl% 0B'c ;Complemento heB! de 1N6
mov%f +=40 ;carga el +=40
Intervalo clr%dt ;4efrescar el W9+
btfss I:+C2:&+0IG ;4ebasamiento del +=40 PP
goto Intervalo ;+odavDa no
decfs# 9elaC?Cont&G ;9ecrementa contador de intervalos
goto 9elaC?var ;4epite el intervalo de 60 m*
return
Inicio clrf P24+7 ;7orra los latch de salida
bsf *+-+.*&4P0 ;*elecciona banco 1
clrf +4I*7 ;Puerta 7 se configura como salida
movl% b8000001118
mov%f 2P+I2:?4E5 ;Preescaler de (66 para el +=40
bcf *+-+.*&4P0 ;*elecciona banco 0
)oop clr%dt ;4efresco del W9+
call >eC?*can ;EBplora el teclado
movl% 0B80
sub%f +ecla&W
btfsc *+-+.*&A ;1aC alguna pulsada PP
goto )oop ;:o
movf +ecla&W ;)ee el c$digo de la tecla pulsada
mov%f P24+7 ;)o visuali#a sobre los leds de la Puerta 7
movl% !0
mov%f 9elaC?Cont
call 9elaC?var ;+empori#a ( segundos
clrf P24+7 ;9esactiva visuali#aci$n
goto )oop
end ;Gin del programa fuente
; *EP+I=2(!-*=3 Programa "ue cuenta ininterrumpidamente del 0 al valor
; introducido mediante tres interruptores en 4-0& 4-1 C 4-(!
; Cada 60ms cambia el valor del displaC!
; Grecuencia del PIC3 =1#
)I*+ P,16C8
4-9IQ 1EQ
% E/. 0
f E/. 1
PC) E/. 0B0(
P.E4+-- E/. 0B06
P.E4+-7 E/. 0B06
E*+-92 E/. 0B0'
@-)24 E/. 0B1( ; Cota superior del contador
-C+.-) E/. 0B1' ; @alor actual del contaje
+E=P E/. 0B1 ; @ariable de tempori#aciones
+=402P+ E/. 0B01
I:+C2: E/. 0B07
@-)24+=P E/. d8108 ; @alor para la tempori#aciRn
@-)24+I=E4 E/. d86N8 ; @alor inicial del +I=E40
; 4.+I:- P4I:CIP-)3 )ectura de los interruptores C c lculo del valor a visuali#ar
245 0
goto inicio ; Para saltar el @ector de
; InterrupciRn
245 ; @ector de interrupciRn
goto int ; InterrupciRn del +I=E40

inicio bsf E*+-92&6 ; *elecciRn del banco 1
clr%
mov%f P.E4+-7 ; Puerta 7 salida
movl% 0Bff
mov%f P.E4+-- ; puerta - entrada
bcf E*+-92&6 ; *elecciRn banco 0
eBplora movf P.E4+--&% ; *e cargan los
; interruptores en W
mov%f @-)24 ; *e usa un registro
; auBiliar
comf @-)24&f ; Invertir los niveles de
; interuptores
movl% b8000001118 ; aplicamos una m scara
and%f @-)24&f ; para borrar la parte alta
; en @-)24 "ueda valor superior
; de contaje
clrf -C+.-) ; valor actual de contaje,0
clrf +E=P ; @ariable tempori#adora,0

; =S9.)2 C2:+-924 HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
tempori#a clr%dt
bcf E*+-92&6
movf +E=P&f ; Comprueba +E=P
btfss E*+-92&(
goto tempori#a ; *i temp TU 0
call visuali#a ; *i temp , 0
call cargartimer
movl% @-)24+=P
mov%f +E=P
goto tempori#a
; C-45- E) +I=E4 V E) P4E*C-)E4HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
cargartimer bcf E*+-92&6
movl% @-)24+I=E4 ; @alor a cargar en el +imer3
mov%f +=402P+ ; (66 H 6N , 1N6 , Ciclos de contaje
; 1N6 B (66 , NN80 microsegundos
; - =h# 1 ciclo , 1 microsegundo
; Cada ciclo del +I=E40 son 60ms
bsf E*+-92&6 ; P gina 1
movl% b8100001118 ; Prescaler de (66
mov%f +=402P+
movl% b8101000008 ; InterrupciRn por timer0
mov%f I:+C2:
bcf E*+-92&6
return
; +4-+-=IE:+2 9E I:+E44.PCI2:E* HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
int decf +E=P&f
call cargartimer
retfie
; +4-+-=IE:+2 9E) C2:+-924 HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
visuali#a bcf E*+-92&6
movf% -C+.-) ; 4epresenta el nWmero actual
call displaC
mov%f P.E4+-7 ; Incrementa el nWmero
movf% @-)24 ; @-)24 HU W
sub%f -C+.-)&% ; -C+.-) H W E -C+.-) H @-)24 F
btfsc E*+-92&0 ; X-C+.-) T @-)24P HU flag C , 0
goto comien#o ; *I3 pone a 0 el displaC
incf -C+.-)&f ; :23 incrementa -C+.-)
return
comien#o clrf -C+.-)
return
; +-7)- 9E C2:@E4*I2:HHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHH
displaC add%f PC)&f ; pcl Y W HU W
; El pcl se incrementa con el
; valor de W proporcionando un
; salto
retl% 0B'G ; 4etorna con el valor del
; cRdigo del 0
retl% 0B06 ; 4etorna con el cRdigo del 1
retl% 0B6b ; 4etorna con el cRdigo del (
retl% 0Bf ; 4etorna con el cRdigo del '
retl% 0B66 ; 4etorna con el cRdigo del
retl% 0B6d ; 4etorna con el cRdigo del 6
retl% 0BKd ; 4etorna con el cRdigo del 6
retl% 0B0K ; 4etorna con el cRdigo del K
E:9
;
; P4-C+IC- 10
;
; -utor3 =iIel EtBebarria
; EcF =icrosCstems Engineering E7ilbaoF
;
;
;2tras interrupciones
;
;)os dispositivos PIC pueden provocar interrupci$n por otras dos causas diferentes adems de
;por la del +=40! .na de ellas es por la detecci$n de una seZal de un determinado flanco por
;la entrada 470JI:+! )a otra es por el cambio de estado l$gico producido en cual"uiera de las
;lDneas de entrada 47H47K!
;
;El ejemplo pretende mostrar la detecci$n C tratamiento de cada una de estas nuevas fuentes de
;interrupci$n! Cuando se produce la interrupci$n 470JI:+ se activa la salida 4-0 durante 1L!
;Cuando se produce la interrupci$n por cambio de estado en 47H47K se activa la salida 4-1
;durante 1L!
)ist p,16G8 ;+ipo de procesador
include LP16G8!I:CL ;9efiniciones de registros internos
+emp e"u 0B0c ;@ariable para la tempori#aci$n

org 0B00 ;@ector de 4eset
goto Inicio
org 0B0 ;@ector de interrupci$n
;Programa de tratamiento de la interrupci$n
+ratamiento btfsc I:+C2:&I:+G ;1a sido el 470JI:+ PP
goto +ratar?I:+G ;*i
btfss I:+C2:&47IG ;:o& ha sido cambio en 47H47K P
goto Gin?+ratamiento ;:o& falsa interrupci$n
Cambio?47?47Kbsf P24+-&1 ;-ctiva salida 471
goto Gin
+ratar?I:+G bsf P24+-&0 ;-ctiva salida 470
;*e hace un delaC de 1 segundo antes de reponer los correspondientes flags de interrupci$n!
;9e esta forma se evitan posibles rebotes "ue puediera haber en las entradas!
Gin movl% !(0 ;Comien#a una tempori#aci$n de 1L
mov%f +emp ;Inicia una variable temporal
*eguir bcf I:+C2:&+0IG ;4epone el flag del +=40
movl% [!1N6
mov%f +=40 ;4epone el +=40 con el complemento de 1N6
9elaC?60m* clr%dt ;Comien#a un bucle de tempori#aci$n de 60m*
btfss I:+C2:&+0IG ;Gin de los 60 m* PP
goto 9elaC?60m* ;+odavDa no
nop
decfs# +emp&G ;*e ha repetido (0 veces los 60m* PP
goto *eguir ;:o
Gin?+ratamiento clrf P24+- ;*i& ha pasado 1L! 9esconecta las salidas
movf P24+7&W ;)ee estado actual de las entradas 4-H4-K para reponer
bcf I:+C2:&47IG ;el flag de interrupci$n por cambio en 47H47K! 1aC "ue
;hacerlo en este $rden
bcf I:+C2:&I:+G ;4epone el flag de interrupci$n por 472JI:+
retfie ;4etorno de interrupci$n
Inicio clrf P24+- ;7orra los latch de salida
bsf *+-+.*&4P0 ;*elecciona banco 1
clrf +4I*- ;Puerta - se configura como salidas
movl% b8111111118
mov%f +4I*7 ;Puerta 7 se configura como entrada
movl% b8010001118 ;Preescaler de (66 asignado al +=40 C
mov%f 2P+I2:?4E5 ;470JI:+ sensible al flanco ascendente
bcf *+-+.*&4P0 ;*elecciona banco 0
movf P24+7&W ;)ee el estado inicial de las entradas 47H47K
movl% b8100110008
mov%f I:+C2: ;-ctiva la interrupcines I:+G C 47IG
)oop sleep ;El dispositivo "ueda en standbC
goto )oop
end ;Gin del programa fuente
;
; P4-C+IC- 8
;
; -utor3 =iIel EtBebarria
; EcF =icrosCstems Engineering E7ilbaoF
;
;
;El modo +=40 como contador de eventos eBternos
;
;El ejemplo pretende mostrar el funcionamiento del +=40 en el modo contador! =ediante las
;entradas 4-0H4-' se introduce el nMmero de pulsos a contar! Por 4- se aplican dichos pulsos
;Cuando se alcance el valor deseado se disparan dos salidas durante un tiempo! )a salida 471 se
;utili#a para desconectar la fuente de entrada de pulsos C 470 para activar cual"uier otro
;dispositivo Ep!e! un rel\& en led& etc!F
;El W9+ se emplear a modo de tempori#ador para determinar el tiempo de disparo de ambas
;salidas
)ist p,16G8 ;+ipo de procesador
include LP16G8!I:CL ;9efiniciones de registros internos

org 0B00 ;@ector de 4eset
goto Inicio
org 0B06 ;*alva vector de interrupci$n
Inicio clrf P24+7 ;7orra los latch de salida
bsf *+-+.*&4P0 ;*elecciona banco 1
clrf +4I*7 ;Puerta 7 se configura como salida
movl% b8000111118
mov%f +4I*- ;4-0H4- entradas
movl% b8001111118
mov%f 2P+I2:?4E5 ;Preescaler de (66 para el W9+! El +=40 evoluciona a
;cada flanco descendente aplicado por 4-
bcf *+-+.*&4P0 ;*elecciona banco 0
)oop movf P24+-&W
andl% b8000011118 ;)ee las entradas 4-0H4-'
Borl% b8111111118 ;Complementa el valor leDdo Eel +=40 es ascendenteF
addl% !1
mov%f +=40 ;Carga el +=40 con el valor leDdo
bsf P24+7&1 ;-ctiva la entrada de pulsos a contar
bcf I:+C2:&+0IG ;4epone el flag del +=40
Espera clr%dt ;4efresca el W9+
btfss I:+C2:&+0IG ;1a finali#ado la cuenta PP
goto Espera ;:o
bcf P24+7&1 ;9esconecta la entrada de pulsos a contar
bsf P24+7&0 ;-ctiva la salida a rel\& led& etc!
clr%dt ;El W9+ se refresca C comien#a la tempori#aci$n
sleep ;El modo standbC se mantiene hasta "ue el W9+ desborde
;transcurridos aproB! (L E18m*;(66 de preescalerF
bcf P24+7&0 ;9esactiva la salida a rel\& led& etc!
goto )oop
end ;Gin del programa fuente

También podría gustarte