Buenos Dias a todos! Como estan?
He estado haciendo algunos programillas y quise compartir este con ustedes.
Se trata de controlar el encendido de un bombillo y un motor DC (Luminosidad y Velocidad, respectivamente) mediante un sensor de luz, representado en este caso por una fotoresistencia.
Aqui el Esquema electrico:
La fotoresistencia va conectada a un potenciometro, el cual sirve para calibrar la sensibilidad del mismo a la luz. Esa pasa a travez de 4 comparadores, cada uno con un valor diferente (1, 2, 3 y 4 volts), estos valores solo los que haran varias la luminosidad del bombillo y la velocidad del motor. Mientras mas oscuridad exista, mas rapido andará el motor y alumbrara mucho mas el bombillo.
La señal generada por los comparadores (LM324 en este caso) es la que le dará el codigo al PIC 16F84A, leida a travez del puerto A. El PIC comparará el valor para saber cuanta iluminacion hay en el entorno y enviar las señales por RB1 y RB2 para el encendido del motor y el bombillo.
A traves del puerto RB0 será recibida la señal de la red electrica pasada por un transformador 120V:12V y adecuada con una resistencia de 1M, para de esta manera hacer el detector del cruce por cero, y de esta manera saber en que momento enviar las señales de disparo a ambas cargas.
Aqui les dejo el Codigo en Asembler:
LIST P=16F84A
INCLUDE <P16F84A.INC>
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;Definicion de Puertos y Variables
STATUS EQU 03H
PORTA EQU 05H
PORTB EQU 06H
CBLOCK 20H
PDel0
PDel1
Del0
Del1
ENDC
#DEFINE BANCO_1 BSF STATUS,RP0
#DEFINE BANCO_0 BCF STATUS,RP0
ORG 00H
GOTO INICIO
ORG 04H
ORG 10H
INICIO BANCO_1
MOVLW B'11111'
MOVWF TRISA ;Puerto A Usado como Entrada
MOVLW B'00000001'
MOVWF TRISB ;Puerto B Usado como Salida, RB0 como entrada
BANCO_0
INICIA BCF STATUS,Z
CLRF PORTA
CLRF PORTB ;Limpiando Puertos
MOVF PORTA,W
XORLW B'00000'
BTFSC STATUS,Z
CALL CERO ;% Para las cargas
MOVF PORTA,W
XORLW B'00001'
CALL VEINTICINCO ;% Para las cargas
MOVF PORTA,W
XORLW B'00011'
CALL CINCUENTA ;% Para las cargas
MOVF PORTA,W
XORLW B'00111'
CALL SETENTAYCINCO ;% Para las cargas
MOVF PORTA,W
XORLW B'01111'
CALL CIEN ;% Para las cargas
GOTO INICIA
CRUCE BTFSS PORTB,0
RETURN
GOTO CRUCE
CERO BCF PORTB,1
BCF PORTB,2
GOTO INICIA
VEINTICINCO
CALL CRUCE
BCF PORTB,1 ; BOMBILLO APAGADO 25%
BSF PORTB,2 ; MOTOR ENCENDIDO 25%
CALL RET1
CALL RET1
CALL RET2
BCF PORTB,1 ; BOMBILLO APAGADO 50%
BCF PORTB,2 ; MOTOR APAGADO 50 %
CALL RET2
CALL RET2
CALL RET1
CALL RET1
CALL RET1
CALL RET1
BSF PORTB,1 ; BOMBILLO ENCENDIDO 25%
BCF PORTB,2 ; MOTOR APAGADO 25 %
CALL RET1
CALL RET1
CALL RET2
RETURN
CINCUENTA
CALL CRUCE
BCF PORTB,1 ; BOMBILLO APAGADO 50%
BSF PORTB,2 ; MOTOR ENCENDIDO 50%
CALL RET1
CALL RET1
CALL RET1
CALL RET1
CALL RET2
CALL RET2
BSF PORTB,1 ; BOMBILLO ENCENDIDO 50%
BCF PORTB,2 ; MOTOR APAGADO 50%
CALL RET1
CALL RET1
CALL RET1
CALL RET1
CALL RET2
CALL RET2
RETURN
SETENTAYCINCO
CALL CRUCE
BCF PORTB,1 ; BOMBILLO APAGADO 25%
BSF PORTB,2 ; MOTOR ENCENDIDO 25%
CALL RET1
CALL RET1
CALL RET2
BSF PORTB,1 ; BOMBILLO ENCENDIDO 50%
BSF PORTB,2 ; MOTOR ENCENDIDO 50%
CALL RET2
CALL RET2
CALL RET1
CALL RET1
CALL RET1
CALL RET1
BSF PORTB,1 ; MOTOR ENCENDIDO 25%
BCF PORTB,2 ; MOTOR APAGADO 25%
CALL RET1
CALL RET1
CALL RET2
RETURN
CIEN CALL CRUCE
BSF PORTB,1 ; BOMBILLO ENCENDIDO 100%
BSF PORTB,2 ; MOTOR ENCENDIDO 100%
CALL RET1
CALL RET1
CALL RET1
CALL RET1
CALL RET1
CALL RET1
CALL RET1
CALL RET1
CALL RET2
CALL RET2
CALL RET2
CALL RET2
RETURN
; RETARDOS
;------------------------------------------------------------- 1ms
RET1 movlw .248 ; 1 set numero de repeticion
movwf Del0 ; 1 |
Loop0 clrwdt ; 1 clear watchdog
decfsz Del0,1 ; 1 + (1) es el tiempo 0 ?
goto Loop0 ; 2 no loop
DelL1 goto DelL2 ; 2 ciclos delay
DelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------------------------------------
;------------------------------------------------------------- 0,08ms
RET2 movlw .18 ; 1 set numero de repeticion
movwf PDel0 ; 1 |
PLoop0 clrwdt ; 1 clear watchdog
decfsz PDel0,1 ; 1 + (1) es el tiempo 0 ?
goto PLoop0 ; 2 no loop
PDelL1 goto PDelL2 ; 2 ciclos delay
PDelL2 clrwdt ; 1 ciclo delay
return ; 2+2 Fin.
;-------------------------------------------------------------
END
PD: Recuerden colocarle el Cristal y todos esos detallitos que le hacen falta al PIC en el esquema electrico.
Espero que les sirva de algo.
Saludos!