estas cuatro entradas son las B4-B7 que me despertaran
pudo poner las patas de B4-B7 como salidas para que no molesten al PIC mientras duerme y no necesite sus entradas?
1) si esta en manual, las patas correspondientes al automatico no deben molestar
2) si se activo una para prender los ventiladores, poner ESA MISMA en salida, para que no siga despertandolo, y solo lo despierte la otra (para apagarlos cuando baje la temperatura)
el tema de dormirlo, es porque asi estaria la mayor parte del tiempo,
el tema secundario justamente era ese (consecuencia de poder poner patas del B4-B7 como salidas): que no me molesten los valores externos en los puertos asignados como salidas. como decis, sera con una resistencia entre el 7414 y los puertos del PIC
list P=16F84A
include P16F84A.INC
cblock 0x0C
ev ; estado de ventiladores
el ; estado de luces
endc
org 0 ; en el arranque
goto inicio ; va a inicio
org 4 ; si hay interrupcion
goto interrpuertob ; va a interrpuertob
interrpuertob ; subrutina de interrupciones
bcf INTCON,7 ; inhabilito momentaneamente las interrupciones, borrando el bit 7 de INTCON (SACAR)
btfsc INTCON,0 ; no fue interrupcion por entrada en PUERTO B4-B7 (RBIF)? Salta un renglon
call sensores ; entonces como fue por interrupcion de RBIF (B4-B7), anda a sensores
btfsc INTCON,1 ; no fue interrupcion por entrada en PUERTO B0 (RB0/INTF)? Salta un renglon
call botones ; entonces como fue por interrupcion de RB0/INTF (B0), anda a botones
fininit btfsc PORTB,0 ; espero la liberacion del boton
goto fininit ; vuelvo para seguir esperando la liberacion del boton RB0
bcf INTCON,0 ; limpieza de flags de salida
bcf INTCON,1 ; limpieza de flags de salida
bsf INTCON,7 ; rehabilito las interrupciones, prendiendo el bit 7 de INTCON (SACAR)
retfie ; salgo de las interrupciones
sensores ; subrutina de interrupcion por ingreso de sensores (RB4-RB7) para encender o apagar luces o ventiladores, según necesidad
btfsc PORTB,4 ; no fue boton 4 del puerto B el presionado? Entonces salta un renglon
call luzautoon ; si, fue el 4. entonces anda a prender las luces
btfsc PORTB,5 ; no fue boton 5 del puerto B el presionado? Entonces salta un renglon
call luzautooff ; si, fue el 5. entonces anda a apagar las luces
btfsc PORTB,6 ; no fue boton 6 del puerto B el presionado? Entonces salta un renglon
call venautoon ; si, fue el 6. entonces anda a prender los ventiladores
btfsc PORTB,7 ; no fue boton 7 del puerto B el presionado? Entonces salta un renglon
call venautooff ; si, fue el 7. entonces anda a apagar los ventiladores
return
botones ; subrutina de interrupcion por ingreso de boton RB0 (junto a RB2 o RB3), para alterar los estados de luces o ventiladores
btfsc PORTB,2 ; no fue boton 2 del puerto B el presionado? Entonces salta un renglon
call luces ; si, fue el 2 (JUNTO AL 0 que llamo al PIC). entonces vamos a maniobrar las luces
btfsc PORTB,3 ; no fue boton 3 del puerto B el presionado? Entonces salta un renglon
call ventis ; si, fue el 3 (JUNTO AL 0 que llamo al PIC). entonces vamos a maniobrar los ventiladores
return
luzautoon ; inicializacion modo automatico, con luces encendidas
bsf PORTA,4 ; prendo las luces
bsf STATUS,RP0 ; paso al banco 1
bcf TRISB,4 ; pongo a la pata 4 de B en 0 (salida) para que no moleste el ingreso de encendido automatico
bsf TRISB,5 ; pongo a la pata 5 de B en 1 (entrada) para que active el sistema si hay que apagar las luces en modo automatico
bcf STATUS,RP0 ; vuelvo al banco 0
return
luzautooff ; inicializacion modo automatico, con luces apagadas
bcf PORTA,4 ; apago las luces
bsf STATUS,RP0 ; paso al banco 1
bsf TRISB,4 ; pongo a la pata 4 de B en 1 (entrada) para que active el sistema si hay que encender las luces en modo automatico
bcf TRISB,5 ; pongo a la pata 5 de B en 0 (salida) para que no moleste el ingreso de apagado automatico
bcf STATUS,RP0 ; vuelvo al banco 0
return
venautoon ; inicializacion modo automatico, con ventiladores encendidos
bsf PORTB,1 ; prendo los ventiladores
bsf STATUS,RP0 ; paso al banco 1
bcf TRISB,6 ; pongo a la pata 4 de B en 0 (salida) para que no moleste el ingreso de encendido automatico
bsf TRISB,7 ; pongo a la pata 5 de B en 1 (entrada) para que active el sistema si hay que apagar las luces en modo automatico
bcf STATUS,RP0 ; vuelvo al banco 0
return
venautooff ; inicializacion modo automatico, con ventiladores apagados
bcf PORTB,1 ; apago los ventiladores
bsf STATUS,RP0 ; paso al banco 1
bsf TRISB,6 ; pongo a la pata 4 de B en 1 (entrada) para que active el sistema si hay que encender las luces en modo automatico
bcf TRISB,7 ; pongo a la pata 5 de B en 0 (salida) para que no moleste el ingreso de apagado automatico
bcf STATUS,RP0 ; vuelvo al banco 0
return
luces ; subrutinas de eventos según los estados de las luces
incf el,F ; paso al proximo estado de las luces
movf el,W ; paso el valor de el a W
sublw 1 ; resto 1-W (valor queda en W)
btfsc STATUS,2 ; si la resta no fue cero, salto un renglon
call luzmanon ; la resta fue cero, va a la subrutina luces manual encendido
movf el,W ; paso el valor de el a W
sublw 2 ; resto 2-W (valor queda en W)
btfsc STATUS,2 ; si la resta no fue cero, salto un renglon
call luzauto ; la resta fue cero, va a la subrutina luces automatico
movf el,W ; paso el valor de el a W
sublw 3 ; resto 1-W (valor queda en W)
btfsc STATUS,2 ; si la resta no fue cero, salto un renglon
call luzmanoff ; la resta fue cero, va a la subrutina ventilador manual apagado
return
luzmanon ; inicializacion de encendido manual de luces
bsf PORTA,0 ;
bcf PORTA,1 ; junto al renglon anterior, enciendo uno de los colores de led de salida: estado encendido manual
bsf PORTA,4 ; prendo las luces
bsf STATUS,RP0 ; paso al banco 1
bcf TRISB,4 ; pongo a la pata 4 de B en 0 (salida) para que no moleste el ingreso de encendido automatico
bcf TRISB,5 ; pongo a la pata 5 de B en 0 (salida) para que no moleste el ingreso de apagado automatico
bcf STATUS,RP0 ; vuelvo al banco 0
return
luzauto ; inicializacion de luces automaticas. Se fija en el estado en el que esta la solicitud de luz, y la enciende o apaga
bcf PORTA,0 ;
bsf PORTA,1 ; junto al renglon anterior, enciendo uno de los colores de led de salida: estado encendido automatico
btfsc PORTB,4 ; solo me fijo si necesita luz, cualquier otro estado queda en automatico con las luces apagadas
goto luzonini ; si necesita (pata 4 del puerto B esta en 1, pidiendo luz), salto la llamada a la subrutina de encendido
luzoffini call luzautooff ; voy a la subrutina de apagado, por estar la pata 4 del puerto B en 0 (no esta pidiendo luz)
goto salluzauto ; apagados las luces, salto el renglon, donde se hace la llamada a encendido de luces
luzonini call luzautoon ; llego hasta aca con el goto de 3 renglones arriba, para encender las luces
salluzauto return
luzmanoff ; inicializacion de apagado manual de luces
bcf PORTA,0 ;
bcf PORTA,1 ; junto al renglon anterior, apago el led bicolor: estado apagado manual
bcf PORTA,4 ; apago las luces
bsf STATUS,RP0 ; paso al banco 1
bcf TRISB,4 ; pongo a la pata 4 de B en 0 (salida) para que no moleste el ingreso de encendido automatico
bcf TRISB,5 ; pongo a la pata 5 de B en 0 (salida) para que no moleste el ingreso de apagado automatico
bcf STATUS,RP0 ; vuelvo al banco 0
clrf el ; reinicio estado de las luces a 0
return
ventis ; subrutinas de eventos según los estados de los ventiladores
incf ev,F ; paso al proximo estado de las luces
movf ev,W ; paso el valor de ev a W
sublw 1 ; resto 1-W (valor queda en W)
btfsc STATUS,2 ; si la resta no fue cero, salto un renglon
call venmanon ; la resta fue cero, va a la subrutina ventilador manual encendido
movf ev,W ; paso el valor de ev a W
sublw 2 ; resto 2-W (valor queda en W)
btfsc STATUS,2 ; si la resta no fue cero, salto un renglon
call venauto ; la resta fue cero, va a la subrutina ventilador automatico
movf ev,W ; paso el valor de ev a W
sublw 3 ; resto 1-W (valor queda en W)
btfsc STATUS,2 ; si la resta no fue cero, salto un renglon
call venmanoff ; la resta fue cero, va a la subrutina ventilador manual apagado
return
venmanon ; inicializacion de encendido manual de ventiladores
bsf PORTA,2 ;
bcf PORTA,3 ; junto al renglon anterior, enciendo uno de los colores de led de salida: estado encendido manual
bsf PORTB,1 ; prendo los ventiladores
bsf STATUS,RP0 ; paso al banco 1
bcf TRISB,6 ; pongo a la pata 6 de B en 0 (salida) para que no moleste el ingreso de encendido automatico
bcf TRISB,7 ; pongo a la pata 7 de B en 0 (salida) para que no moleste el ingreso de apagado automatico
bcf STATUS,RP0 ; vuelvo al banco 0
return
venauto ; inicializacion de ventiladores automaticos. Se fija en el estado en el que esta la solicitud de ventilacion, y los enciende o apaga
bcf PORTA,2 ;
bsf PORTA,3 ; junto al renglon anterior, enciendo uno de los colores de led de salida: estado encendido automatico
btfsc PORTB,6 ; solo me fijo si necesita ventilacion, cualquier otro estado queda en automatico con los ventiladores apagados
goto venonini ; si necesita (pata 6 del puerto B esta en 1, pidiendo ventilacion), salto la llamada a la subrutina de encendido
venoffini call venautooff ; voy a la subrutina de apagado, por estar la pata 6 del puerto B en 0 (no esta pidiendo ventilacion)
goto salvenauto ; apagados los ventiladores, salto el renglon, donde se hace la llamada a encendido de ventiladores
venonini call venautoon ; llego hasta aca con el goto de 3 renglones arriba, para encender los ventiladores
salvenauto return
venmanoff ; inicializacion de apagado manual de ventiladores
bcf PORTA,2 ;
bcf PORTA,3 ; junto al renglon anterior, apago el led bicolor: estado apagado manual
bcf PORTB,1 ; apago los ventiladores
bsf STATUS,RP0 ; paso al banco 1
bcf TRISB,6 ; pongo a la pata 4 de B en 0 (salida) para que no moleste el ingreso de encendido automatico
bcf TRISB,7 ; pongo a la pata 5 de B en 0 (salida) para que no moleste el ingreso de apagado automatico
bcf STATUS,RP0 ; vuelvo al banco 0
clrf ev ; reinicio estado de los ventiladores a 0
return
inicio bsf STATUS,RP0 ; paso al banco 1
movlw b'11111101' ; configuro al puerto b:EEEEEESE
movwf TRISB ; configuro al puerto b
clrf TRISA ; configuro al puerto a todo de salida
bcf STATUS,RP0 ; paso al banco 0
clrf PORTA ; pongo en 0 al puerto a
clrf PORTB ; pongo en 0 al puerto b
movlw b'10011000' ; configuracion interrupciones. Habilita general y habilita por RB0 y PORT B (4-7)
movwf INTCON ; configuracion interrupciones
clrf ev ; estado inicial de los ventiladores: 0, apagados
clrf el ; estado inicial de las luces: 0, apagadas
dormir nop ; bucle esperando interrupciones
goto dormir
end
los goto son saltos de dos o tres renglones dentro de una misma subrutina, para que eluda alguna otra subrutina.
efectivamente, al no haber rutina de principal, no me preocupo por almacenar estados ni W
dado que el sistema tiene que "dejar andando" (o no) no hago una rutina principal, sino directamente todo en las interrupciones