Guest
|
Re: EX_DTMF.C |
Posted: Fri Apr 01, 2005 8:39 am |
|
|
ljbeng wrote: | I built the R2R network in the example EX_DTMF.C and used the code pretty much unaltered. I did not use the keypad and just send specific tones. The DTMF sounds good on a speaker and I can hold a phone to the speaker and dial my cell number.
When I feed the tone into a CD22204 DTMF tone decoder, it only recognizes tones 7,8,9,*,0. It does not recognize any other tone. I have used these chips before on very noisy DTMF tones and they worked pretty good. Does anyone have any experience with this example or the CD22204? Thanks. |
Try this, larger amplitude for high frequency tone, smaller amplitude for low frequency tone, and also for 4x4 keypad,
Code: | // tone_out.c 2002/02/20
/* -------------------------------------------------------------------------------
F_Low F_High TONE HM9270_Q4 Q3 Q2 Q1 Hex_from_HM9270
pin_A3 A2 A1 A0 PORTA & 0x0F
------------------------------------------------------------------------------- */
#define TONE_1 0x01 // 697 1209 1 0 0 0 1 1
#define TONE_2 0x02 // 697 1336 2 0 0 1 0 2
#define TONE_3 0x03 // 697 1477 3 0 0 1 1 3
#define TONE_4 0x04 // 770 1209 4 0 1 0 0 4
#define TONE_5 0x05 // 770 1336 5 0 1 0 1 5
#define TONE_6 0x06 // 770 1477 6 0 1 1 0 6
#define TONE_7 0x07 // 852 1209 7 0 1 1 1 7
#define TONE_8 0x08 // 852 1336 8 1 0 0 0 8
#define TONE_9 0x09 // 852 1477 9 1 0 0 1 9
#define TONE_0 0x0A // 941 1336 0 1 0 1 0 a
#define TONE_mi 0x0B // 941 1209 * 1 0 1 1 b
#define TONE_pa 0x0C // 941 1477 # 1 1 0 0 c
#define TONE_A 0x0D // 697 1633 A 1 1 0 1 d
#define TONE_B 0x0E // 770 1633 B 1 1 1 0 e
#define TONE_C 0x0F // 852 1633 C 1 1 1 1 f
#define TONE_D 0x00 // 941 1633 D 0 0 0 0 0
// -------------------------------------------------------------------------------
const unsigned int SINE_WAVE_HIGH[256] = { // Sine wave amplitude range : 8 ~ 248
128,131,134,137,140,143,146,149,151,154,157,160,163,166,168,
171,174,177,179,182,185,187,190,192,195,197,199,202,204,206,
209,211,213,215,217,219,221,223,224,226,228,229,231,232,234,
235,236,238,239,240,241,242,243,244,244,245,246,246,247,247,
247,248,248,248,248,248,248,248,247,247,247,246,246,245,244,
244,243,242,241,240,239,238,236,235,234,232,231,229,228,226,
224,223,221,219,217,215,213,211,209,206,204,202,199,197,195,
192,190,187,185,182,179,177,174,171,168,166,163,160,157,154,
151,149,146,143,140,137,134,131,128,125,122,119,116,113,110,
107,105,102, 99, 96, 93, 90, 88, 85, 82, 79, 77, 74, 71, 69,
66, 64, 61, 59, 57, 54, 52, 50, 47, 45, 43, 41, 39, 37, 35,
33, 32, 30, 28, 27, 25, 24, 22, 21, 20, 18, 17, 16, 15, 14,
13, 12, 12, 11, 10, 10, 9, 9, 9, 8, 8, 8, 8, 8, 8,
8, 9, 9, 9, 10, 10, 11, 12, 12, 13, 14, 15, 16, 17, 18,
20, 21, 22, 24, 25, 27, 28, 30, 32, 33, 35, 37, 39, 41, 43,
45, 47, 50, 52, 54, 57, 59, 61, 64, 66, 69, 71, 74, 77, 79,
82, 85, 88, 90, 93, 96, 99,102,105,107,110,113,116,119,122,
125};
CONST unsigned int SINE_WAVE_LOW[256] = { // Sine wave amplitude range : 43 ~ 213
128,130,132,134,136,138,140,143,145,147,149,151,153,155,157,
159,161,162,164,166,168,170,172,173,175,177,179,180,182,184,
185,187,188,190,191,192,194,195,196,197,199,200,201,202,203,
204,205,206,207,207,208,209,209,210,210,211,211,212,212,212,
213,213,213,213,213,213,213,213,213,212,212,212,211,211,210,
210,209,209,208,207,207,206,205,204,203,202,201,200,199,197,
196,195,194,192,191,190,188,187,185,184,182,180,179,177,175,
173,172,170,168,166,164,162,161,159,157,155,153,151,149,147,
145,143,140,138,136,134,132,130,128,126,124,122,120,118,116,
113,111,109,107,105,103,101, 99, 97, 95, 94, 92, 90, 88, 86,
84, 83, 81, 79, 77, 76, 74, 72, 71, 69, 68, 66, 65, 64, 62,
61, 60, 59, 57, 56, 55, 54, 53, 52, 51, 50, 49, 49, 48, 47,
47, 46, 46, 45, 45, 44, 44, 44, 43, 43, 43, 43, 43, 43, 43,
43, 43, 44, 44, 44, 45, 45, 46, 46, 47, 47, 48, 49, 49, 50,
51, 52, 53, 54, 55, 56, 57, 59, 60, 61, 62, 64, 65, 66, 68,
69, 71, 72, 74, 76, 77, 79, 81, 83, 84, 86, 88, 90, 92, 94,
95, 97, 99,101,103,105,107,109,111,113,116,118,120,122,124,
126};
int8 index1,index2,inc1,inc2;
#INT_RTCC
void wave_generator()
{
int16 wave;
set_rtcc(25); // when clock is 20MHz, interrupts every 100us
wave = SINE_WAVE_LOW[index1] ;
wave += SINE_WAVE_HIGH[index2];
wave >>= 1;
PORTD = wave ;
index1 += inc1; //if(index1 >= 256) index1 -= 256; // Wu, 2003/02/26
index2 += inc2; //if(index2 >= 256) index2 -= 256;
}
#define DTMF_ROW1 18 //18 for 697 Hz, increment this many times every 100us
#define DTMF_ROW2 20 //20 for 770 Hz, for SIN_WAVE[256]
#define DTMF_ROW3 22 //22 for 852 Hz,
#define DTMF_ROW4 24 //24 for 941 Hz,
#define DTMF_COLA 32 //32 for 1209 Hz,
#define DTMF_COLB 35 //34 for 1336 Hz, changed to 35, 2003/03/04
#define DTMF_COLC 38 //38 for 1477 Hz,
#define DTMF_COLD 43 //42 for 1633 Hz,
void generate_dtmf_tone(int8 keypad, long duration) {
index1=0; index2=0; inc1=0; inc2=0;
if ((keypad== 1)||(keypad== 2)||(keypad== 3)||(keypad==13)) inc1=DTMF_ROW1;
else if((keypad== 4)||(keypad== 5)||(keypad== 6)||(keypad==14)) inc1=DTMF_ROW2;
else if((keypad== 7)||(keypad== 8)||(keypad== 9)||(keypad==15)) inc1=DTMF_ROW3;
else if((keypad==11)||(keypad==10)||(keypad==12)||(keypad== 0)) inc1=DTMF_ROW4;
if ((keypad== 1)||(keypad== 4)||(keypad== 7)||(keypad==11)) inc2=DTMF_COLA;
else if((keypad== 2)||(keypad== 5)||(keypad== 8)||(keypad==10)) inc2=DTMF_COLB;
else if((keypad== 3)||(keypad== 6)||(keypad== 9)||(keypad==12)) inc2=DTMF_COLC;
else if((keypad==13)||(keypad==14)||(keypad==15)||(keypad== 0)) inc2=DTMF_COLD;
setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
enable_interrupts(INT_RTCC);
enable_interrupts(GLOBAL);
while ( duration-- > 0 ) delay_us(1000);
disable_interrupts(INT_RTCC);
output_d(0);
}
|
Best wishes |
|