No funcionan condiciones IF en PICBasic

#21
Hola amigos nuevamente por aqui, espero no molestar con mi insistencia.
Les doy mas o menos un alcance mas cercano del problema del proyecto.

en el caso2: hora int 23:59 hora apag 02:20 hora enc 02:40
la hora de int puede ser cualquier hora antes de las 23:59 y la hora de apa y enc deben ser después de las 00:00 horas.
cuando la hora tiempo real esta en el minuto 39 o menos es deecir 38,37,36,etc de cualquier hora por ejemplo:

eehora eemin int apa enc
23 : 39 23:59 02:20 02:40

21:39 / 20:39 .... cualquier hora :39 para atrás , el semaforo no enciende, pero tan luego pasa el minutos 39, se vuelve a la normalidad.
Adjunto el archivo que estoy compilando y el esquema en isis proteus.
Muchas gracias
 

Adjuntos

Última edición:
#22
Hola amigos nuevamente por aqui, espero no molestar con mi insistencia.
Les doy mas o menos un alcance mas cercano del problema del proyecto.

en el caso2: hora int 23:59 hora apag 02:20 hora enc 02:40
la hora de int puede ser cualquier hora antes de las 23:59 y la hora de apa y enc deben ser después de las 00:00 horas.
cuando la hora tiempo real esta en el minuto 39 o menos es deecir 38,37,36,etc de cualquier hora por ejemplo:

eehora eemin int apa enc
23 : 39 23:59 02:20 02:40

21:39 / 20:39 .... cualquier hora :39 para atrás , el semaforo no enciende, pero tan luego pasa el minutos 39, se vuelve a la normalidad.
Adjunto el archivo que estoy compilando y el esquema en isis proteus.
Muchas gracias
Buenas.
He estado analizando tu código, y también hay un bug en tu comparación de casos, por ejemplo si la hora intermitencia es 23:30, hora de apagado 01:45 y hora de encendido 02:40 el programa no hace nada, solo lee el rtc.
Referente a tu problema de Caso 2 hay subo el código con algunas modificaciones para que lo pruebes y analices:
 

Adjuntos

#23
Viendo el código, la verdad me enredé.
Por eso siempre les he aconsejado que hagan el programa por partes, y ya cuando una función les de buen resultado, la incluyan a lo que será el programa principal.

Lo problemas que pude ver en el programa se deben a usar retardos excesivos y escrituras a la pantalla durante el servicio de interrupción.
Tampoco debes usar un Return dentro del servicio de interrupción porque se provocará un desborde de pila.

También hay una mala estructura y muchas variables que se pueden sintetizar en arreglos.
Empieza por partes y prueba cada función, cuando la tengas sigue con el resto del programa.

Yo cuando tengo que hacer un programa grande, lo hago por partes para ir probando las rutinas independientes.
Así voy acumulando carpetas con programas de prueba que posteriormente añado al principal.
Cuando ya están funcionando en conjunto con el resto del programa, las borro o las guardo como ejemplos.
 
#24
Buenas Noches, Amigos otra vez por aquí después de mucho tiempo, pero contento de regresar a explorar esta pagina con una pregunta.
Espero me puedan apoyar de ante mano muchas gracias.
Hace unos años me favorecieron en la solucion de un codigo en pic basic pro, y el amigo RobertTorres me dio una pista, y quiero decirle que me sirvio mucho, tal es que eh podido encontrar la lógica d su analisis que me compartio. aquilo dejo:
en archivos adjuntos,.
aquí la pregunta. porque las sentencias por separadas funcionan bien, pero cuando las junto para dejar listo todo como un solo programa, como que se pierde la LÓGICA Y no obedece, cuando junto los tres casos el tercero mas que todo ya no me obedece. Bueno eso es amigos, ojala me puedan dar una manito, muchas gracias.

