navegante 420
la nave nodriza
Lavafaros
Este proyecto nacio al querer instalar unos lavafaros a nuestros coches que inicialmente no llevaban, cuando fuimos a preguntar por el rele que se tenia que cambiar y su precio, nos quedamos de piedra, y de ahí que me pusiera a programar este PIC para realizar esa función.
Para aquellos que usen una bomba de limpia para el lavar el faro, dado que la presión que dan es menor, programamos el PIC para que que primero limpie un faro y después el otro.
He aquí el esquema.
Y este el código ASM
;=========================
; ***** Encabezado *****
;=========================
list p=16F84A ; Microcontrolador utilizado.-
#include P16F84A.inc ; Definicion de registros SFR.-
__CONFIG _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
;======================================
; ***** Definicion de Variables *****
;======================================
CBLOCK 0x0C ; En esta posicion se declaran los registros de usuario (GPR)
STATUS_Temp ; Registro para guardar temporalmete STATUS
W_Temp ; Registro para guardar temporalmete W
PDel0
PDel1
PDel2
ENDC
;==========================================
; ***** Inicio del Microcontrolador *****
;==========================================
Reset
org 0x00
goto Inicio ; Salto a inicio del programa.-
;=====================================
; ***** Vector de Interrupcion *****
;=====================================
org 0x04
goto Inicio_ISR ; Atiendo Interrupcion.-
;=================================
; ***** Programa principal *****
;=================================
org 0x05
Inicio
;==============================
; ----- Configuraciones -----
;==============================
bsf STATUS,RP0 ; Banco 1.-
movlw 0xE0
movwf TRISA ;sssss
movlw b'00000011'
movwf TRISB ;sssssee
movlw 0xDF
movwf OPTION_REG ; Pull-Up deshabiltado, , Timer0|interno, 1:1
bsf OPTION_REG,INTEDG ; Interrupcion RB0 por flanco ascendente
bcf STATUS,RP0 ; Banco 0.-
bcf INTCON,INTF ; Limpiamos bandera
bsf INTCON,INTE ; Habilitamos interrupcion RB0
;bsf INTCON,T0IE ; Habilitamos interrupcion por Timer0
bsf INTCON,GIE ; Habilitacion general de interrupciones
;=====================
; ***** Código *****
;=====================
sueño
clrf PORTB
clrf PORTA
sleep
goto sueño
;=================================================
; ***** Rutina de servicio de Interrupcion *****
;=================================================
Inicio_ISR
;==============================================
; ----- Guardado de registro W y STATUS -----
;==============================================
movwf W_Temp ; Copiamos W a un registro Temporario
swapf STATUS,W ; Invertimos nibles de STATUS
movwf STATUS_Temp ; Guardamos STATUS en un registro temporal
;=============================
; ----- Interrupciones -----
;=============================
; btfsc INTCON,T0IF ; Interrupcion por TMR0?
; goto ISR_TMR0 ; Si, se trata interrupcion
;.............................
btfsc INTCON,INTF ; Interrupcion por RB0?
goto ISR_RB0 ; Si, se trata interrupcion
;.............................
Fin_ISR
;---- Restauramos los valores de W y STATUS ----
swapf STATUS_Temp,W
movwf STATUS
swapf W_Temp,f
swapf W_Temp,W
retfie
;.......................
;ISR_TMR0
; Tratamiento de Interrupcion
; bcf INTCON,T0IF ; Limpiamos bandera
; goto Fin_ISR
;.......................
ISR_RB0
; Tratamiento de Interrupcion
btfsc PORTB,0
goto ISR_RB0
btfss PORTB,1
goto Fin_ISR
movlw b'00000011'
movwf PORTA
call demora
movlw b'00000101'
movwf PORTA
call demora
movlw b'00000000'
movwf PORTA
bcf INTCON,INTF ; Borramos bandera
goto Fin_ISR
;.......................
;=========================
; ***** Subrutinas *****
;=========================
demora
movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
end
Haber quien es primero que ve una pequeña cagadita en el código, que se ha convertido en una pijada muy chula.....
Este proyecto nacio al querer instalar unos lavafaros a nuestros coches que inicialmente no llevaban, cuando fuimos a preguntar por el rele que se tenia que cambiar y su precio, nos quedamos de piedra, y de ahí que me pusiera a programar este PIC para realizar esa función.
Para aquellos que usen una bomba de limpia para el lavar el faro, dado que la presión que dan es menor, programamos el PIC para que que primero limpie un faro y después el otro.
He aquí el esquema.
Y este el código ASM
;=========================
; ***** Encabezado *****
;=========================
list p=16F84A ; Microcontrolador utilizado.-
#include P16F84A.inc ; Definicion de registros SFR.-
__CONFIG _XT_OSC & _PWRTE_OFF & _WDT_OFF & _CP_OFF
;======================================
; ***** Definicion de Variables *****
;======================================
CBLOCK 0x0C ; En esta posicion se declaran los registros de usuario (GPR)
STATUS_Temp ; Registro para guardar temporalmete STATUS
W_Temp ; Registro para guardar temporalmete W
PDel0
PDel1
PDel2
ENDC
;==========================================
; ***** Inicio del Microcontrolador *****
;==========================================
Reset
org 0x00
goto Inicio ; Salto a inicio del programa.-
;=====================================
; ***** Vector de Interrupcion *****
;=====================================
org 0x04
goto Inicio_ISR ; Atiendo Interrupcion.-
;=================================
; ***** Programa principal *****
;=================================
org 0x05
Inicio
;==============================
; ----- Configuraciones -----
;==============================
bsf STATUS,RP0 ; Banco 1.-
movlw 0xE0
movwf TRISA ;sssss
movlw b'00000011'
movwf TRISB ;sssssee
movlw 0xDF
movwf OPTION_REG ; Pull-Up deshabiltado, , Timer0|interno, 1:1
bsf OPTION_REG,INTEDG ; Interrupcion RB0 por flanco ascendente
bcf STATUS,RP0 ; Banco 0.-
bcf INTCON,INTF ; Limpiamos bandera
bsf INTCON,INTE ; Habilitamos interrupcion RB0
;bsf INTCON,T0IE ; Habilitamos interrupcion por Timer0
bsf INTCON,GIE ; Habilitacion general de interrupciones
;=====================
; ***** Código *****
;=====================
sueño
clrf PORTB
clrf PORTA
sleep
goto sueño
;=================================================
; ***** Rutina de servicio de Interrupcion *****
;=================================================
Inicio_ISR
;==============================================
; ----- Guardado de registro W y STATUS -----
;==============================================
movwf W_Temp ; Copiamos W a un registro Temporario
swapf STATUS,W ; Invertimos nibles de STATUS
movwf STATUS_Temp ; Guardamos STATUS en un registro temporal
;=============================
; ----- Interrupciones -----
;=============================
; btfsc INTCON,T0IF ; Interrupcion por TMR0?
; goto ISR_TMR0 ; Si, se trata interrupcion
;.............................
btfsc INTCON,INTF ; Interrupcion por RB0?
goto ISR_RB0 ; Si, se trata interrupcion
;.............................
Fin_ISR
;---- Restauramos los valores de W y STATUS ----
swapf STATUS_Temp,W
movwf STATUS
swapf W_Temp,f
swapf W_Temp,W
retfie
;.......................
;ISR_TMR0
; Tratamiento de Interrupcion
; bcf INTCON,T0IF ; Limpiamos bandera
; goto Fin_ISR
;.......................
ISR_RB0
; Tratamiento de Interrupcion
btfsc PORTB,0
goto ISR_RB0
btfss PORTB,1
goto Fin_ISR
movlw b'00000011'
movwf PORTA
call demora
movlw b'00000101'
movwf PORTA
call demora
movlw b'00000000'
movwf PORTA
bcf INTCON,INTF ; Borramos bandera
goto Fin_ISR
;.......................
;=========================
; ***** Subrutinas *****
;=========================
demora
movlw .14 ; 1 set numero de repeticion (C)
movwf PDel0 ; 1 |
PLoop0 movlw .72 ; 1 set numero de repeticion (B)
movwf PDel1 ; 1 |
PLoop1 movlw .247 ; 1 set numero de repeticion (A)
movwf PDel2 ; 1 |
PLoop2 clrwdt ; 1 clear watchdog
decfsz PDel2, 1 ; 1 + (1) es el tiempo 0 ? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel1, 1 ; 1 + (1) es el tiempo 0 ? (B)
goto PLoop1 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) es el tiempo 0 ? (C)
goto PLoop0 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
end
Haber quien es primero que ve una pequeña cagadita en el código, que se ha convertido en una pijada muy chula.....