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.
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: