No funcionan condiciones IF en PICBasic

Muy buenas tardes amigos de foros de electrónica, estuve alejado un poco del sitio, por lo que estoy en unos proyectos con mi padre, pero otra vez por aquí molestándoles a ustedes los genios de la electrónica digital.

Eh fabricado una placa de control de semáforo con pantalla lcd, tiempo real ds1307 y pic 16f877a de tres fases, o sea tres cabezas de rojo, ámbar y verde.
La idea principal es de que en esta tarjeta de control yo pueda configurar a través de tres pulsadores (enter configuración, arriba, abajo), lo siguiente:

1.- Elegir la modalidad del semáforo, si va trabajar con 2 o 3 fases. (dos fases para un cruce de dos calles y tres fases puede ser para un ovalo pequeño), bueno eso queda a criterio de cómo lo maneje de acuerdo con las calles y sus sentidos.

2.- elegir el tiempo de encendido por cada fase, por ejemplo:
Fase1 = 10 segundos
Fase2 = 15 segundos
Fase3 = 17 segundos
Ojo: los tiempos son variables de acuerdo al tamaño de las vías.

3.- elegir la hora de:
Intermitencia
Apagado
Encendido
Y para esto deseo configurar tres (3) casos posibles del que yo pueda dejar programado el semáforo, o sea.

file:///D:/Documents%20and%20Settings/Administrador/Escritorio/Sin%20t%C3%ADtulo-1.jpg

Explicando:
Caso1: que la hora de intermitencia y apagado sea antes de las 00:00 hrs y la hora de encendido sea después de las 00:00 horas
Caso2: que la hora de intermitencia sea antes de las 00:00 hrs y la hora de apagado y encendido sea después de las 00:00 hrs
Caso3: que la hora de intermitencia, de apagado y encendido sea antes de las 00:00 hrs

Bueno les cuento, mi programa funciona casi todo, pero ese casi es un gran inconveniente para mi, como así.
Pude elaborar una serie de condiciones (if……then….) para que cualquiera de los casos (1,2,3) pueda correr a criterio del cliente. Ya llevo más de un mes tratando de solucionar y nada, es por eso que pongo mi problema al foro, para que por ahí me den algunas luces de cómo solucionar este problema que se me ha hecho ya cansador hasta hoy. Espero no faltar el respeto.
Gracias por sus aportes amigos de foros de electrónica.

adjunto la parte de mi programa con las condiciones que no me trabajan en pic basic pro.
 

Adjuntos

  • PREGUNTA DEL SEMAFORO.txt
    3.8 KB · Visitas: 23
hola marvin Villalobos, no soy un gran conocedor del basic pero por lo que veo (amenos que este equivocado) hay dos tipos de errores en tu código.
1ro. En este trozo de código que tuenes:

Código:
if APhora >= INHora and APhora >= ENhora and APminu >= INminu and APminu >=ENCminu then caso1
if INHora >= ENhora and INHora >= APhora and INminu >= ENCminu and INminu >= APminu then caso2
if ENhora >= APhora and ENhora >= INHora and ENCminu >= APminu and ENCminu >=INminu then caso3

que recuerde la estructura IF siempre termina con un END IF
por lo cual si mostramos tu programa del siguiente modo.

Código:
if APhora >= INHora and APhora >= ENhora and APminu >= INminu and APminu >=ENCminu then
   caso1
   if INHora >= ENhora and INHora >= APhora and INminu >= ENCminu and INminu >= APminu then
      caso2
      if ENhora >= APhora and ENhora >= INHora and ENCminu >= APminu and ENCminu >=INminu then
         caso3
se observa que solo evalúa el primer if y si este no es verdadero no evalua los demás if.

2do. Si el primerif es verdadero se tiene que ejecutar caso1, pero asi como esta escrito es una llamada a subrutina pero mas abajo en el código solo tienes una etiqueta, si la intención es hacer un salto incondicional a la etiqueta caso1: deberías usar goto caso1
lo mismo para el resto del código.
 
Hola estimado Saint_, quiero darte las gracias por tu ayuda, me da muchas luces donde está mi problema, pero no logro ni hacer funcionar este pequeño circulo.
PHP:
inicio:
if APhora >= INHora and APhora >= ENhora and APminu >= INminu and APminu >= ENCminu then
       goto caso1
        endif
    if INhora >= ENhora and INhora >= APhora and INminu >= ENCminu and INminu >= APminu then
        goto caso2    
        endif
    if ENhora >= APhora and ENhora >= INHora and ENCminu >= APminu and ENCminu >= INminu then
       goto caso3
        endif
      
caso1:
porta.0=1 ;rojo
pause 100
goto inicio
       
caso2:
porta.1=1;amarillo
pause 100
goto inicio 
         
caso3:
porta.2=1;verde
pause 100
goto inicio
Cuando configuro caso1, enciende led porta.0 rojo (Bien)
Cuando configuro caso2, enciende led porta.0 rojo ¿Por qué no enciende el amarillo?
Cuando configuro caso3, enciende led porta.2 verde (Bien)

Gracias por tu apoyo.
 
Última edición por un moderador:

D@rkbytes

Moderador
Debes hacer un bucle para encerrar las comparaciones, o se seguirá ejecutando el código restante.
O sea, también se ejecutarán las instrucciones de las etiquetas "caso1:", "caso2:" y "caso3:" aunque no se compare nada.
 
hasta donde no sera mi torpeza. no me sale,,,:cry: habran algunos ejemplos aqui:
solo esto pude hacer:

inicio:

if hora_apag >=hora_int and hora_apag >=hora_enc and minu_apag>=minu_int and minu_apag>=minu_enc then
GOTO caso1
GOTO inicio
endif

