TODOPIC

Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: khasistos en 07 de Octubre de 2004, 07:51:00

Título: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 07 de Octubre de 2004, 07:51:00
HOLA AMIGOS.

HE DECIDIDO CAMBIAR LA INSTRUCCION COUNT PIN POR UNA RUTINA DE INTERRUPCION REAL es decir no la on _interrupt del plus .dado que mi cuenta rpm detiene la operacion del programa que tiene 2 ad funcinando durante 1 seg para darle tiempo al count pin de realizar un conteo preciso.
Entonces se me ocurrio , a ver si la teoria es correcta,lo siguente

Usar el TRM1 de 16 con un xtal de 32 768 para obtener una interrupcion cada segundo
debo usar xtal ? o alguna combinacion de prescaler /post me puede dar 1 seg exacto usando intosc..
 si es externo lo debo usar sincronico con el del pic o no

Usar esa interrupcion para leer el contenido del TRM0 ,es decir como base de tiempo(el TRM1)

Estare limitado a 15300 rpm dado que el TRM0 es de 8 bits y solo contara hasta 255 que por 60 seg dara esta cifra

Es correcta mi teoria o puedo utilizar alguna otra combinacion de TRMs para no detener la ejecucion del programa mientras se produce el conteo y la base de tiempo.
Necesito algun empujon para empezar con las benditas interrupciones

Gracias
khasistos
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 09 de Octubre de 2004, 13:13:00
Hola pana Khasisots, por favor reviza el mail que te envie, hay mas info en este post http://miarroba.com/foros/ver.php?foroid=8826&temaid=2664719
Cualquier cosa me avisas pana, si tu programa no es muy pero muy complejo pudes usar esta interrupcion, pero si de antemano es un programa lleno de funciones muy especificas como dice el pana RGL a ensamblar.
Salu2 pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 09 de Octubre de 2004, 14:03:00
Hola.
gracias pana por el aporte de sabiduria que estas haciendo ,agarrense porque voy a ampezar con los on_interrupt en Plus y va a haber mas de una duda .vamos con la primera como les dije la teoria es hacer al TRM1 base de tiempo con Xtal de 32768,entonces voy a cargar el valor 16 384 para que me de una interrupcion cada segundo con prescaler en 1,entonces :
El clock lo debo poner en sincronismo con el del micro?
Debo habilitar solo la interrupcion del TRM1 o las globales tambien?

saludos
K
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 09 de Octubre de 2004, 14:32:00
Pana khasistos, las de cajon son las del registro INTCON.7 (global int) y las de desborde y de activacion estan en el registro PIE para el TMR1. aqui un poco de info para mejor entendimiento del TMR0antes de entrar de llenao a interrupcions)

PSA          Bit de asignamiento del predivisor de frecuencia:
   0 = Predivisor asignado a TMR0   
   1 = Predivisor asigando a Watchdog (WDT)
TOSE        Bit de selección de flanco activo cuando TMR0
   es configurado como Contador
   0 = Contaje se incrementa cada flanco ascendente    
   1 = Contaje se incrementa cada flanco descendente   
TOCS        Bit de seleción de la fuente del clock:
   0 = Configura TMR0 como Temporizador
   1 = Configura TMR0 como Contador
INTEDG     Bit de seleción de flanco activo de interrupción externa:
   0 = flanco descendente   
   1 = flanco ascendente
RPBU#     Resistencias pull - up de la puerta B:
   0 = Activadas   
   1 = Desactivadas

El registro TMR0 esta implementado físicamente en el pin RA4 del PORTA, este registro de 8 bits se configura como temporizador para determinar intervalos concretos de tiempo o como contador de impulsos externos .

La combinación binaria de los bits PS0, PS1 y PS2, del registro OPTION me definen el rango del divisor de frecuencias.
¿Como calcular el tiempo?
T = CI x TMR0 x DF
    CI   = Ciclo de instrucción
    TMR0 = Valor cargado en este registro.
    DF   = Rango escogido en el divisor de frecuencia(preescaler)
Por ejemplo si por software cargo un valor de 125 en el registro TMR0, entonces el valor que interviene en la fórmula es 130, valor que falta para que se desborde (llegue a 255) el registro TMR0.
Resumiendo:
Si ponemos al máximo los valores de la fórmula, rango de divisor de 256, TMR0 con 255 y un oscilador de 4 Mhz(no el externo), obtenemos un valor máximo de temporización de 65.28 milisegundos



Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 09 de Octubre de 2004, 15:16:00
Hola Pana:

Voy entendiendo...solo que voy a utilizar el TMR1 pues permite tiempos mas largos dado que es de 16 bits,entonces al trabajar con 32768 de osc y cargando el TRM1 con 32768 no entiendo porque no voy atener 1 seg de acuerdo a tu formula Si comienzo el conteo con 32768 le llevara 2 segundos al trm1(preescaler =1) saturarse (65535) pero si lo inicializo en 32768 saltara la interrupcion en 1 segundo.dime si me equivoco......
AHHH y por favor no me toques el puerto A esta en un hilo no olvides que ahi estan los AD trabajando y se estan cambiando los adcon1 dejalo tranquilo por favor ya veremos cuando tenga que leer el trm0 que oficia de contador de pulsos.....

Gracias por toda tu explicacion espero no te canses....

Abrazos
K
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 09 de Octubre de 2004, 15:39:00
jajajajaja ok khasistos,
Mira la otra formula era con un reloj normalizado (osease a 1us de ciclo) tu estas usando otro, asi que no te preocupes por eso.
Para usar el Tmr1 es exactamente el mismo proceso, solo que el que temporiza esta ves es el Tmr1(eso ya lo dije  ) en el registro T1CON es el registro de control del Tmr1 con el bit 0 lo activas o desactivas, con el 2° eliges reloj externo e interno(en tu caso interno ya que lo vas a usar para esperar 1 seg), el bit 4 y 5 son el preescaler  el bit 3 es para apagar o encender el reloj del timer1(tu no lo necesitas ya que es intenbro) y el bit 2 para seleccionar si quiere sincronizar tu reloj externo(solo cuando cuando usas reloj externo osease no lo necesitas).
el desbordamiento por interrupcion em Tmr1 esta como te comente en el registro PIR1 bit 0 . acuerdate de activar el bit 7 del INTCON para habilitar TODAS las interrupcions(GIE). si usas reloj externo va a funcionar basicamente como contador y si usas el interno como temporizador(igual que con cualquier Tmr)
Salu2 pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 09 de Octubre de 2004, 16:31:00
Pana Khasistos aqui t dejo un ejemplo con TMR1 de lata precision, jajajajaajjaa, me voy a volver relojero . Espero y quede mas que claro, solo una cosa, este trabaja con compensacion de tiempo a traves de una  formula de correccion de tiempo que tiene integrado, la excatitud es increible, y aun se puede mejorar.
Espero y te sea de ayuda
Un abrazo pana.

