View previous topic :: View next topic |
Author |
Message |
kylemorin
Joined: 11 Mar 2007 Posts: 4
|
Function to generate square waves at desired frequencies |
Posted: Sun Mar 11, 2007 6:13 pm |
|
|
Hello all,
Here is an example program I made to demonstrate how to play sounds with a PIC microcontroller. It utilizes a function I wrote, "playtone()" to create a square wave of a set frequency (Hz) and set duration (ms).
Usage: playsound(float frequency, float duration);
Code: | //////////////////////////////////////////////////////////////////
//// Playsound.C ////
//// ////
//// Author: Kyle J. Morin ////
//// Date: March 11, 2007 ////
//// ////
//// Description: This example program shows how to ////
//// manually generate sounds for a specified amount of ////
//// time. The function playsound() was created as a ////
//// a viable, more precise alternative to generate_tone() ////
//////////////////////////////////////////////////////////////////
#INCLUDE <12F683.h> // Include the standard header file for the PIC12F683
#USE delay(clock=4000000) // Tell the delay functions the processor speed (4 MHz) so delay timing is correct
#FUSES nomclr, nowdt // Master clear pin used for I/O, no watch dog timer
//***************************************************************//
// DESCRIPTION: Plays a specified sound for a specified duration //
// PARAMETERS: Frequency in hertz, duration in milliseconds //
//***************************************************************//
int16 freq_truncated, playtime_truncated; // Declare 16-bit variables for frequency, playtime and delaytime
int16 i; // Declare i as a 16-bit counter variable (it will be used later in loops)
void playsound(float frequency, float duration)
{
frequency = 1000000 / frequency; // This is to figure out how many microseconds each period will take to complete
frequency = frequency - 72; // Offset this # by -72. This is because the instructions in the sound loop take
// time to complete and henceforth lower the actual frequency heard. We want precise tones.
freq_truncated = frequency; // Convert the 32-bit floating point frequency to a 16-bit number delay functions can understand
duration = ( duration*1000 )/freq_truncated; // Figure out how many cycles are required to play sound
playtime_truncated = duration; // This number is stored in the 16-bit "playtime_truncated" variable
shift_right( &freq_truncated,2,0 ); // Divide freq_truncated by 2 using a "shift right" bit-shifting operation
for ( i=1 ;i <= playtime_truncated; ++i ) // This funciton creates the square wave audio output signal
{
output_high( PIN_A2 ); // Turn PIN_A2 on
delay_us( freq_truncated ); // Delay for "freq_truncated" microseconds
output_low( PIN_A2 ); // Turn PIN_A2 off
delay_us( freq_truncated ); // Delay for "freq_truncated" microseconds
}
}
//**************************************************************//
// DESCRIPTION: Main loop //
//**************************************************************//
void main()
{
while(TRUE) // Loop forever
{
playsound( 500.0, 1000.0 ); // Create a 500 Hz square wave for 1 second
delay_ms( 1000 ); // Delay for 1 second
}
}
|
|
|
|
longmenok
Joined: 23 Oct 2006 Posts: 12
|
|
Posted: Wed Apr 18, 2007 4:57 am |
|
|
Thanks !!! |
|
|
emelyjose
Joined: 13 Nov 2016 Posts: 5
|
|
Posted: Wed Nov 16, 2016 10:10 am |
|
|
How do you implement the code to use it? |
|
|
asmboy
Joined: 20 Nov 2007 Posts: 2128 Location: albany ny
|
|
Posted: Tue Nov 22, 2016 5:18 pm |
|
|
1- what is the reason for using floats in the call to playsound() , when you immediately move them to 16 bit space.
do you know what happens when you ask for a frequency of 75000 hz ?
2-WHAT happens to playtime_truncated
if you attempt an assignment greater then 0xFFFF ??
3- do you know CCS has an unsigned int32 ?? |
|
|
|