Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

29/07/2016 #1


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.

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

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.
31/07/2016 #2

Avatar de Saint_

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.
31/07/2016 #3


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.
Código 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=;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.
31/07/2016 #4
Moderador

Avatar de D@rkbytes

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.
31/07/2016 #5


hasta donde no sera mi torpeza. no me sale,,, 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.
31/07/2016 #6

Avatar de pilm

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.

31/07/2016 #7

Avatar de Dr. Zoidberg

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???
02/08/2016 #8


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.
Código PHP:
inicio:
on interrupt goto CONFIGURAR
INTCON 
= %10010000
OPTION_REG.6
=0
        
       
if (APhora >= INHora) and (APhora >= ENhora) and (APminu >= INminu) and (APminu >= ENCminuthen caso1
       
if (INhora >= ENhora) and (INhora >= APhora) and (INminu >= ENCminu) and (INminu >= APminuthen caso2    
       
if (ENhora >= APhora) and (ENhora >= INHora) and (ENCminu >= APminu) and (ENCminu >= INminuthen 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 fase1 then paso2
        porta
=%00001100
        portc.0
=1
        PORTE
=%000000000
        pause 1000
        
goto inicio
paso2
:        
        
y=y+1
        
if 3 then paso3
        PORTC.5 
1;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
        
porta=%00001010
        PORTC.0
=0
        PORTE
=%00000100
        pause 1000
        
goto inicio
paso3
:        
        
z=z+1
        
if fase2 then paso4
        porta
=%00000001
        PORTC.0
=0
        PORTE
=%00000011
        pause 1000
        
goto inicio
        
paso4
:
        
w=w+1
        
if 3 then borrar
        porta
=%00100001
        PORTC.0
=0
        PORTE
=%000000010
        pause 1000
        
goto inicio
borrar
:
        
0
        y 
0
        z 
0
        w 
0
        
goto inicio 
         
tresfases
:
        
x=x+1
        
if fase1 then paso22
        porta
=%00001100
        portc.0
=0
        PORTE
=%000000010
        
for 1 to 10
        pause 100
        next
        
goto inicio
paso22
:        
        
y=y+1
        
if 3 then paso33
        PORTC.5 
1;,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
        
porta=%00001010
        PORTC.0
=0
        PORTE
=%000000010
        
for 1 to 10
        pause 100
        next
        
goto inicio
paso33
:        
        
z=z+1
        
if fase2 then paso44
        porta
=%00000001
        PORTC.0
=0
        PORTE
=%00000011
        
for 1 to 10
        pause 100
        next
        
goto inicio 

paso44
:
        
w=w+1
        
if 3 then paso5
        porta
=%00100001
        PORTC.0
=0
        PORTE
=%000000010
        
for 1 to 10
        pause 100
        next
        
goto inicio
        
paso5
:
        
u=u+1
        
if fase3  then paso6
        porta
=%00001001
        PORTC.0
=1
        PORTE
=%000000000
        
for 1 to 10
        pause 100
        next
        
goto inicio
paso6

        
v=v+1
        
if 3 then borrar2
        porta
=%00001001
        PORTC.0
=0
        PORTE
=%00000100
        
for 1 to 10
        pause 100
        next
        
goto inicio
        
borrar2
:
        
0
        y 
0
        z 
0
        u 
0
        v 
0
        w 
0
        
goto inicio 
        
intermitente
:
        
porta=%000001010
        PORTE
=%000000100
        portc.0
=0
        
for 1 to 5
        pause 100
        next
        porta
=%000000000
        PORTE
=%000000000
        
for 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.
10/08/2016 #9


no sucede nada
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.

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

if (
EEHORA >=APhora) and (EEMIN>=APminuthen
    
goto apagar
    
endif
IF (
EEHORA >=INHora) and (EEMIN>=INminuthen
    
goto intermitente
    
endif
if (
EEHORA >=ENhora) and (EEMIN >=ENCminuthen
    
goto programa
    
endif
    goto 
inicio
       
caso2
:

IF (
EEHORA >=INHora) and (EEMIN>=INminuthen 
    
goto intermitente
    
endif    
if (
EEHORA >=ENhora) and (EEMIN>=ENCminuthen 
    
goto programa
    
endif
if (
EEHORA >=APhora) and (EEMIN>=APminuthen 
    
goto apagar
    
endif
if (
EEHORA >= 00 ) AND (EEMIN >= 00) AND (EEHORA <= APhorathen;AND (EEMIN <= INminuthen
    
goto intermitente
    
endif         
    goto 
inicio
         
caso3
:


if (
EEHORA >=ENhora) and (EEMIN>=ENCminuthen
    
goto programa
    
endif
if (
EEHORA >=APhora) and (EEMIN>=APminuthen
    
goto apagar
    
endif
IF (
EEHORA >=INHora) and (EEMIN>=INminuthen
    
goto intermitente
    
endif
if (
EEHORA >= 00 ) AND (EEMIN >= 00) AND (EEHORA <= INHORAthen;AND (EEMIN <= INminuthen
    
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.

Imágenes Adjuntas
Tipo de Archivo: jpg 03 CASOS.jpg (63,2 KB (Kilobytes), 11 visitas)
Tipo de Archivo: jpg IMG_08082016_090948.jpg (110,6 KB (Kilobytes), 10 visitas)
Archivos Adjuntos
Tipo de Archivo: rar pregunta.rar (25,1 KB (Kilobytes), 17 visitas)
Tipo de Archivo: pdf Esquema.pdf (60,5 KB (Kilobytes), 6 visitas)
10/08/2016 #10

Avatar de Gudino Roberto duberlin

Hola, que microcontrolador usas?
Los fuses están configurados, según lo requieres?
Utilizas el pin MCLR? Pregunto porque comentas que el programa se "congela".
10/08/2016 #11

Avatar de dark089

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.
10/08/2016 #12
Moderador

Avatar de D@rkbytes

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.
11/08/2016 #13


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.
11/08/2016 #14

Avatar de dark089

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
11/08/2016 #15
Moderador

Avatar de D@rkbytes

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
16/08/2016 #16

Avatar de dark089

al tener datos incompletos será imposible poderle ayudar al compañero, D@rkbytes gracias por las referencias
saludos.
16/08/2016 #17

Avatar de zgouki

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.
16/08/2016 #18

Avatar de roberttorres

dark089 dijo: Ver Mensaje
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:
Código PHP:
Device PIC16F877A    Microcontrolador utilizado
DEVICE pic16f877AHS_OSC 'Ocilador Xtal.-
@ DEVICE pic16f877A, WDT_OFF ' 
Watchdog Timer desconectado.-
DEVICE pic16f877APWRT_on ' Power-On Timer conectado.-
@ DEVICE pic16f877A, BOD_OFF ' 
Brown-Out Detect conectado.-
DEVICE pic16f877ALVP_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

var byte
var byte
var byte
var byte
var byte
var byte
VAR BYTE
var byte
var byte
var byte

var byte
var byte
var byte
var byte
var byte
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 >= ENCminuthen caso1
    
if (INhora >= ENhora) and (INhora >= APhora) and (INminu >= ENCminu) and (INminu >= APminuthen caso2    
    
if (ENhora >= APhora) and (ENhora >= INHora) and (ENCminu >= APminu) and (ENCminu >= INminuthen caso3
    
goto inicio
      
caso1
:

if (
EEHORA >=APhora) and (EEMIN>=APminuthen
    
goto apagar
    
endif
IF (
EEHORA >=INHora) and (EEMIN>=INminuthen
    
goto intermitente
    
endif
if (
EEHORA >=ENhora) and (EEMIN >=ENCminuthen
    
goto programa
    
endif
    goto 
inicio
       
caso2
:

IF (
EEHORA >=INHora) and (EEMIN>=INminuthen 
    
goto intermitente
    
endif    
if (
EEHORA >=ENhora) and (EEMIN>=ENCminuthen 
    
goto programa
    
endif
if (
EEHORA >=APhora) and (EEMIN>=APminuthen 
    
goto apagar
    
endif
if (
EEHORA >= 00 ) AND (EEMIN >= 00) AND (EEHORA <= APhorathen;AND (EEMIN <= INminuthen
    
goto intermitente
    
endif         
    goto 
inicio
         
caso3
:


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

paso44
:
        
w=w+1
        
if 3 then paso5
        porta
=%00100001
        PORTC.0
=0
        PORTE
=%000000010
        
for 1 to 10
        pause 100
        next
        
goto inicio
        
paso5
:
        
u=u+1
        
if fase3  then paso6
        porta
=%00001001
        PORTC.0
=1
        PORTE
=%000000000
        
for 1 to 10
        pause 100
        next
        
goto inicio
paso6

        
v=v+1
        
if 3 then borrar2
        porta
=%00001001
        PORTC.0
=0
        PORTE
=%00000100
        
for 1 to 10
        pause 100
        next
        
goto inicio
        
borrar2
:
        
0
        y 
0
        z 
0
        u 
0
        v 
0
        w 
0
        
goto inicio 
        
intermitente
:
        
porta=%000001010
        PORTE
=%000000100
        portc.0
=0
        
for 1 to 5
        pause 100
        next
        porta
=%000000000
        PORTE
=%000000000
        
for 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 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 
;pantalla actualizada
ENDIF
GOTO 
num_fases
; ***********************para igualar la hora *****************
up_num_fasesfase fase 1
IF fase >= 4 THEN fase=2
GOTO pausa

pausa
: FOR 1 TO 20 retardo de 200 mls
PAUSE 20 
;pasos de 10 mls para no perder interrupciones
NEXT L
actual 
;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 
;pantalla actualizada
ENDIF
GOTO 
fase_1_1
; ***********************para igualar la hora *****************
up_fase_1fase1 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 1 TO 20 retardo de 200 mls
PAUSE 10 
;pasos de 10 mls para no perder interrupciones
NEXT M
actual_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 
;pantalla actualizada
ENDIF
GOTO 
fase_1_2
; ***********************para igualar la hora *****************
up_fase_2fase2 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 1 TO 20 retardo de 200 mls
PAUSE 10 
;pasos de 10 mls para no perder interrupciones
NEXT N
actual_2 
;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 
;pantalla actualizada
ENDIF
GOTO 
fase_1_3
; ***********************para igualar la hora *****************
up_fase_3fase3 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 1 TO 20 retardo de 200 mls
PAUSE 10 
;pasos de 10 mls para no perder interrupciones
NEXT P
actual_3 
;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 
;pantalla actualizada
ENDIF
GOTO 
hor_int_1
; ***********************para igualar la hora *****************
up_hor_inthora_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 1 TO 20 retardo de 200 mls
PAUSE 10 
;pasos de 10 mls para no perder interrupciones
NEXT Q
actual_4 
;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 
;pantalla actualizada
ENDIF
GOTO 
min_int_1
; ***********************para igualar la hora *****************
up_min_intminu_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 1 TO 20 retardo de 200 mls
PAUSE 10 
;pasos de 10 mls para no perder interrupciones
NEXT R
actual_5 
;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 
;pantalla actualizada
ENDIF
GOTO 
hora_apa
; ***********************para igualar la hora *****************
up_hr_apahora_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 1 TO 20 retardo de 200 mls
PAUSE 10 
;pasos de 10 mls para no perder interrupciones
NEXT S
actual_6 
;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 
;pantalla actualizada
ENDIF
GOTO 
min_apa
; ***********************para igualar la hora *****************
up_m_apaminu_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 1 TO 20 retardo de 200 mls
PAUSE 10 
;pasos de 10 mls para no perder interrupciones
NEXT S
actual_7 
;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 
;pantalla actualizada
ENDIF
GOTO 
hor_enc
; ***********************para igualar la hora *****************
up_h_enchora_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 1 TO 20 retardo de 200 mls
PAUSE 10 
;pasos de 10 mls para no perder interrupciones
NEXT T
actual_8 
;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 
;pantalla actualizada
ENDIF
GOTO 
min_enc
; ***********************para igualar la hora *****************
up_m_encminu_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 1 TO 20 retardo de 200 mls
PAUSE 10 
;pasos de 10 mls para no perder interrupciones
NEXT T
actual_9 
;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 
;pantalla actualizada
ENDIF
GOTO 
hora_actual
; ***********************para igualar la hora *****************
up_horhora 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 1 TO 20 retardo de 200 mls
PAUSE 10 
;pasos de 10 mls para no perder interrupciones
NEXT H
actual_10 
;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 
;pantalla actualizada
ENDIF
GOTO 
minu_actual
; ***********************para igualar la hora *****************
up_MINminu 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 1 TO 20 retardo de 200 mls
PAUSE 10 
;pasos de 10 mls para no perder interrupciones
NEXT I
actual_11 
;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 
19/08/2016 #19


acercándose al problema
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.
19/08/2016 #20
Moderador

Avatar de D@rkbytes

Por favor, adjunta el programa que estás compilando y usando actualmente.
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.