bueno. aca algunas modificaciones sugeridas por killerjc
los goto son saltos de dos o tres renglones dentro de una misma subrutina, para que eluda alguna otra subrutina.
el tema de interrupciones por sensores o por boton, quedaron como debe ser en subrutinas (sin gotos)
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
dormir pasa a ser un bucle
correccion de algunas subrutinas con nombres mal puestos
adjunto tambien foto actualizada del bosquejo, con el cambio de el 7407 por 2 diodos a cada entrada.
la parte del termistor no la hice todavia, porque no encuentro algo similar en el proteus, pero es lo mismo que con el ldr.
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