No obedece la condición

Hola amigos del Foro, estoy haciendo un programa en basic pro para una tarjeta de control de semáforo, y estoy en esta parte que configuro las horas de cada función, para hora_apagado, hora_encendido, hora intermitencia y en esta parte de mi programa la condición IF PORTB.0 = 0 THEN apag, IF PORTB.0 = 0 THEN enc, IF PORTB.0 = 0 THEN inter no obedece en orden, obedece si! pero de una manera "aleatoria", bueno espero que me puedan observar mi programación y asi dar una manito. gracias.
Adjunto parte de mi programación.

Código:
@ DEVICE pic16f877, HS_OSC \'Ocilador Xtal.-
@ DEVICE pic16f877, WDT_OFF \' Watchdog Timer desconectado.-
@ DEVICE pic16f877, PWRT_on \' Power-On Timer conectado.-
@ DEVICE pic16f877, BOD_on \' Brown-Out Detect conectado.-
@ DEVICE pic16f877, LVP_OFF \' Low-Voltage Programming desconectado.-
@ DEVICE pic16f877, CPD_OFF \' Data Memory Code Protect desconectado.-

 define osc 20
 
hora_int var byte
minu_int var byte
hora_apag var byte
minu_apag var byte
hora_enc var byte
minu_enc var byte

actual  VAR byte
actual_1  VAR byte
actual_2  VAR byte
x       VAR BYTE

hora_int = 0
minu_int = 0
hora_apag = 0
minu_apag = 0
hora_enc = 0
minu_enc = 0

actual  = 1
actual_1= 1
actual_2= 1

pause 200

define LCD_DREG     PORTD
DEFINE LCD_DBIT     4
DEFINE LCD_RSREG    PORTD
DEFINE LCD_RSBIT    3
DEFINE LCD_EREG     PORTD
DEFINE LCD_EBIT     1


trisb=%1 
trisd=%0 


 
inter:
IF PORTB.0 = 0 THEN apag                 
IF PORTB.2 = 0 THEN inchr_int       
IF PORTB.1 = 0 THEN incmin_int
                           
actualiza_int: IF actual = 1 THEN
lcdout $fe,1," INTERMITENCIA  "   
LCDOUT $fe,$C0," ",dec2 hora_int,":",dec2 minu_int
actual = 0                      ;pantalla actualizada
ENDIF
GOTO inter
; ***********************para igualar la hora y minutos de intermitencia *****************
inchr_int: hora_int = hora_int + 1
IF hora_int >= 24 THEN hora_int=0
GOTO pausa_1 

incmin_int: minu_int = minu_int + 1
IF minu_int >= 60 THEN minu_int=0
GOTO pausa_1

pausa_1: 
FOR x = 1 TO 20                 
PAUSE 10                        
NEXT x
actual = 1                     
GOTO actualiza_int
;************** Handler de interrupciones para incrementar contador ***************

apag:
IF PORTB.0 = 0 THEN enc
IF PORTB.2 = 0 THEN inchr_apag       
IF PORTB.1 = 0 THEN incmin_apag 
actualiza_apag: IF actual_1 = 1 THEN
lcdout $fe,1," APAGADO  "   
LCDOUT $fe,$C0," ",dec2 hora_APAG,":",dec2 minu_APAG
actual_1 = 0                      
ENDIF
GOTO apag
 
; ***********************para igualar la hora y minutos de apagado ***************** 
inchr_apag: hora_apag = hora_apag + 1
IF hora_apag >= 24 THEN hora_apag=0
GOTO pausa_2 

incmin_apag: minu_apag = minu_apag + 1
IF minu_apag >= 60 THEN minu_apag=0
GOTO pausa_2

pausa_2: 
FOR x = 1 TO 20                 
PAUSE 10                        
NEXT x
actual_1 = 1                      
GOTO actualiza_apag 
 
;***************************encendido**************************

enc:
IF PORTB.0 = 0 THEN inter
IF PORTB.2 = 0 THEN inchr_enc       
IF PORTB.1 = 0 THEN incmin_enc 
actualiza_enc: IF actual_2 = 1 THEN
lcdout $fe,1," ENCENDIDO  "   
LCDOUT $fe,$C0," ",dec2 hora_enc,":",dec2 minu_enc
actual_2 = 0                      
ENDIF
GOTO enc
 
; ***********************para igualar la hora y minutos de apagado ***************** 
inchr_enc: hora_enc = hora_enc + 1
IF hora_enc >= 24 THEN hora_enc=0
GOTO pausa_3 

incmin_enc: minu_enc = minu_enc + 1
IF minu_enc >= 60 THEN minu_enc=0
GOTO pausa_3

pausa_3: 
FOR x = 1 TO 20                 
PAUSE 10                        
NEXT x
actual_2 = 1                      
GOTO actualiza_enc
END ...
 
Última edición por un moderador:
Está realizando un bucle al seguir comparando dentro de las rutinas si PORTB.0 es 0
Fíjate que sucede cuando en la primer rutina "inter" PORTB.0 es llevado a nivel lógico 0...

inter:
Si RB0 es 0 entonces ir a apag ---> Va a rutina "apag"
En la rutina "apag" tienes lo siguiente...
apag:
Si RB0 es 0 entonces ir a enc ---> Va a rutina "enc"
En la rutina "enc" tienes lo siguiente...
enc:
Si RB0 es 0 entonces ir a inter ---> Va a rutina "inter"

Así que se genera un bucle entre inter y enc, porque en todas las rutinas comparas siempre si RB0 es 0.

Saludos.
 
Última edición:
Atrás
Arriba