------------------------------------------------------------------------------------
DEVICE 16F628
        CONFIG INTRC_OSC_NOCLKOUT,WDT_OFF,PWRTE_ON,CP_OFF,BODEN_OFF,LVP_OFF,MCLRE_OFF
        ALL_DIGITAL ON
      DECLARE LCD_DTPIN PORTA.0
       DECLARE LCD_ENPIN PORTB.3
       DECLARE LCD_RSPIN PORTA.4
       DECLARE SDA_PIN PORTB.5
        DECLARE SCL_PIN PORTB.1      
       DIM _100THS                                
       DIM SECS
       DIM MINS
       DIM HOURS
       DIM DAYS
       DIM TEMP_100THS
       DIM TEMP_SECS
       DIM TEMP_MINS
       DIM TEMP_HOURS
       DIM TEMP_DAYS
        SYMBOL GIE = INTCON.7                          
        DIM TIEMPO AS TMR1L.WORD                
       SYMBOL MARGEN = 7                     " VARIABLE PARA MEJORAR EXACTITUD
       SYMBOL TMR1_VAL =((65536)-(XTAL*2500))+MARGEN " CALCULA LOS VALORES COMPENSANDO EL OSCILADOR PARA UNA INTERRUPCIÓN A 100HZ
   
       ON_INTERRUPT INTERRUMPIR              " Interrupciones RAPIDAS!!!
      GOTO INICIO                                      " JUMP THE INTERRUPT CODE

INTERRUMPIR:

       CLEAR T1CON.0                               " DETIENE TMR1
       TIEMPO = TIEMPO + TMR1_VAL            " COMPENSA EL TMR1
       SET T1CON.0                                 " LO ARRANCA DE NUEVO
   
       INC _100THS                                " INCREMENTA LA VARIABLE CENTESIMAS
       IF _100THS = 100 THEN                 " CHEKA SI YA LLEGO A 100
          CLEAR _100THS
          INC SECS                                              " INCREMENTA SEGUNDOS
          IF SECS = 60 THEN
              CLEAR SECS
              INC MINS                                            " INCREMENTA MINUTOS
              IF MINS = 60 THEN
                  CLEAR MINS
                  INC HOURS
                  IF HOURS = 24 THEN                      " INCREMENTA HORAS
                      CLEAR DAYS
                      INC DAYS                                    "INCREMNTA DIAS!!!!
                  ENDIF
              ENDIF
          ENDIF
      ENDIF
      CLEAR PIR1.0                   " LIMPIAMOS INT
      CONTEXT RESTORE                         " A RESTAURAR!!! Y SALIR DE LA INT VELOZMENTE
   
INICIO:
    CLEAR                                                      " LIMPIAMOS VARIABLES
   T1CON = %00000000                           " PREESCALER A 1:1
   PIR1.0 = 0                                  " LIMPIAMOS BANDERA DE INT
   INTCON = %11000000                          " INTERUPCIONES GLOBALES Y PERIFERICAS
   PIE1.0 = 1                                  
   T1CON.0 = 1                                 " ENCENDEMOS TMR1
   
    CLS                                        
    WHILE 1 = 1                                 " BUCLE SIN FIN!!!
    GIE = 0                                " DESHABILITAMOS INT
    WHILE GIE = 1 : GIE = 0 : WEND                " RUTINA DE SEGURIDAD!!
    TEMP_100THS = _100THS                       " SALVAMOS VARIABLES
    TEMP_SECS = SECS
    TEMP_MINS = MINS
    TEMP_HOURS = HOURS
    TEMP_DAYS = DAYS
    GIE = 1                                    " HABILITAMOS INT      
    PRINT AT 1,1,DEC2 TEMP_DAYS,":",DEC2 TEMP_HOURS,":",DEC2 TEMP_MINS,":",DEC2 TEMP_SECS,":",DEC2 TEMP_100THS  
    DELAYMS 100                                
  WEND                                          
  STOP
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 10 de Octubre de 2004, 10:39:00
Hola:

De acuerdo a las enseñanzas del MAESTRO Lager aqui les posteo este pequeño programa que verifica el uso de la interrupcion del trm1 incrementando una variable y presentandola en el display ,funciona con Xtal de 32768 en oso/osi (RC0,RC1)
Y 877 A 20 MHZ.
funciona bien solo que por algun motivo aun desconocido por mi la variable no se incrementa mas de 255 no se que registro esta SALTANDO en overflow aun ....
Saludos
K
"****************************************************************
"*  Name    : int.BAS  
"*  Date    : 10/10/04

 
          DEVICE = 16F877
        XTAL = 20
      ALL_DIGITAL=TRUE
   
   
     LCD_DTPIN = PORTD.4   
     LCD_RSPIN = PORTE.0
    LCD_ENPIN = PORTE.1
   LCD_INTERFACE = 4   " 4-bit Interface
   LCD_LINES = 2
   LCD_TYPE = 0
   
    Dim TIMER1 as TMR1L.Word            " TRM1 es word (16 bits)
     Dim TICK as byte system
     ON_INTERRUPT Goto Int
    DIM PP1H AS BYTE SYSTEM
     DIM PP1H_TEMP AS BYTE SYSTEM
    Delayms 400                         " espero que el micro se estabilize
     CLS

Goto main                " salto al inicio del prog
             
Int:
PP1H_TEMP =PP1H  
PP1H=PP1H_TEMP
context restore

TIMER1 = 32768                      " cargo trm1 con mi valor
Clear PIR1.0                        "limpio el trm1 interrupt flag
INC TICK                            "incremento la variable tick en cada int.
 
MAIN:
   

T1CON = %00001011             " Enciendo TRM1 con prescaler 1 y oscilador Xtal
Clear PIR1.0                  " limpio el trm1 interrupt flag
Set PIE1.0                    " habilito TMR1 como interrupcion periferica  
INTCON =  %11000000           " Habilito las iterrupciones globales y perifericas
 
