Autor Tema: INTERRUPCIONES REALES EN PLUS  (Leído 9867 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #30 en: 12 de Octubre de 2004, 18:45:00 »
No pana, esta EXCELENTE tu proceso, yo cometia el grave error, de volver a setear(perdida de 2 ciclos) el TMR0, con tu  proceso es casi excacto.
Solo repaso pana:
Para el cristal de 4mhz:
1mhz(1/2 de preescaler)=500khz el periodo para esta frecuencia es  t=1/f=1/500000=0.000002 seg  ahora el periodo por el numero maximo de pulsos que soporta el tmr usado(tmr0,1,2) T*TMR(o,1,2)=(0.000002)(256)= TEMPORIZACION para este escaler y este reloj externo y esto es =0.000512 seg=0.512mseg
Entonces necesitamos cada 250 mseg(para que sea parejo el muestreo cada segundo) esto nos lleva a Cuantas interrupciones de (0.512mSeg) se necesitan para obtener250mseg
Resolviendo como bien dice el pana Khasistos(Genio!!!)
artificio=250mseg/0.512mseg, se van los segundos, se van los milies, teniendo un artificio de 488.28125, tomamos el entero y el 0.28125 es nuestro error.

Ahora si entendi pana aqui vuelvo a poner el codigo que si esta parando a 250 ms y con la correcion que pude hacer gracias a tu ayuda Pana:
DEVICE=16F628
     ON_INTERRUPT INTERRUPCION  
     CONFIG INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,CP_OFF,BODEN_OFF,LVP_OFF,MCLRE_OFF
     DECLARE LCD_DTPIN PORTA.0
     DECLARE LCD_ENPIN PORTB.3
     DECLARE LCD_RSPIN PORTA.4
     ALL_DIGITAL=TRUE  
     PORTB_PULLUPS=ON                              
      Dim TMR1 As TMR1L.WORD                                    
      Dim TMR0_POSTCOUNT1 As WORD                                
      Dim CONTEO   As word                                
      Dim BANDERA      As Bit                                  
      Dim RESULTADO  As word                                              
      GoTo INICIO                                    
 
INTERRUPCION:              
    DEC TMR0_POSTCOUNT1
    If TMR0_POSTCOUNT1 = 0 Then  
             clear T1CON.0    
             TMR0_POSTCOUNT1 =488                          
             CONTEO = TMR1                              
             Clear TMR1                                      
             set BANDERA  
          set T1CON.0  
                               
    End If
    clear INTCON.2                                              
    CONTEXT RESTORE                                            

INICIO:
    TMR0_POSTCOUNT1 = 489                
    clear OPTION_REG.0                      
    clear OPTION_REG.1
    clear OPTION_REG.2
    clear OPTION_REG.5                                                  
    clear OPTION_REG.3                                                  
    clear INTCON.2                                                  
    T1CON = %00000110
    set T1CON.0                                                                  
    set INTCON.5                                                
    clear BANDERA                                          
    set INTCON.7                                        
    TMR0 =0    
Loop:
    If BANDERA = 1 Then
        RESULTADO = CONTEO * 4              
        PRINT AT 1,1,"FREC = ",DEC6 RESULTADO ,"Hz"          
        clear BANDERA                                      
    End If
    GOTO LOOP
    Stop

Peo aun no hay exactitud, :S ,, hay que seguir analizando las interupciones.
Gracias pana, ahora si 100% CLARO!!!!, a 500ms trabaja mejor seria 977 de artificio en int, 976 de artificio inicial  con 1:2 de preescaler, :P
Un abrazo

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #31 en: 13 de Octubre de 2004, 16:30:00 »
HOLA:

ESTO SI ES EXACTO ,la inexactitud es la suma de dividir por cuatro el muestreo,eso le pasa tambien a la orden  counter original.. peroooooooo si el muestreo se hace de un segundo los errores no se suman ,eso si hay que calcular muy bien los valores del segundo ,haciendo esto la cuenta da coincidente con frecuencimetro ,puede errarle 1 unidad final en una cifra de 5 digitos es decir en vez de 45627 tal vez les muestre 45628 .Espero les sirva ,solo lo toque un poco NO ES DE MI AUTORIA ,Una version original de Crownhill llena de engorrosidades fue la madre,el Pana Lager con su sabiduria la paso en limpio,y yo la pinte....Les aclaro que probe todas las versiones incluyendo   la original tal como estaba (si querian hacer un reloj con "eso" seria para viajar en el tiempo)
DEVICE=16F877
XTAL 20
ON_INTERRUPT INTERRUPCION
LCD_DTPIN = PORTD.4   
   LCD_RSPIN = PORTE.0
   LCD_ENPIN = PORTE.1
   LCD_INTERFACE = 4   " 4-bit Interface
   LCD_LINES = 2
   LCD_TYPE = 0
ALL_DIGITAL=TRUE
TRISA.4=1
PORTB_PULLUPS=ON
Dim TMR1 As TMR1L.WORD
Dim TMR0_POSTCOUNT1 As WORD
Dim CONTEO As WORD
Dim BANDERA As Bit
Dim RESULTADO As Dword

 
GoTo INICIO

INTERRUPCION:
TMR0 = 9
DEC TMR0_POSTCOUNT1  
If TMR0_POSTCOUNT1 = 0 Then
T1CON.0 = 0                          "PARO TMR1
TMR0_POSTCOUNT1 = 9764
CONTEO =  TMR1
Clear tmr1                             "limpioTMR1
BANDERA = 1
T1CON.0 = 1                         "ENCIENDO TMR1
                     
End If
INTCON.2 = 0                         "APAGO LA INT DEL TMR0
CONTEXT RESTORE

INICIO:
TMR0_POSTCOUNT1 = 9764
OPTION_REG.0 = 0                     "PRESCALER 1:2 DEL TMR0
OPTION_REG.1 = 0
OPTION_REG.2 = 0
OPTION_REG.5 = 0                     "ENTRADA DEL PULSO INT
OPTION_REG.3 = 0                     "PREC ASIGNADO AL TMR0
INTCON.2 = 0                         "APAGO INT.DEL TMR0
T1CON = %00000110                    "PARO TMR1,EXTERNALCLOCK ,rc0,SINCRONIA
T1CON.0 = 1                          "ENCIENDO TMR1              
TMR0 = 9                          "CARGO 9 EN EL TMRO
INTCON.5 = 1                         "ENCIENDO LA INT DE TMRO
BANDERA = 0
INTCON.7 = 1                         "ENCIENDO LAS INT GRALES
CLS
Loop:
If BANDERA = 1 Then
 
PRINT AT 1,1,"FREC = ",dec6 conteo,"Hz","                 "
BANDERA = 0
End If
GOTO LOOP
Stop

PD:si quieren hilar mas finito todavia juegen con el valor de precarga del TMR0....

cuando se usa muestreo de 0.25 seg cualquier diferencia en mas o en menos es multiplicada por 4 .

saludos
khasistos

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #32 en: 13 de Octubre de 2004, 16:59:00 »
Pana me sigue dando el error, para 2khz me lee 1988, esta muy separado del otro, pero estaba viendo que te falto quitarle los 2 ciclos de escritura dentro de la int(usnado el metodo antiguo), si usas 7 te da una dif, de 3 hz aprox, quedando una lectura de 2003 un poco mas exacto .
Aqui esta pana, te fallo un poco tu calculo pana, el calculo por segundo es  9765.625
el .625 de error lo distribuimos en los dos artificios como te dije ayer :P, usando uno igual y uno mayor del original
queda asi:
DEVICE=16F628
     xtal 20
     ON_INTERRUPT INTERRUPCION  
      DECLARE LCD_DTPIN PORTA.0
     DECLARE LCD_ENPIN PORTB.3
     DECLARE LCD_RSPIN PORTA.4
     ALL_DIGITAL=TRUE  
     PORTB_PULLUPS=ON                              
      Dim TMR1 As TMR1L.WORD                                    
      Dim TMR0_POSTCOUNT1 As WORD                                
      Dim CONTEO   As word                                
      Dim BANDERA      As Bit                                  
      Dim RESULTADO  As word                                              
      GoTo INICIO                                    
 
INTERRUPCION:  
    DEC TMR0_POSTCOUNT1
    If TMR0_POSTCOUNT1 = 0 Then  
            
             clear T1CON.0    
             TMR0_POSTCOUNT1 =9765                          
             CONTEO = TMR1                              
             Clear TMR1                                      
             set BANDERA  
             set T1CON.0                      
    End If

    clear INTCON.2                                              
    CONTEXT RESTORE                                            

INICIO:
    TMR0_POSTCOUNT1 = 9765              
    clear OPTION_REG.0                      
    clear OPTION_REG.1
    clear OPTION_REG.2
    clear OPTION_REG.5                                                  
    clear OPTION_REG.3                                                  
    clear INTCON.2                                                  
    T1CON = %00000110
    set T1CON.0                                                                  
    set INTCON.5                                              
    set BANDERA                                          
    set INTCON.7                                        
   TMR0 =0  
Loop:
    If BANDERA = 1 Then          
        PRINT AT 1,1,"FREC = ",DEC6 conteo ,"Hz"          
        clear BANDERA                                      
    End If
    GOTO LOOP
    Stop

En conclusion el proceso es el mismo, pero se busca que se adapte mejor el artificio, sobre todo que sea un valor dividido por .5 es decir todos los artificios  1.5,2.5,3.5, todas las mitades de artificio, para disminuir el error pana.Igual si seguimos buscando encontramos el .555 exacto que nos de un valor exacto.(9765+9766)/2=9765.5
9765.625-9765.5=0.125 de error, jeje, se puede mejorar, aumentemos el tiempo de muestreo(lo malo es que ya casi no va a ser a tiempo real, ahora sera con un delay de 1 seg para arriba, pro y contras )
Un abrazo pana

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #33 en: 13 de Octubre de 2004, 17:38:00 »
Hola pana:

Veo que siges usando RESULTADO=CONTEO*2 por que??,si tienes los valores para no seguir usandolo??
Aparte lo tengo funcionando delante mio y chekeado con erorr de 1 o 2 a lo sumo ,lo estas simulando o es real ,XTAL debe estar en 20 con los cap.Algo esta mal en tu lado REPITO esta chekado Por favor verifica pues pongo mis manos en el fuego por el....

Otra hasta que "bandera" se ponga en 1 nuestro hermoso pic seguira ejecutando su programa normalmente asi que te preocupas de cuanto es la interrupcion pana...explicame eso por favor Tengo entendido que hasta que no se cumpla esa condicion por ejemplo la lectura de los ad no se vera afectada si esta dentro del loop o me equivoco.

2) en este momento tengo una exactitud casi total es decir no tengo diferencias con la orden counter y mira estoy sin error en 3500 lo que significa que puedo medir 210.000 rpm que mas puedo pedir ,la turbina de mi auto no llega a esa cifra

