hola amigos otra ves
Alguien se anima a ayudarme a decifrar un poco el ejemplito EX_Tones.c
del copilador CCS.
bueno la verdad es que soy un novato en este lenguaje
pero aqui va el primer intento.
/////////////////////////////////////////////////////////////////////////
//// EX_TONES.C ////
//// ////
//// This example plays the song "Happy Birthday." ////
//// ////
//// Configure the CCS prototype card as follows: ////
//// Connect the positive wire of the speaker to pin 47 (B0) ////
//// Connect the negative wire of the speaker to pin 27 (Gnd) ////
//// ////
//// This example will work with the PCM and PCH compilers. The ////
//// following conditional compilation lines are used to include a ////
//// valid device for each compiler. Change the device and clock ////
//// pins for your hardware if needed. ////
/////////////////////////////////////////////////////////////////////////
#if defined(__PCM__) // ????
#include <16F877.h> // esta liena indica el pic que usaremos
#fuses HS,NOWDT,NOPROTECT,NOLVP // esto es la configuracion de los fusibles del pic
#use delay(clock=20000000) // esto indica el pic corre con un cristal de 20MHz
#elif defined(__PCH__) // ?????
#include <18F452.h> // ????? porque se define otro pic ???? aclaren me esto ????
#fuses HS,NOWDT,NOPROTECT,NOLVP /?????
#use delay(clock=20000000)
#endif
#include <tones.c> //incluimos el driver Tones.c, este produce las frec y duracion de las notas musicales
#define SIZE 25 // define de cuantas notas tiene nuestra estructura musical
const struct note // esto es la subrutina estructura de notas
{
long tone; // la frecuencia de la nota, la frecuenci esta incluida en la tabla del driver tones.c
long length; // la duracion de la nota, tambien incluida en la misma tabla del driver tones.c
} happy_bday[SIZE] = { // aquiesta si cuentas mas abajo tiene 25 notas musicales con su frecuencia y duracion
C_note[0],350, C_note[0],100, D_note[0],500, C_note[0],500, F_note[0],500, E_note[0],900,
C_note[0],350, C_note[0],100, D_note[0],500, C_note[0],500, G_note[0],500, F_note[0],900,
C_note[0],350, C_note[0],100, C_note[1],500, A_note[0],500, F_note[0],500, E_note[0],500, D_note[0],900,
Bb_note[0],350, Bb_note[0],100, A_note[0],500, F_note[0],500, G_note[0],500, F_note[0],1200};
void main(void) { // esto es el programa principal
int i; // declaramos la variable i
while(TRUE) // esto es un bucle infinito
{
for(i=0; i<SIZE; ++i) // esta condicion nos dice que ejecutara la siguiente instruccion mientras la variable i<25
{
generate_tone(happy_bday
.tone,happy_bday.length); // esto llama al driver Tones.c
delay_ms(75); // un delay de 75ms
}
}
}
bueno todo lo explicado es a mi modesto entender, como ven hay cosas que no llego a entender. y las he remarcado como: //???????? aqui les quiero pedir que me ayuden a decifrar el resto del ejemplo
a por cierto para los que no tienen el CCS el driver tones.c lo pongo por aqui abajo tal y como biene.
////////////////// Driver to generate musical tones /////////////////////
//// ////
//// generate_tone(frequency, duration) Generates wave at set ////
//// frequency (Hz) for set ////
//// duration (ms) ////
//// ////
/////////////////////////////////////////////////////////////////////////
#ifndef MUSIC_NOTES
#define MUSIC_NOTES
// NOTE FREQUENCY
// Octave0 Octave1 Octave2 Octave3
const long C_NOTE[4] ={ 262, 523, 1047, 2093};
const long Db_NOTE[4] ={ 277, 554, 1109, 2217};
const long D_NOTE[4] ={ 294, 587, 1175, 2349};
const long Eb_NOTE[4] ={ 311, 622, 1245, 2489};
const long E_NOTE[4] ={ 330, 659, 1329, 2637};
const long F_NOTE[4] ={ 349, 698, 1397, 2794};
const long Gb_NOTE[4] ={ 370, 740, 1480, 2960};
const long G_NOTE[4] ={ 392, 784, 1568, 3136};
const long Ab_NOTE[4] ={ 415, 831, 1661, 3322};
const long A_NOTE[4] ={ 440, 880, 1760, 3520};
const long Bb_NOTE[4] ={ 466, 923, 1865, 3729};
const long B_NOTE[4] ={ 494, 988, 1976, 3951};
#endif
#define TONE_PIN PIN_B0
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;
}