TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: micro_cadaver en 18 de Enero de 2007, 21:27:39
-
hola amigos del foro, yo soy hincha del assembler es un vicio para mi, asi q necesitaba una rutina para generar melodias y me tope con esta libreria "tones.c" del programa CCS de lenguaje C para pics, lo q sucede es q necesito esa rutina para montarla sobre un programa mas grande q hice, asi q..... como no me gusta el c ni el basic.... lo usare pero no dejare q el C me use :x , cuando lo termine lo subo pa q lo cojan y lo apliquen en sus aplicaciones en asm, chau!!! :-/
PD: si alguien ya lo hice q avise pa no hacerlo denuevo , plop! :-)
-
No sé cuál sea esa librería (no uso C) pero si puedes compilarla, puedes desensamblarla.
Casi nunca reviso lo que produce el compilador pero en ocaciones me ha dado curiosidad y ese código lo miro en el MPLAB (una sugerencia).
A lo mejor ya lo hiciste, esa sería una manera rápida de saber cómo le hicieron.
-
Hola, fijate si esto es de tu utilidad http://www.todopic.com.ar/asm/generador_de_audio/Sonido.txt (http://www.todopic.com.ar/asm/generador_de_audio/Sonido.txt)
o esta otra
http://www.todopic.com.ar/asm/generador_melodias/ (http://www.todopic.com.ar/asm/generador_melodias/)
-
Como estas Norberto, si he revisado varias veces los ejemplos que detallas anteriormente, pero la verdad no se como utilizarlos.
Hace mucho tiempo quiero introducir musik a los proyectos que hago con micros, para hacerlos + diverti2.
Encontre un soft, en version demo que tenia algo parecido, estaba la famos "We are the Champios" y algunas de Rock. luego que revise por alli les dejo el link para que lo prueben.
Pero por el momento si no es mucha molestia, nos podrias indikr komo reproducir diferentes melodias??? :? :?
-
en el CCS esta esa libreria para generar tonos musicales , todas las notas do re mi...si, y tiene cuatro octavas de cada nota, osea q es bastante y suficiente para componer una melodia, simplemente te pide que añadas la frecuencia de la nota (que esta escrita como comentario en el archivo "tones.c") y la duracion q quieres. ahora la duracion vendria a ser la redonda blanca negra corchea semicorchea fusa semifusa, jjje con esa herramienta puedes componer si sabes algo de musica sobrado por eso lo quiero pasar a assembler mi lenguaje nativo :-/
-
micro_cadaver:
voy a ver donde está el ejemplo del CCS C, lo compilo y paso por aquí el Mixed C-ASM que genera. Por lo menos sabrás qué es lo que hacen en ASM los señores que diseñaron el CCS C. :)
-
hola redpic precisamente de ese archivo estoy colgandome para psarlo totalmente a ASM, del mixed, aunque ni tan mixed porq no ponen algunas cosas como la cabezera y el end :shock: jejeje, bueno ahora tb el amigo jhonny me pidio q traduciera el comentario del archivo "tones.c" lo termino y lo subo, no desespereis poshh hombre!!! :D
-
cabezera del archivo tones.c
////////////////// Driver to generate musical tones /////////////////////
//// ////
//// generate_tone(frequency, duration) Generates wave at set ////
//// frequency (Hz) for set ////
//// duration (ms) ////
//// ////
//////////////////////////////////////////////////////////////////////////////////
el resto del mensaje es puro floro, lo unico q aqui dice es q la rutina "generate_tone" te pide en su sintaxis 2 datos con los cuales (esto dice traducido) genera una onda o señal segun la frecuencia configurada en Hz y una duracion determinada en ms q tambien la configuras, todo de esta manera
generate_tone(440,500);
Es un ejemplo, el valor 440 corresponde a 440Hz q lo sacas de la tabla de valores q te da el mismo archivo tones.c por ejemplo ese valor corresponde a la primera octava de la tavla de la nota LA o A(notacion general)
const long A_NOTE[4] ={ 440, 880, 1760, 3520};
y el otro valor 500 pues es simplemente 500"ms" una duracion.
este es el archivo ex_tones.c q esta como ejemplo de como usar esa rutina.
/////////////////////////////////////////////////////////////////////////////////
//// 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) ////
//// ////
/////////////////////////////////////////////////////////////////////////////////
ahi lo q dice es q el pin por donde saldra la onda con los tonos sera el pin RB0 del pic. esto esto estodo amigos!!! :-/
-
Al código en C al que yo me refería es Ring Tone Player - Plays ring tones on PICDEM2 plus board (http://www.ccsinfo.com/forum/viewtopic.php?t=22010&highlight=tones) en el CCS C Forum.
-
saludos amigo micro cadaver
bueno la verdad que yo leia siempre tus notas sobre este famoso driver Tones.c .. pero la verdad es que nunca me anime a revisarlo , ya que no sabia nada del lenguaje C, pero como te platique la vez pasada por el msn. ahora que ya estoy aprendiendo un poquito de este lenguaje, me puse a analisarlo y y no me parese tan complicado la cosa... pero como todo en la vida tambien tiene su pero.. ja ja ja ( nada es lo que parece)..... bueno estube viendo el ex_tones que biene enn el programa... lo quise compilar con el mismo ..y me arrojo un error .. no se porque bueno el mensaje de error dice " A #DEVICE required before this line " no se porque me sale esto.... tal vez me puedas aclarar un poco el panorama...
-
sube el archivo C q tienes, derepnte cambiastes algo sin darte cuenta o quizas te falto algo por ahi. :-/
-
no lo creo que haya movido algo.. pero por las dudas. aqui esta el ex_tones
y luego te pongo el driver tones.c.. bueno yo creo que hay algo de malo aqui en el driver .. ya que cuando compilo..se va al ventana del driver tones.c y me remarca creo que el problema.. la primera C que la pongo en negrita de la tabla del driver.. mas abjo esta todo completo tal cual lo copie de verdadero archivo para pegarlo aqui.
// 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};
/////////////////////////////////////////////////////////////////////////
//// 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. ////
/////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS ////
//// C compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, ////
//// reproduction or distribution is permitted without written ////
//// permission. Derivative programs created using this software ////
//// in object code form are not restricted in any way. ////
/////////////////////////////////////////////////////////////////////////
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#endif
#include <tones.c>
#define SIZE 25
const struct note
{
long tone;
long length;
} happy_bday[SIZE] = {
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) {
int i;
while(TRUE)
{
for(i=0; i<SIZE; ++i)
{
generate_tone(happy_bday.tone,happy_bday.length);
delay_ms(75);
}
}
}
////////////////// Driver to generate musical tones /////////////////////
//// ////
//// generate_tone(frequency, duration) Generates wave at set ////
//// frequency (Hz) for set ////
//// duration (ms) ////
//// ////
/////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS ////
//// C compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, ////
//// reproduction or distribution is permitted without written ////
//// permission. Derivative programs created using this software ////
//// in object code form are not restricted in any way. ////
/////////////////////////////////////////////////////////////////////////
#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;
}
-
tio porq copias de nuevo la tabla de valores??????
// 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}; porq copias todo esto?
/////////////////////////////////////////////////////////////////////////
//// 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. ////
#include <tones.c> si aca estas incluyendolo denuevo!!!
cuando pones ea linea include tones.c ya estas colocando todo el contenido del archiv tones.c al programa ex_tones.c, ademas el ejmplo viene sin la tabla q le has puesto jijiji, eso tu los agregado o no? jijij porq!!!!, :-), bueno ese es el error porque yo no toque nada y salia normal. saludos y exitos!!!!!!!!!!!!! :-/
-
bueno man eso fue un error ... pero solo aqui en el foro.. esque estube intentando muchas veces subir una fotito del mensaje de error que me da mi pc... y al final no lo pude subir ..no se porque .. pero en duarnte esa mechadera con la pese por subir la foto... parece que se me colo ese retaso del codigo por ahi arriba.... pero no te preocupes que eso no aparece en el ejemplo ex_tones.c.. aqui esta de nuevo .. y me sigue dando error.. no se porque?
/////////////////////////////////////////////////////////////////////////
//// 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. ////
/////////////////////////////////////////////////////////////////////////
//// (C) Copyright 1996,2003 Custom Computer Services ////
//// This source code may only be used by licensed users of the CCS ////
//// C compiler. This source code may only be distributed to other ////
//// licensed users of the CCS C compiler. No other use, ////
//// reproduction or distribution is permitted without written ////
//// permission. Derivative programs created using this software ////
//// in object code form are not restricted in any way. ////
/////////////////////////////////////////////////////////////////////////
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#endif
#include <tones.c>
#define SIZE 25
const struct note
{
long tone;
long length;
} happy_bday[SIZE] = {
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) {
int i;
while(TRUE)
{
for(i=0; i<SIZE; ++i)
{
generate_tone(happy_bday.tone,happy_bday.length);
delay_ms(75);
}
}
}
aqui esta el codigo tal i como aparece en el el ejemplo.. la verdad es que no he movido nada .. ni si quiera una coma....
ayudame porfa ..tal vez puedas mandarme tu ejemplo.. tal ves algo esta mal con el mio ....no lo se
-
q raro¿? encontre algo diferente en el codigo q posteastes en el ultimo,
este es el q tengo en mi maquina
while(TRUE)
{
for(i=0; i<SIZE; ++i)
{
generate_tone(happy_bday[i].tone,happy_bday[i].length);
delay_ms(75);
}
}
}
ves la diferencia con el tuyo?, le faltan los indices del array "" esto, ponle y ve q fue, porsiaca te mando el q esta en maquina. eso e slo unico distinto, exitos amigo!!! :-/
PD: sigo traduciendo el codigo, ta feo hay una parte q no entiendo ya mañana lo subo con mas calma, hasta luego amigos :-/ !!!
-
No es un error del código, sino de cómo trata el foro los caracteres especiales. Los corchetes con una "i" en su interior lo interpreta como "cursiva" y no los imprime.
Para evitarlo hay que encerrar el código entre los atributos [c o d e] y [/c o d e].
Ya os lo he modificado yo.
-
ups gracias nocturno!!!,
jhonny, bajate ese archivo ahi ta el mismo programa pero q funcionana, al menos en mi maquina y compila y hasta simula ok,. exitos!!! :-/
-
amigos, jejej, cambie de estrategia estoy generando el ASM desde el mismo MPLAB enchufandole el compilador del CCS, porq el archivo mixed q me salia desde el CCS estaba medio confuso, pues bueno ya lo tengo en mis manos y estoy ya pasandolo a limpio.
otra cosa, lo estuve simulando en el proteus y observe q poniendole el frequencimetro me salia 420hz para un frecuencia seleccionada desde el soft de 440, es decir un aparente error de 20hz, lo cual es bastante! porq la nota LA en 440 y LA bemol es 415Hz, demasiado cerca, y todo esto a 4Mhz, luego le puse para 20Mhz y ya se situo en 440.
-
ya lo pase a ASM y lo corri en el MPLAB y hace exactamente lo mismo q el compilado en C, ahora toy en la chamba de ponerle nombres y etiquetas a todos los registros y demas instrucciones., esq todos esta en hexadecimal jiji, ya estamos cerca de terminar. :-/
-
que bueno henry :-/ .. muchas felicidades
voy a seguir tus pasos haber que me .. pero primero.. voy a probar el archivito que em pasaste... ojala y me funcione .. ya te comento despues.. suerte
-
ya hice que me funcione :-/
al parecer .. el problema era que asi como estaba en el ejemplo mi pc no lo agaraba ... siempre me arrojaba error la pc.. pero omitiendo algunas lineas en el codigo ... ya funciona......
las modificaciones que hice fueron estas: :lol:
//#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
//#elif defined(__PCH__)
//#include <18F452.h>
//#fuses HS,NOWDT,NOPROTECT,NOLVP
//#use delay(clock=20000000)
//#endif
con ello definimos que unicamente usaremos el 16F877 y nada mas...je je je je ..
que tonto fui.... :mrgreen: ...si ya el mensaje de error me lo decia .. solo que no le preste atencion
" A #DEVICE required before this line " esto en español significa que:
El copilador requiere un #device antes de que encuentre cualquier declaración o directorio del copilador que puedan hacerlo generar código. En general los #defines pueden aparecer antes de un #device pero no mucho más.
bueno ese era el error que solia darme.. la verdad que no se porque :shock:... pues el codigo esta muy bien echo
bueno lo mas curioso fue que una ves copilado de esa forma, regrese el codigo a su original
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#endif
y ya no me vota el error y copila correctamente.... ja ja ja ja.. creo que mi PC acaba de aprender algo..je je je je je
:D que curioso
ahora si voy siguendo tus pasos amigo micro_cadaver...... :-/
-
jaja q curioso, son cosas del orinoco q yo no se ni tu tampoco......
a mi tambien me pasan cosas raras con los softs sobre todo cuando creo q todo esta bien.... sobre todo con los programadores... sera q he quemado tantos pics q ya me han maldecido!!!
bueno te queria pedir si pudieras montar el programa en C es decir quermalo en un pic y probarlo por ejemplo medir si sale la frecuencia q dice, cual es el error de precision q tiene el codgio, segun parece con 4MHz debe de fallar un poco la precision.
exitosd!! :-/
-
buena idea amigo... bueno tratare de hacerlo .. aunque .. no tengo gran cosa pa medir frecuencia pero tratare de conseguir un buen instrumento.......
a una cosa mas amigo.. como le hiciste para compilar el codigo ex_tones.c en el mplab..en otras palabras como lo conectaste al CCS..yo he estado intentando..pero me sale un error a la hora de compilar ... da un error que dice: " el pcm no esta instalado en el pc" ..... o algo asi..
tienes algun manual de como integrar los dos programas de forma correcta.....
aahh algo mas .. que version del MPLAB estas usando.. tal ves por ahi deba empesar...yo uso la version 7.5 del MPLAB
tratare de hacer las pruebas esta tarde..... ojala pueda... :-/
-
ya hice que me funcione :-/
al parecer .. el problema era que asi como estaba en el ejemplo mi pc no lo agaraba ... siempre me arrojaba error la pc.. pero omitiendo algunas lineas en el codigo ... ya funciona......
las modificaciones que hice fueron estas: :lol:
//#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
//#elif defined(__PCH__)
//#include <18F452.h>
//#fuses HS,NOWDT,NOPROTECT,NOLVP
//#use delay(clock=20000000)
//#endif
con ello definimos que unicamente usaremos el 16F877 y nada mas...je je je je ..
que tonto fui.... :mrgreen: ...si ya el mensaje de error me lo decia .. solo que no le preste atencion
" A #DEVICE required before this line " esto en español significa que:
El copilador requiere un #device antes de que encuentre cualquier declaración o directorio del copilador que puedan hacerlo generar código. En general los #defines pueden aparecer antes de un #device pero no mucho más.
bueno ese era el error que solia darme.. la verdad que no se porque :shock:... pues el codigo esta muy bien echo
bueno lo mas curioso fue que una ves copilado de esa forma, regrese el codigo a su original
#if defined(__PCM__)
#include <16F877.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#elif defined(__PCH__)
#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=20000000)
#endif
y ya no me vota el error y copila correctamente.... ja ja ja ja.. creo que mi PC acaba de aprender algo..je je je je je
:D que curioso
ahora si voy siguendo tus pasos amigo micro_cadaver...... :-/
El problema que te daba es que debes seleccionar el compilador a usar en algunas versiones de CCS.
Si es la linea baja se usa PCB, si es la linea media se usa PCM y si es la linea alta se utiliza PCH.
Al no seleccionarlo previamente el compilador daba el error porque la libreria antes de seleccionar el PIC busca cual de los compiladores esta elegido, al encontrar uno diferente al cual pertenece el PIC empiezan los errores.
Cuando comentaste las lineas hiciste que el compilador se autoseleccionara segun la linea de PICs a la cual pertenece, dejendo de dar errores...
Cuando volviste al original de la libreria el tipo de compilador ya estaba correctamente seleccionado, por lo tanto ya no te dio errores tampoco...
Aclaremos algo, el entorno del CCS no es muy complejo de utilizar, pero hay que aprender mucho de la compilacion condicional para sacarle buen provecho.
Aconsejo utilizen RTFM antes de seguir trabajando en el...
Saludos!! :D :D :D
-
bueno amigos termine, uff... q chamba, esoty implementandolo con un osicaldor de 4mhz y funciona muy bien para frecuencias bajas aunque requiere de una calibracion, sinembargo par alas frecuencias altas la rutina no funciona debido a la baja frecuencia del oscilador interno 4Mhz, podria echarle un xtal externo de 20MHz q es lo que pide, pero en mi aplicacion requiero de todos lo pines posibles, ni el 18f4520 tiene mas de 8Mhz de oscilador interno ,si q....... no pienso rendirme!!!, hare mi propio codigo para los tonos en un xtal de 4mhz , buenbo aprendi bastante :mrgreen: ejeje, y ya se por donde comenzar, asi q os pido paciencia, chauuu :-/
-
:mrgreen:
Hola henry pues si te te faltan puertos ... un Pic16f877a no estaria mal y tu codigo no variaria mucho....:)
-
ñooooooooooooooooooooooooooooo
jejejeej tiene q salir en 4 Mhz :-/
-
Lo que no me quedó claro es el título del post jejeje "Triste desenlace"
es que esto aún no termina...
-
por supuesto que no,..... tened paciencia... :-)
-
bueno, ya termine una rutina simple pero util tiene, funciona con un xtal de 4MHz, todas las frecuencias calibradas,nada mas q 253 lineas de memoria de programa, es simplemente un banco de sub-rutinas de los notas musicales distribuidos de la siguiente manera:
C ={ 262, 523, 1047, 2093};
Db={ 277, 554, 1109, 2217};
D ={ 294, 587, 1175, 2349};
Eb ={ 311, 622, 1245, 2489};
E ={ 330, 659, 1329, 2637};
F ={ 349, 698, 1397, 2794};
Gb ={ 370, 740, 1480, 2960};
G ={ 392, 784, 1568, 3136};
Ab ={ 415, 831, 1661, 3322};
A ={ 440, 880, 1760, 3520};
Bb ={ 466, 923, 1865, 3729};
B={ 494, 988, 1976, 3951};
ahi se pùede observar 4 octavas por cada nota musical, el archivo lo subo y se le puede usar de un monton de maneras al estar en ASM, ojo q esta calibrado para 4Mhz, mas adelante subire un ejemplo de aplicación de este codigo, asi q.... disfrutenlo y si saquenle provecho!!!! :-/
-
disculpa por haver abamdonado un poco el tema... es que me estaba dedicando mas aun proyectito que estoy tratando de saca... pero bueno ahora le dedicare un poco mas de tiempo..... estube tratando de seguir tus pasos amigo.. compilando el es_tones.c en el mplab.. pero no me sale.. me bota un error..... creo que no lo integre bien con el ccs.. tu sabes como hacerlo.. porfa no tienes algun manual para integrarlo con el MPLAB.... bueno como yo solo requiero de unos cuantos pines .. esta bien creo hasta donde llegaste....mas bien yo si nesesito que todo mi pic corra a 20MHz... me gusta trabajar a esa frecuencia es como mas exacta..... pero bueno seguir tratando.. de integrar el ccs con el mplab.... ojala pueda llegar hasta donde tu llegaste....
haaaaaaaaa voy a probar el archivo que nos dejaste.. lo bajare ahora mismo....para probarlo y compararlo
ya te comentare luego que me parecio....gracias por todas esas ganas que le pones .. sigue adelante .. mucha suerte
-
a disculpa pense q ya te habia respondido ... jejeej . a ver. ...
1º vas a la pestaña PROJECT y clickas en SET LANGUAJE TOOLS LOCATION:
(http://img201.imageshack.us/img201/77/ayuda1yp2.png)
2º ubicas el ejecutalbe CCSC.EXE ,
(http://img201.imageshack.us/img201/1210/ayuda2yg8.png)
3º lo puedes buscar yendo al BROWSE y aceptas.
(http://img201.imageshack.us/img201/5717/ayuda3cc8.png)
4º finalmente al hacer un proyecto vas a project, clickas en project wizard y te debe salir esto:
(http://img201.imageshack.us/img201/9009/ayuda4wm9.png)
5º sigues los pasos normalmente hasta aqui, donde seleccionas de una lista el lenguaje a usar:
(http://img201.imageshack.us/img201/5712/ayuda5wu1.png)
6º escojes el CCS C compiler y listo, sigues con lo demas pasos y ya puedes escribir tu codigo en C dentro del MPLAB
(http://img201.imageshack.us/img201/2889/ayuda6ou1.png)
-
Hola Amigos, buscando en mi pc, encontré el programita que comenzo Elena2000, fue para una navidad, y lamentablemente el archivo estaba en el foro anterior y se perdio... lo subo nuevamente, alli hay un macro para generar los tonos.... :-/ :mrgreen:
; PIC MUSICAL PARA CANTAR VILLANCICOS ESTA NAVIDAD!!!
;LAS 8 SALIDAS DEL PUERTO B CONECTAR LAS LUCES O LED+R SERIE A MASA
;DEL PUERTO A , RESISTENCIAS pull up ,Y uno de los pin 0,2,4 extremo del piezo, 1,3 el otro extremo
list P=16f84a
include "p16f84a.inc"
errorlevel 0,-302 ; ignorar mensajes de error 302
;GPIO equ PORTB
;configuración de los fuses esos...
__CONFIG _XT_OSC & _CP_OFF & _WDT_OFF & _PWRTE_ON
;La escala musical en frecuencias (1 y 2 octava)
constant notaBb1=.238 ;Bb1
constant notaC2 =.208 ;C2
constant notaD2 =.188 ;D2
constant notaEb2=.168 ;Eb2
constant notaF2 =.159 ;F2
constant notaG2 =.141 ;G2
constant notaA2 =.127 ;A2
constant notaBb2=.119 ;Bb2
constant notaC3 =.104 ;C3
constant notaD3 =.94 ;D3
constant notaEb3=.84 ;Eb3
constant notaF3 =.80 ;F3
constant notaG3 =.70 ;G3
constant notaA3 =.63 ;A3
;Duración de las notas
constant A_FREC =.15200
constant B_FREC =.15500
constant C_FREC =.15600
constant D_FREC =.15700
constant E_FREC =.22800
constant F_FREC =.30700
constant G_FREC =.30800
constant H_FREC =.30900
constant I_FREC =.60400
constant J_FREC =.91200
constant K_FREC =.183500
constant L_FREC =.183600
NOTA macro frec,duracion
retlw frec
retlw low ((duracion) / frec)
retlw high ((duracion) / frec)
endm
;registros
org 0Ch
frec res 1
len res 1
lenh res 1
frq res 1
tabpos res 1
contador EQU 11H
LOOPS EQU 12H
;-------------------------------------------------------
org 0
goto inicio
;-------------------------------------------------------
tono movf tabpos,w
addwf PCL,f
;AQUI LA CANCION QUE HA COMPUESTO SUPER-CUCA: EL TAMBORILERO!!!!
cancion NOTA notaF2,J_FREC
NOTA notaG2,G_FREC
NOTA notaA2,I_FREC
NOTA notaA2,H_FREC
NOTA notaA2,G_FREC
NOTA notaBb2,B_FREC
NOTA notaA2,C_FREC
NOTA notaBb2,H_FREC
NOTA notaA2,L_FREC
NOTA notaF2,G_FREC
NOTA notaF2,G_FREC
NOTA notaG2,G_FREC
NOTA notaA2,G_FREC
NOTA notaA2,G_FREC
NOTA notaA2,G_FREC
NOTA notaA2,G_FREC
NOTA notaBb2,A_FREC
NOTA notaA2,C_FREC
NOTA notaBb2,G_FREC
NOTA notaA2,L_FREC
NOTA notaG2,G_FREC
NOTA notaA2,G_FREC
NOTA notaBb2,G_FREC
NOTA notaC3,G_FREC
NOTA notaC3,G_FREC
NOTA notaC3,G_FREC
NOTA notaD3,G_FREC
NOTA notaC3,A_FREC
NOTA notaBb2,C_FREC
NOTA notaA2,G_FREC
NOTA notaG2,L_FREC
NOTA notaG2,G_FREC
NOTA notaA2,G_FREC
NOTA notaBb2,G_FREC
NOTA notaC3,G_FREC
NOTA notaC3,G_FREC
NOTA notaC3,G_FREC
NOTA notaD3,G_FREC
NOTA notaEb3,A_FREC
NOTA notaD3,D_FREC
NOTA notaC3,G_FREC
NOTA notaBb2,I_FREC
NOTA notaD3,A_FREC
NOTA notaC3,C_FREC
NOTA notaBb2,G_FREC
NOTA notaA2,I_FREC
NOTA notaC3,A_FREC
NOTA notaBb2,C_FREC
NOTA notaA2,G_FREC
NOTA notaG2,L_FREC
NOTA notaF2,J_FREC
NOTA notaG2,G_FREC
NOTA notaA2,G_FREC
NOTA notaA2,F_FREC
NOTA notaA2,G_FREC
NOTA notaA2,H_FREC
NOTA notaBb2,A_FREC
NOTA notaA2,C_FREC
NOTA notaBb2,H_FREC
NOTA notaA2,K_FREC
NOTA notaG2,E_FREC
NOTA notaF2,C_FREC
NOTA notaG2,G_FREC
NOTA notaF2,L_FREC
endtab ;final de cancion
;-------------------------------------------------------
luces incf contador,F ;secuencia encendido de luces (port b )
movf contador,W
luces1 addwf PCL,f
retlw b'10000001'
retlw b'01000010'
retlw b'00100100'
retlw b'00011000'
retlw b'10100101'
retlw b'01000010'
retlw b'10101010'
retlw b'01010101'
retlw b'10101010'
retlw b'01010101'
retlw b'00100100'
retlw b'11111111'
retlw b'00000000'
retlw b'11011011'
retlw b'00100100'
retlw b'10011001'
retlw b'10000001'
retlw b'01000010'
retlw b'00100100'
retlw b'10011001'
retlw b'00100100'
retlw b'01011010'
retlw b'10101010'
retlw b'01010101'
retlw b'10101010'
retlw b'01010101'
retlw b'00100100'
retlw b'00011000'
retlw b'01100110'
retlw b'11011011'
retlw b'00100100'
retlw b'10011001'
retlw b'10011001'
retlw b'00100100'
retlw b'01011010'
retlw b'00000001'
retlw b'00000010'
retlw b'00000100'
retlw b'00001000'
retlw b'00010000'
retlw b'00100000'
retlw b'01000000'
retlw b'10000000'
retlw b'01000000'
retlw b'00100000'
retlw b'00010000'
retlw b'00001000'
retlw b'00000100'
retlw b'00000010'
; continuar con la tabla de encendido de luces A GUSTO
clrf contador
retlw b'10000001'
;*****************************************************************************
inicio movlw b'10101010' ;configurar salidas
movwf PORTA ;GPIO
banksel TRISA
movlw b'00000000'
movwf TRISA ;Todos los pines son salidas
banksel PORTA
banksel TRISB
movlw b'00000000'
movwf TRISB ;Todos los pines son salidas
banksel PORTB
;----------------------------------------------------------------------------
MASMUSICA
CLRF PORTB
clrf tabpos ;resetear la posicion en la tabla
CLRF contador
CLRWDT
CLRW
call luces1 ;SECUENCIA DE LAS LUCES
MOVWF PORTB
;--------------------------------------------------------------
nxtnota call canta ;canta nota de la tabla
call play ;play nota
movlw endtab - cancion ;comprueba si termino la tabla
subwf tabpos,w ;
btfss STATUS,Z
goto nxtnota ;no acabó! canta siguiente nota
;---------------------------------------------------------
CLRF PORTB ;APAGO LAS LUCES, EN MODO DE ESPERA.....
CLRF PORTA ;DESCONECTO SALIDA PIEZOELECTRICO
CALL ESPERA
CALL ESPERA
CALL ESPERA
CALL ESPERA
arriba goto MASMUSICA ;arriba ;reinicia si se despierta ;reinicia si se despierta
;-------------------------------------------------------
canta call tono ;canta una nota de la tabla
movwf frec
incf tabpos,f
call tono ;duracion del byte menor peso
movwf len
incf tabpos,f
call tono ;duracion del byte mayor peso
movwf lenh
incf tabpos,f
return
play incf lenh,f
play2 movf frec,w
call nota ;espera 1/2 de la frecuencia
comf PORTA,F ;GPIO,f ;sostiene el sonido
decfsz len,f
goto play2 ;mantener hasta nota acabe
decfsz lenh,f
goto play2
call luces ;SECUENCIA DE LAS LUCES
movwf PORTB
return
;-------------------------------------------------------
ESPERA CLRF frq ;empleo el mismo registro...
call nota
decfsz LOOPS,f
GOTO ESPERA
nota movwf frq ;espera 1/2 de la frecuencia
wait nop
nop
nop
CLRWDT
nop
decfsz frq,f
goto wait
return
end
Norberto
-
gracias todopic, se puede hacer una fusion , me gusta mucho el orden del programa de elena, ademas solo tiene 2 octavas, se le puede agregar para q lleguen a 4 y tener mas espacio para rollearrrrrrrrrrrr :-/
-
buena amigo henry
ya lo pude compilar dede el MPLAB.... :-/
pero disculpa mi poco conocimiento.... como generas el .ASM dede el codigo original en .C con el MPLAB.... existe tambien algun Boton o algun menu que haga eso como en el CCS.
me parece que mejor voy a trabajar el ASM que me genera el CCS
-
hola, en realidad no te recomiendo hacer eso...........jejje, porque el CCS utiliza muchos registros de la SRAM y hace un codigo extraño cuando lo vuelcas al assembler, aparte de q todo esta con valores hexadecimales, es decir no hay ninguna etiqueta ni label ni titulo ni nada, tan solo assembler puro , y pasarlo a un assembler mas entendible pues tomara una larga tarea, es mas, notaras q hay rutinas q se pueden simplificar pues el CCS genera rutinas generales q se acomoden a cualqueir pic u otra condicion, sino mira cuanto me demore en tratar de pasar el codigo tones a ASM.
por otro lado, para lo que si sirve esa union del MPLAB y el CCs es para verificar como va generandose el ASM dentro del codigo en C, como una manera de supervision y limaduras de detalles.
para ver el codigo ASM generador por el CCS se hace de la siguiente manera:
VAS A
(http://img185.imageshack.us/img185/9149/dibujono6.png)
-
aunque no es muy alentador lo que me dices.. te doy las gracias por tu respuesta
.... y bueno entonces a ver otros rumbos.... ha te comento que estube ojenado un poco tu codigo que posteaste... TONOS.asm... bueno segun lo que veo estan la 4 octavas con todas y sus frecuencias.... pero como le vas hacer con la duracion de cada nota ..
yo creo que seria bueno colocar todo eso como una libreria .. algo asi como en el ejemplo del CCS..... o tal vez como una macro ..como lo hizo elena en su moneto con el codigo del pic cantor... y bueno cuando creemos la musiquita... ya solo llamamos a la libreria para que nos genere la frecuencia coreecta... bueno es solo una sugerencia... aunque no soy un capo voy a tratar de hacer algo.....quiero poner el titanic dentro del pic ..je je je je .. oja pueda
-
ha te acuerdas del programita que te pase.. aquel que se llamaba MIDIASM.... de sispic creo que era...pero bueno yo solo lo tenia guardado..... pero en si nuca llegue a utilisarlo... tu legaste a decifrarlo bien .. como actua... lo que te bota ese programita es la frecuencia y la duracion eso lo se .. pero esta en ese orden.. frecuencia , duracion o es al reves duracion, frecuencia... esto me causo duda ya que cuando quise pasar el tema del titanic habian algunas notas que me salian asi:
384 , 0 ///// bueno yo creo que esto debe ser duracion , frecuencia ..porque estraia indicando silencio
196 , 277 ///// y esta linea indicaria 196 supongo milisegundo de la frecuencia 277
188 , 139
284 , 659
4 , 277
332 , 659
8 , 988
152 , 415
168 , 0
8 , 988
64 , 1319
232 , 0
bueno tu que crees .... como te fue a ti ....ya lo decifraste ?
...algo mas .. segun lo que llege a leer en aquel post el programa estaba echo para decifrar el midi en 4 octavas, justo como tu lo querias... creo......
-
añap
ahora lo voy a revisar
ddddddddddddddddddddddddd :-/