if hora_int >=hora_enc and hora_int >= hora_apag and minu_int>=minu_enc and minu_int>= minu_apag then
GOTO caso2
GOTO inicio
endif

if hora_enc>= hora_apag and hora_enc>=hora_int and minu_enc>= minu_apag and minu_enc>=minu_int then
goto caso3
endif

goto inicio

caso1:
porta.0=1 ;rojo
pause 1000
goto inicio

caso2:
porta.1=1 ; amarillo
pause 1000
goto inicio

caso3:
porta.2=1 ;verde
pause 1000
goto inicio



espero no molestar mas.
 
Saludos marvin villalobos. En relación a lo por Ti publicado en el post #3, la forma correcta es la siguiente:


Código:
inicio:
    if (APhora >= INHora) and (APhora >= ENhora) and (APminu >= INminu) and (APminu >= ENCminu) then caso1
    if (INhora >= ENhora) and (INhora >= APhora) and (INminu >= ENCminu) and (INminu >= APminu) then caso2    
    if (ENhora >= APhora) and (ENhora >= INHora) and (ENCminu >= APminu) and (ENCminu >= INminu) then caso3
goto inicio
      
caso1:
    porta.0=1 ;rojo
    pause 100
    goto inicio
       
caso2:
    porta.1=1;amarillo
    pause 100
    goto inicio 
         
caso3:
    porta.2=1;verde
    pause 100
    goto inicio
    
    end
Observaciones:
- La sentencia “GOTO” no es necesaria, aunque la podrías colocar si con ello das mas legibilidad al código.
- La sentencia “ENDIF” se utiliza en casos como: si después de “THEN” existieran varias sentencias o si se hubiese utilizado además “ELSEIF” y/o “ELSE”.


No hay que olvidar además, configurar adecuadamente los registros CMCON y TRISA.

 
Última edición:

Dr. Zoidberg

Well-known-Papá Pitufo
Será posible???
Están usando BASIC y programan como en assembler!!!
Por que diablos no usan las estructuras de control propias de Basic y se dejan de echar basura con los gotos???
 
Quiero agradecer a Pilm por su aporte y pues si voy bien con el código.
Gracias, pero el programa al que quiero llegar es más extenso.

¿En la otra parte del programa es necesario que lleve if then endif y/o else?
Es decir, entre la etiqueta: caso1 y caso 3, porque desde caso3 para abajo funciona bien.
PHP:
inicio:
on interrupt goto CONFIGURAR
INTCON = %10010000
OPTION_REG.6=0
        
       if (APhora >= INHora) and (APhora >= ENhora) and (APminu >= INminu) and (APminu >= ENCminu) then caso1
       if (INhora >= ENhora) and (INhora >= APhora) and (INminu >= ENCminu) and (INminu >= APminu) then caso2    
       if (ENhora >= APhora) and (ENhora >= INHora) and (ENCminu >= APminu) and (ENCminu >= INminu) then caso3
       
caso1:       
       if EEHORA >= APhora and EEMIN >= APminu then apagar
       IF EEHORA >= INHora and EEMIN >= INminu then intermitente
       if EEHORA >= ENhora and EEMIN >= ENCminu then programa
       PAUSE 5
caso2:
       IF EEHORA >= INHora and EEMIN >= INminu then intermitente
       if EEHORA >= ENhora and EEMIN >= ENCminu then programa
       if EEHORA >= APhora and EEMIN >= APminu then apagar
       PAUSE 5
caso3:
       if EEHORA >= ENhora and EEMIN >= ENCminu then programa 
       if EEHORA >= APhora and EEMIN >= APminu then apagar
       IF EEHORA >= INHora and EEMIN >= INminu then intermitente        
       PAUSE 5
          
       goto inicio
        
programa:
       if fase=2 then dosfases
       if fase=3 then tresfases
      
dosfases:
        x=x+1
        if x > fase1 then paso2
        porta=%00001100
        portc.0=1
        PORTE=%000000000
        pause 1000
        goto inicio
paso2:        
        y=y+1
        if y > 3 then paso3
        PORTC.5 = 1;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
        porta=%00001010
        PORTC.0=0
        PORTE=%00000100
        pause 1000
        goto inicio
paso3:        
        z=z+1
        if z > fase2 then paso4
        porta=%00000001
        PORTC.0=0
        PORTE=%00000011
        pause 1000
        goto inicio
        
paso4:
        w=w+1
        if w > 3 then borrar
        porta=%00100001
        PORTC.0=0
        PORTE=%000000010
        pause 1000
        goto inicio
borrar:
        x = 0
        y = 0
        z = 0
        w = 0
        goto inicio 
         
tresfases:
        x=x+1
        if x > fase1 then paso22
        porta=%00001100
        portc.0=0
        PORTE=%000000010
        for M = 1 to 10
        pause 100
        next
        goto inicio
paso22:        
        y=y+1
        if y > 3 then paso33
        PORTC.5 = 1;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
        porta=%00001010
        PORTC.0=0
        PORTE=%000000010
        for M = 1 to 10
        pause 100
        next
        goto inicio
paso33:        
        z=z+1
        if z > fase2 then paso44
        porta=%00000001
        PORTC.0=0
        PORTE=%00000011
        for M = 1 to 10
        pause 100
        next
        goto inicio 

paso44:
        w=w+1
        if w > 3 then paso5
        porta=%00100001
        PORTC.0=0
        PORTE=%000000010
        for M = 1 to 10
        pause 100
        next
        goto inicio
        
paso5:
        u=u+1
        if u > fase3  then paso6
        porta=%00001001
        PORTC.0=1
        PORTE=%000000000
        for M = 1 to 10
        pause 100
        next
        goto inicio
