Temporizador para insoladora con PIC

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

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:
También voy hacer una insoladora pero no de Led.

Uso este esquema y funciona a la primera, muy ueno.

Fig1802_Cuadradas_y_otros.GIF


Con código fuente incluido.

http://www.pic16f84a.org/index.php?...w=article&id=66&Itemid=87#Proteus_Capitulo_18

Saludo.
 
Yo es que soy bastante novato con los pics y programaciones, agradezco tu aporte pero lo que deseo es aprender a hacerlo por mi mismo en la medida de mis limitaciones, me esfuerzo bastante para no tener que solicitar ayuda porque muchos foreros estan hartos de prestar ayuda y mas de una vez he visto el problema por mi mismo, pero ahora no consigo averiguar donde esta mi fallo, se que esta en la programacion del pic y seguramente en el barrido de puertos que hace el programa para setear los puertos y que los pulsadores no queden cebados para que puedan recibir una nueva pulsacion, pero no consigo averiguarlo.
Gracias de todas formas.
 
Hola Meta, conozco el circuito del libro del 16f84a, pero donde le añadirias el relay???
No controlo de lenguaje ensamblador para nada y no sabría a que i/o meterle el relay de 12V y que codigo meterle
 
Hola:

¿Vez un Led rojo encendido?
Va conectado precisamente ahí y ya te funciona.

Precisamente haré ese temporizador para la insoladora que haré como buen proyecto y vale la pena.
Pones el .hex generado que puedes descargar y todo listo.

Saludo.
 
Última edición:
Gracias Meta!!!

Soy bastante novato y no había caido...mi libro esta en pdf y blanco y negro, se ve fatal!!!

Pero lo que no entiendo es que es LS1, ya que el buzzer si lo veo y LS1 tiene forma de altavoz, perdona mi ignorancia...
 
Hola:

LS1 es un altavoz de PC y el otro un zumbador.
En el código de ASM escoges que vas a usar, el zumbador o el altavoz. En este ejemplo está predeterminado el zumbador que recuerde. No hace falta conectar el altavoz.

Si lo montas, funcionará a la primera.

Un slaudo.
 
Hola:

LS1 es un altavoz de PC y el otro un zumbador.
En el código de ASM escoges que vas a usar, el zumbador o el altavoz. En este ejemplo está predeterminado el zumbador que recuerde. No hace falta conectar el altavoz.

Si lo montas, funcionará a la primera.

Un slaudo.

Gracias Crack!!!

Ultima pregunta, que las salidas RB esten repetidas en el bus como se entiende? es decir, es tal cual? o hay una errata, porque veo que a pesar de estar conectadas al bus, hay puertas RB que no tienen nada conectado como salida....y en cambio otras , tienen bastantes cosas creando unos cuantos paralelos.

y el reloj de cuarzo de 4 MHZ aunque se omite sigue estando ahi con dos caps de 22pF, no?



el esquema difiere un poco del de mi libro, supongo que el mio es una edicion anterior
 
Última edición:
Hola:

Sí. el cristal de cuarzo de 4 MHz y los condensadores de 22pF están prtesentes aunque no se muestre en el esquema.

Lo de los puertos no es una errata, si te refieres a que el mismo puerto está conectados dos cosas diferentes, el motivo es, que al tener poco pines se simplifica con truquitos de programación. Está explicado en el .asm, en el mismo puerto funciona como interruptor, cambia de estado se comporta como comunicación al LCD y así sucesivamente a una velocidad pasmosa. Está todo correcto y funciona a la primera, me he preguntado lo mismo hace tiempo.

El último libro es la 3ª edición.

Si lo montas, funciona a la primera, guardas en la EEPROM el tiempo que quieras del temprizador. Vale la pena.

Si te lías, puedes usar un NE555 que también funciona de maravilla.

Eso si, tengo intenciónd e adaptar el código del PIC16F84A al 16F88, otros lo harán directo al 16F628A. Funciona exactmente igual lo que usams PIC más modernos por si acaso el 16F84A lo dejen de fabricar como ocurre con los 16F876A/877A y ahora vinieron los sustitutos mejorados que son el 16F886/887. Microchip ha escogido que esos son los sustitutos, en cuanto al sustituto del F84A Microchip no ha dicho nada, se sigue fabricando y vendiendo. Muchos quieren que sea el 16F628A o el 16F88.

