Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - elcerouno

#1
Electrónica / Re: Temporizador para insoladora
23 Octubre 2015, 16:23 PM
hola de nuevo, mira tengo este codigo de un reloj de 24 horas, quise modificarlo pero lo que logre es q solo decremente los minutos y horas con los segundos acendentes ocea que si llega el segundero a 60 (no a cero) decrementa, tambien tengo el problema de que cuando decrmenta las horas en los minutos en lugar de iniciarce en 59 ejemplo 2:59:59  se inicia en 55  (2:55:60) espero me puedas ayudar

__CONFIG   _CP_OFF &  _WDT_OFF & _PWRTE_ON & _XT_OSC
   LIST      P=16F84A
   INCLUDE  <P16F84A.INC>

   CBLOCK  0x0C
   Hora               ; Guarda las horas.
   Minuto               ; Guarda los minutos.
   Segundo                     ; Guarda los segundos.
   MedioSegundo            ; Incrementa cada medio segundo.
   Registro50ms            ; Incrementa cada 50 ms
   Intermitencia            ; Para lograr la intermitencia.
   FlagsAjuste            ; Guarda los flags para establecer los
   ENDC               ; ajustes de hora y minuto.
#DEFINE  REELEVADOR         PORTB,1
#DEFINE  ModoPulsador      PORTB,7      ; Los pulsadores se conectan a estos
#DEFINE  IncrementarPulsador   PORTB,6      ; pines del Puerto B.
#DEFINE  F_AjusteHora      FlagsAjuste,1   ; Flags utilizados en la puesta en hora.
#DEFINE  F_AjusteMinuto      FlagsAjuste,0
#DEFINE  F_Intermitencia   Intermitencia,0   ; Si es 0, apaga en intermitencia.
TMR0_Carga50ms      EQU   -d'195'      ; Para conseguir la interrupción del

; ZONA DE CÓDIGOS ********************************************************************

   ORG    0
   goto   Inicio
   ORG   4
   goto   ServicioInterrupcion

Mensajes
   addwf   PCL,F
MensajePublicitario
   DT "REC:  H  M  S", 0x00

Inicio   call   LCD_Inicializa
   movlw   MensajePublicitario
   call   LCD_Mensaje
   bsf   STATUS,RP0      ; Acceso al Banco 1.
   movlw   b'00000111'      ; Prescaler de 256 para el TMR0 y habilita
   movwf   OPTION_REG      ; resistencias de Pull-Up del Puerto B.
   bsf   ModoPulsador      ; Configurados como entrada.
   bsf   IncrementarPulsador
    bcf REELEVADOR
   bcf   STATUS,RP0      ; Acceso al Banco 0.
   
    clrf   FlagsAjuste      ; Inicializa todos los flags de la puesta en hora.
   clrf   Hora         ; Inicializa todos los datos del reloj.
   clrf   Minuto
   clrf   Segundo
   clrf   MedioSegundo
   clrf   Registro50ms
   movlw   TMR0_Carga50ms      ; Carga el TMR0.
   movwf   TMR0      
   movlw   b'10101000'      ; Activa interrupción del TMR0 (TOIE), por cambio
   movwf   INTCON         ; líneas del Puerto B (RBIE) y la general (GIE).
   call   PuestaEnHoraReset   ; Puesta en hora por primera vez.
   
; La sección "Principal" es mantenimiento. Sólo espera las interrupciones.
; No se puede poner en modo de bajo consumo porque la instrucción "sleep" detiene el Timer 0.

Principal
   goto   Principal

; Subrutina "ServicioInterrupcion" ------------------------------------------------------
;
; Detecta qué ha producido la interrupción y ejecuta la subrutina de atención correspondiente.

ServicioInterrupcion
   btfsc   INTCON,T0IF      ; Si es una interrupción procedente del
   call   Reloj         ; desbordamiento del Timer 0, actualiza el reloj.
   btfss   INTCON,RBIF      ; Si es una interrupción RBI, lee los pulsadores.
   goto   FinInterrupcion
   btfss   ModoPulsador      ; ¿Está presionado el pulsador de "MODO"?
   call   PuestaEnHora      ; Sí, pasa a poner en hora.
   btfss   IncrementarPulsador   ; ¿Pulsado "INCREMENTAR"?.
   call   Incrementar      ; Sí, pasa a incrementar el registro de tiempo