paso6: 
        v=v+1
        if v > 3 then borrar2
        porta=%00001001
        PORTC.0=0
        PORTE=%00000100
        for M = 1 to 10
        pause 100
        next
        goto inicio
        
borrar2:
        x = 0
        y = 0
        z = 0
        u = 0
        v = 0
        w = 0
        goto inicio 
        
intermitente:
        porta=%000001010
        PORTE=%000000100
        portc.0=0
        for M = 1 to 5
        pause 100
        next
        porta=%000000000
        PORTE=%000000000
        for M = 1 to 5
        pause 100
        next
        goto inicio
        
apagar:    
        porta=0
        porte=0
        portc.0=0
        goto inicio        
        
disable
CONFIGURAR:
Ya casi está el programa, falta poco para dar mi aporte.
Programa en MicroCode Studio, en ISIS, y PCB en Eagle. Aquí publicaré todo.

Gracias.
 
Última edición por un moderador:
Buenas noches, amigos de Foros de Electrónica.
Estuve trabajando duro en esta parte del programa y es que hasta ahora no he podido concluir con mi proyecto, la verdad no sé qué está pasando.

Quiero que mi programa cumpla tres casos diferentes, según el caso que yo requiera, es decir:

01 caso: Que la hora de intermitencia y apagado sea antes de las 23:00 horas y la hora de encendido, después de las 00:00 horas.
02 caso: Que la hora de intermitencia sea antes de las 23:00 horas y la hora de apagado y encendido después de las 00:00 horas.
03 caso: Que la hora de intermitencia y la hora de apagado y la hora de encendido sean antes de las 23:00 horas.

Y bueno, he podido poner en mi programa estas sentencias para que funcionen según el caso que lo requiera.

PHP:
on interrupt goto CONFIGURAR
INTCON = %10010000
OPTION_REG.6=0
        
    if (APhora >= INHora) and (APhora >= ENhora) and (APminu >= INminu) and (APminu >= ENCminu) then caso1
    if (INhora >= ENhora) and (INhora >= APhora) and (INminu >= ENCminu) and (INminu >= APminu) then caso2    
    if (ENhora >= APhora) and (ENhora >= INHora) and (ENCminu >= APminu) and (ENCminu >= INminu) then caso3
    
goto inicio
      
caso1:

if (EEHORA >=APhora) and (EEMIN>=APminu) then
    goto apagar
    endif
IF (EEHORA >=INHora) and (EEMIN>=INminu) then
    goto intermitente
    endif
if (EEHORA >=ENhora) and (EEMIN >=ENCminu) then
    goto programa
    endif
    goto inicio
       
caso2:

IF (EEHORA >=INHora) and (EEMIN>=INminu) then 
    goto intermitente
    endif    
if (EEHORA >=ENhora) and (EEMIN>=ENCminu) then 
    goto programa
    endif
if (EEHORA >=APhora) and (EEMIN>=APminu) then 
    goto apagar
    endif
if (EEHORA >= 00 ) AND (EEMIN >= 00) AND (EEHORA <= APhora) then;AND (EEMIN <= INminu) then
    goto intermitente
    endif         
    goto inicio
         
caso3:


if (EEHORA >=ENhora) and (EEMIN>=ENCminu) then
    goto programa
    endif
if (EEHORA >=APhora) and (EEMIN>=APminu) then
    goto apagar
    endif
IF (EEHORA >=INHora) and (EEMIN>=INminu) then
    goto intermitente
    endif
if (EEHORA >= 00 ) AND (EEMIN >= 00) AND (EEHORA <= INHORA) then;AND (EEMIN <= INminu) then
    goto programa
    endif    
    goto inicio
Pero no me funciona como debe ser.
Cuando configuro (cualquiera de los casos) y a la hora con los minutos (EEHORA EEMIN tiempo real) lo hecho a correr antes de las horas de intermitencia (de cualquiera de los tres casos) a veces funciona y aveces no, o si no, funciona bien, pero después se congela por un rato el programa y después de un rato, o después de una hora, continúa bien.

Por eso aquí les adjunto el programa total que he venido elaborando, el diagrama en proteus y una foto de mi plaquita que ya he fabricado.

¿Sería mucha molestia, amigos, que lo revisen y me indiquen en qué estoy fallando?
Para poder dar más rápido con este problemilla que ya llevo varios meses y no logro concluir.

Les agradezco mucho.

:cry:
 

Adjuntos

  • pregunta.rar
    25.1 KB · Visitas: 19
  • 03 CASOS.jpg
    03 CASOS.jpg
    63.2 KB · Visitas: 18
  • IMG_08082016_090948.jpg
    IMG_08082016_090948.jpg
    110.6 KB · Visitas: 19
  • Esquema.pdf
    60.5 KB · Visitas: 10
Última edición por un moderador:
amigo marvin Villalobos deberías a serle caso al compañero Dr. Zoidberg usas muchos saltos muchos gotos la interrupción por rb.0 lo noto medio raro tal vez por que yo programo en pic simulador ide
(que viene siendo un basic) pero son muy parecidos los if que tratas de usar a mi gusto son muy largos tal vez por eso se pierden el programa.

por ultimo tal vez puedas pasar el código completo así te podría ayudar un poco mas ya que solo veo partes del código y solo ago. suposición de lo que tiene que hacer el programa o de donde tiene que sacar datos o variables saludos.
 

D@rkbytes

Moderador
El microcontrolador es un PIC16F877A y el código completo se encuentra en el archivo adjunto. "prueba_2_semaf.pbp"
El esquema está en el diseño con Proteus y lo adjunté a su mismo post en formato PDF.
 
