TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: ferdy575 en 30 de Junio de 2012, 21:57:26
-
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
;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