FinInterrupcion            ; correspondiente.
   bcf   INTCON,RBIF
   bcf   INTCON,T0IF
   retfie

; Subrutina "Reloj" ---------------------------------------------------------------------
;
; Esta subrutina actualiza los contadores Horas, Minutos, Segundos y Registro50ms.
; Se ejecuta debido a la petición de interrupción del Timer 0 cada 50 ms.
;
; Como el PIC trabaja a una frecuencia de 4 MHz, el TMR0 evoluciona cada µs y se desborda cada
; 195 x 256 = 49920 µs. Sumádole el retardo de 71 µs y el pequeño tiempo de los saltos
; iniciales y de carga del contador, resulta un total de 50000 µs exactos. Es decir, el
; TMR0 producirá una interrupción cada 50 ms exactos, comprobado experimentalmente con la
; ventana Stopwatch del simulador del MPLAB.

Reloj   call   Retardo_50micros   ; Retardo de 71 microsegundos para
   call   Retardo_20micros   ; ajustar a 50 milisegundos exactos.
   nop
     movlw   TMR0_Carga50ms      ; Carga el Timer 0.
   movwf   TMR0
     call   IncrementaRegistro50ms
   
   btfss   STATUS,C      ; ¿Ha contado 10 veces 50 ms = 1/2 segundo?
   goto   FinReloj      ; No. Pues sale sin visualizar el reloj.
   

; Si está en "ModoAjusteHora", o "ModoAjusteMinuto" conmuta el flag de intermitencia y
; salta a visualizar el reloj.
;
   movf   FlagsAjuste,F
   btfsc   STATUS,Z
   goto   IncrementaReloj
   movlw   b'00000001'      ; Conmuta el flag F_Intermitencia cada 500 ms.
   xorwf   Intermitencia,F
   goto   ActualizaReloj      ; Visualiza el reloj y sale.
IncrementaReloj
   bsf     REELEVADOR
    bsf       F_Intermitencia      ; Se mantendrá siempre encendido durante
   call   IncrementaMedioSegundo   ; el funcionamiento normal.
   btfss   STATUS,C      ; ¿Ha pasado 1 segundo?
   goto   ActualizaReloj      ; No. Pues sale visualizando el reloj.
    call    IncrementaSegundos       ; Sí. Incrementa el segundero.
   btfss   STATUS,Z      ; ¿Han pasado 60 segundos?
   goto   ActualizaReloj      ; No. Pues sale visualizando el reloj.
   call    Decrementamin   ; Sí. Incrementa el minutero.
   btfss   STATUS,Z      ; ¿Han pasado 60 minutos?
   goto   ActualizaReloj      ; No. Pues sale visualizando el reloj.
   call    Decrementahr      ; Sí. Incrementa las horas.
ActualizaReloj
   call   VisualizaReloj      ; Visualiza el reloj.
FinReloj
   return


; Subrutina "VisualizaReloj" ------------------------------------------------------------
;
; Visualiza el reloj en la segunda línea en formato: " 8:47:39".
; Cuando se ajusta una variable, ésta debe aparecer en intermitencia. Para ello, utiliza
; el flag F_Intermitencia que conmuta cada 500 ms en la subrutina Reloj.
;
VisualizaReloj
   movlw   .4         ; Para centrar visualización
   call   LCD_PosicionLinea2   ; en la segunda línea.
   btfss   F_AjusteHora      ; ¿Está en la puesta en hora?
   goto   EnciendeHoras      ; No. Visualización normal.
   btfss   F_Intermitencia      ; Sí. Intermitencia si procede.
   goto   ApagaHoras      ; Apaga las horas en la intermitencia.
EnciendeHoras
   movf   Hora,W         ; Va a visualizar las horas.
   call   BIN_a_BCD      ; Lo pasa a BCD.
   call   LCD_Byte      ; Visualiza rechazando cero de las decenas.
   goto   VisualizaMinutos