hola Gudino Duberlin, el tiempo real sigue su curso, no se congela, lo que se congela es la secuencia de encendido de las fases, el cambio de rojo, amarillo verde, pero mas que un congelamiento parece que se pierde la secuencia, para mi que las sentencias que eh puesto, no están bien, debe haber una mejor manera de plantear.

Gracias de antemano por su apoyo.
 
hola trate de ver el código completo pero tanto en el archivo de nombre pregunta del semaforo.txt como en el archivo rar. solo viene una parte del código no viene la configuración de entradas y salidas ni el programa del reloj ds1307 etc pasa porfa el programa completo.
saludos
 

D@rkbytes

Moderador
Como mencioné en el post #12, el código se encuentra en el archivo adjunto del post #9
Viene con el nombre "prueba_2_semaf.pbp" (Extensión PBP = PIC Basic Project)
Tiene referencias a subrutinas no definidas, pero así lo subió marvin villalobos
 
Algunas veces, en códigos que son largos es más legible utilizar la sentencia SELECT CASE en vez del IF (aclaro que yo utilizo el basic del PSI, pero seguramente esta esa sentencia en otro lenguaje similar).
Saludos.
 
al tener datos incompletos será imposible poderle ayudar al compañero, D@rkbytes gracias por las referencias
saludos.
Buenas.
Efectivamente el código esta incompleto, pero si te fijas en el post #8 encontraras la otra parte del código que falta.
PD: Referente al codigo veo demasiados delay en tu secuencia, yo usaría el TMR0 por el pin RA4 T0CKI y el pin Sout del ds1307 para los segundos de tu secuencia de encendido del semáforo.
Entonces para los demás compañeros el código completo supongo seria este:
PHP:
@ Device PIC16F877A	; Microcontrolador utilizado
@ DEVICE pic16f877A, HS_OSC 'Ocilador Xtal.-
@ DEVICE pic16f877A, WDT_OFF ' Watchdog Timer desconectado.-
@ DEVICE pic16f877A, PWRT_on ' Power-On Timer conectado.-
@ DEVICE pic16f877A, BOD_OFF ' Brown-Out Detect conectado.-
@ DEVICE pic16f877A, LVP_OFF ' Low-Voltage Programming desconectado.-
@ DEVICE pic16f877A, CPD_OFF ' Data Memory Code Protect desconectado.-

define OSC 20
TRISA=0
trisb=%11111111
trisc=%01011110
TRISD=0
TRISE=0
porta=0
portE=0
;DEFINE I2C_SCLOUT 1
define LCD_DREG     PORTD
DEFINE LCD_DBIT     4
DEFINE LCD_RSREG    PORTD
DEFINE LCD_RSBIT    3
DEFINE LCD_EREG     PORTD
DEFINE LCD_EBIT     1

;DEFINE I2C_SCLOUT 1

CPIN VAR PORTc.3
DPIN VAR PORTc.4

segu var byte
minu var byte
hora var byte
minu_int var byte
hora_int var byte
minu_apag var byte
hora_apag var byte
minu_enc var byte
hora_enc var byte

LCD VAR BYTE

fase var byte
fase1 var byte
fase2 var byte
fase3 var byte
fase4 var byte

H var byte
I var byte
L var byte
M var byte
N var byte
P var byte
Q VAR BYTE
R var byte
S var byte
T var byte

x var byte
y var byte
z var byte
u var byte
v var byte
w var byte
sec var byte

INHora  var byte
INminu  var byte
APhora var byte
APminu var byte
ENhora var byte
ENCminu VAR BYTE
EEHORA var byte
EEMIN VAR BYTE
BCDIn   Var Byte
BCDOut  Var Byte
BinHold Var Byte

actual var byte
actual_1 var byte
actual_2 var byte
actual_3 var byte
actual_4 var byte
actual_5 var byte
actual_6 var byte
actual_7 var byte
actual_8 VAR BYTE
actual_9 VAR BYTE
actual_10 VAR BYTE
actual_11 VAR BYTE

fase=0
fase1=0
fase2=0
fase3=0

MINU_INT=0
HORA_INT=0
MINU_APAG=0
HORA_apag=0
minu_enc=0
hora_enc=0

actual=1
actual_1=1
actual_2=1
actual_3=1
actual_4=1
actual_5=1
actual_6=1
actual_7=1
actual_8=1
actual_9=1
actual_10=1
actual_11=1
x=0
y=0
z=0
u=0
v=0
W=0
sec=0

ini:
PORTD.2=0
PORTC.5=1
PORTE.2=0
portc.0=0

;EEPROM 0,[14,23,20,23,10,02,5,7,9,3,13,23] ;CASO 1 ROJO
EEPROM 0,[59,23,20,02,40,02,5,7,9,3,13,23] ;CASO 2 AMARILLO
;EEPROM 0,[14,23,20,23,40,23,5,7,9,3,13,23] ;CASO 3 verde
    
       READ 0,minu_int
        PAUSE 10
       READ 1,HORA_INT 
        PAUSE 10
       READ 2,minu_apag
        PAUSE 10
       READ 3,hora_apag
        PAUSE 10
       READ 4,minu_enc
        PAUSE 10
       READ 5,hora_enc
        PAUSE 10
       READ 6,FASE1
        PAUSE 10
       READ 7,fase2
        pause 10
       READ 8,fase3
        pause 10
       READ 9,fase
        pause 10
       READ 10,minu
        pause 10
       READ 11,hora
        pause 10
        
BCDIn = minu_int
GoSub DecToBCD
INminu = BCDOut
	BCDIn = hora_int
   	GoSub DecToBCD
   	INHora = BCDOut
BCDIn = minu_apag
GoSub DecToBCD
APminu = BCDOut
    	BCDIn = hora_apag
    	GoSub DecToBCD
    	APhora = BCDOut   
