Sentencias if... then , no me funcionan

Hola amigos del Foro, estoy haciendo una tarjeta de control para semáforo de dos fases; con tiempo real Ds 1307, pic 16f877 y lcd 16 x 2 .
Bueno mi programación es para que cuando inicie el funcionamiento me salga el reloj de tiempo real en la lcd y a la vez haga el circulo cerrado de un semáforo de dos fases.
Pero bueno ademas necesito programar los tiempos de la fase 1 y fase 2 de mi semáforo y para esto estoy utilizando la interrupcion B.0 INTCON = %10010000
OPTION_REG.6=0 para el flanco de bajada, y mi problema esta que no me obedece la sentencia que le doy, por ejemplo dice: IF PORTB.0 = 0 THEN apag y no va la etiqueta apag si no que se saltea y va de-frente a otra etiqueta que no es la que envia la sentencia o sino cambia pero de manera aleatoria o sea desordenada, quiero solucionar esta parte de mi programación para luego pasar a otra parte.Espero me puedan dar la mano amigos del foro gracias, eh leído tanto de sentencias y de ejercicios con pulsadores y nad de resultados , espero su ayuda por servicio. Gracias
 

Adjuntos

  • programa.rar
    1.4 KB · Visitas: 12
Yo no programo en PIC, pero si vamos a dejar algo en claro, el PIC siempre obedece, solo que el programador no lo indica como debe ser, lo que yo hago cuando me topo con estas situaciones es ejecutar el simulador por software paso a paso e ir viendo que pasa con los registros sobre todo el tipico registro de estado y los relacionados con la instruccion que "no obedece", y eso es algo que puedes hacer antes de preguntar, muy probablemente resuelvas el problema antes de lo que alguien te pueda responder.

Luego ya vienen problemas de hardware, botones defectuosos, mucho rizo en la fuente de dc, ruido externo, mal desacoplo, cables trozados etc.
 
Amigo Gudino, claro que si, los tres pines: Ra0, Ra1, Ra2 tienen resistencias de 10 k a 5 voltios., Con Ra0 hago la interrupcion, con ra1, incremento horas, y con ra2, icremento minutos, ahi esta el programa adjunto mensaje anterior. GRacias
 
Entonces vamos de nuevo, la interrupcion esta destinada para RB.0 y tu dices que dicha interrupcion la inyectas en RA.0!. No comprender!!!!
Sube el esquema del conexionado electrico para opinar mas certeramente.
 
Última edición:
mi problema esta que no me obedece la sentencia que le doy, por ejemplo dice: IF PORTB.0 = 0 THEN apag y no va la etiqueta apag si no que se saltea y va de-frente a otra etiqueta que no es la que envia la sentencia o sino cambia pero de manera aleatoria o sea desordenada
Si copiaste las rutinas de este programa ve la respuesta en este post.
Ahí está la explicación del error en la sentencia IF de ese programa.
 
ohhhhhhhh caramba tiene razon Amigo Gudino es Rb.0, Rb1, Rb2. me habia confundido en escribir, la interrupcion se da por RB.0. Gracias



Entonces D@rkbytes cual seria la solucion, poner pauses o ? ,por que cuando yo pulso la interrupcion Rb.0 la respuesta de mi sentencia es que va a otra etiqueta siguiente pero de manera desordenada o aleatoria. La solucion seria algunos pauses? o que seria?.
Gracias D@rkbytes.
 
Última edición:
Amigo marvin, cuando la interrupcion es llamada a la etiqueta que fue declarada para tal fin, debes desactivar la interrupcion dentro de la subrutina asi no se producen sucesivas interrupciones en caso de ser llamada tantas veces ocurra el evento, sino jamas saldria de dicha subrutina, una vez ejecutadas todas la etapas, vuelves a activar la interrupcion antes de salir de ahi.
 
Buenos días marin villalobos.

Hace muchos (o más) años que no trabajo con Basic, pero...

En tu programa he visto algo raro raro...

IF PORTB.0 = 0 THEN apag

apag:
IF PORTB.0 = 0 THEN enc

enc:
IF PORTB.0 = 0 THEN actualizar_hora

actualizar_hora:
IF PORTB.0 = 0 THEN inter

inter:
IF PORTB.0 = 0 THEN apag

Por lo que si PORTB,0 = 0 el programa se meterá en un bucle.

Será que esto no está bién :unsure:

Sal U2
 
muy bien amigos de foros de electronica , me ayudo bastante lo que me dijeron sobre l bucle que habia hecho con mi sentencia, mi solucion fue hacerle un lazo con un pause de 100 ms, mas o menos asi:
int:
for c = 1 to 3
pause 100
lcdout $fe, $1, "intermitencia"
next

luego entra al programa y si , si me dio resultado.
Muchas Gracias
 
Atrás
Arriba