TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: MGLSOFT en 13 de Julio de 2012, 00:13:52

Título: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 13 de Julio de 2012, 00:13:52
Necesito medir tiempos de ocurrencia de un evento con precision, y lei en la documentacion de mi PIC que se puede utilizar este modulo para hacer esto y muy bien, pero no encuentro documentacion que me ayude a comprender como se utiliza...
Alguna ayudita please ?? :mrgreen: :mrgreen:
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Suky en 13 de Julio de 2012, 00:27:19
Ninguna de las Notas de Aplicación (https://www.google.com.ar/search?rlz=1C1AVSA_enAR445AR445&sugexp=chrome,mod=1&sourceid=chrome&ie=UTF-8&q=CTMU#hl=es&gs_nf=1&pq=ctmu&cp=8&gs_id=g&xhr=t&q=CTMU+pic&pf=p&rlz=1C1AVSA_enAR445AR445&sclient=psy-ab&oq=CTMU+pic&gs_l=&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&fp=6da882c9033fc775&biw=1360&bih=669) da en el clavo?
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Nocturno en 13 de Julio de 2012, 01:47:37
¿No te vale el CCP?
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 13 de Julio de 2012, 08:15:49
Ninguna de las Notas de Aplicación (https://www.google.com.ar/search?rlz=1C1AVSA_enAR445AR445&sugexp=chrome,mod=1&sourceid=chrome&ie=UTF-8&q=CTMU#hl=es&gs_nf=1&pq=ctmu&cp=8&gs_id=g&xhr=t&q=CTMU+pic&pf=p&rlz=1C1AVSA_enAR445AR445&sclient=psy-ab&oq=CTMU+pic&gs_l=&pbx=1&bav=on.2,or.r_gc.r_pw.r_qf.,cf.osb&fp=6da882c9033fc775&biw=1360&bih=669) da en el clavo?
Esa y unas 50 mas busquedas hice, y no encuentro algo a medida que me deje claro como debo usarlo, es un modulo complejo, que permite muchos usos, y la nota de Microchip al respecto solo muestra cuales aplicaciones puedes tener, pero no da un ejemplo claro de como usarlo para medir un tiempo entre flancos de una misma señal, solo muestra como hacerlo usando los gates del modulo.... :oops: :oops:
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 13 de Julio de 2012, 08:17:26
¿No te vale el CCP?
Si no logro usar el CTMU, seguramente acudire a el, aunque aun no lo use para medir tiempos, solo para temporizar en forma precisa... :? :oops:
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Nocturno en 13 de Julio de 2012, 09:20:20
En el manual de referencia aparece esto:

11.7  MEASURING TIME WITH THE CTMU MODULE
Time can be precisely measured after the ratio (C/I) is measured from the current and
capacitance calibration step by following these steps:
1. Initialize the A/D Converter and the CTMU.
2. Set EDG1STAT.
3. Set EDG2STAT.
4. Perform an A/D conversion.
5. Calculate the time between edges as T = (C/I) * V, where I is calculated in the current
calibration step (Section 11.5.1 ìCurrent Source Calibrationî), C is calculated in the
capacitance calibration step (Section 11.5.2 ìCapacitance Calibrationî) and  V is
measured by performing the A/D conversion.
It is assumed that the time measured is small enough that the capacitance COFFSET provides a
valid voltage to the A/D Converter. For the smallest time measurement, always set the A/D Channel Select register (AD1CHS) to an unused A/D channel; the corresponding pin for which is not
connected to any circuit board trace. This minimizes added stray capacitance, keeping the total
circuit capacitance close to that of the A/D Converter itself (4-5 pF). To measure longer time intervals, an external capacitor may be connected to an A/D channel, and this channel selected when
making a time measurement.


Pero realmente creo que el CCP es más indicado para medir tiempos; si te animas y tienes dudas lo vemos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 13 de Julio de 2012, 09:26:20
Esto lo lei unas 20 veces, pero no encuentro un ejemplo implementado para ver exactamente como usarlo. :( :(

Lo del CPP lo has hecho alguna vez??
Puedo usarlo a traves de un flag o algo a traves de interrupcion??  :shock: :shock:
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: rivale en 13 de Julio de 2012, 10:42:27
Con el ctmu no te puedo ayudar, nunca lo he usado, ni leido como funciona.

pero el ccp si te sirve para capturar entre flancos de subida o de bajada, tu lo configuras, y como base de tiempo tienes el timer1. todo esto con interrupciones.

en que estas programando?
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 13 de Julio de 2012, 10:46:45
En C de CCS, pero si tienes ejemplos en C18 o Hitech, pasamelo que lo convierto... :mrgreen: :mrgreen:
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: rivale en 13 de Julio de 2012, 11:13:12
Te pongo este ejemplo, aca leia el ancho de un puslo, primero configuro en flanco de subida y luego en flanco de bajada. cualquier duda con gusto te explico
PD. ponle el geshi porque no se como ;-)

Código: [Seleccionar]
#include <16f887.h>
#fuses intrc_io,nowdt,noput,nomclr,protect,nolvp
#use delay(clock=8M)
#define LCD_ENABLE_PIN  PIN_D3
#define LCD_RS_PIN      PIN_D1
#define LCD_RW_PIN      PIN_D2
#define LCD_DATA0       PIN_D4   
#define LCD_DATA1       PIN_D5   
#define LCD_DATA2       PIN_D6   
#define LCD_DATA3       PIN_D7
#include <lcd.c>


#define t1  0.0000005//4/osc=4/8000000=0.5x10(-6)
int1 ccp1_f=0,fe=0;
void config()
{
   setup_ccp1(ccp_capture_re);//configuro en flanco de subida
   setup_timer_1(t1_internal|t1_div_by_1);
   enable_interrupts(global);
   enable_interrupts(int_ccp1);
   lcd_init();
}
void frecuencimetro()
{
   unsigned int16 val_t1=0;
   float tiempo=0,frec=0;
//si "fe" esta en 0, entonces leyo en flanco de subida
   if(fe==0)
   {
      setup_ccp1(ccp_capture_fe);
      set_timer1(0);
      fe=1;
   }
   //cuando entro por flanco de bajada
   else
   {
      setup_ccp1(ccp_capture_re);
      fe=0;
      val_t1=get_timer1();
      tiempo=2*t1*(float)val_t1;
      frec=1/tiempo;
      //lcd_putc("\f");
      lcd_gotoxy(1,1);
      printf(lcd_putc,"frec=%f   ",frec);
   }
   
}


void main()
{
   config();
   while(true)
   {
      if(ccp1_f)
      {
         ccp1_f=0;
         frecuencimetro();
      }
   }
}

#int_ccp1
void pulsos()
{
   ccp1_f=1;
}

Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Suky en 13 de Julio de 2012, 11:50:32
Para CCP no te sirven los ejemplos de RedPIC  :roll:
 
http://www.todopic.com.ar/foros/index.php?topic=14427.0
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: rivale en 13 de Julio de 2012, 12:10:33
Para CCP no te sirven los ejemplos de RedPIC  :roll:
 
http://www.todopic.com.ar/foros/index.php?topic=14427.0

++;

cierto, tambien eso te ayudaria mucho, de hecho tambien puedes medir el puslo usando la interrupcion externa ;-)
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: PCCM en 13 de Julio de 2012, 12:18:48
En un muy conocido libro, donde se programa en CCS:

"compilador ccs y simulador proteus para microcontroladores pic"

En la página 145 te explica y te da un ejemplo para lo que deseas.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: rivale en 13 de Julio de 2012, 12:25:02
Te dejo el link de un muy conocido libro, donde se programa en CCS.

http:...........................Compilador-C-CCS-e-Simulador-Proteus-para-Microcontroladores-Pic

En la página 145 te explica y te da un ejemplo para lo que deseas.


 :? :? :?, creo que no esta permitido ese contenido en el foro
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: PCCM en 13 de Julio de 2012, 12:51:40
Tienes razón, ya lo corregí.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: darck_khronos en 13 de Julio de 2012, 14:01:24
Migsantiago hiso algo parecido para hacerle ing^-1 al control del xbox en su pagina viene como hacerlo
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 13 de Julio de 2012, 14:45:15
Gracias a todos por sus respuestas. ((:-))
Voy a encararlo por medio del CPP. ;-)

Una vez concluido este trabajo, voy a meterme de cabeza (y eso es mucho decir porque soy bien cabezon!) en el aprendizaje de los diferentes usos del modulo CTMU, que me parece tiene mucho para darnos!! :mrgreen:
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: jeremylf en 13 de Julio de 2012, 15:45:48
Ojala esto sirva para el CTMU: http://forum.allaboutcircuits.com/showthread.php?t=63487
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 13 de Julio de 2012, 17:22:38
A veces resulta muy difícil medir flancos con el PIC.
El CTMU te servirá para medir tiempos pequeños con gran resolución (hasta de 1ns) y con poca exactitud (a no ser que lo calibres)

El CPP te servirá para medir tiempos más grandes con buena exactitud (la del cristal de cuarzo). En los nuevos PIC tienes una cola o pila de eventos. En las gamas más bajas no, y el siguiente flanco pisa al anterior.

¿Que precisión necesitas en ns o en %?
¿Cuál es el tiempo entre flancos aproximadamente?
¿Los flancos son repetitivos o necesitas medir tiempo entre dos flancos únicos?
¿Los flancos son de una misma señal o de señales diferentes?

Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 13 de Julio de 2012, 18:09:58
Ojala esto sirva para el CTMU: http://forum.allaboutcircuits.com/showthread.php?t=63487
Gracias, ya lo habia bajado y es para usar Touch capacitivo a traves del modulo CTMU (es otra de las posibilidades que tiene), pero no me sirve para lo que quiero hacer yo.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 13 de Julio de 2012, 18:22:50
A veces resulta muy difícil medir flancos con el PIC.
El CTMU te servirá para medir tiempos pequeños con gran resolución (hasta de 1ns) y con poca exactitud (a no ser que lo calibres)

El CPP te servirá para medir tiempos más grandes con buena exactitud (la del cristal de cuarzo). En los nuevos PIC tienes una cola o pila de eventos. En las gamas más bajas no, y el siguiente flanco pisa al anterior.

¿Que precisión necesitas en ns o en %?
¿Cuál es el tiempo entre flancos aproximadamente?
¿Los flancos son repetitivos o necesitas medir tiempo entre dos flancos únicos?
¿Los flancos son de una misma señal o de señales diferentes?

Saludos.
A ver si paso tu interrogatorio... :mrgreen: :mrgreen:
Se trata de un PIC18F26K80, o sea considerado uno de la nueva serie...

Los tiempos son de varios milisegundos entre flancos, provenientes de una sola señal.
Respecto a los tiempos, me interesa no perder ninguna ocurrencia, es decir el flanco final de un tiempo, es inicio del siguiente, se entiende??
Debo capturar las anormalidades, y ademas relevar la cadencia de los pulsos tambien.
Por otro lado, como lo que detecto son objetos que pasan, si pudiera detectar el tiempo en ON de la señal, y conociendo la velocidad de avance del objeto, podria hasta discriminar tamaños de esos objetos.
Esta ultima parte es bien importante para mi, ya que tambien puedo ver anormalidades de los objetos.

Mil disculpas si no aclaro demasiado bien, intento ser lo mas descriptivo posible, sin desnudar las bases del proyecto, creo que todos pueden entender mis razones.
Y de nuevo gracias por su colaboracion, hace unos cuantos dias que le doy vueltas al rosquete, y en unas pocas horas las colaboraciones que me hicieron me van aclarando el panorama. ((:-)) ((:-))
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: rivale en 13 de Julio de 2012, 18:29:55
como son ms creo que te serviria bien el CCP, checa el ejemplo que te puse, o los de redpic. puedes medir entre flancos o medir el tiempo en alto del pulso.

PD. cuando inicies los experimentos con el CTMU me uno para aportar en lo que pueda  :mrgreen:
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 13 de Julio de 2012, 19:52:55
El pic que utilizas creo que tiene una pila de 4 capturas, de manera que no pierdes la última captura.

Con esos tiempos lo mejor será utilizar el módulo CCP.
Puedes configurarle para que salte con flanco positivo y con flanco negativo, de manera que restando puedes saber todos los tiempos que quieras.

El módulo CCP tiene que trabajar de forma síncrona a 1/4 de Fosc (en ese micro puedes trabajar a 64Mhz y capturar con base de tiempos de 16Mhz)
Eso significa una resolución de 63ns o 16000 pulsos por ms.

El único problema es que tendrás que actualizar un contador de desbordamiento cada 4ms porque se producirá un desbordamiento del Timer que utilices. No hay problema porque tienes tiempo suficiente.


Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 13 de Julio de 2012, 20:00:43
Me he equivocado, no tienes pila de almacenamiento de capturas en ese micro.

De todas formas, con los tiempos tan grandes entre flancos, cada captura saltas a una interrupción que lea la captura, cambias el tipo de flanco a detectar y listo.

Sólo necesitarás pocos microsegundos antes de que pueda cambiar el flanco de entrada de nuevo.

Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: rivale en 13 de Julio de 2012, 20:05:17
no entendi lo de las pilas de captura, pero como tu base de tiempo es el timer1, si tienes un tiempo mayor al maximo que puede contar el timer 1, lo que haces es que el timer te genere una interreupcion cada que se desborde y asi vas contando cuantas veces se desbordo. y en el momento de la captura solo le agregas la fraccion del timer que se haya incrementado.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 13 de Julio de 2012, 20:52:28
Pila de capturas:

http://ww1.microchip.com/downloads/en/devicedoc/70135c.pdf
Página 79


Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: rivale en 13 de Julio de 2012, 20:55:44
Pila de capturas:

http://ww1.microchip.com/downloads/en/devicedoc/70135c.pdf
Página 79


Saludos.

Gracias Picuino ;-)
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 13 de Julio de 2012, 23:30:20
Espectacular !!
Voy a andar bien seguro!!
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 14 de Julio de 2012, 03:27:11
Tendrás algún problema con el contador de desbordamientos. Tienes que asegurarte de que no se desborde el timer mientras estás copiando los valores, porque leeras valores incorrectos (por ejemplo deshabilitando interrupciones durante la lectura)

