Manolo, es exactamente lo q hago. Pero si uso la interrupcion por flanco, me quedo sin modulo CCP para el pwm (necesito 2 pwm).
Esto es lo que tengo hasta ahora:
#include <16f877a.h>
#fuses XT,NOWDT,NOPROTECT,NOLVP,PUT,NOBROWNOUT
#use delay(clock=4000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,parity=N,bits=8,stop=1)
unsigned long int contador=0, T=0;
int flag=0;
float f=0;
#INT_CCP1
void handle_ccp1_int()
{
T = contador; //periodo=cantidad de interrupciones
contador = 0;
f = 1000.0 / (float)T; //frecuencia=1/Tms
if(!input(PIN_D0)) //leemos el otro canal para saber la direccion
f*=-1.0;
set_timer1(64543);
flag=1;
}
#INT_TIMER1
void handle_timer1_int()
{
contador++;
set_timer1(64543); //interrumpe cada 1ms
}
void main()
{
set_tris_d(0x01);
setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
setup_ccp1(CCP_CAPTURE_RE);
enable_interrupts(INT_CCP1);
enable_interrupts(INT_TIMER1);
enable_interrupts(GLOBAL);
set_timer1(64543);
while(TRUE)
{
if(flag)
{
flag=0;
printf("T=%ldms f=%fHz \r\n",T
,f
); }
}
}
Funciona a la perfeccion, asiq pense en usar el otro modulo CCP para leer el segundo encoder, y generar el pwm por software. Salvo q encuentre otra forma de leer los encoders sin usar el modulo CCP.
Algec, ahi vi tu codigo, pero no resuelve mi problema. Si hago funcionar lo mio veo de darte una mano
Gracias por su ayuda muchachos, saludos!