Hola:
Deseo intentar lograr con un PIC12F629 varios tipos de parpadeo de un LED. Entre ellos cambiaré el modo de parpadeo con un pulsador que cada vez al pulsar el pulsador, cambia de modo de configuración del LED. Habrá 3 tipos de configuración.
Dejo un ejemplo mal hecho para que sepan la idea y lograr este objetivo.
Librería RETARDOS_12F629.INC
Un cordial saludo.
EDITO:
Por ahora estoy intentando hacer esto, pero no me sale. Sólo soy ideas.
Deseo intentar lograr con un PIC12F629 varios tipos de parpadeo de un LED. Entre ellos cambiaré el modo de parpadeo con un pulsador que cada vez al pulsar el pulsador, cambia de modo de configuración del LED. Habrá 3 tipos de configuración.
Dejo un ejemplo mal hecho para que sepan la idea y lograr este objetivo.
Código:
; ZONA DE DATOS *********************************************************************
LIST P=12F629 ; Procesador utilizado.
INCLUDE <P12F629.INC> ; Definición de algunos operandos utilizados.
__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__idlocs 0001 ; Versión 1 del ID.
CBLOCK 0x20
Contador
ENDC
#DEFINE LED GPIO,2 ; Salida del Led.
#DEFINE Pulsador GPIO,3 ; Entrada del interruptor.
; ZONA DE CÓDIGOS *******************************************************************
ORG 0 ; El prograna empieza con la dirección 0.
Inicio
bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
movlw 0x20 ; Valor de calibración.
movwf OSCCAL
movlw b'00001000' ; Activar GP3 como entrada.
movwf TRISIO
bcf STATUS,RP0 ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Principal
movf GPIO,W
andlw b'00001000'
addwf PCL,F
goto Configuracion_0
goto Configuracion_1
goto Configuracion_2
Configuracion_0
bsf LED
call Retardo_1s
bcf LED
call Retardo_1s
; goto Principal
Configuracion_1
bsf LED
call Retardo_0.5s
bcf LED
call Retardo_0.5s
; goto Principal
Configuracion_2
bsf LED
call Retardo_0.1s
bcf LED
call Retardo_1s
goto Principal
INCLUDE <RETARDOS_12F629.INC> ; Subrutinas de retardos.
END
Librería RETARDOS_12F629.INC
Código:
; SUBRUTINA *************************************************************************
; Retardo_1s ************************************************************************
; Delay = 1 seconds
; Clock frequency = 4 MHz
; Actual delay = 1 seconds = 1000000 cycles
; Error = 0 %
cblock
d0
d1
d2
endc
Retardo_1s
;999990 cycles
movlw 0x07
movwf d0
movlw 0x2F
movwf d1
movlw 0x03
movwf d2
Retardo_1s_0
decfsz d0, f
goto $+2
decfsz d1, f
goto $+2
decfsz d2, f
goto Retardo_1s_0
;6 cycles
goto $+1
goto $+1
goto $+1
;4 cycles (including call)
return
; Retardo_5s ************************************************************************
; Delay = 5 seconds
; Clock frequency = 4 MHz
; Actual delay = 5 seconds = 5000000 cycles
; Error = 0 %
cblock
d3
d4
d5
endc
Retardo_5s
;4999993 cycles
movlw 0x2C
movwf d3
movlw 0xE7
movwf d4
movlw 0x0B
movwf d5
Retardo_5s_0
decfsz d3, f
goto $+2
decfsz d4, f
goto $+2
decfsz d5, f
goto Retardo_5s_0
;3 cycles
goto $+1
nop
;4 cycles (including call)
return
; Retardo_0.5s ************************************************************************
; Delay = 0.5 seconds
; Clock frequency = 4 MHz
; Actual delay = 0.5 seconds = 500000 cycles
; Error = 0 %
cblock
d6
d7
d8
endc
Retardo_0.5s
;499994 cycles
movlw 0x03
movwf d6
movlw 0x18
movwf d7
movlw 0x02
movwf d8
Retardo_0.5s_0
decfsz d6, f
goto $+2
decfsz d7, f
goto $+2
decfsz d8, f
goto Retardo_0.5s_0
;2 cycles
goto $+1
;4 cycles (including call)
return
; Retardo_0.3s ************************************************************************
; Delay = 0.3 seconds
; Clock frequency = 4 MHz
; Actual delay = 0.3 seconds = 300000 cycles
; Error = 0 %
cblock
d9
d10
endc
Retardo_0.3s
;299993 cycles
movlw 0x5E
movwf d9
movlw 0xEB
movwf d10
Retardo_0.3s_0
decfsz d9, f
goto $+2
decfsz d10, f
goto Retardo_0.3s_0
;3 cycles
goto $+1
nop
;4 cycles (including call)
return
; Retardo_0.1s ************************************************************************
; Delay = 0.1 seconds
; Clock frequency = 4 MHz
; Actual delay = 0.1 seconds = 100000 cycles
; Error = 0 %
cblock
d11
d12
endc
Retardo_0.1s
;99993 cycles
movlw 0x1E
movwf d11
movlw 0x4F
movwf d12
Retardo_0.1s_0
decfsz d11, f
goto $+2
decfsz d12, f
goto Retardo_0.1s_0
;3 cycles
goto $+1
nop
;4 cycles (including call)
return
; Retardo_0.02s ************************************************************************
; Delay = 0.02 seconds
; Clock frequency = 4 MHz
; Actual delay = 0.02 seconds = 20000 cycles
; Error = 0 %
cblock
d13
d14
endc
Retardo_0.02s
;19993 cycles
movlw 0x9E
movwf d13
movlw 0x10
movwf d14
Retardo_0.02s_0
decfsz d13, f
goto $+2
decfsz d14, f
goto Retardo_0.02s_0
;3 cycles
goto $+1
nop
;4 cycles (including call)
return
Un cordial saludo.
EDITO:
Por ahora estoy intentando hacer esto, pero no me sale. Sólo soy ideas.
Código:
; ZONA DE DATOS *********************************************************************
LIST P=12F629 ; Procesador utilizado.
INCLUDE <P12F629.INC> ; Definición de algunos operandos utilizados.
__CONFIG _CPD_OFF & _CP_OFF & _BODEN_OFF & _MCLRE_OFF & _PWRTE_ON & _WDT_OFF & _INTRC_OSC_NOCLKOUT
__idlocs 0002 ; Versión 1 del ID.
CBLOCK 0x20
Contador
ENDC
#DEFINE LED GPIO,2 ; Salida del Led.
#DEFINE Pulsador GPIO,3 ; Entrada del interruptor.
; ZONA DE CÓDIGOS *******************************************************************
ORG 0 ; El prograna empieza con la dirección 0.
Inicio
bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
movlw 0x20 ; Valor de calibración.
movwf OSCCAL
movlw b'00001000' ; Activar GP3 como entrada.
movwf TRISIO
bcf STATUS,RP0 ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.
Principal
btfsc Pulsador ; ¿Pulsador presionado?, ¿(Pulsador)=0?
goto Fin ; No. Vuelve a leerlo.
; call Retardo_0.02s ; Espera que se estabilicen los niveles de tensión.
btfsc Pulsador ; Comprueba si es un rebote.
goto Fin ; Era un rebote y sale fuera.
call IncrementaVisualiza ; Incrementa el contador y lo visualiza.
EsperaDejePulsar
btfss Pulsador ; ¿Dejó de pulsar?. ¿(Pulsador)=1?
goto EsperaDejePulsar ; No. Espera que deje de pulsar.
Fin goto Principal
Loco
goto Configuracion_0
goto Configuracion_1
goto Configuracion_2
Configuracion_0
bsf LED
; call Retardo_1s
bcf LED
; call Retardo_1s
; goto Principal
Configuracion_1
bsf LED
; call Retardo_0.5s
bcf LED
; call Retardo_0.5s
; goto Principal
Configuracion_2
bsf LED
; call Retardo_0.1s
bcf LED
; call Retardo_1s
goto Principal
; Subrutina "IncrementaVisualiza" ---------------------------------------------------------
IncrementaVisualiza
incf Contador,F ; Incrementa el contador y comprueba si ha
movlw d'3' ; llegado a su valor máximo mediante una
subwf Contador,W ; resta. (W)=(Contador)-10.
btfsc STATUS,C ; ¿C=0?, ¿(W) negativo?, ¿(Contador)<10?
InicializaContador
clrf Contador ; No, era igual o mayor. Por tanto, resetea.
goto Loco
return
INCLUDE <RETARDOS_12F629.INC> ; Subrutinas de retardos.
END