Por otra parte tienes que asegurarte de que no se ha producido desbordamiento antes de la lectura del contador.

Es fácil: si el CCP tiene almacenado el valor 100 = se ha producido un desbordamiento antes de la captura. Asegúrate que el contador está actualizado
            si el CCP tiene almacenado el valor 65530, el desbordamiento se ha producido después de la captura. Asegúrate de leer un desbordamiento menos.

Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 14 de Julio de 2012, 10:28:07
No tiene interrupcion por desbordamiento el timer 1??
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: rivale en 14 de Julio de 2012, 12:15:37
si, el timer1 tiene interrupcion, puedes usar esa.

en cada lectura despues de leer el valor pones a cero el timer y asi comienza tu timer para que leas correctamente los valores, si se desborda en el inter usas la interrupcion del t1 para contar lo acumulado y sumarlo con lo que leas al momento de la captura
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 14 de Julio de 2012, 16:48:20
Si tiene interrupción y te puede servir para aumentar el contador de desbordamientos.

Uno de los problemas que puedes encontrar es, por ejemplo:
   Llega un flanco cuando el Timer1 vale 65530.
   Se captura el valor y se activa la interrupción del CCP1
   Saltas a la rutina de interrupción.
   A estas alturas el Timer1 vale 00002 y se ha producido desbordameinto.
   En la rutina de interrupción primero se comprueba el flag de interrupción del Timer1 y se actualiza el valor del contador de desbordamientos.
   A continuación se comprueba el flag de interrupción del CCP y se toma el dato de la captura y del contador de desbordamientos (que vale uno más de lo que debería)