Código:
on interrupt goto CONFIGURAR
INTCON = %10010000
OPTION_REG.6=0
    FOR a = 1 TO 100   
    if (APhora >= INHora) and (APhora >= ENhora) then caso1
    pause 100
    next
    FOR a = 1 TO 100
    if (INhora >= ENhora) and (INhora >= APhora) then caso2
    pause 100
    next
    FOR a = 1 TO 100   
    if (ENhora >= APhora) and (ENhora >= INHora) then caso3
    pause 100
    next
    
goto inicio
 
#25
te tomaste tu tiempo al parecer o_O Agosto 2016, Marzo 2018...
Podrias subir lo que estas sumando o haciendo en la interrupcion?... si no veo todo el programa, no puedo ayudarte... ahi solo veo tres contadores que nunca van a sali del loop si no cambian los valores de APhora, INHora,ENhora.... entonces, tengo que ver como configuraste cada variable, tengo que ver que haces cuando pega el salto la interrupcion , etc etc... ponete las pilas papa ;)
 
#27
mira, si no mal entendi el programa, el problema radica en que se pierde el microcontrolador cuando esta dentro de la interrupcion... Para que esto no pase, tenes que indicarle al microcontrolador cuando arranca y cuando termina la interrupcio ya que uinterrupcion lo que hace es dejar de lado o que estaba haciendo paara atender otra cosa y finalizada esta, vuelve al punto donde habia quedado (en algunos caso si, en otros puedes seguir atendiendo otra cosas, pero debes de activar nuevamente la bandera de la interrupcion para arranque nuevamente el timer a trabajar).
En tu caso, si bien se ve que configuras la interrupcion, fijate que debajo de esta configuracion colocas parte de lo que seria la rutina de la interrupcion, pero sin anidar a un subprograma... o sea, las lineas de abajo no tienen etiqueta y la cerras con DISABLE

Código:
on interrupt goto CONFIGURAR

INTCON = %10010000

OPTION_REG.6=0

     

    if (APhora >= INHora) and (APhora >= ENhora) then caso1



    if (INhora >= ENhora) and (INhora >= APhora) then caso2

   

    if (ENhora >= APhora) and (ENhora >= INHora) then caso3

 

goto inicio

     

caso1:

IF (EEHORA >=APHora) and (EEMIN>=APminu)  then  apagar

if (EEHORA >=INHora) and (EEMIN => INminu) then intermitente

if (EEHORA >=ENhora) and (EEMIN>=ENCminu) and (EEHORA =<INhora) then programa



if (EEHORA >= 00) AND (EEMIN >= 00) AND (EEHORA <= ENhora) then  apagar    

if (EEHORA >= 00) and (EEmin >= 00) and (EEhora <= INhora) then programa

if (EEHORA >= 00) AND (EEMIN >= 00) AND (EEHORA >= INHORA) then  intermitente    ;AND (EEMIN <= INminu) then    

    goto inicio

     

caso2:

IF (EEHORA >=INHora) and (EEMIN>=INminu)  then  intermitente

if (EEHORA >=ENhora) and (EEMIN => ENCminu) then programa

if (EEHORA >=APhora) and (EEMIN>=APminu) and (EEHORA =<ENHORA) then  apagar  


if (EEHORA >= 00) AND (EEMIN >= 00) AND (EEHORA <= APhora) then  intermitente    ;AND (EEMIN <= INminu) then    

if (EEHORA >= 00) and (EEmin >= 00) and (EEhora <= ENhora) then apagar

if (EEHORA >= 00) AND (EEMIN >= 00) AND (EEHORA >= ENHORA) then  programa    ;AND (EEMIN <= INminu) then    

    goto inicio

       

caso3:

IF (EEHORA >=ENHora) and (EEMIN>=ENCminu)  then  programa  

if (EEHORA >=APhora) and (EEMIN => APminu) then apagar

if (EEHORA >=INhora) and (EEMIN>=INminu) and (EEHORA =<APHORA) then  intermitente  


if (EEHORA >= 00) AND (EEMIN >= 00) AND (EEHORA <= INhora) then  programa    

if (EEHORA >= 00) and (EEmin >= 00) and (EEhora <= APhora) then intermitente