Más información aquí a partir de la página 71.

Descargar:
PDF 5.12 MB.
ZIP 3.19 MB.

16f84a-7324.jpg


Si lo vas ahcer, lo presentas por aquí, ejjee. Haré lo mismo.

Saludo.
 
Última edición:
Olé subcompi,:aplauso:
información al poder.

De acuerdo Meta, tengo el layout casi terminado, mañana empiezo el montaje y te cuento...

Respecto al 16f28, era mi segunda opción en cuanto a pic, hay otro timer para insoladora circulando por ahi....de embedd lab, pero no he podido conseguir los 16f628 a tiempo, así que continuo con el del libro RA-MA.

También tengo controlado alguno con atmega 8, y otros que en vez de LCD usan displays (www.turbokeu.com) pero es mucho aparetejo....

Para esta aplicación el problema de la mayoria reside en que el tiempo esta en horas y minutos, y creo que para insolar podemos prescindir de las horas, y ajustar valores de minutos y segundos.
A mi el ensamblador se me da fatal y no se como convertirlo a C para poder trastearlo.

Tengo que hacerme un tuto acelerado de ensamblador.
 
Hola:

No está en horas y minutos, está en minutos y segundos que no es lo mismo y es así para insoladoras. El PIC16F84A funcionará a la primera.

¿Por qué cambiar a otro PIC?

En mi caso porque el 16F88 es más moderno y cada vez es más aceptado, también que el 16F84A en cualquier momento se puede dejar de fabricar, por ahora resiste a hasta la saciedad y Microchip no tiene nigún tipo de dejarlo de fabricar sobre todoque se usa mucho para aprender y hay libros específicos para ello.

No te líes y primero montas el temporizador que cogerás experiencias y con ello soltura.

Un saludo.
 
Desde luego tengo que terminar el proyecto si o si,

gracias por tus consejos y soporte, tienes razón, primero el 0 y luego el 1.

Te cuento en un par de dias.
 
Entendido, cuanod me llegue a correos los LCD, haré también pruebas. Ahora con los Carnavales correo se ha parado.


Ya esta montada, pero no me funciona correctamente:cry:
en la pantalla solo se ve la linea de caracteres de arrriba, pero sin letras, todos los pixels ocupados
no puedo ajustar tiempo y al darle a los botones ninguno me activa el relé

Tengo ke revisar ke okurre,

Meta, los pines 11 y 12 del lcd van al aire como en el esquema???
 
Buenas:

¿Lo estás haciendo con el PIC16F84A y el ejemplo que viene? Usa directamente su archivo .hex.

Si el LCD se ve como dices, es que no está configurado. Revisa cable por cable o móntalo de nuevo, a veces se resuelve así.

Saludo.
 
lo hago tal cual tu dibujo....aunnke no entiendo que significan los puntos de colores que hay al lado de las patillas....es un codigo?

Lo he hecho y no me funciona, voy a seguir revisando...te informo kon lo ke sea
 
joer, esto falla mas ke una eskopeta de feria, la situación esta asi:

Enciendo>>>La pantalla muestra la fila superior como una cadena de bloques , es decir, todo negro. la fila inferior no tiene nada.

Respecto a la config de la pantalla, lo he mirado unas cuantas veces.

Mis preguntas, dado que el esquemático no ayuda a concretar, son:

Para que ponemos las R3 y R4? como pull up? divisor de tension? que sentido tiene?

el programa que tengo que cargarle cual es? ( por si me he equivocado)

Tengo hecha la cerradura electronica del libro

aunque es practicamente el mismo esquematico, difiere en cuanto a ciertos componentes, no?

POR FAVOR explica el codigo de colores que aparece en los terminales de cada componente, porque los grises me dan a entender que eso no esta conectado, y que es rojo y azul?


Llevo un mareo ke la flipas, estoy por hacerla con el atmega 8....


Saludos Meta
 
Atrás
Arriba