BCDIn = minu_enc
GoSub DecToBCD
ENCminu = BCDOut
	BCDIn = hora_enc
	GoSub DecToBCD
	ENhora = BCDOut    
BCDIn = minu
GoSub DecToBCD
EEMIN = BCDOut
	BCDIn = hora
	GoSub DecToBCD
	EEHORA = BCDOut
       
       lcdout$fe,1  
       lcdout$fe,$C0," SEMAFORO"
       PAUSE 1200
       
inicio:        
       i2cread DPIN,CPIN,%11010000,0,[segu]
       i2cread DPIN,CPIN,%11010000,1,[EEMIN]
       i2cread DPIN,CPIN,%11010000,2,[EEHORA]
       
       lcdout$fe,1
       lcdout$fe,$81,"SEMAFORO"
;LCDOUT $fe,$80,hex2 INHora, ":",hex2 INminu
;LCDOUT $fe,$85,hex2 APhora, ":",hex2 APminu
;LCDOUT $fe,$8a,hex2 ENhora, ":",hex2 ENCminu
       lcdout$fe,$C1,"HORA ", hex2 EEHORA,":",hex2 EEMIN, ":" ,hex2 segu
       pause 10

on interrupt goto CONFIGURAR
INTCON = %10010000
OPTION_REG.6=0
        
    if (APhora >= INHora) and (APhora >= ENhora) and (APminu >= INminu) and (APminu >= ENCminu) then caso1
    if (INhora >= ENhora) and (INhora >= APhora) and (INminu >= ENCminu) and (INminu >= APminu) then caso2    
    if (ENhora >= APhora) and (ENhora >= INHora) and (ENCminu >= APminu) and (ENCminu >= INminu) then caso3
    
goto inicio
      
caso1:

if (EEHORA >=APhora) and (EEMIN>=APminu) then
    goto apagar
    endif
IF (EEHORA >=INHora) and (EEMIN>=INminu) then
    goto intermitente
    endif
if (EEHORA >=ENhora) and (EEMIN >=ENCminu) then
    goto programa
    endif
    goto inicio
       
caso2:

IF (EEHORA >=INHora) and (EEMIN>=INminu) then 
    goto intermitente
    endif    
if (EEHORA >=ENhora) and (EEMIN>=ENCminu) then 
    goto programa
    endif
if (EEHORA >=APhora) and (EEMIN>=APminu) then 
    goto apagar
    endif
if (EEHORA >= 00 ) AND (EEMIN >= 00) AND (EEHORA <= APhora) then;AND (EEMIN <= INminu) then
    goto intermitente
    endif         
    goto inicio
         
caso3:


if (EEHORA >=ENhora) and (EEMIN>=ENCminu) then
    goto programa
    endif
if (EEHORA >=APhora) and (EEMIN>=APminu) then
    goto apagar
    endif
IF (EEHORA >=INHora) and (EEMIN>=INminu) then
    goto intermitente
    endif
if (EEHORA >= 00 ) AND (EEMIN >= 00) AND (EEHORA <= INHORA) then;AND (EEMIN <= INminu) then
    goto programa
    endif    
    goto inicio 
    
programa:
       if fase=2 then dosfases
       if fase=3 then tresfases
      
dosfases:
        x=x+1
        if x > fase1 then paso2
        porta=%00001100
        portc.0=1
        PORTE=%000000000
        pause 1000
        goto inicio
paso2:        
        y=y+1
        if y > 3 then paso3
        PORTC.5 = 1;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
        porta=%00001010
        PORTC.0=0
        PORTE=%00000100
        pause 1000
        goto inicio
paso3:        
        z=z+1
        if z > fase2 then paso4
        porta=%00000001
        PORTC.0=0
        PORTE=%00000011
        pause 1000
        goto inicio
        
paso4:
        w=w+1
        if w > 3 then borrar
        porta=%00100001
        PORTC.0=0
        PORTE=%000000010
        pause 1000
        goto inicio
borrar:
        x = 0
        y = 0
        z = 0
        w = 0
        goto inicio 
         
tresfases:
        x=x+1
        if x > fase1 then paso22
        porta=%00001100
        portc.0=0
        PORTE=%000000010
        for M = 1 to 10
        pause 100
        next
        goto inicio
paso22:        
        y=y+1
        if y > 3 then paso33
        PORTC.5 = 1;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
        porta=%00001010
        PORTC.0=0
        PORTE=%000000010
        for M = 1 to 10
        pause 100
        next
        goto inicio
paso33:        
        z=z+1
        if z > fase2 then paso44
        porta=%00000001
        PORTC.0=0
        PORTE=%00000011
        for M = 1 to 10
        pause 100
        next
        goto inicio 

paso44:
        w=w+1
        if w > 3 then paso5
        porta=%00100001
        PORTC.0=0
        PORTE=%000000010
        for M = 1 to 10
        pause 100
        next
        goto inicio
        
paso5:
        u=u+1
        if u > fase3  then paso6
        porta=%00001001
        PORTC.0=1
        PORTE=%000000000
        for M = 1 to 10
        pause 100
        next
        goto inicio
paso6: 
        v=v+1
        if v > 3 then borrar2
        porta=%00001001
        PORTC.0=0
        PORTE=%00000100
        for M = 1 to 10
        pause 100
        next
        goto inicio
        
borrar2:
        x = 0
        y = 0
        z = 0
        u = 0
        v = 0
        w = 0
        goto inicio 
        
intermitente:
        porta=%000001010
        PORTE=%000000100
        portc.0=0
        for M = 1 to 5
        pause 100
        next
        porta=%000000000
        PORTE=%000000000
        for M = 1 to 5
        pause 100
        next
        goto inicio
        
