Buenas compañeros del foro, estoy montando mi propia insoladora con leds UV pero tengo un problema con la programacion del pic 16F628A en picbasic pro, que consta de varias rutinas
una de definicion del tiempo que desea el usuario, otra de pausa, otra de isolado y otra de completado.
Usando el comando pause 1000 realiza el descuento de tiempo desde 100 horas hasta completado, pero el usuario puede definir el tiempo deseado al poner en marcha la isoladora,
mostrando digito a digito el tiempo que le vas introduciendo mediante los pulsadores sumar y seleccionar digito, hasta que al introducir el valor del ultimo digito pasa automaticamente a la rutina de preparado, esperando una pulsacion de START para iniciar el isolado.
En ese momento manteniendo pulsada la tecla START empieza la isolacion.
Pero tengo un problema.
En proteus (isis) la simulacion del programa funciona bastante bien ya que hace lo que yo deseo, pero en la protoboard no lo hace, el programa no espera a que yo introduzca el tiempo saltando de digito a digito a la hora de definir el tiempo deseado sin dejarme hacerlo y pasando de la rutina de la definicion del tiempo deseado para isolar a la rutina de START, ademas salta de la rutina de isolado a la rutina de pausa, le he dado mil vueltas y no comprendo que tengo mal en la programacion del pic para que en proteus me funcione bien y en la protoboard no.
Que me podeis ayudar a resolver el problema porfavor?
Os adjunto el programa en picbasic pro y el esquema en proteus con su respectivo HEX para que en la medida de lo posible me ayudeis a resolver mi problema.
Un saludo.
Ver el archivo adjunto temporizador insoladora.rar
Esquema en proteus con el HEX
una de definicion del tiempo que desea el usuario, otra de pausa, otra de isolado y otra de completado.
Usando el comando pause 1000 realiza el descuento de tiempo desde 100 horas hasta completado, pero el usuario puede definir el tiempo deseado al poner en marcha la isoladora,
mostrando digito a digito el tiempo que le vas introduciendo mediante los pulsadores sumar y seleccionar digito, hasta que al introducir el valor del ultimo digito pasa automaticamente a la rutina de preparado, esperando una pulsacion de START para iniciar el isolado.
En ese momento manteniendo pulsada la tecla START empieza la isolacion.
Pero tengo un problema.
En proteus (isis) la simulacion del programa funciona bastante bien ya que hace lo que yo deseo, pero en la protoboard no lo hace, el programa no espera a que yo introduzca el tiempo saltando de digito a digito a la hora de definir el tiempo deseado sin dejarme hacerlo y pasando de la rutina de la definicion del tiempo deseado para isolar a la rutina de START, ademas salta de la rutina de isolado a la rutina de pausa, le he dado mil vueltas y no comprendo que tengo mal en la programacion del pic para que en proteus me funcione bien y en la protoboard no.
Que me podeis ayudar a resolver el problema porfavor?
Os adjunto el programa en picbasic pro y el esquema en proteus con su respectivo HEX para que en la medida de lo posible me ayudeis a resolver mi problema.
Un saludo.
Ver el archivo adjunto temporizador insoladora.rar
Esquema en proteus con el HEX
Código:
' Temporizador microcontrolado con 16F628A de 100 horas hasta 0
' utilizando pausas de 1000 ms para crear el decremento de 1 seg
' portb.3 sera usado para activar la carga, un opto moc 3020 que a su vez activara
' un triac con amperaje suficiente para soportar una carga de unos 5 amp
' ya que la finalidad del temporizador es activar un trafo de 220v -->12v +/-5a
' y este alimentara a una placa tamaño din A4 con 200 leds UV con sus respectivas resistencias de 470H.
' o tambien activar 2 placas de din A5 con 100 leds por placa para crear isolacion a doble cara.
' los fuses debo definirlos en el programador ya que PBP con MPLAB solo permite definirlos asi
' usando el valor de config word 3F0D
' FUSES XT, WDT ON, PWRT OFF, MCLRE OFF, BOREN OFF, LVP OFF, CPD OFF, CP OFF
DEFINE XT
DEFINE WDT_ON
DEFINE PWRT_OFF
DEFINE MCLRE_OFF
DEFINE BOREN_OFF
DEFINE LVP_OFF
DEFINE CPD_OFF
DEFINE CP_OFF
DEFINE OSC 4
DEFINE LCD_DREG PORTB 'Define el puerto de los datos del LCD
DEFINE LCD_DBIT 4 'Utilizamos RB4 RB5 RB6 RB7 del PIC
DEFINE LCD_RSREG PORTB 'Define el puerto de RS
DEFINE LCD_RSBIT 0 'Numero de puerto de RS
DEFINE LCD_RWREG PORTB 'Puerto de RW
DEFINE LCD_RWBIT 1 'Numero de puerto de RW
DEFINE LCD_EREG PORTB 'Puerto de Enable
DEFINE LCD_EBIT 2 'Numero de puerto de Enable
DEFINE LCD_BITS 4 'BITS DE DATOS
DEFINE LCD_LINES 2 'LINEAS DEL LCD EN ESTE CASO 2
p var byte ' tiempo de pausas
hd var byte ' unidades de horas
hi var byte ' decenas de horas
md var byte ' unidades de minutos
mi var byte ' decenas de minutos
sd var byte ' unidades de segundos
si var byte ' decenas de segundos
carga var portb.3
rled var porta.0 ' led rojo de marcha
vled var porta.1 ' led verde de pausa
paus var porta.2 ' pulsador de start
sele var porta.3 ' pulsador de seleccion tiempo y pausa
suma var porta.4 ' pulsador de añadir tiempo y continuar
p=100
sd=0
si=0
md=0
mi=0
hd=0
hi=0
CMCon=7
trisb=0
trisa=1
gosub ledson
pause 500
gosub clean
lcdout $FE,1, "Inicializando"
lcdout $FE,$C0,"Temporizador."
pause 2000
setsd: ' inicio de rutina de definicion de tiempo
' Se añade tiempo digito a digito
' se cambia de digito pulsando CAMBIAR DIGITO / PAUSA
' tras pasar los 6 digitos de tiempo pasa a modo
' PREPARADO automaticamente esperando pulsacion
' del pulsador START para iniciar la isolacion.
if suma=0 then
sd=sd+0
gosub pins1
else
sd=sd+1
gosub pins1
if sd=10 then
sd=0
endif
endif
gosub clean
lcdout $FE,1, "Definir tiempo."
gosub lcd
pause 500
gosub clean
lcdout $FE,1, "Definir tiempo."
lcdout $FE,$c0, dec (hi), dec (hd), ":", dec (mi), dec (md), ":" ,dec (si)," "
pause 500
if sele=1 then
gosub pins1
goto setsi
endif
goto setsd
setsi:
if suma=0 then
si=si+0
gosub pins1
else
si=si+1
gosub pins1
if si=6 then
si=0
endif
endif
gosub clean
lcdout $FE,1, "Definir tiempo."
gosub lcd
pause 500
gosub clean
lcdout $FE,1, "Definir tiempo."
lcdout $FE,$c0, dec (hi), dec (hd), ":", dec (mi), dec (md), ":"," ", dec (sd)
pause 500
if sele=1 then
gosub pins1
goto setmd
endif
goto setsi
setmd:
if suma=0 then
md=md+0
gosub pins1
else
md=md+1
gosub pins1
if md=10 then
md=0
endif
endif
gosub clean
lcdout $FE,1, "Definir tiempo."
gosub lcd
pause 500
gosub clean
lcdout $FE,1, "Definir tiempo."
lcdout $FE,$c0, dec (hi), dec (hd), ":", dec (mi)," ", ":",dec (si), dec (sd)
pause 500
if sele=1 then
gosub pins1
goto setmi
endif
goto setmd
setmi:
if suma=0 then
mi=mi+0
gosub pins1
else
mi=mi+1
gosub pins1
if mi=6 then
mi=0
endif
endif
gosub clean
lcdout $FE,1, "Definir tiempo."
gosub lcd
pause 500
gosub clean
lcdout $FE,1, "Definir tiempo."
lcdout $FE,$c0, dec (hi), dec (hd), ":"," ", dec (md), ":",dec (si), dec (sd)
pause 500
if sele=1 then
gosub pins1
goto sethd
endif
goto setmi
sethd:
if suma=0 then
hd=hd+0
gosub pins1
else
hd=hd+1
gosub pins1
if hd=10 then
hd=0
endif
endif
gosub clean
lcdout $FE,1, "Definir tiempo."
gosub lcd
pause 500
gosub clean
lcdout $FE,1, "Definir tiempo."
lcdout $FE,$c0, dec (hi)," ", ":", dec (mi), dec (md), ":",dec (si), dec (sd)
pause 500
if sele=1 then
gosub pins1
goto sethi
endif
goto sethd
sethi:
if suma=0 then
hi=hi+0
gosub pins1
else
hi=hi+1
gosub pins1
if hi=10 then
hi=0
endif
endif
gosub clean
lcdout $FE,1, "Definir tiempo."
gosub lcd
pause 500
gosub clean
lcdout $FE,1, "Definir tiempo."
lcdout $FE,$c0," ", dec (hi), ":", dec (mi), dec (md), ":",dec (si), dec (sd)
pause 500
if sele=1 then
gosub pins1
goto start
endif
goto sethi ' finalizacion de la rutina de definicion del tiempo de isolacion
start: ' rutina de preparado para isolar
gosub pins1
high vled
low rled
gosub clean
lcdout $FE, 1, "Preparado."
gosub lcd
pause 500
gosub clean
lcdout $FE,1, "Pulse Start."
gosub lcd1
pause 400
gosub pins1
if porta.2 = 1 then
goto inicio0
else
goto start
endif
inicio0: ' conmuta los puertos de los leds de preparado (verde) e insolacion (rojo)
gosub pins
gosub pins1
gosub ledsoff
inicio: ' inicio de la rutina de descuento de tiempo y activa el puerto de carga
high portb.3
if porta.3 =1 then pausa
gosub clean
lcdout $FE, 1, "Tiempo restante."
gosub lcd
pause 500
gosub clean
lcdout $FE, 1, "Tiempo restante."
gosub lcd1
pause 500
if sd = 0 then
if si =0 and sd=0 then
if md =0 and si=0 and sd=0 then
if mi =0 and md =0 and si=0 and sd=0 then
if hd=0 and mi =0 and md =0 and si=0 and sd=0 then
if hi=0 and hd=0 and mi =0 and md =0 and si=0 and sd=0 then
goto final
endif
hi=hi-1
hd=10
mi=6
md=10
si=6
endif
hd=hd-1
mi=6
md=10
si=6
endif
mi=mi-1
md=10
si=6
endif
md=md-1
si=6
endif
si=si-1
sd=10
endif
sd=sd-1
goto inicio ' finalizacion de la rutina de descuento de tiempo
' si el tiempo no es 00:00:00 vuelve a inicio
final: ' rutina de finalizacion, conmutacion de puertos de leds y carga
low portb.3
high vled
low rled
gosub clean
lcdout $FE, 1, "Completado."
gosub lcd
pause 50
low vled
pause 950
goto final
pins: ' barrido de pins para setear puertos de pulsadores
pause p
trisa=%11111100
trisa=%11101100
trisa=%11110100
trisa=%11111000
return
pins1:
pause p
trisa=%11111100
trisa=%10111100
trisa=%11011100
trisa=%11101100
trisa=%11110100
trisa=%11111000
trisa=%11111100
return ' fin del barrido de pins
ledson: ' leds en modo pausa
high vled
low rled
return
ledsoff: ' leds en modo isolado
low vled
high rled
return
lcd: ' subrutinas de LCD para ahorrar espacio
lcdout $FE,$C0, dec (hi), dec (hd), ":", dec (mi), dec (md), ":" ,dec (si), dec (sd)
return
lcd1:
lcdout $FE,$C0, dec (hi), dec (hd), " ", dec (mi), dec (md), " " ,dec (si), dec (sd)
return
clean:
lcdout $FE, 1
lcdout $FE, 1
return
pausa: ' Rutina de pausa se activa con el pulsador CAMBIAR DIGITO /PAUSAR
' Se sale de Pausa activando el pulsador SUMAR TIEMPO / CONTINUAR
gosub ledson
low portb.3
low sele
low suma
low paus
gosub clean
lcdout $FE, 1, "Pausado."
gosub lcd
gosub pins
gosub pins1
pause 1000
gosub clean
lcdout $FE, 1, "Pulse Continuar."
gosub lcd
gosub pins
gosub pins1
pause 1000
if suma =1 then
suma=0
gosub ledsoff
goto inicio
else
suma=0
goto pausa
endif ' fin de la rutina pausa
end
Última edición: