TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: pulpin en 30 de Agosto de 2008, 17:11:13
-
Amigos recurro a su ayuda despues de cumplir con la tarea de buscar en la web toda la noche pasada.
Mi proyecto consiste en generar tonos dtmf desde el pic...osea generar las frecuencias de los mismos...sabemos que son necesarias dos frecuencias diferentes a la vespara cada tono....por lo que me a quedado muy dificil usar los dos pwm ya que trabajan a la misma frecuencia....una de las soluciones que he implementado es usar un pwm y la interrupcion RTCC pero los tiempos de la interrupcion son muy lentos (256us) lo que no me sirve para aproximarme adecuadamente a los tonos bajos (697-770-852-941)hz...
Luego de ver este inconveniente opte por usar el timer2 que es muy rapido. dentro de su interrupcion realizar los conteos pertinentes para determinar cada tono.
#include <16F73.h>
#FUSES NOWDT, HS, NOPUT, NOPROTECT, NOBROWNOUT
#use delay(clock=20000000)
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
#use fast_io (C)
int tonoa,tonob,conta,contb;
int16 tiempo;
#int_TIMER2
TIMER2_isr()
{
conta++;
contb++;
if(tonoa==conta)
{
output_toggle(PIN_C0);
conta=0;
}
if(tonob==contb)
{
output_toggle(PIN_C1);
contb=0;
}
}
void main()
{
set_tris_c(0x11111000);
setup_timer_2(T2_DIV_BY_1,16,1);
enable_interrupts(INT_TIMER2);
enable_interrupts(GLOBAL);
/*tonoa=18; //1633
tonoa=20; //1477
tonoa=22; //1336
tonoa=24; //1220
tonob=31; //941
tonob=34; //862
tonob=38; //772
tonob=42; //698*/
tiempo=500;
while(true)
{
tonoa=23; //1
tonob=42;
delay_ms(tiempo);
tonoa=22; //2
delay_ms(tiempo);
tonoa=20; //3
delay_ms(tiempo);
tonoa=24; //4
tonob=38;
delay_ms(tiempo);
tonoa=22; //5
delay_ms(tiempo);
tonoa=20; //6
delay_ms(tiempo);
tonoa=24; //7
tonob=34;
delay_ms(tiempo);
tonoa=22; //8
delay_ms(tiempo);
tonoa=20; //9
delay_ms(tiempo);
tonoa=24; //0
tonob=31;
delay_ms(tiempo);
tonoa=22; //*
delay_ms(tiempo);
tonoa=20; //#
delay_ms(tiempo);
tonob=42; //A
tonoa=18;
delay_ms(tiempo);
tonob=38; //B
delay_ms(tiempo);
tonob=34; //C
delay_ms(tiempo);
tonob=31; //D
delay_ms(tiempo);
}
}
luego de realizar los calculos para cada tono y verificar con mi osciloscopio..puede notar que los tonos generados eran los adecuados.....!!!!pero aparecio el problema...... dentro de mi while solo llega hasta cierto punto. nunca realiza los retardo y genera todos los tonos....... he buscado sobre el timer2 todos los usos los pongo como he visto pero aun asi nada.... y no se que mas hacer...si creen que estoy usando mal el timer2 diganmelo o indiquenme otras alternativas...desde ya muchas gracias amigos. :(
-
Hola.
Puedes usar el Timer0 haciendo que se desborde mas rapido de lo normal, es decir a menor tiempo de 256uS. Revisa la funcion de set_timer0(value); y mira si depronto te sirve.
Saludos
EDITO: 256uS es el tiempo de desborde del timer cuando trabajas a 4MHz (fuse XT).
-
Qué tal!
Pues en esta parte:
una de las soluciones que he implementado es usar un pwm y la interrupcion RTCC pero los tiempos de la interrupcion son muy lentos (256us) lo que no me sirve para aproximarme adecuadamente a los tonos bajos (697-770-852-941)hz...
Luego de ver este inconveniente opte por usar el timer2 que es muy rapido. dentro de su interrupcion realizar los conteos pertinentes para determinar cada tono.
Creo que hay un error de conceptos, de todos modos me corriges MLO si el error es mío.
Yo tengo entendido que la velocidad de los temporizadores depende de la fuente de oscilación que se esté usando en el micro... o sea que eso de que un timer sea más rápido que otro... creo que no es así... lo que sí es cierto es que hay temporizadores que permiten más posibilidades de pre-escalas, haciendo posible contar tiempos más largos... pero eso ya es cuestión de las opciones del timer, no que cuente más rápido o más lento.
Por eso MLO te menciona que también puedes usar tranquilamente el timer0, configurándolo apropiadamente para que cuente el tiempo que tú deseas, que en este caso es bastante rápido.
Ok no más quise aclarar ese punto...
Te deseo éxito con tu programa!
Un cordial saludo a todos! :mrgreen:
-
Hola.
Es correcto Javier, uno tiene un tiempo fijo de conteo o "tick" el cual depende del cristal, en el caso del amigo pulpin es de 200nS. El timer se puede cargar con un valor para que la interrupcion se haga mas "rapido" de lo normal. De hecho con la interrupcion completica del Timer0 estamos hablando de una frecuencia minima de 9.76kHz y una frecuencia maxima de unos 2.5MHz!!!! (en teoria claro esta!!!). Se puede escoger la frecuencia dando la precarga con la funcion set_timer0(value);
No he manejado los tonos DTMF, asi que no se que valores de frecuencias seran.
Saludos