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.
