por razones de una memoria sd que se estropeo y no tenia en otro sitio algunos programas el que tengo funcionando en el video youtuve lo perdi. este es el mismo con el mismo principio que siempre e usado para echarlo a funcionar.. solo que no esta provado y verificado.. aparte de estas con algunas mejoras como una salida pwm cuando se apaguen al completo todas las luces.
'****************************************************************
'* Name : programa control hiluminacion vivienda pic16f84 *
'* Author : peep *
'* Notice : Copyright (c) 2011 buffff *
'* : All Rights Reserved *
'* Date : 26/08/2011 *
'* Version : 1.0 *
'* Notes : 2Xdimer 220V, PWM led, temporizador y conmutacion *
'* : *
'****************************************************************
'
'
contador var word
estractor var word
funci var byte
b0 var funci.bit0
b1 var funci.bit1
b2 var funci.bit2
ciclo var byte
luz1 var byte
luz2 var byte
t_luz1 var byte
t_luz2 var byte
temp1 var byte
temp2 var byte
reten var byte
pwm_led var byte
clear
trisb=1
portb=128
trisa=0
porta=12
intcon=%01000111
porta=0
luz1=100
luz2=20
t_luz1=160
t_luz2=160
estractor=23000
contador=65300
pause 20
read 0,temp1 ' leemos epron y comprobamos si hay algun valor almacenado
if temp1<>255 then gosub leer_epron
'
' programa
'
programa
gosub alterna
if contador=estractor then low porta.4
contador=contador+1
if contador=65301 then contador=0:porta.4=b0
if reten<>0 then programa
high portb.1:high portb.2:high portb.3:high portb.4
if portb.1=0 or portb.2=0 or portb.3=0 or portb.4=0 then bajo
low portb.1:low portb.2:low portb.3:low portb.4
if portb.1=1 or portb.2=1 or portb.3=1 or portb.4=1 then alto
goto programa
'
' disparo del triac
'
alterna:
while portb.0=0
wend
while portb.0=1 and ciclo<159
if ciclo=luz1 then high porta.0
if ciclo=luz2 then high porta.1
ciclo=ciclo+1
wend
low porta.0
low porta.1
ciclo=0
return
'
' lectura de controles
'
' pulso 0
'
bajo:
if b1=0 and portb.1=0 and luz1<160 then luz1=luz1+1
if b1=0 and portb.2=0 and luz2<160 then luz2=luz2+1
if portb.3=0 then
toggle porta.2
b1=porta.2
reten=120
swap t_luz1,luz1
swap t_luz2,luz2
else
reten=7
endif
if portb.4=0 then n_estractor
if luz1=160 and luz2=160 and b1=0 then led_pwm
goto programa
'
' pulso alto
'
alto:
if portb.1=1 and luz1>0 then luz1=luz1-1
if portb.2=1 and luz2>0 then luz2=luz2-1
if portb.3=1 then
toggle porta.3
b0=porta.3
contador=65300
reten=120
else
reten=7
endif
if portb.4=1 then almacenar
goto programa
'
' muestra el tiempo activo del estractor
'
n_estractor:
temp1=160
temp1=160
swap temp1,luz1
swap temp2,luz2
while portb.4=0
high portb.4
estractor=estractor+100
if estractor>65300 then estractor=7200
luz1=160-(estractor/520)
gosub alterna
wend
swap temp1,luz1
swap temp2,luz2
porta.4=b0
goto programa
'
' nivel de apagado control PWM para led
'
led_pwm:
pwm_led=210
while pwm_led<>230
for reten=0 to 20
low portb.7
for temp1=0 to 200
if temp1=pwm_led then high portb.7
PAUSEUS 2
next temp1
next reten
high portb.1:high portb.2:high portb.3
if (portb.1=0 or portb.2=0) and pwm_led>20 then pwm_led=pwm_led-1
if portb.3=0 then pwm_led=230
low portb.1:low portb.2
if portb.1=1 or portb.2=1 then pwm_led=pwm_led+1
wend
reten=0
high portb.7
goto programa
'
' leer los valores de la epron
'
leer_epron:
read 0,luz1
read 1,luz1
read 2,temp1
read 3,funci
return
'
' almacenar valores
'
almacenar:
high porta.0
for temp1=0 to 50
low portb.4
if portb.4=1 then goto programa
pause 4
next temp1
temp1=contador/255
write 0,luz1
write 1,luz1
write 2,temp1
write 3,funci
for temp1=0 to 5
toggle porta.0
pause 500
next temp1
goto programa
la verdad que este programa tambien llena el pic, un consejo seroa no intenteis con el 84 usar a.2 ni a.3 para el dimmer no son estables. o porlomenos ami nunca me funcionaron bien.
aparte en ese programa a.3 es una salida temporizada a intervalos de unos 5min.