Autor Tema: Ayuda con temporizador en PBP  (Leído 2190 veces)

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

Desconectado ferdy575

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

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Ayuda con temporizador en PBP
« Respuesta #1 en: 25 de Junio de 2012, 22:38:26 »
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

A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.


 

anything