ApagaHoras
   call   LCD_DosEspaciosBlancos   ; Visualiza dos espacios en blanco.
;
VisualizaMinutos
   movlw   ':'         ; Envía ":" para separar datos.
   call   LCD_Caracter
   btfss   F_AjusteMinuto      ; ¿Está en la puesta en hora?.
   goto   EnciendeMinutos
   btfss   F_Intermitencia
   goto   ApagaMinutos
EnciendeMinutos
   movf   Minuto,W      ; Visualiza minutos.
   call   BIN_a_BCD      ; Lo pasa a BCD.
   call   LCD_ByteCompleto
   goto   VisualizaSegundos
ApagaMinutos
   call   LCD_DosEspaciosBlancos   ; Visualiza dos espacios en blanco.
;
VisualizaSegundos
   movlw   ':'         ; Envía ":" para separar datos.
   call   LCD_Caracter
    movf   Segundo,W      ; Visualiza segundos.
    call   BIN_a_BCD      ; Lo pasa a BCD.
   call   LCD_ByteCompleto
    return
;
; Subrutina "Incrementar" ---------------------------------------------------------------
;
; Subrutina de atención a la interrupción por cambio de la línea RB6 al cual se ha conectado
; el pulsador "INCREMENTAR". Incrementa según corresponda una sola de las variables.

Incrementar
   call   Retardo_20ms      ; Espera se estabilicen niveles de tensión.   
   btfsc   IncrementarPulsador   ; Si es un rebote sale fuera.
   goto   FinIncrementar
   bsf       F_Intermitencia      ; Visualiza siempre mientras incrementa.
   btfsc   F_AjusteHora
   call   IncrementaHoras
   btfsc   F_AjusteMinuto
   call   IncrementaMinutos
   call   VisualizaReloj      ; Visualiza mientras espera que deje
   call   Retardo_200ms      ; de pulsar.
   btfss   IncrementarPulsador   ; Mientras permanezca pulsado,
   goto   Incrementar      ; incrementa el dígito.
FinIncrementar
   return

; Subrutina "IncrementaRegistro50ms" ----------------------------------------------------
;
; Incrementa el valor de la variable Registro50ms. Cuando llega a 10, lo cual supone
; medio segundo (50 ms x 10 = 500 ms), lo resetea y sale con el Carry a "1".
;
IncrementaRegistro50ms
   incf   Registro50ms,F
   movlw   .10
   subwf   Registro50ms,W      ; (W)=(Registro50ms)-10.
   btfsc   STATUS,C      ; ¿C=0?, ¿(W) negativo?, ¿(Registro50ms)<10?
   clrf   Registro50ms      ; Lo inicializa si ha superado su valor máximo.
   return

; Subrutina "IncrementaMedioSegundo" --------------------------------------------------------
;
; Incrementa el valor de la variable MedioSegundo. Su bit de menor peso se pondrá a "1" una
; vez por segundo.

IncrementaMedioSegundo
   incf   MedioSegundo,F      ; Incrementa.
   bsf   STATUS,C      ; Supone que ha llegado al segundo.
   btfss   MedioSegundo,0      ; El bit 0 se pondrá a uno cada segundo.
   bcf   STATUS,C
   return

; Subrutina "IncrementaSegundos" -----------------------------------------------------------
;
; Incrementa el valor de la variable Segundo. Si es igual al valor máximo de 60 lo resetea
; y sale con el Carry a "1".

IncrementaSegundos
   incf   Segundo,F      ; Incrementa los minutos.
   movlw   .60
   subwf    Segundo,W      ; ¿Ha superado su valor máximo?. (W)=(Minuto)-60.
   btfsc   STATUS,C      ; ¿C=0?, ¿(W) negativo?, ¿(Minuto)<60?
   clrf   Segundo         ; Lo inicializa si ha superado su valor máximo.
   return
       