apagar:    
        porta=0
        porte=0
        portc.0=0
        goto inicio        
        








        
disable
CONFIGURAR:
       porta=0
       portE=0
       portc.0=0
       PORTC.5=1
for L = 1 to 10
lcdout $fe,1," CONFIGURACION"
    pause 100
    NEXT L        
L=0
num_fases:
IF PORTB.0 = 1 THEN fase_1
IF PORTB.1 = 1 THEN up_num_fases ;botón para igualar minutos
IF PORTB.2 = 1 THEN up_num_fases ;botón para igualar horas
actualiza: IF actual = 1 THEN ;chequea si hay que actualizar LCD

lcdout$fe,1,"  FASES"
lcdout$fe,$88
lcdout$fe,$0F,dec2 fase
actual = 0 ;pantalla actualizada
ENDIF
GOTO num_fases
; ***********************para igualar la hora *****************
up_num_fases: fase = fase + 1
IF fase >= 4 THEN fase=2
GOTO pausa

pausa: FOR L = 1 TO 20 ; retardo de 200 mls
PAUSE 20 ;pasos de 10 mls para no perder interrupciones
NEXT L
actual = 1 ;indica actualizar pantalla LCD
GOTO actualiza

fase_1:
gosub soltar
fase_1_1:
IF PORTB.0 = 1 THEN fase_2
IF PORTB.1 = 1 THEN up_fase_1 ;botón para igualar minutos
IF PORTB.2 = 1 THEN dw_fase_1 ;botón para igualar horas
actualiza_f_1: IF actual_1 = 1 THEN ;chequea si hay que actualizar LCD

lcdout$fe,1,"     FASE 1  "
lcdout$fe,$C6, "segundos"
lcdout$fe,$C2
lcdout$fe,$0F,dec2 fase1

actual_1 = 0 ;pantalla actualizada
ENDIF
GOTO fase_1_1
; ***********************para igualar la hora *****************
up_fase_1: fase1 = fase1 + 1
IF fase1 >= 59 THEN fase1=0
GOTO pausa_1

dw_fase_1: fase1 = fase1 - 1
IF fase1 >= 59 THEN fase1=0
GOTO pausa_1

pausa_1: FOR M = 1 TO 20 ; retardo de 200 mls
PAUSE 10 ;pasos de 10 mls para no perder interrupciones
NEXT M
actual_1 = 1 ;indica actualizar pantalla LCD
GOTO actualiza_f_1

fase_2:
gosub soltar
fase_1_2:
IF PORTB.0 = 1 THEN fase_3
IF PORTB.1 = 1 THEN up_fase_2 ;botón para igualar minutos
IF PORTB.2 = 1 THEN dw_fase_2 ;botón para igualar horas
actualiza_f_2: IF actual_2 = 1 THEN ;chequea si hay que actualizar LCD

lcdout$fe,1,"     FASE 2"
lcdout$fe,$C6, "segundos"
lcdout$fe,$C2
lcdout$fe,$0F,dec2 fase2
actual_2 = 0 ;pantalla actualizada
ENDIF
GOTO fase_1_2
; ***********************para igualar la hora *****************
up_fase_2: fase2 = fase2 + 1
IF fase2 >= 29 THEN fase2=0
GOTO pausa_2

dw_fase_2: fase2 = fase2 - 1
IF fase2 >= 29 THEN fase2=0
GOTO pausa_2

pausa_2: FOR N = 1 TO 20 ; retardo de 200 mls
PAUSE 10 ;pasos de 10 mls para no perder interrupciones
NEXT N
actual_2 = 1 ;indica actualizar pantalla LCD
GOTO actualiza_f_2

fase_3:
gosub soltar
if fase=2 then h_int
fase_1_3:
IF PORTB.0 = 1 THEN h_int
IF PORTB.1 = 1 THEN up_fase_3 ;botón para igualar minutos
IF PORTB.2 = 1 THEN dw_fase_3 ;botón para igualar horas
actualiza_f_3: IF actual_3 = 1 THEN ;chequea si hay que actualizar LCD

lcdout$fe,1,"     FASE 3"
lcdout$fe,$C6, "segundos"
lcdout$fe,$C2
lcdout$fe,$0F,dec2 fase3
actual_3 = 0 ;pantalla actualizada
ENDIF
GOTO fase_1_3
; ***********************para igualar la hora *****************
up_fase_3: fase3 = fase3 + 1
IF fase3 >= 29 THEN fase3=0
GOTO pausa_3

dw_fase_3: fase3 = fase3 - 1
IF fase2 >= 29 THEN fase3=0
GOTO pausa_3

pausa_3: FOR P = 1 TO 20 ; retardo de 200 mls
PAUSE 10 ;pasos de 10 mls para no perder interrupciones
NEXT P
actual_3 = 1 ;indica actualizar pantalla LCD
GOTO actualiza_f_3

h_int:
gosub soltar
hor_int_1:
IF PORTB.0 = 1 THEN m_int
IF PORTB.1 = 1 THEN up_hor_int ;botón para igualar minutos
IF PORTB.2 = 1 THEN dw_hor_int ;botón para igualar horas
act_hor_int: IF actual_4 = 1 THEN ;chequea si hay que actualizar LCD

lcdout$fe,1,"HORA: INTERMITENTE"
lcdout$fe,$c1
lcdout$fe,$0F,dec2 hora_int
actual_4 = 0 ;pantalla actualizada
ENDIF
GOTO hor_int_1
; ***********************para igualar la hora *****************
up_hor_int: hora_int = hora_int + 1
IF hora_int > 23 THEN hora_int=0
GOTO pausa_4