Print at 1,1,dec TICK
    
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 10 de Octubre de 2004, 12:14:00
Me da gusto que ya este funcionando con tu reloj pana khasistos, otra cosa para nada soy maestro, solo puse lo basico de interrupciones y estoy casi seguro que en este momento has de saber mas que yo.  
Veo un problema, estas usando para tick(que noes una variable del sistema) la definicion equivocada, ademas en byte solo guardaria el limite de tu problema 255, cambiala  Word y reviza.
El otro problema esta en tu interrupcion:
Int:
PP1H_TEMP =PP1H  <--- estas guardando bien el s.v
PP1H=PP1H_TEMP  <--- este esta restaurando!!! este no va aqui
context restore    <-- este va al final de toda la interrupcion
                                   <--- no veo donde deshabilitas la int??
TIMER1 = 32768 " cargo trm1 con mi valor    
Clear PIR1.0 "limpio el trm1 interrupt flag
INC TICK "incremento la variable tick en cada int.
                          <--- donde vuelves a habilitar la int
REviza tu estructura completa pana no se si te funcione asi, pero no es la mas adecuada
Un abrazo pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 10 de Octubre de 2004, 12:26:00
Aqui tu Ejercicio funcionando, por favor reviza bien la sintaxis, es importante entender por que va colocado cada comando y donde para que siempre el trabajo sea optimo en cuanto a tiempos y espacio ocupado :
Dim TIMER1 as TMR1L.Word " TRM1 es word (16 bits)
Dim TICK as word
DIM PP1H AS BYTE SYSTEM
DIM PP1H_TEMP AS BYTE SYSTEM
Goto main " salto al inicio del prog
-------------------------------------------------------------------------------------
Int:
PP1H_TEMP =PP1H  <---- guardamos todas las v.s
CLEAR T1CON.0       <-----detenemos el tmr1
TIMER1 = 32768 " cargo trm1 con mi valor  <--tu codigo isr
INC TICK "incremento la variable tick en cada int.
SET T1CON.0           <-----encendemos el tmr1 , pero no esta en cero la bandera de int asi que es como si estuviera apagado
PP1H=PP1H_TEMP   <-----restauramos las v.s
Clear PIR1.0 "limpio el trm1 interrupt flag  <-- ahora si esta en cero ahora empieza a trabajar la int no antes
context restore  <--- restauramos status,fsr,w,etc
-----------------------------------------------------------------------------------
MAIN:
    CLEAR                                       " LIMPIAMOS VARIABLES
   T1CON = %00000000   " Desde el inicio apagamos tmr1, usamos un prescaler de 1:1
   PIR1.0 = 0                    " limpiamos bandera de int pero aun no comienza a trabajar
   INTCON = %11000000  " requisitos para que funcione cualquier int periferica y global
   PIE1.0 = 1                     "encendemos la int de tmr1    esta se queda perpetuamente asi          
   T1CON.0 = 1                 "Ahora si empieza a trabajar la int habilitando el Tmr1(ya no hay nada que ativar)
   CLS                          
-------------------------------------------------------------------------------------
while 1=1                              "bucle infinito aqui sucedera la int siempre no antes
Print at 1,1,dec TICK
Delayms 100 " espero que el micro se estabilize
wend
end

Trata de poner siempre el ON_INTERRUPT despues de  declarar los fuses asi jamas te fallara
Un abrazo pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 10 de Octubre de 2004, 17:10:00
Hola Master lager
He hecho algunas correcciones en MAIN: con el registro T1CON y no por llevarte la contra sino pues he deducido que como dices debo parar el trm1 pero no el osc a XTAL ni la sincronizacion ,pues si asi lo hiciese el oscilador del TRM1 arancaria probablemente inestable asi que lo dejo habilitado andando y en sincronia solo paro el bit 0.
A ver si ahora das tu aprobacion pana,hasta ahora he logrado gracias a ti un hermoso contador de 65535 segundos.Por algo se empieza
"****************************************************************
"*  Name    : int.BAS  
"*  Date    : 10/10/04

 
          DEVICE = 16F877
        XTAL = 20
       ON_INTERRUPT Goto Int
      ALL_DIGITAL=TRUE
   
   
     LCD_DTPIN = PORTD.4   
     LCD_RSPIN = PORTE.0
    LCD_ENPIN = PORTE.1
   LCD_INTERFACE = 4   " 4-bit Interface
   LCD_LINES = 2
   LCD_TYPE = 0
   
    Dim TIMER1 as TMR1L.Word            " TRM1 es word (16 bits)
     Dim TICK as word
     
    DIM PP1H AS BYTE SYSTEM
     DIM PP1H_TEMP AS BYTE SYSTEM
    Delayms 400                         " espero que el micro se estabilize
     CLS

Goto main                " salto al inicio del prog
             
Int:
PP1H_TEMP =PP1H  
clear T1CON.0                        "detengo el TRM1
TIMER1 = 32768                      " cargo trm1 con mi valor

INC TICK                            "incremento la variable tick en cada int.
SET T1CON.0                         "enciendo el TRM1
PP1H=PP1H_TEMP
Clear PIR1.0                          "limpio el trm1 interrupt flag
context restore  



MAIN:
Clear
T1CON = %00001010              "solo paro el TRM1 y configuro 1:1 y XTAL en osi/ oso

Clear PIR1.0                  " limpio el trm1 interrupt flag
Set PIE1.0                    " habilito TMR1 como interrupcion periferica  
INTCON =  %11000000           " Habilito las iterrupciones globales y perifericas
T1CON = %00001011             " Enciendo TRM1 con prescaler 1 y oscilador Xtal
while 1=1 "bucle infinito aqui sucedera la int siempre no antes
Print at 1,1,dec TICK
Delayms 100 " espero que el micro se estabilize
wend
end

ABRAZO
K
    
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 10 de Octubre de 2004, 17:21:00
De maestro a lo mejor los gises que tengo por aqui y nada masEXCELENTE tu observacion Khasistos, ni me habia dado cuenta del problemon que traeria detener a cada rato el osc .
Salu2 pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 10 de Octubre de 2004, 17:49:00
Gracias pana:
Bueno ahora voy a pooner el trmo como contador de pulsos y lo que hicimos sera para la base de tiempos ,entonces como NO voy a habilitar interrupcion para el TRM0 puedo poner un symbol X=TRM0
y luego leer la cuenta en la interrupcion??por ej Pulsos=X