Cuando quieras hacer cálculos, resulta que no son correctos.
Si cambias el orden del tratamiento de las interrupciones no lo solucionas, se puede dar otro error contando uno menos de lo que se debería.

Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: jukinch en 14 de Julio de 2012, 18:45:01
Hola MGLSOFT:
           No lo he implementado nunca al tema del cronómetro pero recuerdo este hilo que te va a ser de ayuda. Cito a Reiniertl.
               un abrazo.
                    Jukinch
Y además debes utilizar el TIMER en modo comparador con autorecarga. Es algo que TIMER1 puede hacer perfectamente. Así nunca tienes que volver a poner el valor de recarga en el TIMER por software.

Siendo el TIMER1 de 16 bits con dos registros de 8 bits (asumo que usas un PIC de 8 bits) no puedes actualizar la llamada set_timer1(65480); dentro de la ISR porque siempre  se consume tiempo en atender una ISR, lo peor es que nunca el tiempo es el mismo. Aunque el mecanismo de atención del uC siempre lleve el mismo tiempo, las interrupciones pueden estar temporalmente deshabilitadas, puede que el uC esté atendiendo otra interrupción cuando llega la solicitud de TIMER1, etc.

Lo mejor es que utilices el hardware con las configuraciones adecuadas, ello evitará tener que utilizar la recarga por software del temporizador, muy aconsejable si lo que intentas diseñar e implementar es un cronómetro.