; Subrutina "IncrementaMinutos" -----------------------------------------------------------
;
; Incrementa el valor de la variable Minuto. Si es igual al valor máximo de 60 lo resetea
; y sale con el Carry a "1".
;
IncrementaMinutos
   incf   Minuto,F      ; Incrementa los minutos.
   movlw   .60
   subwf   Minuto,W      ; ¿Ha superado su valor máximo?. (W)=(Minuto)-60.
   btfsc   STATUS,C      ; ¿C=0?, ¿(W) negativo?, ¿(Minuto)<60?
   clrf   Minuto         ; Lo inicializa si ha superado su valor máximo.
   return

; Subrutina "IncrementaHoras" -----------------------------------------------------------
;
; Incrementa el valor de la variable Hora. Si es igual al valor máximo de 24 lo resetea
; y sale con el Carry a "1".
;
IncrementaHoras
   incf   Hora,F         ; Incrementa las horas.
   movlw   .24
   subwf   Hora,W         ; ¿Ha superado su valor máximo?. (W)=(Hora)-24.
   btfsc   STATUS,C      ; ¿C=0?, ¿(W) negativo?, ¿(Hora)<24?
   clrf   Hora         ; Lo inicializa si ha superado su valor máximo.
   return
Decrementamin

             decf    Minuto,1
           
           
             return

Decrementahr

             decf    Hora,1
           
             
             
             return
             
PuestaEnHora
   call   Retardo_20ms      ; Espera a que se estabilicen niveles.   
   btfsc   ModoPulsador      ; Si es un rebote sale fuera.
   goto   FinPuestaEnHora
PuestaEnHoraReset         ; Al pulsar "MODO" se apaga la variable de
   bcf    REELEVADOR
    bcf   F_Intermitencia      ; tiempo que se va a ajustar.
   movf   FlagsAjuste,F      ; Si antes estaba en funcionamiento normal, ahora
   btfss   STATUS,Z       ; pasa a ajustar la hora.
   goto   AjustaSiguiente      ; Si no pasa a ajustar la variable de tiempo siguiente.
   bsf   F_AjusteHora      ; Pasa a ajustar la hora.
   clrf   Segundo         ; Inicializa contador de segundos y el resto.
   clrf   MedioSegundo
   clrf   Registro50ms
   goto   FinPuestaEnHora
AjustaSiguiente            ; Desplaza un "1" a la derecha del registro
   bcf   STATUS,C      ; FlagsAjuste para ajustar secuencialmente
   rrf   FlagsAjuste,F      ; cada uno de los registros de tiempo:
FinPuestaEnHora            ; hora y minuto.
   call   VisualizaReloj
   btfss   ModoPulsador      ; Ahora espera deje de pulsar.
   goto   FinPuestaEnHora
   return

   INCLUDE  <RETARDOS.INC>
   INCLUDE  <LCD_4BIT.INC>
   INCLUDE  <LCD_MENS.INC>
   INCLUDE  <BIN_BCD.INC>
   END
   
#2
Electrónica / Re: Temporizador para insoladora
23 Octubre 2015, 16:11 PM
hola, primero quiero agradecer tu ayuda, dos puedes pasarme el codigo para hacer el temporizador de 99:99 programable porfavor, quisiera darle una estudiada haber si puedo hacer el de 24 hrs te lo agradecere mucho saludos
#3
Electrónica / Re: temporizador 24 horas
28 Septiembre 2015, 22:24 PM
Cita de: ivancea96 en 28 Septiembre 2015, 20:59 PM
Dado "Retardo_500ms", basta que lo metas en un bucle para esperar todo el tiempo que quieras.


pero igual puedo programar el tiempo que yo quiera?
#4
Electrónica / temporizador 24 horas
24 Septiembre 2015, 19:10 PM
hola alguien me puede ayudar y principiante en pic quiero hacer un temporizador programable a 24 horas que pongas el tiempo que quieras prenda un led y al terminar ese tiempo lo apague, vi los ejemplos de un temporizador pero solo llega a 4 min 15 seg espero puedan ayudarme dejo el ejemplo

Código (asm) [Seleccionar]


                               LIST P=16F84A
                               INCLUDE <P16F84A.INC>

           __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 
   
    CBLOCK 0x0C
    TiempoDeseado
    Tiempo
    FlagsModo
    ENDC
   
    ORG    0x2100              
    DE     0x00                