o como seria la forma de leer la cuenta del trm0 en la interrupcion??
OJO pana no te pido un SUPER desarrollo simplemente la expresion mas simple de leer el valor del trm0 OK?No voy a llegar a desbordar al trm0 asi que no habilitare las int del mismo..

Abrazo
K
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 10 de Octubre de 2004, 19:01:00
Haber pana khasistos, antes que nada, acuerdate que la interrupcion de tiempo con el tmr1 que hiciste, a la larga va a tener un retraso o margen de error que en largos periodos tienes que  restaurar para que nunca sea mucha la falla, claro esto en el ejmplo de reloj(por que va a permanecer 1 año 2 años encendido o meses o dias, claro si no lo muerde el perro, ) en  el caso de este uso, lo podriamos despreciar momentaneamente estableciendo que siempre habra una interrupcion cada 1 seg. Solo queria dejar en claro este punto por que el tema de timers de muy alta precision es extenso tambien.
Si sabes que cada seg va haber una interrupcion  ahora decides usar  el tmr0 como contador hay que hablitarlo como tu sabes desde option_reg aun asi nos enfrentaremos al detalle de la frrecuencia maxima que soportara el tmr0 ya que acurdate que  solo cuenta hasta 255(e aqui la preferencia de usar tmr1 o tmr2 como contador)  cada segundo se va a hacer un muestreo de los pulsos contados, yo  creo que te va a sobrer tiempo. Lo que se me ocurre es lo siguiente(claro es olo una idea)
Que arranque el periodo de muestreo, usamos el desbrode dela int de tmr0 (obviamente cada ves que desborda limpiamos,contamos  y salimos de la int al final se toman el numero de interrupciones por 256 mas el valor de tmr0 como valor final de muestreo, supongamos que fue 1000 este valor dividido entre el segundo nos dara la frecuencia, claro este claculo solo se hara AL FINAL del muestreo, para no tener un margen de error amplio.Reviza el ejemplo que te envie

Salu2 pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 10 de Octubre de 2004, 19:25:00
Hola Pana

Lo de la precision del reloj la tengo clara eso se puede ajustar cambiando el valor de carga en el trm1 o como se hace en el ejemplo del reloj ,creo que luego de poner en funcionamiento el trm0 sera facil ajustar haciendo coincidir el valor del generador de frec con el mostrado en el display ,ya se que a lo mejor hay alguna dif en el segundo por alguna instruccion que se ejecuta y no la hemos tomado en cuenta.,tambien pana esta claro que tenemos un contador de 256 asi que la frec max sera de 15 300 siempre y cuando no le ponga un prescaler ...y como yo todavia no tengo un F1 me sobran...Entonces mientras no llege a 15300 rpm no va a desbordar el tmr0.Tambien tu teoria es interesante ahi no habria limitaciones se incrementaria una variable durante el periodo de muestra al final leeriamos cuantas veces se desbordo mas el numero que tenga el TMR0 en el momento que TRM1 llego a desbordarse..pero piensa que hasta ayer las interrupciones eran solo cerebrales mias y hoy gracias a ti ya estoy metido y haciendo funcionar cosas .vamos despacio voy a empezar a hacer funcionar el "Limitado" entonces dime como lo leo durante la interrupcion es decir como "tomo "su valor.....Symbol X=TMR0 y luego dentro del handler  Pulsos=X..puede ser??Creo saber como habilitar el TMR0 y como limpiarlo asi que en eso no te preocupes que ya me van a surgir dudas...JA JA

abrazos y gracias
K
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 10 de Octubre de 2004, 22:42:00
Pana khasistos, te filtre un poco el programa de Les, asi puedes entenderlo claramente,

     DEVICE=16F628
     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 FUDGE_FACTOR   AS 2
      Dim TMR1 As TMR1L.WORD                                    
      Dim TMR0_POSTCOUNT1 As WORD                                
      Dim CONTEO   As WORD                                
      Dim BANDERA      As Bit                                  
      Dim RESULTADO  As WORD                                
      DIM TMR0_RELOAD_VAL AS ((255 + FUDGE_FACTOR ) -(250 ))"XTAL* 62.5
   
      ON_INTERRUPT INTERRUPCION                                
      GoTo INICIO                                    
 
INTERRUPCION:
    TMR0 = TMR0 + TMR0_RELOAD_VAL                          
    DEC TMR0_POSTCOUNT1
    If TMR0_POSTCOUNT1 = 0 Then
        TMR0_POSTCOUNT1 = 500                  "
             T1CON.0 = 0                              
             CONTEO = TMR1                              
             Clear TMR1                                      
             T1CON.0 = 1
             BANDERA = 1                                  
             INC PORTA.0
    End If
    INTCON.2  = 0                                                
    CONTEXT RESTORE                                            

INICIO:
    TMR0_POSTCOUNT1 = 500                      
    OPTION_REG.0  = 0                            
    OPTION_REG.1 = 0
    OPTION_REG.2 = 0
    OPTION_REG.5 = 0                                                    
    OPTION_REG.3 = 0                                                    
    INTCON.2  = 0                                                  
    T1CON = %00000110
    T1CON.0 = 1                                          
    TMR0 = TMR0_RELOAD_VAL                                      
    INTCON.5  = 1                                                
    BANDERA = 0                                          
    OUTPUT PORTA
    INTCON.7  = 1                                        

Loop:
    If BANDERA = 1 Then
        RESULTADO = CONTEO * 4                      
        PRINT AT 1,1,"FREC = ",DEC6 RESULTADO ,"Hz"          
        BANDERA = 0                                      
        SET PORTA.0
    End If
    GOTO LOOP
    Stop

Salu2 pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: Nocturno en 11 de Octubre de 2004, 03:59:00
Bueno, entre pana y pana he aprendido un montón.

Buen hilo este señores (¿o quizas debería decir panas?)
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 11 de Octubre de 2004, 09:58:00
Hola:

Pana:siempre unos kilometros delante........era lo que estaba haciendo pero siempre llego tarde....Hay dos cosas que me quitan el sueño

El fudge factor ,es un valor de precarga numerica al TRM para adecuar el tiempo de acuerdo al Xtal que usemos pero    
DIM TMR0_RELOAD_VAL AS ((255 + FUDGE_FACTOR ) -(250 ))"XTAL* 62.5 ............XTAL*62.5 en caso de 20  =1250??me fui a los caños......aclarame un poco esto del fudge factor por favor ....

Aqui estan sacando la interrupcion por PORTA.0 para que? solo porque sabian que la estoy usando para complicarme cuando tenga los AD funcionando ........gracias Lester

NOCTURNO:
Lo de señores suena pesado muy formal creo que a esta altura del partido somos mas que nada AMIGOS  y que por razones idiomaticas el AMIGO lager nos llama PANAS ::
Eso si te aconsejo que nunca postees la expresion QUERIDO AMIGO a quien use la expresion PANA ,si no preguntale al AMIGO lager como se interpreta por alla  JA JA  JA



Le mado un abrazo a ambos
K
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 11 de Octubre de 2004, 12:08:00
Pana Khasistos, el set porta. debe ser de antemano un error de ellos o lo usaban en su proyecto para otra cosa borralo por favor, el factor fuga mas o menos sabes que es una variable para ajustar de acuerdo a tu reloj el grado de error, acuerdate que cuando escribes en el tmr0 o tmr1 en este caso lo haces se pierden 2 ciclos de reloj antes de que vuelva a operar(ya que cada incremento se lleva 1 ciclo de reloj),
Veo mas detalles en el ejemplo de lester:
segun el programa original el prreescaler esta para 1:1 no puede ser si PSA esta a cero esto nos da un preescaler 1:2 segun el ds, si tu  pones a 1 el PSA te va a dar exactamente la mitad de la frecuencia.
Dejame seguirlo revizando,
Pana Nocturno66 Gracias por el apoyo, solo tratamos de recavar informacion util, asi que si hay errores, se iran corrigiendo al avanzar el aprendizaje


analizando el proceso:
inicia el tmr0=7(255-7=248 no cuenta realmente hasta 255)
cuando el tmr0 llega a 255 se interrumpe:
tmr0=TMR0+7 (lo que tenga el tmr0 puedes ser 4, 5,6 ,7 etc nuevamente mas 7)
la variable postcont de tmr0 es decrementada en 1(499)
y reviza si llego a cero, como no llego limpia la bandera de int ,restaura fsry status y vuelve,pero retorna a int por que esta tmr0=255 y asi succesivamente hasta que decremente la variable postcont del tmr0 a 0
interrupcion es a 1:2 y NO como dice Les a 1:1, Que pasa cuando entra a la interrupcion? solo vuelve a cargar la variable de conteo hasta 500 apaga el tmr1 lo guarda en la variable con la que se imprime lo enciende y activa la bandera para impresion.
Aunque el verdadero orden deberia ser este para optimizar tiempo:
T1CON.0 = 0    
TMR0_POSTCOUNT1 = 500                          
CONTEO = TMR1                              
Clear TMR1                                              
BANDERA = 1  
T1CON.0 = 1  
No es mucho la diferencia podria ser 1 cuando mucho 2 pulsos que se escapen

2° analisis:
Como pueden ver tiene como que una formula y etc,etc,etc. todo el proceso lo podemos reducir en SETEAR un temporizador omo se  debe, ya que las indicaciones del programa original, casi no tienen nada que ver con lo que hace(me refiero alos puntos importantes, todos sabemos para que son los registros y por que se ponen en cero o en 1)
Un ejemplo antes de continuar:
Si queremos que una interrupcion TMR0 de 8 bits(255 max) se ejecute en determinado tiempo, seguimos los pasos clasicos
cada cuanto tiempo? ... digamos por ejemplo 50 ms
con esta info. sabemos que 50 ms son 50000us, y eso pa que?
bueno el micro trabaja en us no en m y algun dia en nsegundos :P.
bueno pensemos por ahora(solo por ahora) que queremos usar un pic con reloj externo a 4Mhz(despues de toda la explicacion lo podran hacer a cualquier reloj)
ok!! esto quiere decir que cada instruccion nos tomara 1us (4Mhz/4= ciclo de reloj o instruccion) entendido esto, solo nos queda una cosa por hacer, ya que vamos a usar el TMR0 como TEMPORIZADOR, entonces debemos ajustar los preescalers del TMR0 , que es un preescaler(podriamos decir sencilamente un divisor de frecuencia de cada ciclo de reloj)
ahora si de lleno: Si queremos que nuestro TMR0 pare cada 50 ms(aprox) = 50000Us y ponemos o mejor dicho configuramos el preescaler a 1:256, esto quiere decir que 50000/256 = aprox 195.3125 <---- este es seguible en el TMR0 pero no es el que queremos, nosotros necesitamos el valor contraparte, es decir, como usamos TMR0 entonces solo  lee hasta 255, luego entonces la contraparte es:
255-195.3125 =59.6875 <--- un valor tambien seguible via tMr0, lo podemos redondear a 60
Este valor es con el que debe de empezar nuestro TMR0 con prescaler 1:256 para que pare APROX a 50 ms , (espero que hayan entendido ahora el como y por que se configura el preescaler)
Entendido Este ejemplo creo que lo que explicare acontinuacion  ya no es necesario, pero lo hare:

Como ven en el programa, el TMR0 empieza en 7 <-- y esto quien les dijo o ke??? ahora ya lo saben.
Si el programa va a parar 4 veces por segundo(cada 250ms osease cada 250000Us) entonces como ajustar el pree y el valor de inicio de mi TMR0???
250000/2=125000 <-------- ta! esto esta muy grande para seguirlo en mi pequeño Tmr0 de solo 8 bits(255) pero si hacemos un pequeño artificio no sera tanto:
lo podemos dividir por un numero que nos de unvalor razonable en el TMR0 no? CLARO!! , en el caso del programa si dividimos 125000/500=250 <----- perfecto es exacto y seguible por el tmr0, ahh deberas que necesito su contra parte: 255-250=5
Ahora sabemos que debe empezar en 5, pero hay un detalle que no habiamos percibido, cada ves que ESCRIBIMOS en el TMR(o cualquier TMR por favor lean el DS) este proceso inhibe dos ciclos de instruccion , excatamente 2 valores que no se contaran(esto puede crearnos un error grande) entonces tenemos que agregarlo de cajon en la escritura del TMR --->Tmr0=5+2=7
Ahora si tenemos el valor justo que arregla(en un 50%) el rror que se vaya generando como el problema de contar , ahora si nuestro TMR0 esperara 250ms e imprimira el valor guardado en conteo.
como ven la interrupcion sucedera 500 veces antes de que imprima un valor
Espero les sirva de algo la info, aunque me siguen viniendo muchas dudas aun.

Salu2 panas!
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 11 de Octubre de 2004, 16:16:00
Estan usando el Interno no?, esta en cero. deja y cheko..
aqui ta:

INICIO:
TMR0_POSTCOUNT1 = 500
OPTION_REG.0 = 0
OPTION_REG.1 = 0
OPTION_REG.2 = 0
OPTION_REG.5 = 0 <--------- Reloj interno, si estuviera seteado seria como contador o reloj externo
OPTION_REG.3 = 0
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 11 de Octubre de 2004, 16:36:00
Hola:

Aqui esta mas o menos digerido para entendero mejor
sigo insistiendo poque no poner 7 directamente ,aunque la duda es si en la formula del fudge no te comiste un parentesis he interviene la expresion XTAL *62.5 cheka eso por favor

Saludos
K

DEVICE=16F628
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 FUDGE_FACTOR AS 2
Dim TMR1 As TMR1L.WORD
Dim TMR0_POSTCOUNT1 As WORD
Dim CONTEO As WORD
Dim BANDERA As Bit
Dim RESULTADO As WORD
DIM TMR0_RELOAD_VAL AS ((255 + FUDGE_FACTOR ) -(250 ))"XTAL* 62.5

ON_INTERRUPT INTERRUPCION
GoTo INICIO

INTERRUPCION:
TMR0 = TMR0 + TMR0_RELOAD_VAL                   "cargo 7 para compensar el tiempo
DEC TMR0_POSTCOUNT1                             "decremento 500 hacia 0
If TMR0_POSTCOUNT1 = 0 Then                     "Si es 0 vale 500
TMR0_POSTCOUNT1 = 500                           "vuelvo a ponerla en 500
T1CON.0 = 0                                     "paro timer  tmr1
CONTEO = TMR1                                   "obtengo el valor de TMR1
Clear TMR1                                      "pongo TMR1 a 0
T1CON.0 = 1                                     "habilito TMR1
BANDERA = 1                                     "bandera que indica q se cumplio la int.para loop
INC PORTA.0
End If
INTCON.2 = 0                                     "apago la interrupcion del TRM0
CONTEXT RESTORE                                  "restauro las variables

INICIO:
TMR0_POSTCOUNT1 = 500                            "cargo postcout con 500 ya lo hice en la interrup..
OPTION_REG.0 = 0                                 "prescaler 1:2 asignado al TMR0
OPTION_REG.1 = 0                                
OPTION_REG.2 = 0
OPTION_REG.5 = 0                                  "entrada del conteo por osc interno
OPTION_REG.3 = 0                                  "prescaler asigando a TRM0
INTCON.2 = 0                                      "apago la interrupcion del TRM0
T1CON = %00000110                                 "paro TRM1,entro pulsos en rb6,sin sincronia
T1CON.0 = 1                                       "enciendo TMR1
TMR0 = TMR0_RELOAD_VAL                            "TMR0 con el numero de correcion 7
INTCON.5 = 1                                      "habilito la interrupcion del TMR0
BANDERA = 0                                       "indicador de la interrupcion a 0
OUTPUT PORTA
INTCON.7 = 1                                      "habilito las interrupciones grales

Loop:
If BANDERA = 1 Then                               "me indica que se produjo la interrupcion
RESULTADO = CONTEO * 4                            "por 4 pues tome muestras de 250ms *4=1seg
PRINT AT 1,1,"FREC = ",DEC6 RESULTADO ,"Hz"
BANDERA = 0
SET PORTA.0
End If
GOTO LOOP
Stop
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 11 de Octubre de 2004, 18:17:00
En realidad yo uso este pana es identico al que hiciste pero con el 7, para que tanta variable!!, jajaja y funciona igualito:
     DEVICE=16F628
     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                              
      ON_INTERRUPT INTERRUPCION                                
      GoTo INICIO                                    
 
INTERRUPCION:
    TMR0 = TMR0 + 7                    
    DEC TMR0_POSTCOUNT1
    If TMR0_POSTCOUNT1 = 0 Then        
             T1CON.0 = 0    
             TMR0_POSTCOUNT1 = 500                          
             CONTEO = TMR1                              
             Clear TMR1                                      
             BANDERA = 1  
              T1CON.0 = 1                                
    End If
    INTCON.2  = 0                                                
    CONTEXT RESTORE                                            

INICIO:
    TMR0_POSTCOUNT1 = 500                      
    OPTION_REG.0  = 0                          
    OPTION_REG.1 = 0
    OPTION_REG.2 = 0
    OPTION_REG.5 = 0                                                    
    OPTION_REG.3 = 0                                                    
    INTCON.2  = 0                                                  
    T1CON = %00000110
    T1CON.0 = 1                                          
    TMR0 =7                                  
    INTCON.5  = 1                                                
    BANDERA = 0                                          
    INTCON.7  = 1                                        

Loop:
    If BANDERA = 1 Then
        RESULTADO = CONTEO * 4                      
        PRINT AT 1,1,"FREC = ",DEC6 RESULTADO ,"Hz"          
        BANDERA = 0                                      
    End If
    GOTO LOOP
    Stop

PD:Quiero suponer que dejaron todo con variables para que se entendiera mejor,pero se me hace mas facil VER los REGISTROS directamente en lugar de tanto flase,alias,formulas,etc..
De acuero con la formula:
TMR0_RELOAD_VAL = ((255 + 2 ) -(xtal * 62.5 )) , donde es facil la explicacion,
(VALOR MAXIMO DE TMR + DELAY)-(XTAL* NUMERO MULT POR XTAL DE LIMITE DE TMR ENCONTRADO)
Pero incisto que se me hace mas facil encontrar el valor siguiendo el proceso que siempre se ha seguido para determinar las temporizaciones(proceso que yo no invente por supuesto, y que siempre se a usado).
Tambien es logico por que usaron el preescaler a 1:2 ya que con los demas se tiene valores aproximados(decimales) y seria mayor el error.
Un salu2 pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 11 de Octubre de 2004, 18:28:00
Hola:

Chekeaste eso de la formula ,pues si tengo xtal de 20 no me da... el numero de 4 int por seg ...ni por broma, si la tienes a mano esa que venia en un clock por favor posteala asi no andamos sacando calculos.

Saludos
K
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 11 de Octubre de 2004, 18:33:00
La formula no la uso pana, calculo como explique anteriormente, si usas un xtal de 20mhz, tendras  .2 us por instruccion, hay que modificar temporizacion y demas!! ya que 1us(7)= 7 y (.2 )7= 1.4 <------ no se puede tomar partido solo enteros, asi que redondeamos y tendremos una APROXIMACION con error de .4!!!!. tienes que calcular un preescaler  que de mejores resultados y de entero la variable a corregir!
El que mas se acercaria modificando a xtal de 20 seria cambiando los 500 por 497 y el error de fuga por 1 (con un error de .098, el cual e va de 30 a 40 hz de Error, DEMASIADO error!)
La del Reloj funciona de otra forma, es otro codigo funciona con un limite a 76, es otra estructura eso si con menos error.
Salu2 pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 11 de Octubre de 2004, 19:17:00
Hola

entendido dicho en otras palabras parto de una entrada de 5 mhz y debo salir con 4 hZ buscare los valores adecuados para lograr el fin aunque es mucha division pensare.........

Saludos
K
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 11 de Octubre de 2004, 19:37:00
Ya te lo calcule pana, usa 491 como artificio y un tmr de 2, acontinuacion te lo explico:

1,000,000/4=250,000/2=125,000/491=255-254.58xxx=0.4174xxx POR 0.2 =0.08xxx + 2 <-- de las instrucciones detenidas, = 2.08xxx, quitamos el decimal y = 2
con tu error de 0.08xxx es CASI igual al anterior pero ya se desplazo un poquito mas, un desplazamiento de 8 hz aprox.
Un abrazo
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 11 de Octubre de 2004, 21:24:00
Hola,

a ver si me sigues ,el TMR0 recibe 4/fosc = 1mhz con xtal de 4 OK?
con prescaler de 1:2 500Khz periodo 0.000002 seg x 256 saca interrupcion cada 0.000512 seg
repetimos ese desborde 500 veces =0.256 seg     3.9 HZ


Ahora con 20 mhz de Xtal

Tmr0 recibe 4/fosc= 5MHz
prescaler a 2 =2.5mhz periodo 0.0000004 seg
interrupcion cada 0.0001024 seg
si repetimos ese desbode 2441 veces tenemos 0.2499 seg
Como TMR0_POSTCOUNT1 es un word 16 bits creo que es posible y encima mas exacto que el anterior  0.256 contra 0.2499   4Hz

tu veras el fudge factor ,,y si esta teoria es correcta
Si me equivoque fiero prometo borrarlo.....

Abrazo
Khasistos
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 11 de Octubre de 2004, 21:46:00
<-- asi quede, jajajajja .
Haber pana, 1 ciclo de instruccion= 4 ciclos de reloj y el reloj lo define el cristal ok? si el cristal oscilador es de 4Mhz entonces el ciclo dl reloj sera  1/4= 0.25 microsegundos por lo tanto el ciclo de cada INSTRUCCION sera de 4 por 0.25= 1us!!!!!!
C.I=(1/xtal) x 4
para 20 Mhz
C.I.=(1/20) x 4 = 0.2 us
 Aclarado esto, lo demas se calcula como es habitual:
necesito 4 interrupciones por SEGUNDO= cada 250ms esto se puede modificar.
Entonces realmente necesito una interrupcion cada 250,000  .
Esto entre el preescaler 1:2.
250,000/2=125,000 <-- esto esta muy por encima de lo que puede CONTAR mi TMR0, manejamos el artificio de dividirlo por (en este caso ya calculado) 491 = 254.58xxxxxx necesitamos la contraparte:
255- 254.58xxxxx=0.41xxxxx  es mi interrupcion, perom ojo este es para un C.i = 1 us no para 0.2 us por lo tanto :
TMR0= (0.41xxxx *  0.2) + el retardo por RE escribir en la interrupcion el Tmr(en este caso 2 ciclos por instrucion ojo este valor ya viene alterado por el tiempo que ocupa en cumplirlo)
TMR0=2.0853xxxx <--- CASI 2 el error es evidente pero a diferencia del que se supone que tampoco tiene error es minimo.
entonces TMR0=2 y el artificio con IF =491.

Es esto a lo que te referias pana?
Si no explicamelo ami por favor.
Un abrazo pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 11 de Octubre de 2004, 22:10:00
Hola Pana

son formas diferentes de ver lo mismo..

Mira ya sabes lo que recibe el TMR0 en su entrada si es 4 mhz de XTAL recibe 1 mhz pues es 4/fosc eso no invente yo lo dice la DS
y con 20  de Xtal recibe 5mhz todo esto sin considerar los prescalers

Ahora conectamos el prescaler 1:2 es decir lo que va a llegar al TMR0 es la mitad de ambos con Xtal de 4 era 1mhz ahora 500Khz
en 20 seran 2.5 MHZ

El periodo de esa frecuencia 1/F  es de 0.000002 seg para 500khz es decir un ciclo de lo que entra al TMR0 dura 0.000002seg pero tengo que "Llenar" 256 casillas antes que desborde por ende 0.000002*256 0.000512seg y se desborda.
Como utilizamos la "Trampa" de hacerlo desbordar 500 veces sumamos esos 500 tiempos y nos da 0.256 seg   Pasamos el cuarto de seg 0.25  por eso digo que la frecuencia que "debe" salir de ese desbode es de 4 hz si fuese exacta pero no lo es   frec = 1/periodo      1/0.256       3.9hz

haciendo la misma deduccion para Xtal de 20 solo necesitamos que realize 2441 desbordes .Que deduzco que es posible dado que definimos a TMR0_POSTCOUNT1 como word.Y encima nos da justito 0.2499 seg.

Piensalo, no tengo la verdad ,puedo errarle pero creo que es asi , el fudge factor corre por cuenta tuya ahi te dejo las matematicas para calcular cuantos ciclos de instruccion se pierden.....

Abrazo
K
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 12 de Octubre de 2004, 02:35:00
Pana es lo mismo pero en tu proceso esta muy bien explicado  eso es PERFECTO , asi se puede apreciar claramente el por que del pequeño error, en estas funciones que pusiste como  determinas el inicio del TMr0? seria importante para tener los dos metodos. los pasos que di son los usados para cualquier calculo de temporizacion, no los adapte a lo que hacemos, la perdida de 2 ciclos tambien y se tiene que agregar ya que escribimos en el tmr0 al momento de la interrupcion si no ponemos este 2 que no es mas que el conteo de 2 ciclos, estariamos agrandando el error, por eso hago enfasis en el proceso que explique,. Tu proceso esta mas que EXCELENTE pana .

Un abrazo pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager 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
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos 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
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager 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
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos 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



Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager 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
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos 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

Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager 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.
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos 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
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos 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

Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager 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
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos 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
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager 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
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos 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
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager 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
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos 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
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 14 de Octubre de 2004, 18:23:00
Sigue el error pana, jajaja ,hasta mayor al que dejamos en i de diferencia. Hay que seguir analizando
Me marca 9942-43 en 10ks, esta muy fuera del otro rango usando el bit
Un abrazo
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 14 de Octubre de 2004, 19:30:00
HOLA PANA

NO NO el ultimo post esta perfecto .PERFECTO coincide en todos los rangos en este preciso momento el generador marca 50.092HZ el frecuencimetro 50.093 y el pic 50.092 o cambia esporadicamente a 3 TE LO ASEGURO.El Xtal esta chekeado esta en 20. 000.002 hz .Algo en la simulacion no camina ES el mejor de todos.
Estas simulando en proteus NO? A mi todo lo que simule siempre me dio mas lento ,a pesar que funcionaba los tiempos no son los mismos.Puede venir por ahi ...
 
Te mando un abrazo
Khasistos
Abrazos PANA
Khasistos
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 15 de Octubre de 2004, 10:46:00
Ok pana, entonces ese es el bueno .a mi me sigue funcionando mejor el otro, lo probe ayer en la facultad, me da 50.002  a 50.001 para 50.002 quien sabe por que.Como ves es lo mismo(la misma diferencia del tuyo de 1 hz, el mismo error de siempre), pero sin reescribir el TMR y con la ganancia de que el que uso tambien me da en proteus pero 1hz de dif. En fin usa el que te sirva Pana
Un  abrazo pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: Sispic en 15 de Octubre de 2004, 13:13:00
Tener +- un ciclo de diferencia es normal , depende de la sincronización y si cuando empieza la cuenta está el ciclo a leer a nivel alto ó bajo .

la mas dificil es que funcione usando " ON_INTERRUPT INTERRUPCION "

ya que la atenderá cuando termine lo que está haciendo , si esta en un PAUSE 2000 , tardara dos segundos en atenderla , bruff .


Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 15 de Octubre de 2004, 13:22:00
Gracias Sispic , entonces lo puedo dejar asi? o hay alguna forma de contra restar ese +-1?
No estamos usando pause ni delays, solo interrupcion hardware de proton , pero si hay una forma de obtener la exactidud, me gustaria mucho aprenderla , ya que con el que puse tengo ese error.
SAlu2 pana
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 15 de Octubre de 2004, 15:02:00
HOLA sisco

la interrupciones del PLUS son de HARDWARE no son de soft ,las que tu haces referencia se llaman  on  interrupt y si hacen lo que tu dices Hay dos clases ON_INTERRUPT  y ON INTERRUPT (este es por soft) sin guion bajo.
Lo que has visto en estas paginas son por hard
Muy buena apreciacion la de si esta entrando un pulso  cuando se larga el conteo....ahi tenemos la dif de +-1cs

Y gracias por brindarnos siempre tus consejos....

Te mando un abrazo
Khasistos
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: Sispic en 16 de Octubre de 2004, 00:47:00
Ok khasistos . entonces no es igual que pbp 2.4xx , y como no utilizo el plus pensé que seria lo mismo .

por cierto , saveis si el plus se encarga automaticamente de guardar los registros al entrar en la interrupción ?

un saludo
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: khasistos en 16 de Octubre de 2004, 07:54:00
HOLA SISCO

Mira los principales si los guarda con la orden context restore,pero a su vez si usas alguna otra variable importante que quieres conservar se hace de la siguiente manera ,con el editor del PLUS una vez compilado tocas F2 ahi ves el asm y te fijas que variable es la utilizada por ejemplo PP1 entonces pones esto...

en las declaraciones la pones ,DIM PP1H AS BYTE SYSTEM
DIM PP1H_TEMP AS BYTE SYSTEM


Y dentro de la interrupcion al inicio:
INTERRUPCION:
 PP1H_TEMP =PP1H
x
x
x
x
PP1H=PP1H_TEMP
context restore

El plus maneja un a serie de variables que las puedes ver facilmente editando el asm y esta es la forma de conservarlas despues de la interrupcion.Te mando el juego de las variables reservadas del PLUS asi te es mas facil reconocerlas..
TODO ESTO Enseñanzas del amigo lager.....no es mio yo solo lo aprendi.....No siempre es necesario el uso de este metodo pues simplemete con el context restore ya se salvan las del sistema solas.

Abrazo
K
Título: RE: INTERRUPCIONES REALES EN PLUS
Publicado por: lager en 16 de Octubre de 2004, 13:36:00
Solo agregando un poco mas de info a lo bien mensionado por el pana khasistos, si usas modelos de 16 bits tienes que agregar la instruccion CONTEXT SAVE  tambien antes del ISR, ahora guarda tu status,tufsr,etc,,, pero que psas con las variables del sistema(de proton+ me refiero) esas son las usadas para hacer calculos complejos una de ellas puede ser PP1 si esta se maneja muchas veces mas se a a ir incrementando y pasara a PP1H, y luego PP1HH y asi sucesivamente, dependiendo de l calculo a hacer, en caso de que DENTRO de nuestra interrupcion usemos una o varias(por eso en el manual se recomienda usar comandos simples, no serializados y lo mas que se pueda en asm)incluidas en un comando complejo como PRINT AT <--- aqui abria que guardar las posiciones para un GLCD y lo estados del flag, y demas,
Para no extender esta explicacion, las v.s que se usen deben ser guardadas y restauradas(esto no es falla del compilador, solo falta de vision del programador, el cual en sus proximas versiones es muy probable que ya venga incluido, asi que preparense )con context Restore y context save( esta solo necesaria para modelos de 16 bits). Asi que podemos decir que proton+ vamos para adelante, Otro detalle(para versiones desactualizadas) no soporta mas de 92 deficniciones de variables de sistema(v.S) ya que no era el punto estarlas definiendo, esto se usa como solucion alterna mientras adaptan este plus a nuevas versiones.
Un abrazo panas