Luego te queda aplicar las recomendaciones de jukinch

Un saludo
Reinier
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 15 de Julio de 2012, 07:22:34
En este caso lo mejor creo que es no recargar nada en el Timer.

Dejas que el timer se desborde y siga contando desde cero. Otro contador de 32 bits puede contar los desbordamientos.

En total tendrás 16bits del timer + 32 bits del contador de desbordamiento = 48 bits.

Si cuentas pulsos a 16Mhz, podrás contar tiempos hasta 203 días.

Para sumar y restar números de 48 bits puedes utilizar parte del código que he utilizado para mi frecuencímetro:

Firmware frecuencímetro YAF v0.8 (https://sites.google.com/site/picuino/ocxo_10mhz/Picuino_YAF_Freqmeter_v08.zip?attredirects=0)


El código del frecuencímetro todavía no está completo, pero ya funciona lo que está y funcionan las rutinas matemáticas de 48 bits.


Edito: Necesitas los ficheros que comienzan con math48 Eliminando el include al fichero "rs232.h"  (no debería estar ahí, ya lo he quitado para la próxima versión)

Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 15 de Julio de 2012, 09:55:52


Pensaba, despues de hacer algunas experiencias, hacer que el timer desborde, y en la interrupcion sumarle 65535 al registro de tiempo (de 32 bits), esto me permitiria almacenar muchos desbordamientos, que en mi caso me permitirian medir tiempos de hasta 150 milisegundos con buena precision.
Eso me alcanza bien.
Matematicamente, podria resolverlo mejor si en vez de guardar los 65535 guardo el valor en microsegundos equivalente, que debera estar en float, eso me dejaria mas rango al final, y con solo convertir el valor de la ultima captura y sumarlo tendria el tiempo de pulsos, no?

Seria algo asi:

| desborde 1  | desborde 2  | desborde 3  | desborde 4  | desborde 5  | desborde N  | intCCP y captura |
| acc tiempo1 | acc tiempo2 | acc tiempo3 | acc tiempo4 | acc tiempo5 | acc tiempoN | acc tiempo captura |
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 15 de Julio de 2012, 10:41:49
No entiendo bien qué quieres hacer.
Si quieres medir en microsegundos (y perder resolución) debes dividir el reloj de entrada al CCP para que llegue 1 pulso por microsegundo. Por ejemplo con reloj de 16Mhz divide por 16.

Te recomiendo que mantengas las cuentas con enteros siempre que puedas. En ocasiones son más precisos.

Si no quieres demasiado rango puedes sumar los desbordamientos en un entero de 16 bits cada desbordamiento del timer de 16 bits. Los dos juntos dan un entero largo de 32bits y no necesitas rutinas especiales.
Con pulsos cada microsegundo, podrás contar hasta 4000 segundos (una hora y pico)

Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 15 de Julio de 2012, 11:22:55
Creo que le voy agarrando la mano.
Partiendo de los ejemplos de Manolo, esto es lo que llevo hasta el momento:

Las constantes que uso:

Código: C
  1. float const uSxTick = 0.0625;       // Microsegundos por Tick de TMR1 a 64 Mhz
  2. float const uSxDesborde = 65535.0 * uSxTick;// Microsegundos a sumar en cada desborde
  3. float const mSxDesborde = 65535.0 * uSxTick / 1000.0;// Milisegundos a sumar en cada desborde

La interrupcion de Timer 1 acumula los milisegundos por desborde.

Código: C
  1. #INT_TIMER1    // Timer 1 overflow
  2. void handle_int_Timer1()
  3.    {
  4.      acc_useg_aux += mSxDesborde;                      
  5.    }

Cuando llega un flanco, acumula segun donde se haya predeterminado, en mi caso quiero el ancho del pulso en ON y el ancho del pulso total (Ton + Toff).
Eso lo hago en la captura, se que me querran matar porque tardo en hacer cuentas en la interrupcion, pero aun no se como hacerlo bien... :mrgreen: :mrgreen:

Código: C
  1. #int_ccp2
  2. void handle_ccp2_int()
  3. {
  4.   if(flagToggleFlanco==0)
  5.      {      // He recibido Flanco de Subida          
  6.        t1=get_timer1();            // Guardo en t1 el valor de TMR1 al Flanco de Subida  
  7.        mseg_S_On = acc_useg_aux +( t1 * uSxTick / 1000.0);  // Tiempo de señal ON  
  8.        setup_ccp2(CCP_CAPTURE_FE); // Configuro para capturar siguiente flanco de Bajada                                
  9.        flagToggleFlanco=1;         // Indico que el siguiente flanco será de Bajada  
  10.      }
  11.   else
  12.      {                      // He recibido Flanco de Bajada
  13.        t2=get_timer1();            // Guardo en t2 el valor de TMR1 al Flanco de Bajada
  14.        mseg_ep = acc_useg_aux +( t2 * uSxTick / 1000.0);  // Tiempo de pulso completo
  15.        setup_ccp2(CCP_CAPTURE_RE); // Configuro para capturar siguiente flanco de subida      
  16.        flagToggleFlanco=0;         // Indico que el siguiente flanco será de Subida
  17.        set_timer1(0);              // Reinicio TMR1  
  18.        acc_useg_aux = 0;           // y contador de tiempos.
  19.        if(flagHayDatos==0)
  20.           {        // Si los datos anteriores han sido procesados ...
  21.             flagHayDatos=1;           // Indico que ya hay nuevos datos de flancos para calcular
  22.           }
  23.       }                                  
  24. }

Luego mando por serie los datos...

Código: C
  1. if(flagHayTransmitir==1)
  2.         { // Si hay algo pendiente de transmitir ...
  3.  
  4.           printf("| TPulso: %6.3f miliseg.| TEPulsos: %6.3f miliseg.| \r\n",mseg_S_On, mseg_ep);
  5.           flagHayTransmitir=0;    // Indico que ya he transmitido lo pendiente.
  6.  
  7.            FLASH;                       // Reproduzco la entrada mediante un LEd en E0;
  8.         }

Si me lo revisan y comentan me haran gran favor...
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: rivale en 15 de Julio de 2012, 12:38:21
Exacto MGLsoft, a eso me referia, en cada interrupcion solo incrementas los segundos correspondientes al desbordamiento del t1.

creo que estas midiendo tu tiempo alrevez, cuando "flagToggleFlanco==0" estarias leyendo el tiempo del pulso en bajo, no el tiempo en alto, ya que entro a esa condicion en flanco de subida
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 15 de Julio de 2012, 14:46:18
En realidad tengo una entrada que funciona invertida, por eso lo di vuelta, pero eso va a ser diferente despues...
Buena vista para ver un detalle pequeño !! :mrgreen: :mrgreen:
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 15 de Julio de 2012, 19:36:07
Creo que tendrías más precisión si lees CCPR1H y CCPR1L.



Es mucho más rápido:
Código: C
  1. #define TOSC  (1.0/16000000)
  2.  
  3. long int acc_tmr1, t1;
  4.  
  5.  
  6. #INT_TIMER1    // Timer 1 overflow
  7. void handle_int_Timer1()
  8. {
  9.     acc_tmr1 += 65536;                      
  10. }
  11.  
  12.  
  13. #int_ccp2
  14. void handle_ccp2_int()
  15. {
  16.     if (flagToggleFlanco==0)
  17.     {      // He recibido Flanco de Subida          
  18.         t1 = get_timer1();            // Guardo en t1 el valor de TMR1 al Flanco de Subida  
  19.         ticks_On = acc_tmr1_aux + t1;  // Tiempo de señal ON
  20.  
  21.         //
  22.         //
  23.         // AQUÍ TIENES QUE ASEGURARTE DE QUE SI LEES  t1 = 10,   SE HA ACTUALIZADO YA  acc_tmr1_aux
  24.         //
  25.         //
  26.  
  27.  
  28.  
  29.         setup_ccp2(CCP_CAPTURE_FE); // Configuro para capturar siguiente flanco de Bajada                                
  30.         flagToggleFlanco=1;         // Indico que el siguiente flanco será de Bajada  
  31.     }
  32.          
  33. ...
  34.  
  35.  
  36.     if(flagHayTransmitir==1)
  37.     {     // Si hay algo pendiente de transmitir ...
  38.         printf("| TPulso: %6.3f miliseg.| TEPulsos: %6.3f miliseg.| \r\n", ticks_On * (TOSC * 1000), ticks_ep * (TOSC * 1000));
  39.         flagHayTransmitir=0;    // Indico que ya he transmitido lo pendiente.
  40.  
  41.         FLASH;                       // Reproduzco la entrada mediante un LEd en E0;
  42.     }

Todo queda en dos multiplicaciones en coma flotante (mucho más rápidas que las divisiones).
Vas a tener problemas si utilizas las mismas variables para capturar eventos y para transmitir. Tienes que utilizar diferentes variables y copiarlas deshabilitando interrupciones.

Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 16 de Julio de 2012, 21:21:49
Citar
Creo que tendrías más precisión si lees CCPR1H y CCPR1L.

Te refieres a que en estos registros se carga el valor del timer en el momento de la interrupcion de CCP, no es asi ??

Si, es posible, tampoco me molesta tener corridos unos microsegundos mi cuenta de tiempo, ya que sera mas o menos siempre el mismo corrimiento.
Igual es mas exacto hacerlo como dices.

Respecto a porque no guardo el valor del timer directamente, es porque de esta forma en 32 bits (una Float en CCS) puedo guardar mucho mas tiempo acumulado que si guardo y acumulo el valor entero del timer, para darte una idea un desborde del timer vale 65535 y el tiempo equivalente que guardo son 4,095 milisegundos.
Es decir, si lo hago con enteros es mejor y mas preciso, pero acumulo menos tiempo, se entiende??
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 17 de Julio de 2012, 06:47:50
Te refieres a que en estos registros se carga el valor del timer en el momento de la interrupcion de CCP, no es asi ??
Eso es.


Si, es posible, tampoco me molesta tener corridos unos microsegundos mi cuenta de tiempo, ya que sera mas o menos siempre el mismo corrimiento.
Tienes un  error de 1 ciclo (porque si la interrupción llega en medio de una instrucción de 2 ciclos, tarda un ciclo más en saltar)
Eso teniendo en cuenta que otras interrupciones no te afecten más.


Respecto a porque no guardo el valor del timer directamente, es porque de esta forma en 32 bits (una Float en CCS) puedo guardar mucho mas tiempo acumulado que si guardo y acumulo el valor entero del timer, para darte una idea un desborde del timer vale 65535 y el tiempo equivalente que guardo son 4,095 milisegundos.
Es decir, si lo hago con enteros es mejor y mas preciso, pero acumulo menos tiempo, se entiende??
No lo termino de entender. Con un float tienes una resolución total de 24 bits (el resto es el exponente)
Como yo te decía tienes una resolución total de 32 bits (16 del timer + otros 16 del contador de desbordamiento)

Es verdad que con el float no tienes límite de tiempo, pero para tiempos mayores de un segundo, comienzas a tener error (aunque es verdad que es muy pequeño).

Con entero de 32bits tienes un límite de 256 segundos y precisión total.

Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 17 de Julio de 2012, 12:17:27
Voy a hacerlo como dices, no me retes mas... :oops: :oops: :oops:
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 17 de Julio de 2012, 13:11:44
El frecuencímetro que estoy haciendo utiliza enteros de 48 bits. Puede contar pulsos de 80Mhz de forma seguida durante 40 dias.
La aritmética de coma flotante la he tenido que rehacer para que trabaje con 40 bits de mantisa y conseguir así suficiente precisión.
Aunque sea un reto y me divierta, me ha llevado mucho tiempo. Sobre todo corregir pequeños errores y decidir qué tenía que hacer cada rutina.

Si lo que haces es un trabajo y por ahora funciona, también puedes olvidarte de retos y seguir la máxima:  "Si funciona, no lo toques"

Los técnicos tenemos la manía de buscar soluciones tecnicas elegantes, potentes, caras y que el cliente no desea en absoluto.


Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 17 de Julio de 2012, 15:57:26
Toma en broma mis comentarios !! :mrgreen: :mrgreen: :D
Me gusta hacer chistes para que no sea demasiado formal el foro !! :D :D
Agradezco desde el alma toda la ayuda que me dieron, y por supuesto voy a depurar bien y comentar muy bien mi codigo, ya que dentro de un año ni yo voy a saber que hice aqui o que quise hacer... :D :D

Siempre en el arranque voy en forma desprolija, hago comentarios de rutinas completas pero no las saco del codigo, por las dudas aun las necesite, recien cuando le encuentro la vuelta comienzo a revisar bien y comentar todo.

Para los que comienzan:
Esto que escribi arriba es lo que NO HAY que hacer, especialmente cuando arrancan a programar, acostumbren a comentar hasta las instrucciones de reset del Watchdog... ;-) ;-) ((:-)) ((:-))
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 17 de Julio de 2012, 17:39:48
Pues adelante.
Yo tengo la manía de comentar poco los programas, pero he intentado hacer el soft del frecuencímetro lo más sencillo posible y todavía lo tengo fresco, de manera que puedo ayudarte si te atascas o necesitas ayuda.

Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 18 de Julio de 2012, 00:01:34
Lo hice como me recomendaste, Picuino, y la verdad es que tenias mucha razon, me estaba enloqueciendo con cuentas que no tenian razon de ser.
Aqui algunos resultados de mediciones (a mano, tapando el sensor de luz que estoy usando) de tiempos de 30 y 60 segundos, mirando el reloj de la PC.
Creo que es bastante preciso.

Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 18 de Julio de 2012, 06:37:31
¿Qué precisión necesitas? porque me da la impresión de que estás utilizando más resolución de la necesaria.
Quizás te valdría con el Timer1 funcionando a 1MHz o incluso menos. Así tienes mayor rango de tiempo de medida.


Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 18 de Julio de 2012, 08:47:16
Preciso medir milisegundos y decimas de milisegundos.
Si, en este momento estoy llevando esto mucho mas lejos de mis necesidades, es cierto.
Pero la velocidad del reloj del micro, necesito que sea la maxima del reloj interno, porque tengo comunicaciones en el medio, con precision muy importante en los tiempos de bit.
Asi como esta, transmite a 115200 bps sin problemas, lo que es muy auspicioso para mi, ya que voy a trabajar con CAN tambien a 250 K, y esta ultima es muy estricta en la precision del tiempo de bit.