en 35khz solo salta 2 decimales del final pero ahora avanza de a 1 y no como antes que el avance o retroceso era de 4 ...

Fijate en esa orden que tienes mal "conteo*2" sacala y me contestas si es real o proteus...

Abrazos Pana

K




Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #34 en: 13 de Octubre de 2004, 17:43:00 »
Lo que comentas pana, tiene apostrofe, si la ves nop?, prueba con mis valores y no debes notar cambio, pero simulando es CASI perfecto , otra cosa pana me dio 9765.xxx a 1 segundo  ese .xxx se distribuye entre los dos artificios como esta en el ejemplo que puse, pruebalo con los valores que te di . Los numeros no engañan, a lo jmejor el lcd no denota es cambio, pero lo hay, por ese error un poco mayor , vaya es como querer ver parpadear un led a 100ms o menos
Un abrazo

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #35 en: 13 de Octubre de 2004, 18:00:00 »
HOLA pana :

Perdon no vi el """ ,efectivamente con el artificio es mas exacto todavia y se nota en altos valores-
estoy pensando que para esa diferencia que le encuentras  se puede tocar el preload ,cada unidad equivale a 0.000004 seg *9765 correremos 0.039 seg, aver de acuerdo a tus calculos como estamos con respecto al segundo???pues una unidad para arriba/abajo del preload modifica  0.039seg.
abrazo
K


Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #36 en: 13 de Octubre de 2004, 18:11:00 »
No pana, es que tambien me pase, deja y quito eso que casi no se nota, mira revizando nuevamente el codigo, siguemal, es decir, tu lo tienes bien solo te habias equivocado en el valor del artificio, yo solo lo corregi, si te das cuenta el valor del artificio siempre va a ser el de la int solo en primera instancia es el del inicio, ahora necesitamos poner ese error de .6xxx por ahi lo puese creo que es 9765.625 ahora ese error es del artificio!!! osease cada segundo le falta eso .625 pero de espera, como te das cuenta es medio numero CASI, es decir medio conteo por segundo o .1useg nos estamos pasando por cada muestreo.

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #37 en: 13 de Octubre de 2004, 18:19:00 »
Hola

pongamos un nop que es una instruccion inoperante pero toma 1 ciclo  ....que te parece dije algo mal...

Cuando empezo todo esto no le pegabamos ni a las paredes ,ahora despues de dos dias estamos hablando de 1 us yo que vos voy solicitando permiso para el viernes ,para un chekeo con el reloj atomico
Abrazos
K

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #38 en: 14 de Octubre de 2004, 13:57:00 »
Hola pana:

a ver
prescaler 64
precarga tmr0 131
postcount 625

5m/64=78125kz periodo 0.0000128seg
TMR0 125 (256-125) 131 para la precarga
0.0000128*125= 0.0016 seg cada desborde delTMR0
x 625 del postcout = 1seg EXACTO ....

sin embargo en 50KHZ hay 27c/s de diferencia en mas y usando 624 en post es decir 54us de mas eso es 10 menos que ayer....

MUY LINDO NO???

Pues hay error... DONDE ESTA??

Salu2
K


Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #39 en: 14 de Octubre de 2004, 14:14:00 »
jaja pana, eso lo habia pensado, el problema es que con este metodo, no se hace o no se debe hacer asi, si te habras dado cuanta te dio un error como si de 3 digitos enteros, como de 40 hz, 1° regla no se puede modificar TMR para ajustar los decimales, solo preescaler y tiempo, y como ves solo hasta 8 segundos obtendrias un valor sin decimales, y claro reduciendo tiempo de muestreo, pero su detalle, el error(que viene siendo casi el mismo a 1 segundo, se multiplica por la escala, si fuera a 250 ms, es por 4 y tu error seria 4 veces , por eso a 250 salia un error de 4hz(sigue siendo el error de siempre a 1 hz pero multiplicado por 4 , hay que seguir analizando pana, Te digo que la soluion tampoco es aumentar el tiempo de muestreo ya que cambiaria cada 8 segundos :P para obtener un valor de artificio entero para un preescaler.
Un abrazo pana

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #40 en: 14 de Octubre de 2004, 14:41:00 »
Hola Pana

No he hecho lo que tu dices ,mira el post por  favor ,la logica que he usado es probable que no se use pero las matematicas son 1 sola y lo que he hecho es hacer un muestreo de 1 segundo igual que siempre ,solo que use un prescaler diferente y diferentes valores de precarga y postcount para que  nos diesen numeros enteros.Eso es simplemente una combinacion diferente para no usar decimales y la cuenta da exacta ,ahora debe haber algun tiempo de ejecucion o no se que que altera esa exactitud .

MIRA:
Frecuencia de entada en TMR=5 mhz (4/fosc)
despues del prescaler de 64=78125Khz Cada ciclo es de 0.0000128seg
cada ciclo de entrada en su flanco positivo carga 1 bit delTMR0.
125 bits del TMR0 (pues 131 tiene pre cargados) son entonces 0.0016 seg.y se desborda...
si este proceso lo repito 625 veces es 1 SEGUNDO sin usar ningun numero con decimales...
Ahora que pasa, que tiempos entran en juego dentro del pic para que esto no sea CASI perfecto......pues el problema esta dentro y no en los numeros asi todo es bastante exacto pero no lo que buscamos..
Abrazo
K

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #41 en: 14 de Octubre de 2004, 15:01:00 »
Ya te explique pana,lo que estas haciendo ahi pana es lo que se hace en el metodo antiguo, pero en el nuevo, lo que estas haciendo es definir que el tmr es de 130 y no de 256, lo cual es valido si y solo si, el tmr empieza siempre desde AHI!!!!! ok? entonces tienes que poner en el inicio(una preecarga de 131) y CUANDO suceda una interrupcion RAPIDAMENTE(lo cual no lo es y te va a volver a generar error) cargar el tmr este donde este con 131(si el tmr ya avanzo 3 o 4 pulsos se le suman esos 131).(TODO esto ya lo hicimos en el antiguo metodo pana)
al inicio TMR0=131
dentro de la int:
TMR0=TMR0+131 <--- pero ojo no estas agregando los 2 ciclos que te quita la reescritura del tmr,
Pruebalo asi y te debe de dar cercano o exacto como dices.
va con el mismo preescaler pana!!!
1:2,20Mhz,1 segundo de muestreo:
5000000/2=2500000 <-- el inverso=.0000004 (valor cerrado para que nunca de decmal) se me antoja 250(empezaria en 6),= .0001 que divide a 1 segundo= tnemos un artificio cerrado de la manera mas facil  de 10000 .
empieza en 5 pero cuando escribo la in tengo que agregarle 2 por que se pierden 2 ciclos x inst entonces dentro de la int tenemos TMR0=TMR0+7
y ahi tiene que ser excato. si aumentamos el preescaler disminuye el artificio(lo cual seria mejor) mientras mas cerca de 0 este el tmr menos error tendra.

Un abrazo pana

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #42 en: 14 de Octubre de 2004, 16:38:00 »
HOLA PANA:

Una vez mas con tus salidas de lo que no figura en los libros,,GRACIAS ,te comento que el anterior no el ultimo funciona realmente CASI PERFECTO el que nos daba 0.999 ese es maravilloso....Lo comprobe contra la orden counter xxxx y anda mas preciso el de la interrupcion sobretodo notoria diferencia en max frecuencia ahi le erra por 2 ciclos en 50khz mientras que el count le erra por 5  ciclos.Perdon pero pase por alto tu ultimo post ahora lo voy a probar pero creo que ya no hay mucho mas para sacarle.
Asi que ahora se que cuanto menos se introduzca de pre carga mas preciso sera ,y comprobado esta....


Bueno ahora comenzare a incorporar el programa original que usaba la instruccion counter dentro de este que la reemplaza ,en teoria ,sin distraer "ese" segundo de la ejecucion del counter......

Abrazo
K

Desconectado lager

  • PIC18
  • ****
  • Mensajes: 258
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #43 en: 14 de Octubre de 2004, 17:16:00 »
Pana, el proceso antiguo, viene en muchos manuales de calculo de temporizaciones, no es nada inventado ni sacado abajo de la manga, si te fijas, el mejor proceso es JAMAS escribir en tmr, osease el que tu solo descrubriste pana, te da una muy buena precision(mas que suficiente). pero en tu proceso no te das cuenta de que es lo mismo que el proceso antiguo, ya que si multiplicas por los 256(total de pulsos que cuenta el tmr0) entonces tu tmr se inicializa 255-255=0 en CERO, (acuerdate que el 256 en realidad es el 255), por eso si usas una variable cerrada(le digo ceerrada por que por 250 ccasi cualquier numero no t daria el decimal que t da la terminacion 6) entonces si usas ese 250, el artificio queda cerrado, pero acuerdate que el 250 en realidad es 249, entonces 255-249=6 <-- ojo de inicio esta bien, peo cuando hay que volver a reescribir en el tmr(como en ese momento sigue corriendo todo le faltan solo a ese 2 ciclos que se le suman este donde este el tmr por eso el 7, como puedes ver son simple y sencillamente matematicas, pero prefiero tu metodo que a pasar del error, uno puede calcular valores exactos y buscar esos 0.5 en el artificio para obtener esa excatitud(la mayoria de las veces), si no seria una perdidad de dos hz en escala,.
REviza este si tienes tiempo pana:
     DEVICE=16F628
     xtal 20
     ON_INTERRUPT INTERRUPCION  
     "CONFIG INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,CP_OFF,BODEN_OFF,LVP_OFF,MCLRE_OFF
     DECLARE LCD_DTPIN PORTA.0
     DECLARE LCD_ENPIN PORTB.3
     DECLARE LCD_RSPIN PORTA.4
     ALL_DIGITAL=TRUE  
     PORTB_PULLUPS=ON                              
      Dim TMR1 As TMR1L.WORD                                    
      Dim ESCALA As WORD                                
      Dim CONTEO   As word                                
      Dim BANDERA      As Bit                                  
      Dim RESULTADO  As word  
    " dim X as BIT                                        
      GoTo INICIO                                    
 
INTERRUPCION:
tmr0=tmr0 +8
    DEC ESCALA
   If ESCALA = 0 Then
             clear T1CON.0
          ESCALA =10020 "9765 + X                      
             CONTEO = TMR1
         " X=X XOR 1
          CLEAR TMR1
          set BANDERA                              
          set T1CON.0            
    End If
    clear INTCON.2                                              
    CONTEXT RESTORE                                            

INICIO:
    ESCALA = 10020"9765  
   "SET X          
    clear OPTION_REG.0                      
    clear OPTION_REG.1
    clear OPTION_REG.2
    clear OPTION_REG.5                                                  
    clear OPTION_REG.3                                                  
    clear INTCON.2                                                  
    T1CON = %00000110
    set T1CON.0                                                                  
    set INTCON.5                                              
    set BANDERA                                          
    set INTCON.7  
   clear TMR1                                      
   TMR0=8
Loop:
    If BANDERA = 1 Then          
        PRINT AT 1,1,"FREC = ",DEC6 conteo  ,"Hz"        
        clear BANDERA                                      
    End If
    GOTO LOOP
    Stop
Tiene la misma exactitud no?
Un abrazo

Desconectado khasistos

  • PIC18
  • ****
  • Mensajes: 493
RE: INTERRUPCIONES REALES EN PLUS
« Respuesta #44 en: 14 de Octubre de 2004, 17:51:00 »
HOLA PANA:

siento contestarte que NO:

Prueba esto es lo mejor creo que no resiste mejoras
DEVICE=16F877
XTAL 20
ON_INTERRUPT INTERRUPCION
LCD_DTPIN = PORTD.4   
   LCD_RSPIN = PORTE.0
   LCD_ENPIN = PORTE.1
   LCD_INTERFACE = 4   " 4-bit Interface
   LCD_LINES = 2
   LCD_TYPE = 0
ALL_DIGITAL=TRUE
TRISA.4=1
PORTB_PULLUPS=ON
Dim TMR1 As TMR1L.WORD
Dim TMR0_POSTCOUNT1 As WORD
Dim CONTEO As WORD
Dim BANDERA As Bit
Dim RESULTADO As Dword

 
GoTo INICIO

INTERRUPCION:
TMR0 =  9
DEC TMR0_POSTCOUNT1  
If TMR0_POSTCOUNT1 = 0 Then
T1CON.0 = 0                          "PARO TMR1
TMR0_POSTCOUNT1 = 9767
CONTEO =  TMR1
Clear tmr1  
BANDERA = 1
T1CON.0 = 1                         "ENCIENDO TMR1
                      "limpio el trm1 interrupt flag
End If
INTCON.2 = 0                         "APAGO LA INT DEL TMR0
CONTEXT RESTORE

INICIO:
TMR0_POSTCOUNT1 = 9765
OPTION_REG.0 = 0                     "PRESCALER 1:2 DEL TMR0
OPTION_REG.1 = 0
OPTION_REG.2 = 0
OPTION_REG.5 = 0                     "ENTRADA DEL PULSO INT
OPTION_REG.3 = 0                     "PREC ASIGNADO AL TMR0
INTCON.2 = 0                         "APAGO INT.DEL TMR0
T1CON = %00000110                    "PARO TMR1,EXTERNALCLOCK ,rc0,SINCRONIA
T1CON.0 = 1                          "ENCIENDO TMR1              
TMR0 = 0                              "CARGO 0 EN EL TMRO
INTCON.5 = 1                         "ENCIENDO LA INT DE TMRO
BANDERA = 0
INTCON.7 = 1                         "ENCIENDO LAS INT GRALES
CLS
Loop:
If BANDERA = 1 Then
 
PRINT AT 1,1,"FREC = ",dec6 conteo,"Hz","                 "
BANDERA = 0
End If
GOTO LOOP
Stop

Por favor puebalo si tienes tiempo ..OJO no hay error 9767  9765 el artificio

te mando un abrazo
K