dw_hor_int: hora_int = hora_int - 1
IF hora_int > 23 THEN hora_int=23
GOTO pausa_4

pausa_4: FOR Q = 1 TO 20 ; retardo de 200 mls
PAUSE 10 ;pasos de 10 mls para no perder interrupciones
NEXT Q
actual_4 = 1 ;indica actualizar pantalla LCD
GOTO act_hor_int

m_int:
gosub soltar
BCDIn = hora_int
GoSub DecToBCD
INHora = BCDOut

min_int_1:
IF PORTB.0 = 1 THEN h_apa
IF PORTB.1 = 1 THEN up_min_int ;botón para igualar minutos
IF PORTB.2 = 1 THEN dw_min_int ;botón para igualar horas
act_min_int: IF actual_5 = 1 THEN ;chequea si hay que actualizar LCD

lcdout$fe,1,"HORA: INTERMITENTE"
lcdout$fe,$c1
lcdout$fe,$0F,dec2 hora_int, ":",dec2 minu_int
actual_5 = 0 ;pantalla actualizada
ENDIF
GOTO min_int_1
; ***********************para igualar la hora *****************
up_min_int: minu_int = minu_int + 1
IF minu_int > 59 THEN minu_int=0
GOTO pausa_5

dw_min_int: minu_int = minu_int - 1
IF minu_int > 59 THEN minu_int=59
GOTO pausa_5

pausa_5: FOR R = 1 TO 20 ; retardo de 200 mls
PAUSE 10 ;pasos de 10 mls para no perder interrupciones
NEXT R
actual_5 = 1 ;indica actualizar pantalla LCD
GOTO act_min_int

h_apa:
gosub soltar
BCDIn = minu_int
GoSub DecToBCD
INminu = BCDOut

hora_apa:
IF PORTB.0 = 1 THEN m_apa
IF PORTB.1 = 1 THEN up_hr_apa ;botón para igualar minutos
IF PORTB.2 = 1 THEN dw_hr_apa ;botón para igualar horas
act_hr_ap: IF actual_6 = 1 THEN ;chequea si hay que actualizar LCD

lcdout$fe,1," HORA: APAGADO  "
lcdout$fe,$c1
lcdout$fe,$0F,dec2 hora_apag
actual_6 = 0 ;pantalla actualizada
ENDIF
GOTO hora_apa
; ***********************para igualar la hora *****************
up_hr_apa: hora_apag = hora_apag + 1
IF hora_apag > 23 THEN hora_apag=0
GOTO pausa_6

dw_hr_apa: hora_apag = hora_apag - 1
IF hora_apag > 23 THEN hora_apag=23
GOTO pausa_6

pausa_6: FOR S = 1 TO 20 ; retardo de 200 mls
PAUSE 10 ;pasos de 10 mls para no perder interrupciones
NEXT S
actual_6 = 1 ;indica actualizar pantalla LCD
GOTO act_hr_ap

m_apa:
gosub soltar
BCDIn = hora_apag
GoSub DecToBCD
APhora = BCDOut
    
min_apa:
IF PORTB.0 = 1 THEN h_enc
IF PORTB.1 = 1 THEN up_m_apa ;botón para igualar minutos
IF PORTB.2 = 1 THEN dw_m_apa ;botón para igualar horas
act_min_ap: IF actual_7 = 1 THEN ;chequea si hay que actualizar LCD

lcdout$fe,1," HORA: APAGADO  "
lcdout$fe,$c1
lcdout$fe,$0F,dec2 hora_apag, ":", dec2 minu_apag
actual_7 = 0 ;pantalla actualizada
ENDIF
GOTO min_apa
; ***********************para igualar la hora *****************
up_m_apa: minu_apag = minu_apag + 1
IF minu_apag > 59 THEN minu_apag=0
GOTO pausa_7

dw_m_apa: minu_apag = minu_apag - 1
IF minu_apag > 59 THEN minu_apag=59
GOTO pausa_7

pausa_7: FOR S = 1 TO 20 ; retardo de 200 mls
PAUSE 10 ;pasos de 10 mls para no perder interrupciones
NEXT S
actual_7 = 1 ;indica actualizar pantalla LCD
GOTO act_min_ap

h_enc:
gosub soltar
BCDIn = minu_apag
GoSub DecToBCD
APminu = BCDOut

hor_enc:
IF PORTB.0 = 1 THEN m_enc
IF PORTB.1 = 1 THEN up_h_enc ;botón para igualar minutos
IF PORTB.2 = 1 THEN dw_h_enc ;botón para igualar horas
act_hor_en: IF actual_8 = 1 THEN ;chequea si hay que actualizar LCD

lcdout$fe,1," HORA: ENCENDIDO  "
lcdout$fe,$c1
lcdout$fe,$0F,dec2 hora_enc
actual_8 = 0 ;pantalla actualizada
ENDIF
GOTO hor_enc
; ***********************para igualar la hora *****************
up_h_enc: hora_enc = hora_enc + 1
IF hora_enc > 23 THEN hora_enc=0
GOTO pausa_8

dw_h_enc: hora_enc = hora_enc - 1
IF hora_enc > 23 THEN hora_enc=23
GOTO pausa_8

pausa_8: FOR T = 1 TO 20 ; retardo de 200 mls
PAUSE 10 ;pasos de 10 mls para no perder interrupciones
NEXT T
actual_8 = 1 ;indica actualizar pantalla LCD
GOTO act_hor_en

m_enc:
gosub soltar
BCDIn = hora_enc
GoSub DecToBCD
ENhora = BCDOut