if (EEHORA >= 00) AND (EEMIN >= 00) AND (EEHORA >= APHORA) then  apagar    ;AND (EEMIN <= INminu) then    


    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=%000100010

        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:
....
Justo debajo de DISABLE, le indicas al microcontrolador que arranca justamente la etiqueta a donde saltar en caso de interrupcion.... corrige eso y cuentanos como te fue... en lo posible, intenta que no pasen otros dos años :ROFLMAO::LOL: Saludos
 
#29
En pocas palabras, que no incluyas todas esas rutinas dentro del servicio de interrupción.
Eso lo comenté en el post #23 y hasta ahora tu código sigue igual, aún con el Return dentro de la interrupción. o_O
Para eso existen las banderas (Flags) que puedes verificar para ejecutar rutinas.
 
#30
Ola buenas tardes, estoy un poco cruzado los cables del cerebro con respecto a sus aportes de ayuda. Quería enviarles una imagen enseñándoles de donde saque mi programa base, del libro de microcontroladores Carlos Reyes A.. esta es.
 

Adjuntos

#31
Sí, pero eso es sólo un ejemplo que enciende un LED cuando ocurre la interrupción externa por RB0.
Pero tú ingresaste la mayor parte del programa dentro del servicio de interrupción.
Una interrupción no debe ser usada de la forma en que lo hiciste.
Si hubieras escrito tu programa en lenguaje ensamblador, jamás hubiera dado señales de vida.

Lo que debes hacer es retirar todo ese código del servicio de interrupción y usar banderas.

Por ejemplo:
Código:
Servicio_Interrupciones:
    Disable

    If INTCON.1 = 1 Then    ; Si ocurre una interrupción por RB0...
        INTCON.1 = 0        ; Regresar a 0 el bit INTF
        Bandera_RB0 = 1     ; Indicar que ocurrió una interrupción por RB0
    EndIf

    Resume
    Enable
Posteriormente puedes comprobar "Bandera_RB0" dentro del bucle principal y ejecutar rutinas, sin olvidar regresar a 0 "Bandera_RB0"
 
#33
¿Has programado antes en algún lenguaje? Si no se ha hecho, cuesta un poco más.
No te desanimes, presta atención a todo lo que te dijeron sobre donde debe ir cada cosa.
A veces querer corregir lo que se tiene, puede llegar a ser muy complicado.
Pasar en limpio e ir compilando por partes, te ayudará.
Muchas veces es muy buena idea hacer un diagrama de flujo para tener claro cada paso.
 
#36
Hoja de datos, entra al topico de pbp ue hay en el.foro y centraye en los aportes del kia darkbyte... fijate que subio un pdf tambien que habla de configurcion del 16f877... eso mismo, te ayuda a entender como configurar otros pic... ojo, es complejo, a mi me cuesta cundo tengo que meter mano en micros que nunca use...
 
#37
Hola, buenas noches, estimados amigos.
E
stuve haciendo un ejercicio con interrupción por timer 0 para poder entender un poco más acerca de este tema que me tiene un poco tonteado, jajaja.
Cogí un ejemplo de temporizador con el cronómetro de mecatrodatos en la pagina 1 del curso de pic basic pro.
S
e ve ahí que su temporizador es de 5 minutos, pero yo lo estoy haciendo programable y descendente a 0.
T
oda la programación me funciona, excepto que cuando llega a cero no se detiene el tiempo.
U
na pregunta. ¿Podrán revisarlo para ver qué no estoy comprendiendo? Por eso me da ese error.
Aquí-les adjunto mi programación y la simulación en proteus. Gracias por su comprensión.
 

Adjuntos

#38
Ola buenas noches, aqui subo la modificación del programa del contador, tengo algunos inconvenientes con el pulsador stop que cuando la cuenta esta en stop y continuo presionando esta tecla , empieza a decrementar la cuenta por cada pulsada que le doy, cosa que no debe hacer. por favor revisen mi archivo, para continuar con el otro programa , que estoy plantado en hacer. muchas gracias.
 

Adjuntos

Temas similares