Para bajar la resolucion del timer deberia usar prescaler, no??
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 18 de Julio de 2012, 13:50:25
El Timer1 tiene un preescaler pequeño  (hasta 1/8). Con esa precisión podrías utilizar el Timer0 con preescaler 1/256 que contaría en intervalos de 16us (tu necesitas intervalos de 100us, de manera que sería suficiente)

Cada 4ms te generará una interrupción en la que tendrías que sumar 256 a un contador de 32 bits.

En total podrías contar 19 horas antes de que el contador vuelva a cero.

Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 18 de Julio de 2012, 14:58:02
Pero entiendo que el modulo CPP, no funciona con el timer 0.
O me equivoco ?? :shock: :shock:
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 18 de Julio de 2012, 18:00:05
No te equivocas, pero la precisión que necesitas es baja. No te hace falta capturar con tanta precisión.

También puedes utilizar el Timer1 sin preescaler y tener en cuenta sólo el byte alto y descartar el byte bajo (para una precisión de 0.1ms tampoco necesitas el CCP con el Timer1)


Saludos.
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: MGLSOFT en 18 de Julio de 2012, 22:17:36
Perdon, quise decir centesimas de milisegundo... :oops:
Título: Re: Alguien a usado el modulo CTMU de los PIC18F ??
Publicado por: Picuino en 19 de Julio de 2012, 08:37:10
Con esa precisión, tampoco necesitas el CCP. Podrías utilizar el TMR0 con prescaler en 1/128 para tener precisión de 8 microsegundos (necesitas 10 microsegundos, de manera que 8 van sobrados).

El Timer0 desbordará cada 2milisegundos.

Saludos.