#DEFINE   F_Temporizador_ON       FlagsModo,2
#DEFINE   F_Temporizador_Ajuste   FlagsModo,1
#DEFINE   F_Temporizador_OFF      FlagsModo,0

#DEFINE    SalidaTemporizador     PORTB,1
#DEFINE    Zumbador               PORTB,2
#DEFINE    AjustePulsador         PORTB,7
#DEFINE    IncrementarPulsador    PORTB,6

; ZONA DE CÓDIGOS ********************************************************************

            ORG   0
            goto  Inicio
            ORG   4
            goto  ServicioInterrupcion

Mensajes
           addwf        PCL,F


Mensaje_ON
           DT "EN FUNCION",0x00
Mensaje_Ajuste
           DT "TIEMPO DECEADO",0x00
Mensaje_OFF
           DT "   RECARGAR",0x00

;interrupcion de inicio
         

Inicio
           call    LCD_Inicializa
           movlw   Mensaje_Inicio
           call    LCD_MensajeMovimiento
           call    Retardo_500ms
           call    Retardo_500ms
           call    Retardo_500ms
         
           movlw   Mensaje_nollave
           call    LCD_MensajeMovimiento
           call    Retardo_500ms
           call    Retardo_500ms
           call    Retardo_500ms
           call    Retardo_500ms
           call    Retardo_500ms
           
           bsf     STATUS,RP0
           movlw   b'00000111'
           movwf   OPTION_REG
           bsf     AjustePulsador
           bsf     IncrementarPulsador
           bcf     SalidaTemporizador
           bcf     Zumbador
           bcf     STATUS,RP0
           clrw
           call    EEPROM_LeeDato
           movwf   TiempoDeseado
           call    ModoTemporizador_OFF
           movlw   b'10001000'
           movwf   INTCON
Principal
           
           
           
             goto     Principal

;subrrutinasdeservicioInterrupcion------------------------------------------
           
             
         



ServicioInterrupcion
                     
                     
                     btfsc        INTCON,T0IF
                     call         Temporizador
                     btfss        INTCON,RBIF
                     goto         FinInterrupcion
                   
                     btfss        AjustePulsador
                     call         CambiarModo
                     btfsc        IncrementarPulsador
                     goto         FinInterrupcion

                     call         Retardo_20ms
                     btfsc        IncrementarPulsador
                     goto         FinInterrupcion
                     btfsc        F_Temporizador_OFF
                     call         ModoTemporizador_ON
                     btfsc        F_Temporizador_Ajuste
                     call         IncrementarTiempoDeseado
FinInterrupcion
                     bcf          INTCON,RBIF
                     bcf          INTCON,T0IF
                     retfie

;subrrutinasCambiarModo------------------------------------------------------------

CambiarModo
            call      PitidoCorto
            btfsc     AjustePulsador
            goto      EsperaDejePulsar
            btfsc     F_Temporizador_OFF
            goto      ModoTemporizador_Ajuste
            btfss     F_Temporizador_Ajuste
            goto      ModoTemporizador_OFF

            clrw
            movwf    EEADR
            movf     TiempoDeseado,W
            call     EEPROM_EscribeDato



ModoTemporizador_OFF
                      bcf   SalidaTemporizador
                      call  Pitido
                      movlw  b'00000001'
                      movwf  FlagsModo
                      bcf    INTCON,T0IE
                      movf   TiempoDeseado,W
                      movwf  Tiempo
                      call   LCD_Borra
                      movlw  Mensaje_OFF
                      goto   FinCambiarModo
ModoTemporizador_Ajuste
                      bcf     SalidaTemporizador
                      movlw   b'00000010'
                      movwf   FlagsModo
                      clrf     Tiempo
                      clrf     TiempoDeseado
                      bcf      INTCON,T0IE
                      call     LCD_Borra
                      movlw    Mensaje_Ajuste
                      goto     FinCambiarModo
