TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: ferdy575 en 25 de Junio de 2012, 21:40:32
-
Hola a todos.
Quiza alguien me pueda ayudar con este proyecto, se trata de un temporizador programanle en horas minutos y segundos el problema que tengo es que no he logrado que llegue a cero para que pueda activar la alarma de tiempo cumplido a ver sí alguien le encuentra el error a mi codigo.- @ DEVICE pic16F84A
@ DEVICE pic16F84A, WDT_ON
@ DEVICE pic16F84A, PWRT_ON
@ DEVICE pic16F84A, PROTECT_OFF
@ device xt_osc
define osc 4
;LCD
Define LCD_DREG PORTB
Define LCD_DBIT 0
Define LCD_RSREG PORTB
Define LCD_RSBIT 4
Define LCD_EREG PORTB
Define LCD_EBIT 5
Symbol Horas = PORTA.0 ; AJUSTE HORA
Symbol Minutos = PORTA.1 ; AJUSTE MINUTOS
Symbol Segundos = PORTA.2 ; AJUSTE SEGUNDOS
symbol Out = PORTB.7 ; SALIDA CONTROL ALARMA
symbol START = PORTA.3 ; INICIO CONTEO
SYMBOL STOP_ = PORTB.6 ; DETIENE CONTEO
SYMBOL CLEAR_ = PORTA.4 ; LIMPIA CONTEO
;VARIABLES
Pulsos VAR byte
Hrs VAR byte
Mts VAR byte
Sds VAR byte
Disp VAR byte
Delay VAR byte
CLEAR
TRISB = %01000000
TRISA = %00011111
PAUSE 500
Hrs = 00
Mts = 00
Sds = 00
pulsos = 0
OPTION_REG = %00000101
ON INTERRUPT GOTO ISR
INTCON = %10100000
LCDOUT $FE, 1 ;LIMPIA LCD
;INCIO PROGRAMA
LOOP:
if hrs > 23 Then hrs = 23
if mts > 60 then mts = 60
if sds > 60 then sds = 60
;BOTÓN START
IF START = 0 THEN
TMR0 = 0 ;Inicializa registro TMR0
INTCON = %10100000 ;habilita el timer interrupt
Disp = 1 ; habilita display
Gosub Retardo
ENDIF
;BOTÓN STOP
IF STOP_ = 0 THEN
INTCON = 0 ;desabilita el timer
Disp = 1 ; habilita display
Gosub Retardo
ENDIF
;BOTÓN CLEAR
IF clear_ = 0 THEN
HRS = 00
MTS = 00
SDS = 00
Gosub Retardo
ENDIF
;BOTÓN PROGRAMAR HORAS
IF Horas = 0 THEN
hrs = hrs - 1
Gosub Retardo
ENDIF
;BOTÓN PROGRAMAR MINUTOS
IF Minutos = 0 THEN
Mts = Mts - 1
Gosub retardo
ENDIF
;BOTÓN PROGRAMAR SEGUNDOS
if Segundos = 0 then
Sds = Sds - 1
Gosub retardo
ENDIF
;BOTÓN ALARMA
IF hrs = 00 AND Mts = 00 AND Sds = 00 THEN
out = 1
INTCON = 0
else
out = 0
endif
IF Disp = 1 THEN
LCDOUT $FE, 2
Lcdout "Tiempo de espera "
LCDOUT $FE,$C4, DEC2 hrs, ":",DEC2 Mts, ":",DEC2 Sds
LcdOut $fe,$C15, 0
LCDOUT $fe,$40,$00,$0A,$0A,$00,$04,$11,$0E,$00
Disp = 0
ENDIF
GOTO LOOP
;BOTONES
Retardo:
FOR Delay = 1 To 200
Pause 1
NEXT Delay
Disp = 1
RETURN
;UN SEGUNDO
DISABLE
ISR:
;DETECTANDO EL CERO
IF hrs < 0 or Mts < 0 or Sds > 0 THEN 'Ojo sí cambiamos esta función no funciona el conteo
pulsos = pulsos + 1
IF pulsos < 61 THEN NoUpdate
endif
;TIEMPO
Retro:
pulsos = 0
if hrs < 00 then
hrs = 24
endif
IF Mts <= 00 AND hRS >= 00 THEN 'error con el Mts <= 00
Mts = 59
hrs = hrs - 1
ENDIF
IF Sds <= 00 AND Mts >= 00 then 'error con el Sds <= 00
Sds = 59
Mts = Mts - 1
endif
Sds = Sds - 1
Disp = 1
return
'ojo hay error al contar hacia atras despues de llegar a 00:01:01 pasa a
'00:59:01 porque la sentencia: IF Mts <= 00 AND hRS >= 00 THEN Mts = 59 no permite
'que escriba 00, pero sí se le quita el "=" en el "<=" el conteo se vuelve loco y
'presenta gran cantidad de errores, adicionalmente los segundos pasan de 01 a 58
'tambien hay un error al momento de accionar el CLEAR pues no queda en 00:00:00
'sino que presenta un 55:58:58.
'Además al llegar el conteo a 00:01:01 no pasa a 00:01:00 y luego 00:00:59 sino
'que pasa a 55:58:58 presentando tambien error en las horas; luego como no llega
'a 00:00:00 entonces no dispara la alarma y no detiene el
'conteo y sigue avanzando infinitamente hacia atras,
'por lo demás todo funciona correctamente.
;FIN TIEMPO ACTIVO
NoUpdate:
INTCON.2 = 0
Resume
ENABLE
END
END
Aqui les dejo los archivos para que lo puedan ver
-
Hola ferdy.
Para que detectes el cero total debes hacer lo siguiente:
if hrs = 0 and Mts = 0 and Sds = 0 then
codigo alarma
endif
para que hagas el conteo descendente:
este codigo se debe ejecutar cada segundo:
Sds = Sds -1
if Sds > 59 then
Sds = 0
Mts = Mts-1
if Mts > 59 then
Mts = 0
hrs = hrs-1
if hrs > 23 then
hrs = 0
endif
endif
endif
OJO:
1. no hagas comparaciones menor a 0 si la variable esta definida como byte, hasta donde recuerdo son positivos ya hace años que no programo en pbp asi que no se si ya usara numeros negativos.
2. Si mal no recuerdo la sentencia pause deshabilita las interrupciones mientras se ejecuta, no te recomiendo su uso junto a las interrupciones.
saludos