Hola foro;
Aqui nuevamente molestando con una duda, estoy trabajando con la generacion de tonos DMTF por software, auxiliandome de un PWM y TMR2 para despues generar una onda senoidal por medio de un filtro pasivo. Pero tengo ciertas dudas para trabajar en MikroC, mi duda es como habilitar la interrupción por medio del TMR2, he estado tratando de realizarlo pero creo que algo se me esta pasando. Dejo por aqui el codigo para ver si alguien me puede hechar una mano o tips. El pic que utilizo es el PIC16F877 Saludos
//Tabla de Senos Unipolar
const unsigned int SINE_WAVE[256]={
128,131,134,137,140,144,147,150,153,156,159,162,165,168,171,174,
177,179,182,185,187,191,193,196,199,201,204,206,209,211,213,216,
218,220,222,224,226,228,230,232,233,235,237,239,240,241,243,244,
245,246,248,249,250,250,251,252,253,253,254,254,254,255,255,255,
255,255,255,255,254,254,254,253,253,252,251,250,250,249,248,246,
245,244,243,241,240,239,237,235,234,232,230,228,226,224,222,220,
218,216,213,211,209,206,203,201,199,196,193,191,188,185,182,179,
177,174,171,168,165,162,159,156,153,150,147,144,140,137,134,131,
128,125,122,119,116,112,109,106,103,100,97,94,91,88,85,82,79,76,
74,71,68,65,63,60,57,54,52,49,47,45,43,40,38,36,34,32,30,28,26,
24,22,21,19,17,16,15,13,12,11,10,8,7,6,6,5,4,3,3,2,1,1,1,1,1,1,
1,1,1,2,2,2,3,3,4,5,6,6,7,8,10,11,12,13,15,16,17,19,21,24,26,28,
30,32,34,36,38,40,43,45,47,50,52,55,57,60,63,65,68,71,74,77,79,
82,85,88,91,94,97,100,103,106,109,112,116,119,122,125,128};
//Definición de valores de los incrementos
#define DTMF_ROW1 23 // incremento para 700 Hz, cada 128us
#define DTMF_ROW2 25 // incremento para 750 Hz, cada 128us
#define DTMF_ROW3 28 // incremento para 850 Hz, cada 128us
#define DTMF_ROW4 31 // incremento para 950 Hz, cada 128us
#define DTMF_COLA 40 // incremento para 1200 Hz, cada 128us
#define DTMF_COLB 44 // incremento para 1350 Hz, cada 128us
#define DTMF_COLC 48 // incremento para 1500 Hz, cada 128us
//Variables Globales
unsigned long index1,index2;
int inc1,inc2;
volatile int wave;
//Interrupción
void interrupt(void)
{
if(TMR2IF_bit==1)
{
wave = 0;
wave = ((long)SINE_WAVE[index1]+(long)SINE_WAVE[index2])/2;
PWM1_Set_Duty(wave);
index1 += inc1;
index2 += inc2;
if(index1 >= 256)
index1 -= 256;
if(index2 >= 256)
index2 -= 256;
TMR2IF_bit=0;
}
//PR2=128;
}
//Función Generadora de tonos
void generate_dtmf_tone(char keypad, long duration)
{
index1=0; index2=0; inc1=0; inc2=0;
if((keypad=='1')||(keypad=='2')||(keypad=='3'))
inc1=DTMF_ROW1;
else if((keypad=='4')||(keypad=='5')||(keypad=='6'))
inc1=DTMF_ROW2;
else if((keypad=='7')||(keypad=='8')||(keypad=='9'))
inc1=DTMF_ROW3;
else if((keypad=='*')||(keypad=='0')||(keypad=='#'))
inc1=DTMF_ROW4;
if((keypad=='1')||(keypad=='4')||(keypad=='7')||(keypad=='*'))
inc2=DTMF_COLA;
else if((keypad=='2')||(keypad=='5')||(keypad=='8')||(keypad=='0'))
inc2=DTMF_COLB;
else if((keypad=='3')||(keypad=='6')||(keypad=='9')||(keypad=='#'))
inc2=DTMF_COLC;
//enable_interrupts(INT_TIMER2);
T2CON=0b00101111;
//enable_interrupts(GLOBAL);
INTCON=0b10000000;
while(duration-- > 0)
{
Delay_ms(1);
}
//disable_interrupts(GLOBAL);
INTCON=0b00000000;
//disable_interrupts(INT_TIMER2);
T2CON=0b00101011;
//set_pwm1_duty(0x80);
//PWM1_Set_Duty(0x80); //Periodo de 128 us
}
//Programa Principal
void main()
{
char k;
//Configuración de Pines
ADCON1=7; //Todos los pines como digitales
TRISC=0; //Puerto C como salida
//Configuración del PWM
PWM1_Init(7812); //Frecuencia de Muestreo Fs
PWM1_Start();
//PWM1_Set_Duty(0x80); //Periodo de 128 us
//Configuración del Timer 2
T2CON=0b00101111;
PR2=128;
//Interrupciones Deshabilitadas al inicializar
INTCON=0b00000000;
while(1)
{
k=1;
if(k!=0)
generate_dtmf_tone(k,5000);
}
}