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:
¿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:
#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;
}
Para CCP no te sirven los ejemplos de RedPIC :roll:
http://www.todopic.com.ar/foros/index.php?topic=14427.0
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.
Ojala esto sirva para el CTMU: http://forum.allaboutcircuits.com/showthread.php?t=63487Gracias, 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.
A veces resulta muy difícil medir flancos con el PIC.A ver si paso tu interrogatorio... :mrgreen: :mrgreen:
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.
Pila de capturas:
http://ww1.microchip.com/downloads/en/devicedoc/70135c.pdf
Página 79
Saludos.
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
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 ??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)
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.No lo termino de entender. Con un float tienes una resolución total de 24 bits (el resto es el exponente)
Es decir, si lo hago con enteros es mejor y mas preciso, pero acumulo menos tiempo, se entiende??