TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: israelo_rs 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
-
¿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.