Autor Tema: MikroC DTMF PWM+TMR2  (Leído 3197 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
MikroC DTMF PWM+TMR2
« en: 22 de Enero de 2011, 16:52:03 »
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

Código: [Seleccionar]
//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);
  }
}

Lo que no me destruye, me fortalece

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: MikroC DTMF PWM+TMR2
« Respuesta #1 en: 22 de Enero de 2011, 20:46:31 »
La forma de hacerlo es tal como lo harias en ASM; una de las ventajas de los productos de MikroE, es que las configuraciones del micro las haces usando los mismos nombres de sus registros. (OPTION.TOIE = 1 o 0)

Para comenzar prueba usando Mikroc Pro la version 4.10 o 4.15, es lo mejorcito que hay en cuanto a compiladores para PICs.

Desconectado fenixariel

  • PIC10
  • *
  • Mensajes: 39
    • www.delphiandpic.jimdo.com
Re: MikroC DTMF PWM+TMR2
« Respuesta #2 en: 22 de Enero de 2011, 20:55:11 »
Mira este es el ejemplo que viene con la version 4.10, y se parece bastante al tuyo, dale una revisada mas a tu codigo y hardware.


unsigned short cnt;

void interrupt()
{
     if (TMR2IF_bit)
     {
         cnt++;              
         TMR2IF_bit = 0;        
         TMR2 = 0;
     }
}

void main()
{
     cnt = 0;                    
     ANSEL  = 0;              
     ANSELH = 0;
     C1ON_bit = 0;            
     C2ON_bit = 0;
     PORTB = 0xFF;              
     TRISB =   0;              
     T2CON = 0xFF;              
     TMR2  =   0;                
     TMR2IE_bit = 1;            
     INTCON = 0xC0;          

     while (1)
    {            
        if (cnt >= 32)
       {
           PORTB = ~PORTB;      
           cnt = 0;              
       }
    }
}
« Última modificación: 22 de Enero de 2011, 20:59:11 por fenixariel »


 

anything