Autor Tema: ayuda con cronometro  (Leído 2195 veces)

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

Desconectado israelo_rs

  • PIC10
  • *
  • Mensajes: 1
ayuda con cronometro
« en: 27 de Noviembre de 2008, 18:43:34 »
ayuda con codigo:

SE LOS AGRADESERE BASTANTE.

ES UN cronometro CON 6 DISPLAYS, dos para "MINUTOS", dos para "SEGUNDOS" Y dos para "MILISEGUNDOS", TENGO UN BOTON PARA RESETEAR EL CONTEO, PERO ____LA CUESTION AQUI ES ¿COMO AÑADO OTRO BOTON PARA PAUSAR LA CUENTA Y QUE NO SE RESETEEN LOS NUMEROS?

el codigo es el siguiente: (lo estoy simulando en isispuedo mandarles el archivo de la simulacion de ser necesario para que me ayuden)

   list      p=16f877      ;Se le dice al programa con que micro vamos a trabajar
   include      "p16f877.inc"      ;Trae todas los equ predeterminados (TMR0, PORTA, PORTB, etc.)

   __CONFIG H'3F71'

   CONTA      equ      0x20   ;Define variables
   sb      equ      0x21
   sa      equ      0x22
   mb      equ      0x23
   ma      equ      0x24
   hb      equ      0x25
   ha      equ      0x26

   org      0x00         
   goto      inicio

   org         0x04             ;Vector de interrupcion
   goto      int

   org      0x05
inicio
   clrf      PORTA         ;Se limpia el puerto A
   clrf      PORTB         ;Se limpia el puerto B
   clrf      PORTC         ;Se limpia el puerto C
   clrf      PORTD         ;Se limpia el puerto D
   clrf      CONTA
   clrf      sb
   clrf      sa
   clrf      mb
   clrf      ma
   clrf      hb
   clrf      ha

   bsf      STATUS, RP0      ;Cambio al banco 1
   movlw      0x06
   movwf      ADCON1
   movlw      B'000000'
   movwf      TRISA
   movlw      0x00         ;Configura RB7:RB1 como entradas   
   movwf      TRISB         ;Configura RB0 como salida
   movlw      0x00
   movwf      TRISC
   movlw      0x00
   movwf      TRISD   
   bsf      PIE1, CCP1IE      ;habilito interrupcion CCP1
   bcf      STATUS, RP0      ;Cambio al banco 0
   movlw           B'1011'                 ;Se pone el modulo CCP1
        movwf           CCP1CON                 ;en modo COMPARE
   movlw      B'000001'      ;El TMR1 se incrementa con el reloj interno  (Fosc/4)
   movwf      T1CON         ;Predivisor de 1:1 (Tmax = 1*1 us*65536 = 65536 us = 65.536 ms)
   bsf      INTCON, PEIE      ;Se habilita la interrupcion periferica (modulos CCP)
        bsf             INTCON, GIE             ;Se habilitan las interrupciones   

diezms
   bcf      PIR1, TMR1IF      ;Se limpia la bandera de desbordamiento del TMR1
   movlw      0xD8         ;Se carga el TMR1 con el 55544 decimal, 0xD8F8  
   movwf      TMR1H         ;originalmente era el 55536 decimal 0XD8F0, pero
   movlw      0xF8         ;el contador de tiempo salio mas exacto con el D8F8
   movwf      TMR1L

fin   goto      fin

;.......................

int

        btfss       PIR1, CCP1IF         ;es la interrupcion por el CCP1?
        retfie               ;Sale del servicio de interrupción                      
  
   movlw      0x00         ;Se carga el TMR1 con el 3890 decimal, 0x0F32, originalmente era el 10000 decimal 0X2710  
   movwf      CCPR1H         ;pero como consume mas tiempo por las instrucciones se ajusto el contador con el
   movlw      0x02         ;0F32 por que al final el valor de 1 seg sale ms exacto (1.000212. seg)
   movwf      CCPR1L

        bcf          PIR1, CCP1IF       ;Se limpia la bandera
        nop                            ;Y espera a que el TMR1 sea igual
        btfss        PIR1, CCP1IF        ;A CCPR1
        goto   $-1
      
   incf      CONTA         ;Cuenta 100 interrupciones de 10 ms
   movlw      D'100'         ;Para obtener un valor de 1 seg
   xorwf      CONTA, W      
   btfss      STATUS, Z
   retfie

segundos
   incf      sb
   swapf      sa, W
   addwf      sb, W
   movwf      PORTB
   swapf      ma, W
   addwf      mb, W
   movwf      PORTC
   swapf      ha, W
   addwf      hb, W
   movwf      PORTD
   movlw      D'9'
   xorwf      sb, W
   btfss      STATUS, Z
   retfie
   incf      sa
   clrf      sb
   decf      sb
   movlw      D'6'
   xorwf      sa, W
   btfss      STATUS, Z
        retfie                            ;Sale del servicio de interrupción

minutos
   clrf      sa
   clrf      sb
   incf      mb
   movlw      D'10'
   xorwf      mb, W
   btfss      STATUS, Z
   retfie
   incf      ma
   clrf      mb
   movlw      D'6'
   xorwf      ma, W
   btfss      STATUS, Z
        retfie                            ;Sale del servicio de interrupción

horas
   clrf      ma
   clrf      mb
   movlw      D'2'
   xorwf      ha, W
   btfss      STATUS, Z
   goto      $+5
   movlw      D'3'
   xorwf      hb, W
   btfsc      STATUS, Z
   goto       $   
   incf      hb
   movlw      D'10'
   xorwf      hb, W
   btfss      STATUS, Z   
   retfie
   incf      ha
   clrf      hb   
   retfie
;.......................
   end

jacrmr

  • Visitante
Re: ayuda con cronometro
« Respuesta #1 en: 27 de Noviembre de 2008, 19:23:17 »
¿Tú hiciste este programa? Por la forma en que haces la pregunta de la pausa parece que no, pero lo que tú necesitas hacer para obtener la pausa es detener la base de tiempo. Bien puedes hacerlo desabilitando el timer o ignorándolo mediante alguna bandera.