ModoTemporizador_ON
                      movf     TiempoDeseado,W
                      btfsc    STATUS,Z
                      goto     ModoTemporizador_OFF
                      movwf    Tiempo
                      call     PitidoCorto
                      movlw    b'00000100'
                      movwf    FlagsModo
                      movlw    TMR0_Carga50ms
                      movwf    TMR0
                      movlw    Carga_1s
                      movwf    Registro50ms
                      bsf      INTCON,T0IE
                      call     LCD_Borra
                      bsf      SalidaTemporizador
                      movlw    Mensaje_ON
FinCambiarModo
               call   LCD_Mensaje
               call   VisualizaTiempo
EsperaDejePulsar
               btfss   AjustePulsador
               goto    EsperaDejePulsar
               return

;SubrutinaTEMPORIZADOR

              CBLOCK
              Registro50ms
              ENDC
TMR0_Carga50ms     EQU         -d'195'
Carga_1s           EQU         d'20'

Temporizador
             call        Retardo_50micros
             call        Retardo_20micros
             nop
             movlw        TMR0_Carga50ms
             movwf        TMR0
             decfsz       Registro50ms,F
             goto         FinTemporizador
             movlw        Carga_1s
             movwf        Registro50ms
             btfss        F_Temporizador_ON
             goto         FinTemporizador
             decfsz       Tiempo,F
             goto         VisualizaContador
             bcf          SalidaTemporizador
             call         VisualizaTiempo
             call         Pitido
             call         Retardo_500ms
             call         Pitido
             call         Retardo_500ms
             call         PitidoLargo
             call         Retardo_500ms
             call         ModoTemporizador_OFF
             goto         FinTemporizador
VisualizaContador
              call        VisualizaTiempo
FinTemporizador
              return
;SubrutinaVisualizaTiempo--------------------------------------------------

VisualizaTiempo
               movlw      .5
               call      LCD_PosicionLinea2
               movf      Tiempo,W
               call      MinutosSegundos
               movf      TemporizadorMinutos,W
               call      BIN_a_BCD
               call      LCD_Byte
               movlw     ':'
               call      LCD_Caracter
               movf      TemporizadorSegundos,W
               call      BIN_a_BCD
               goto      LCD_ByteCompleto
               return
;subrutinaminutossegundos----------------------------------------------------

            CBLOCK
            TemporizadorMinutos
            TemporizadorSegundos
            ENDC

MinutosSegundos
           movwf      TemporizadorSegundos
           clrf       TemporizadorMinutos
Resta60     movlw      .60
           subwf      TemporizadorSegundos,W
           btfss       STATUS,C
           goto        FinMinutosSegundos
           movwf       TemporizadorSegundos
           incf        TemporizadorMinutos,F
           goto        Resta60
FinMinutosSegundos
           return

;subrutina incrementatiempodeseado

Saltoincremento  EQU       .5

IncrementarTiempoDeseado
               call   PitidoCorto
               movlw   Saltoincremento
               addwf   Tiempo,F
               btfsc   STATUS,C
               clrf    Tiempo
               call    VisualizaTiempo
               call    Retardo_100ms
               btfss   IncrementarPulsador
               goto    IncrementarTiempoDeseado
               movf    Tiempo,W
               movwf   TiempoDeseado
           
               return  

;subrrutinapitidolargopitidocorto

PitidoLargo
          bsf     Zumbador
          call    Retardo_500ms
Pitido    
          bsf     Zumbador
          call    Retardo_200ms
