Autor Tema: ayuda con temporizador en PBP  (Leído 1707 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ferdy575

  • PIC10
  • *
  • Mensajes: 2
ayuda con temporizador en PBP
« 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