min_enc:
IF PORTB.0 = 1 THEN hor
IF PORTB.1 = 1 THEN up_m_enc ;botón para igualar minutos
IF PORTB.2 = 1 THEN dw_m_enc ;botón para igualar horas
act_min_en: IF actual_9 = 1 THEN ;chequea si hay que actualizar LCD

lcdout$fe,1," HORA: ENCENDIDO  "
lcdout$fe,$c1
lcdout$fe,$0F,dec2 hora_enc , ":", dec2 minu_enc
actual_9 = 0 ;pantalla actualizada
ENDIF
GOTO min_enc
; ***********************para igualar la hora *****************
up_m_enc: minu_enc = minu_enc + 1
IF minu_enc > 59 THEN minu_enc=0
GOTO pausa_9

dw_m_enc: minu_enc = minu_enc - 1
IF minu_enc > 59 THEN minu_enc=59
GOTO pausa_9

pausa_9: FOR T = 1 TO 20 ; retardo de 200 mls
PAUSE 10 ;pasos de 10 mls para no perder interrupciones
NEXT T
actual_9 = 1 ;indica actualizar pantalla LCD
GOTO act_min_en

hor:
gosub soltar
BCDIn = minu_enc
GoSub DecToBCD
ENCminu = BCDOut

hora_actual:
IF PORTB.0 = 1 THEN minut
IF PORTB.1 = 1 THEN up_hor ;botón para igualar minutos
IF PORTB.2 = 1 THEN dw_hor ;botón para igualar horas
act_hra: IF actual_10 = 1 THEN ;chequea si hay que actualizar LCD

lcdout$fe,1,"   HORA ACTUAL  "
LCDOUT $fe,$c1
lcdout$fe,$0F,dec2 hora
actual_10 = 0 ;pantalla actualizada
ENDIF
GOTO hora_actual
; ***********************para igualar la hora *****************
up_hor: hora = hora + 1
IF hora > 23 THEN hora=0
GOTO pausa_10

dw_hor: hora = hora - 1
IF hora > 23 THEN hora=23
GOTO pausa_10

pausa_10: FOR H = 1 TO 20 ; retardo de 200 mls
PAUSE 10 ;pasos de 10 mls para no perder interrupciones
NEXT H
actual_10 = 1 ;indica actualizar pantalla LCD
GOTO act_hra

minut:      
gosub soltar
BCDIn = hora
GoSub DecToBCD
EEHORA = BCDOut
minu_actual:
IF PORTB.0 = 1 THEN GRABAR
IF PORTB.1 = 1 THEN up_MIN ;botón para igualar minutos
IF PORTB.2 = 1 THEN dw_MIN ;botón para igualar horas
act_mit: IF actual_11 = 1 THEN ;chequea si hay que actualizar LCD

lcdout$fe,1,"   HORA ACTUAL  "
LCDOUT $fe,$c1
lcdout$fe,$0F,dec2 hora, ":", dec2 minu
actual_11 = 0 ;pantalla actualizada
ENDIF
GOTO minu_actual
; ***********************para igualar la hora *****************
up_MIN: minu = minu + 1
IF minu > 59 THEN minu=0
GOTO pausa_11

dw_MIN: minu = minu - 1
IF minu > 59 THEN minu=59
GOTO pausa_11

pausa_11: FOR I = 1 TO 20 ; retardo de 200 mls
PAUSE 10 ;pasos de 10 mls para no perder interrupciones
NEXT I
actual_11 = 1 ;indica actualizar pantalla LCD
GOTO act_mit

GRABAR:
gosub soltar
BCDIn = minu
GoSub DecToBCD
EEMIN  = BCDOut
goto grabacion

        
DecToBCD:
    BinHold = BCDIn
    BinHold = (BinHold Dig 1) * $10 + (BinHold Dig 0)
    BCDOut = BinHold
    Return           
        
soltar:
if portb.0 = 1 then soltar
pause 250
return
 
grabacion:      
       PAUSE 10
       WRITE 0,minu_int
       PAUSE 10
       WRITE 1,HORA_INT 
       PAUSE 10
       WRITE 2,minu_apag
       PAUSE 10
       write 3,hora_apag
       PAUSE 10
       write 4,minu_enc
       PAUSE 10
       write 5,hora_enc
       PAUSE 10
       WRITE 6,FASE1
       PAUSE 10
       WRITE 7,fase2
       pause 10
       write 8,fase3
       pause 10
       write 9,fase
       pause 10
       write 10,minu
       pause 10
       write 11,hora
       pause 10

       i2CWRITE DPIN,CPIN,%11010000,0,[$00]
       i2CWRITE DPIN,CPIN,%11010000,1,[EEMIN]
       i2CWRITE DPIN,CPIN,%11010000,2,[EEHORA]
       I2CWRITE DPIN,CPIN,%11010000,7,[$10] ;control %00010000 para
      
       FOR LCD = 1 TO 2
lcdout$fe,$0C
lcdout$fe,1       
lcdout$fe,$81," GUARDAND0."
PAUSE 250
lcdout$fe,1
lcdout$fe,$81," GUARDAND0.."
PAUSE 250
lcdout$fe,1
lcdout$fe,$81," GUARDAND0..."
PAUSE 250
NEXT 
       lcdout$fe,1
       lcdout$fe,$81,"   PRESIONAR"
       lcdout$fe,$c4,"  RESET"
       PAUSE 3000
       INTCON = %10010000
       resume
       enable
       
end
 
Quiero agradecer por sus aportes, pero queria agregar un dato al problema del proyecto
Cuando configuro el caso 2 osea la hora de int antes de las 23:59 y hora de encendido y apagado deapuds de las00:00, en algunas horas ai funciona el caso, pero cuando entra en otras horas , se apaga. Parece q eñ problema no es las sentencias si no estn en el rtc.
 
Última edición:
Arriba