Este es un intento de cajita musical con el 16F877A y mi primer programa en CCS. La idea me surgió leyendo un tema que encontré acerca de PICs musicales para Navidad. El tema que compuse para el 16F877A es “We Wish You A Merry Christmas“, del cual saqué un pedazo a partir de la partitura que encontré en esta página: http://notadivina.blogspot.com/2008/10/canciones-de-navidad-partitura.html.
Lamentablemente el tema anterior no contenía las frecuencias de todas las notas disponibles, así que tuve que complementar la tabla que ya tenía con otra tabla de notas musicales y sus respectivas frecuencias que dejaré a continuación: http://webdelprofesor.ula.ve/ciencias/sanrey/tubos.pdf.
Y el resultado es el siguiente:
El simulador Proteus nos permite escuchar la melodía resultante, y si conectamos un osciloscopio en la salida del PIC (el cual en este programa es RB0), podemos ver la variación de la frecuencia cada vez que se toca una nota diferente.
El funcionamiento del circuito es el siguiente: Si se oprime el botón conectado a RB1, la melodía sonará una vez. Y solo se volverá a escuchar cuando se pulse de nuevo el botón.
Para quien quiera saber la explicación del por qué los bucles tan extraños, la resumiré a continuación: La canción está escrita a 3/4. No soy un erudito en música y me dormía en las clases de música en la secundaria, así que lo que hice fue convertir esos 3/4 en un segundo (es decir, 3 tiempos forman un segundo), y cada duración de nota a su equivalente en segundos. Por ejemplo, una corchea de 1/4 dura 0.333333 segundos, y una semicorchea de 1/8 dura 0.1666666 segundos, aproximadamente.
La fórmula para obtener las veces que se repetirá la nota para llegar a la duración es la siguiente:
donde fnota es la frecuencia de la nota y tnota es la duración de la nota. Ahora apliquemos la teoría expuesta anteriormente. Por ejemplo, queremos convertir a número de veces una corchea en nota Sol a 3/4. Recordemos que la frecuencia de la nota Sol es de 393.1 Hz, y la duración de una corchea es de 0.333333 segundos a 3/4 (a 4/4 duraría 0.25 segundos):
Es decir, necesitaremos que se repita 131 veces la nota (sin pausas) para lograr el tiempo esperado. Si en dado caso el número N nos llegara a dar más de 255, tenemos que aplicar bucles anidados. Esto es debido a que los ciclos for requieren que la variable a incrementar sea de tipo int, y los int solo aceptan hasta 255. Eso significa que por ejemplo si N nos dio 348 (como en el caso de la última nota del código), podemos cómodamente dividir
y hacer nuestro bucle padre de 2 veces, y dentro de él nuestro bucle hijo de 174 veces.
Como mencioné anteriormente, el código lo escribí en PIC C (CCS), escrito a 4 MHz (frecuencia que se usa mucho en la enseñanza de programación de PICs), y adjunto el código, junto con la simulación a continuación:
Descargar Código + Simulación + .HEX [16F877A]
[ACTUALIZADO] Optimicé el código y ahora se pudo compilar para el pequeño 16F84A.
Descargar Código + Simulación + .HEX [16F84A]
Y un video con el circuito en funcionamiento, para el 16F84A:
Cualquier sugerencia para el código será bienvenida, aun estoy aprendiendo a manejarme con el CCS.

