|
|
View previous topic :: View next topic |
Author |
Message |
Newbee Guest
|
Newbee question: ex_tones |
Posted: Thu Sep 14, 2006 1:29 pm |
|
|
Good afternoon !
Im using mostly the same part of the ex_tones example for generating sound from 1khZ to 70 Khz. If i attach the oscilloscope to see what i get as output, all looks fine accept one small problem.
I use this calculation for generating 1 KHZ at 8mhz :
Code: |
const long KHZ_1[1] = {2500}; // one khz
const long KHZ_2[1] = {5000}; // 2 khz
const long KHZ_4[1] = {10000};// 4 khz
...
const long KHZ_16[1] = {40000}; // 16khz
const long KHZ_20[1] = {50000}; // 20 khz
|
... you get the picture.
in the main part i call
This will play cca 3 seconds of the 16khz sound.
If i call :
this will play 3 seconds of 20khz signal.
I can reach all freq. ( till 70 khz ) but i can not play the 20 and above khz sound longer than 1 second ( sometimes even less than second ) and i want output it for 3 seconds. I can see on the osciloscop that the freq. is right but the time is much too quick. This happens only on freq. greater than 20 khZ. How should i the make calculation ? |
|
|
Newbee Guest
|
|
Posted: Fri Sep 15, 2006 5:30 am |
|
|
any idea ?
by the way, can this be hardware problem ?
I have tested values till 20 and 20 khz with no problems.
All other freq. greater than 20 khZ do not work. |
|
|
Guest
|
|
Posted: Fri Sep 15, 2006 8:19 am |
|
|
Havenīt looked at the code but maybe some variable is not long enough to hold the correct value after this frequency and time. Look at the calculations, figure out the ones that receive big values and change them to int32. |
|
|
Ttelmah Guest
|
|
Posted: Fri Sep 15, 2006 8:29 am |
|
|
First screaming comment. The idea of using arrays to hold single values, is ludicrous. Either just declare the values (no in arrays), or have a single array, and 'define' symbolic names for the entries.
However the reason the code will fail, is that it is not designed to handle values this fast (think audio only). As the other poster has said, think value sizes. Maximum value for the tone, is 65535 (long), and with your 2.5* scaling, this is 26214Hz. Even before this though, the frequencies will show a significant error...
Best Wishes |
|
|
Newbee Guest
|
|
Posted: Fri Sep 15, 2006 10:07 am |
|
|
Hallo !
Quote: | First screaming comment. |
Quote: | figure out the ones that receive big values and change them to int32. | i changed that but it looks like there is still problem with calculations.
Code: |
const long KHZ_1 = 2500;
const long KHZ_2 = 5000;
const long KHZ_4 = 10000;
const long KHZ_8 = 20000; |
Quote: | Maximum value for the tone, is 65535 (long), and with your 2.5* scaling, this is 26214Hz. | . I have made the changes but im missing the calculations, becuse the problem is the same. What ( accept listed before ) must i change to reach over 20 khZ and where can i make this changes. ? |
|
|
Newbee Guest
|
|
Posted: Sun Sep 17, 2006 11:58 am |
|
|
Becuse the freq over 22 khz is very difficult to see on the old osciloscop ( like mine ) i have several problems.
I can not check if im doing wright or not.
I have added LED to light after the khz cycle is over and this if functioning until i pass 20 khz ( last post ).
I have changed vars to int32 (max 2,147,483,647) but program stucks again over 20khz.
Can someone give me some example what else should i do becuse i dont understand the parts related to total delay time and number of periods.
How should i make recalculation and is this all to it or do i have to change something else.
This is the main part of original( without my changes )tones.c code from ccs that im using. Main changes i did was that i have changed the freq note to 1khz - 30 khz.
Code: | const long KHZ_1 = 2500;
const long KHZ_2 = 5000;
void do_delay(int ms_delay, int num_ms, int us_delay, int num_us) {
int i;
for(i=0;i<num_ms;i++)
delay_ms(250);
delay_ms(ms_delay);
for(i=0;i<num_us;i++)
delay_us(250);
delay_us(us_delay);
}
void generate_tone(long frequency, long duration)
{
int32 total_delay_time; // in microseconds
long total_ms_delay_time, total_us_delay_time;
int num_us_delays, num_ms_delays, ms_delay_time, us_delay_time;
long num_periods;
total_delay_time = (1000000/frequency)/2-10; // calculate total delay time (10 for error)
total_ms_delay_time = total_delay_time/1000; // total delay time of ms
num_ms_delays = total_ms_delay_time/250; // number of 250ms delays needed
ms_delay_time = total_ms_delay_time%250; // left over ms delay time needed
total_us_delay_time = total_delay_time%1000; // total delay time of us (ms already acounted for)
num_us_delays = total_us_delay_time/250; // number of 250us delays needed
us_delay_time = total_us_delay_time%250; // left over us delay time needed
num_periods = ((int32)duration*1000)/(1000000/frequency);
while((num_periods--) != 0)
{
do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
output_high(TONE_PIN);
do_delay(ms_delay_time, num_ms_delays, us_delay_time, num_us_delays);
output_low(TONE_PIN);
}
return;
}
|
|
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Sun Sep 17, 2006 8:06 pm |
|
|
Code: | num_periods = ((int32)duration*1000)/(1000000/frequency); |
If duration is 6000 and frequency is 50000 then num_periods would be 300000 which
won't fit. |
|
|
Newbee Guest
|
|
Posted: Mon Sep 18, 2006 4:50 am |
|
|
/* dur. freq. # periods
// (6000 * 1000 )/(1000000/50000 )= 6000000 / 20 = 300 000
I have changed the num_periods to int32 and now i have this situation:
Code: | const struct note
{ long tone;
long length;
} khz[2] = { KHZ_1, 2000, // playing time cca 2 second
KHZ_20,2000 // playing time cca 7 seconds
};
LED lights |
If i set 22 khz i can hear 1KHZ and 22khz stats to play, but then again program hangs and there is no light on cycle end
( he never ends ).
Code: | This is my KHZ table:
const long KHZ_1 = 2500;
const long KHZ_2 = 5000;
const long KHZ_4 = 10000;
const long KHZ_8 = 20000;
const long KHZ_16 = 40000;
const long KHZ_18 = 45000;
const long KHZ_20 = 50000;
const long KHZ_22 = 55000;
const long KHZ_24 = 60000;
const long KHZ_26 = 65000;
const long KHZ_28 = 70000;
const long KHZ_30 = 75000; |
Is there something else i should change to get proper khz output ? |
|
|
Mark
Joined: 07 Sep 2003 Posts: 2838 Location: Atlanta, GA
|
|
Posted: Mon Sep 18, 2006 6:37 am |
|
|
Do you own a calculator?
Code: | total_delay_time = (1000000/frequency)/2-10; // calculate total delay time (10 for error)
|
= (1000000/55000)/2 - 10
= 18/2 - 10
= 9 - 10
which isn't going to work |
|
|
Ttelmah Guest
|
|
Posted: Mon Sep 18, 2006 7:24 am |
|
|
Also
Code: |
const long KHZ_28 = 70000;
const long KHZ_30 = 75000;
|
Won't work.
The whole of this post, has the 'ring', of somebody trying to use a 'nut to crack a sledgehammer'... The 'tones' program is designed to produce audio tones. There are a whole set of new problems that will appear as signals (not tones, once you are above 20KHz), get faster.
Realistically, if you want to develop hgh frequency signal with reasonable accuracies, look at using the hardware timer modules.
Best Wishes |
|
|
Newbee Guest
|
|
Posted: Mon Sep 18, 2006 8:23 am |
|
|
Quote: | Do you own a calculator? |
Im laughting for last 2 minutes :-)). Mark you rule !. Keep that spirit !
Ttelmah is "unfortunately" right. I can play freq. till 24 khz but after that, freq. get mixed up and you can see them and sometimes hear them (26 khz (!?)), so "i guess" that he is not playing right freq. :-)
If there is a chance i want to stick to this code. Now i partly know how is this working so if there is possibility to continue on this code, please be so kind and point me into right direction.
Quote: | There are a whole set of new problems that will appear.. |
Becuse you both know why will there be problems, please give me idea how to solve this.. |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
Powered by phpBB © 2001, 2005 phpBB Group
|