Hola, gracias por ayudarme con los calculos de tiempo para el TMR0
Bueno mira el proyecto se trata de un frecuencimetro para medir hasta 40 mhz con el 16F84 y esta funcionado pero me cuenta al reves es decir yo inyecto en el pin RA4 una frecuencia de 4 Mhz , me visualisa 3 Mhz y si yo subo la frecuencia de entrada en el pin RA4 la que me visualisa va bajando por ej 5 Mhz, muestra 2 Mhz y haci sucesivamente y no puedo sacar la falla, si bien en este foro mas abajo pregunte por el frecuencimetro y me ayudaron , ahora me queda eso por terminar para que funciones bien, bueno aca te mando el programa para que lo veas y me puedas ayudar desde ya te comento que se trata de un contador de 6 digitos en el cual necesito mostrar los pulsos contador durante 100 mseg
List P = 16f84
Include <P16f84.inc>
__config _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
indo equ 00h ;registro de indireccion
pc equ 02h ;contador de programa
status equ 03h ;registro de estado
fsr equ 04h ;registro de seleccion
intcon equ 0bh
tmr0 equ 01h
ptoa equ 05h ;puerto a
ptob equ 06h ;puerto b
rota equ 2fh ;variable para desplazamiento de display
trisa equ 85h ;configuracion puerto a
trisb equ 86h ;configuracion puerto b
dig2 equ d'12' ;acumulador cent. mil
dig3 equ d'13' ;acumulador dec. mil
dig4 equ d'14' ;acumulador unid. mil
dig5 equ d'15' ;acumulador centenas
dig6 equ d'16' ;acumulador decenas
dig7 equ d'17' ;acumulador unidades
loops equ 1dh ;variables usadas en retardos
loops2 equ 1eh
ciclo equ 1fh
z equ 02h ;flag de cero
ram equ 05h ;bit de seleccion de pagina de memoria
c equ 00h ;flag de acarreo
w equ 00h ;bit de destino a variable de trabajo
reset org 00
goto inicio
org 05h
retardo ;subrutina de retardo
movwf loops ;la variable de trabajo contiene la cant.
top2 movlw d'110' ;de ms a demorar
movwf loops2
top nop
decfsz loops2 ;controla si termina 1mS
goto top
decfsz loops ;controla si termina el retardo completo
goto top2
retlw 0
x100 ;rutina de incremento x 100000
clrf dig3 ;pone a cero las decena de miles
incf dig2 ;incrementa el contador de centenas de miles
movf dig2, w ;carga en work el conteo de las centenas de miles
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
clrf dig2 ;inicializa lascentenas de miles
return
x10 ;rutina de incremento x 10000
clrf dig4 ;pone a cero las unidades de mil
incf dig3 ;incrementa el contador de decenas de mil
movf dig3, w ;carga en work el conteo de las decenas miles
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call x100 ;incrementa las centenas de mil
return
x1 ;rutina de incremento x 1000
clrf dig5 ;pone a cero las centena
incf dig4 ;incrementa el contador de unidad miles
movf dig4, w ;carga en work el conteo de las unidades miles
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call x10 ;incrementa los decenas miles
return
s100 ;rutina de incremento x 100
clrf dig6 ;pone a cero las decenas
incf dig5 ;incrementa el contador centenas
movf dig5, w ;carga en work el conteo de las centenas
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call x1 ;incrementa los unidades mil
return
s10 ;rutina de incremento x 10
clrf dig7 ;pone a cero las unidades
incf dig6 ;incrementa el contador de decenas
movf dig6, w ;carga en work el conteo de las decenas
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s100 ;incrementa las centenas
return
subir ;rutina de incremento
incf dig7 ;incrementa el contador de unidades
movf dig7, w ;carga en work el conteo de las unidades
xorlw 0ah ;si work era 10, entonces quedara en cero
btfsc status, z ;si es cero, el flag z queda alto
call s10 ;incrementa las decenas
return
tabla ;genera los numeros sobre el display
addwf pc ;agrega al cont. programa el valor de work
retlw b'0000' ;genera el 0
retlw b'0001' ;genera el 1
retlw b'0010' ;genera el 2
retlw b'0011' ;genera el 3
retlw b'0100' ;genera el 4
retlw b'0101' ;genera el 5
retlw b'0110' ;genera el 6
retlw b'0111' ;genera el 7
retlw b'1000' ;genera el 8
retlw b'1001' ;genera el 9
inicio ;programa principal
bsf status, ram ;selecciona el banco de memoria alto
movlw b'10100111'
movwf tmr0
movlw b'00010000' ;configura el puerto a
movwf trisa ;bit 4 entrada, demas bits salidas.
movlw b'11000000' ;configura el puerto b
movwf trisb ;como salidas
bcf status, ram ;selecciona el banco de memoria bajo
empe
clrf dig2
clrf dig3
clrf dig4
clrf dig5
clrf dig6
clrf dig7
movlw 00 ;envia ceros a los transistores para apagar
movwf ptob ;todos los displays
movlw 02h
movwf ciclo
con movlw d'61'
movwf tmr0
inc call subir ;llama la rutina de incremento
btfss intcon, 2
goto inc
bcf intcon, 2
decfsz ciclo
goto con
movlw 0x01 ;iniciar un 1 en el registro de rotacion
movwf rota ;inicializa el display
movlw d'12' ;con el registro selector (fsr) se apunta
movwf fsr ;al primer dato que se va a mostrar
disp movf indo, w ;lee el dato del registro apuntado por fsr
call tabla
movwf ptoa ;envia el digito al puerto b
btfsc rota, 0
bsf ptob, 0
btfsc rota, 1
bsf ptob, 1
btfsc rota, 2
bsf ptob, 2
btfsc rota, 3
bsf ptob, 3
btfsc rota, 4
bsf ptob, 4
btfsc rota, 5
bsf ptob, 5
movlw d'03'
call retardo
clrf ptob
btfsc rota, 5
goto empe ;si termino, vuelve desde el comienzo
bcf status, c ;carry en cero para no afectar las rotaciones
rlf rota ;desplaza el 1 que enciende los displays
incf fsr, 1 ;incrementa el puntero. Apunta el proximo
goto disp ;digito a mostrar ;digito a mostrar
end
bueno saludos 73