PitidoCorto
          bsf      Zumbador
          call     Retardo_20ms
          bcf      Zumbador
          return
         
           
           
               
   
         
   



         
                               INCLUDE    <RETARDOS.INC>
                               INCLUDE    <BIN_BCD.INC>
                               INCLUDE    <LCD_4BIT.INC>
                               INCLUDE     <LCD_MENS.INC>
                               INCLUDE     <EEPROM.INC>

                    END :-(

#5
Electrónica / temporizador 24 horas
24 Septiembre 2015, 19:09 PM
hola alguien me puede ayudar y principiante en pic quiero hacer un temporizador programable a 24 horas que pongas el tiempo que quieras prenda un led y al terminar ese tiempo lo apague, vi los ejemplos de un temporizador pero solo llega a 4 min 15 seg espero puedan ayudarme dejo el ejemplo


                                LIST      P=16F84A
                                INCLUDE   <P16F84A.INC>

            __CONFIG   _CP_OFF   &   _WDT_OFF   &   _PWRTE_ON   &   _XT_OSC
   
     
     CBLOCK 0x0C
     TiempoDeseado
     Tiempo
     FlagsModo
     ENDC
     
     ORG    0x2100               
     DE     0x00               

#DEFINE   F_Temporizador_ON       FlagsModo,2
#DEFINE   F_Temporizador_Ajuste   FlagsModo,1
#DEFINE   F_Temporizador_OFF      FlagsModo,0

#DEFINE    SalidaTemporizador     PORTB,1
#DEFINE    Zumbador               PORTB,2
#DEFINE    AjustePulsador         PORTB,7
#DEFINE    IncrementarPulsador    PORTB,6

; ZONA DE CÓDIGOS ********************************************************************

             ORG   0
             goto  Inicio
             ORG   4
             goto  ServicioInterrupcion

Mensajes
            addwf        PCL,F


Mensaje_ON
            DT "EN FUNCION",0x00
Mensaje_Ajuste
            DT "TIEMPO DECEADO",0x00
Mensaje_OFF
            DT "   RECARGAR",0x00

;interrupcion de inicio
           

Inicio
            call    LCD_Inicializa
            movlw   Mensaje_Inicio
            call    LCD_MensajeMovimiento
            call    Retardo_500ms
            call    Retardo_500ms
            call    Retardo_500ms
         
            movlw   Mensaje_nollave
            call    LCD_MensajeMovimiento
            call    Retardo_500ms
            call    Retardo_500ms
            call    Retardo_500ms
            call    Retardo_500ms
            call    Retardo_500ms
             
            bsf     STATUS,RP0
            movlw   b'00000111'
            movwf   OPTION_REG
            bsf     AjustePulsador
            bsf     IncrementarPulsador
            bcf     SalidaTemporizador
            bcf     Zumbador
            bcf     STATUS,RP0
            clrw
            call    EEPROM_LeeDato
            movwf   TiempoDeseado
            call    ModoTemporizador_OFF
            movlw   b'10001000'
            movwf   INTCON
Principal
           
             
           
              goto     Principal

;subrrutinasdeservicioInterrupcion------------------------------------------
             
             
           



ServicioInterrupcion
                     
                       
                      btfsc        INTCON,T0IF
                      call         Temporizador
                      btfss        INTCON,RBIF
                      goto         FinInterrupcion
                   
                      btfss        AjustePulsador
                      call         CambiarModo
                      btfsc        IncrementarPulsador
                      goto         FinInterrupcion

                      call         Retardo_20ms
                      btfsc        IncrementarPulsador
                      goto         FinInterrupcion
                      btfsc        F_Temporizador_OFF
                      call         ModoTemporizador_ON
                      btfsc        F_Temporizador_Ajuste
                      call         IncrementarTiempoDeseado
FinInterrupcion
                      bcf          INTCON,RBIF
                      bcf          INTCON,T0IF
                      retfie

;subrrutinasCambiarModo------------------------------------------------------------

CambiarModo
             call      PitidoCorto
             btfsc     AjustePulsador
             goto      EsperaDejePulsar
             btfsc     F_Temporizador_OFF
             goto      ModoTemporizador_Ajuste
             btfss     F_Temporizador_Ajuste
             goto      ModoTemporizador_OFF

             clrw
             movwf    EEADR
             movf     TiempoDeseado,W
             call     EEPROM_EscribeDato



ModoTemporizador_OFF
                       bcf   SalidaTemporizador
                       call  Pitido
                       movlw  b'00000001'
                       movwf  FlagsModo
                       bcf    INTCON,T0IE
                       movf   TiempoDeseado,W
                       movwf  Tiempo
                       call   LCD_Borra
                       movlw  Mensaje_OFF
                       goto   FinCambiarModo
ModoTemporizador_Ajuste
                       bcf     SalidaTemporizador
                       movlw   b'00000010'
                       movwf   FlagsModo
                       clrf     Tiempo
                       clrf     TiempoDeseado
                       bcf      INTCON,T0IE
                       call     LCD_Borra
                       movlw    Mensaje_Ajuste
                       goto     FinCambiarModo
ModoTemporizador_ON
                       movf     TiempoDeseado,W
                       btfsc    STATUS,Z
                       goto     ModoTemporizador_OFF
                       movwf    Tiempo
                       call     PitidoCorto
                       movlw    b'00000100'
                       movwf    FlagsModo
                       movlw    TMR0_Carga50ms
                       movwf    TMR0
                       movlw    Carga_1s
                       movwf    Registro50ms
                       bsf      INTCON,T0IE
                       call     LCD_Borra
                       bsf      SalidaTemporizador
                       movlw    Mensaje_ON
FinCambiarModo
                call   LCD_Mensaje
                call   VisualizaTiempo
EsperaDejePulsar
                btfss   AjustePulsador
                goto    EsperaDejePulsar
                return

;SubrutinaTEMPORIZADOR

               CBLOCK
               Registro50ms
               ENDC
TMR0_Carga50ms     EQU         -d'195'
Carga_1s           EQU         d'20'

Temporizador
              call        Retardo_50micros
              call        Retardo_20micros
              nop
              movlw        TMR0_Carga50ms
              movwf        TMR0
              decfsz       Registro50ms,F
              goto         FinTemporizador
              movlw        Carga_1s
              movwf        Registro50ms
              btfss        F_Temporizador_ON
              goto         FinTemporizador
              decfsz       Tiempo,F
              goto         VisualizaContador
              bcf          SalidaTemporizador
              call         VisualizaTiempo
              call         Pitido
              call         Retardo_500ms
              call         Pitido
              call         Retardo_500ms
              call         PitidoLargo
              call         Retardo_500ms
              call         ModoTemporizador_OFF
              goto         FinTemporizador
VisualizaContador
               call        VisualizaTiempo
FinTemporizador
               return
;SubrutinaVisualizaTiempo--------------------------------------------------

VisualizaTiempo
                movlw      .5
                call      LCD_PosicionLinea2
                movf      Tiempo,W
                call      MinutosSegundos
                movf      TemporizadorMinutos,W
                call      BIN_a_BCD
                call      LCD_Byte
                movlw     ':'
                call      LCD_Caracter
                movf      TemporizadorSegundos,W
                call      BIN_a_BCD
                goto      LCD_ByteCompleto
                return
;subrutinaminutossegundos----------------------------------------------------

             CBLOCK
             TemporizadorMinutos
             TemporizadorSegundos
             ENDC

MinutosSegundos
            movwf      TemporizadorSegundos
            clrf       TemporizadorMinutos
Resta60     movlw      .60
            subwf      TemporizadorSegundos,W
            btfss       STATUS,C
            goto        FinMinutosSegundos
            movwf       TemporizadorSegundos
            incf        TemporizadorMinutos,F
            goto        Resta60
FinMinutosSegundos
            return

;subrutina incrementatiempodeseado

Saltoincremento  EQU       .5

IncrementarTiempoDeseado
                call   PitidoCorto
                movlw   Saltoincremento
                addwf   Tiempo,F
                btfsc   STATUS,C
                clrf    Tiempo
                call    VisualizaTiempo
                call    Retardo_100ms
                btfss   IncrementarPulsador
                goto    IncrementarTiempoDeseado
                movf    Tiempo,W
                movwf   TiempoDeseado
           
                return 

;subrrutinapitidolargopitidocorto

PitidoLargo
           bsf     Zumbador
           call    Retardo_500ms
Pitido     
           bsf     Zumbador
           call    Retardo_200ms
PitidoCorto
           bsf      Zumbador
           call     Retardo_20ms
           bcf      Zumbador
           return
           
           
           
               
     
           
     



         
                                INCLUDE       <RETARDOS.INC>
                                INCLUDE       <BIN_BCD.INC>
                                INCLUDE       <LCD_4BIT.INC>
                                INCLUDE     <LCD_MENS.INC>
                                INCLUDE     <EEPROM.INC>

                     END :-(