Caja musical PIC16F84A

he visto que hay un tema aca con este mismo asunto pero la solucion no es la que muchos esperan y con esas 5000 visitas.. decidi hacer este tema que ojala ayude a muchos con esto.

se trata de hacer una "caja musical" con un pic.

asi podremos tener una melodia con un pic, a muchos de seguro que les provoco hacerse algo asi...

pues es algo complejo.. agarrense.. :LOL:

yo tengo la version 7.2 de ISIS Proteus y buscando entre los ejemplos encontre un circuito de timbre con dos melodias

locacion_doorbell.JPG


adentro se tiene el circuito, codigo ASM, el Hex listo para el PIC y etc etc..

utiliza el pic 16f84A.

bueno ahora.. ¿ y si no me gustan esas dos melodias?, ¿como me hago las mias?

enhorabuena :D

pues me pase 2 semanas aprendiendo codigo ASM y editando probando y demas ese codigo que tiene asi que.. manos a la obra

probamos el circuito.. lo vemos.. analizamos y demas.. ahora.. para nuestra melodia, recomiendo el MPlab de microchip, muy bueno.. y como un festival de musica que huvo hace poco aca, completamente gratis.

entonces, abrimos Doorbell.asm y nos vamos a esta linea:

Código:
; Tune 0 Data
; Bach 'Badinerie' from Suite No 2

a partir de aca esta la melodia.. notemos algo..

esta el codigo de la nota.. y su duracion.. un ejemplo:

Código:
	retlw 0x1A	;D
	retlw 0x3C	;120
	retlw 0x17	;B
	retlw 0x3C	;120

eso del 120 no quiere decir que dura 120 milisegundos ni nada de eso.. es, basicamente, la duracion de la nota, muscalmente hablando.. miremos esto:

NotasDeRedonda.jpg


uan redonda.. dura lo mismo que dos blancas, una blanca lo mismo que 2 negras, y por consiguiente, una redonda dura lo mismo que 4 negras

algo confuso.. lo se..

lo que esto quiere decir:

Código:
	retlw 0x1A	;D
	retlw 0x3C	;120
	retlw 0x17	;B
	retlw 0x3C	;120

es que se tocara la nota D (Re) por aproximadamente un segundo, seguida de la nota B (Si) por la misma duracion.. ¿que determina la duracion de la nota?

el tempo amigos..
Wikipedia dijo:
En terminología musical, el tempo (en plural, tempi), movimiento o aire es la velocidad con que debe ejecutarse una pieza de música.

de seguro muchos han visto esto en partituras:

Music-metronome.png


el tempo se traduce a:

la cantidad de notas negras que se tocan en un minuto

la imagen nos dice que se tocan 120 notas negras en un minuto, osea que cada una duraria 0.5 segundos

entonces como supodnre, ud ya tendran su melodia hecha, o la tomaran de otro lado.

asi que fijense en el tempo al que esta y nos vamos a:

Código:
;Routines to play the tunes
playtune0     movlw   0x13
	      movwf   PORTB
	      movlw   0x50
    	      movwf   tempo
	      movlw   tune0 / 0x100
	      movwf   tptrh
	      movlw   tune0 % 0x100
	      movwf   tptrl
	      goto    playtune

fijemonos en estas dos lineas:

Código:
	      movlw   0x50
    	      movwf   tempo

aca en esta instruccion. movlw, cargaremos nuestro tempo.

el que viene marcado es de 80. para fijar el nuestro debemos fijarlo en hexadecimal.. para los que no saben hexadecimal (como yo al principio).

esta pagina pasa de decimal a hexa

entonces con nuestro tempo fijado nos vamos a editar la melodia.

vamos de nuevo a

Código:
; Tune 0 Data
; Bach 'Badinerie' from Suite No 2

recuerden que son dos melodias, pero si quieren eliminan todos los datos de la otra para ahorrar espacio y no le colocan el otro pulsador.

entonces procedemos a editar.

si se fijan, mas arriba en el codigo estan "las notas" pero.. no son esas realmente..me dedique a sacarlas yo mismo.. una a una.. aca se las dejo

Código:
notas

	retlw 0x00	;c2
	retlw 0x01	;c#2
	retlw 0x02	;D2
	retlw 0x03	;D#2
	retlw 0x04	;E2
	retlw 0x05	;F2
	retlw 0x06	;F#2
	retlw 0x07	;G2
	retlw 0x08	;G#2
	retlw 0x09	;A2
	retlw 0x0A	;A#2
	retlw 0x0B	;B2
	retlw 0x0C	;C3
	retlw 0x0D	;C#3
	retlw 0x0E	;D3
	retlw 0x0F	;D#3
	retlw 0x10	;E3
	retlw 0x11	;F3
	retlw 0x12	;F#3
	retlw 0x13	;G3
	retlw 0x14	;G#3
	retlw 0x15	;A3
	retlw 0x16	;A#3
	retlw 0x17	;B3
	retlw 0x18	;C4
	retlw 0x19	;C#4
	retlw 0x1A	;D4
	retlw 0x1B	;D#4
	retlw 0x1c	;E4
	retlw 0x1D	;F4
	retlw 0x1E	;F#4
	retlw 0x1F	;G4
	retlw 0x20	;G#4
	retlw 0x21	;A4
	retlw 0x22	;A#4
	retlw 0x23	;B4
	retlw 0x24	;C5

ahora la de los tiempos:

Código:
tiempos:
	retlw 0x07	;57
	retlw 0x3C	;120x	  0:00.096
	retlw 0x18	;193	  0:00.040
	retlw 0x1B	;218	  0:00.047
	retlw 0x1D	;232	  0:00.049
	retlw 0x78	;240x	  0:00.193
	retlw 0xF0	;480x	  0:00.391
	retlw 0x3E	;498	  0:00.102
	retlw 0x43	;538	  0:00.107
	retlw 0x48	;582	  0:00.116	
	retlw 0x4D	;617	  0:00.129

las que tienen una X son las que encontre mas "reales" a la hora de escribir la musica
la duracion no es de fiarse por que las probe antes y creo que fue entre dos tempos distintos, no se que pasa ahora mi pc que se cualga un poco al grabar y asi no puedo examinar esto

entonces solo queda escribir nuestra melodia.. un ejemplo..

Himno de la alegria (Sinfonía n.º 9, Ludwig van Beethoven
Código:
	retlw 0x1c	;E4
	retlw 0x1c	;E4
	retlw 0x1D	;F4
	retlw 0x1F	;G4
	retlw 0x1F	;G4
	retlw 0x1D	;F4
	retlw 0x1c	;E4
	retlw 0x1A	;D4
	retlw 0x18	;C4
	retlw 0x18	;C4
	retlw 0x1A	;D4
	retlw 0x1c	;E4
	retlw 0x1c	;E4
	retlw 0x1A	;D4
	retlw 0x1A	;D4

parece bien no?... pues no.. ¿ que tiene de mal?..

nos falto la duracion de las notas.. pues solo las colocamos.

Código:
	retlw 0x1c	;E4
	retlw 0x78	;240
	retlw 0x1c	;E4
	retlw 0x78	;240
	retlw 0x1D	;F4
	retlw 0x78	;240
	retlw 0x1F	;G4
	retlw 0x78	;240
	retlw 0x1F	;G4
	retlw 0x78	;240
	retlw 0x1D	;F4
	retlw 0x78	;240
	retlw 0x1c	;E4
	retlw 0x78	;240
	retlw 0x1A	;D4
	retlw 0x78	;240
	retlw 0x18	;C4
	retlw 0x78	;240
	retlw 0x18	;C4
	retlw 0x78	;240
	retlw 0x1A	;D4
	retlw 0x78	;240
	retlw 0x1c	;E4
	retlw 0x78	;240
	retlw 0x1c	;E4
	retlw 0x78	;240
	retlw 0x1A	;D4
	retlw 0x78	;240
	retlw 0x1A	;D4
	retlw 0xF0	;480

notese que la ultima la dejamos sonar de mas por que asi va la cancion.

hasta aca todo bien, ya tenemos nuestra melodia hecha para el pic solo queda compilar a hex y quemar el pic pero se nos va un detalle..

el circuito de proteus esta pensado para un pic con cristal de cuarzo de 1mhz y pues por aca solo consigo de 4mhz ¿en que les afecta que tengan mi misma suerte?.. en mucho..

primero.. las notas seran una o dos octavas mas agudas

lease Octava

y pues la duracion no sera la misma.. sera mucho mas corta, pero me las he arreglado..

adjunto esta un rar con las melodias..

PIC1.mid es la que queria meter al pic pero la duracion de las notas es algo larga.
asi que solo hace falta dejar salir al musico interior para hacer unos arreglos para que la musica sea uniforme como se escucha en PIC2.mid

no encontre otra forma de hacerles llegar esto, no encuentro reproductores para el foro, y menos de midi

con esto todo claro.. para aquellos que tengan otra version de proteus adjunto el rar de la carpeta PIC Doorbell.

bueno espero haber ayudado a otros 5000 mas y ante cualquier duda solo escribir y esperar respuesta.
 

Adjuntos

  • PIC sonidos.rar
    615 bytes · Visitas: 604
  • PIC Doorbell.rar
    29 KB · Visitas: 424
Cuando tenga mas tiempo lo leeré detenidamente y probare, ya que probando es la mejor forma para aprender.. según yo.. :p y de música no cacho una así que esto esta de pelos .. =)

Saludos man.. y gracias.. siga así =D
 
Bueno dire que aprendiste mas Duno:D! y pues bueno yo si no me hubiera animado a entrarle al ASM y pues bueno te felicito que seguramente mas de alguno se cruzara con esto saludos y segui asi!

HADES:cool:
 
Lindo laburo te mandaste pero esto se puede hacer muy facil con picbasic que ya tiene el comando, hay uno para sacar frecuencias (frec,duracion), uno para ruido rosa a distintas frecuencia o notas. :D
 
Lindo laburo te mandaste pero esto se puede hacer muy facil con picbasic que ya tiene el comando, hay uno para sacar frecuencias (frec,duracion), uno para ruido rosa a distintas frecuencia o notas. :D

:rolleyes:.......:cabezon:

u.u.. pensar que perdi mucho tiempo en esto.. teniendo para sacar la frecuencia de las notas que aca las tengo..


bueno igual aprendi ASM.. revisare eso del picbasic a ver que tal :D.. muchas gracias fernandoae
 
Última edición:
"la imagen nos dice que se tocan 120 notas negras en un minuto, osea que cada una duraria 0.5 segundos" con esto se puede temporizar los tiempo estandar, bueno gracias por la enseñanza, yo tambien había observado Doorbell.asm pero me complicaba mas en obtener notas de ese tipo
retlw 0x00 ;c2
retlw 0x01 ;c#2
retlw 0x02 ;D2
retlw 0x03 ;D#2
retlw 0x04 ;E2

nomenclatura ingles (frecuencias de cada nota musical), :aplauso: gracias!
 
"la imagen nos dice que se tocan 120 notas negras en un minuto, osea que cada una duraria 0.5 segundos" con esto se puede temporizar los tiempo estandar, bueno gracias por la enseñanza, yo tambien había observado Doorbell.asm pero me complicaba mas en obtener notas de ese tipo
retlw 0x00 ;c2
retlw 0x01 ;c#2
retlw 0x02 ;D2
retlw 0x03 ;D#2
retlw 0x04 ;E2

nomenclatura ingles (frecuencias de cada nota musical), :aplauso: gracias!

pues fijate que asi aprendi yo.. con la notacion inglesa.. me parece mas facil con las primeras 7 letras del ABC que con el poema pero bueno.. como nos podamos entender :LOL:
 
que tal te dejo el código


Código:
'****************************************************************
'*  Name    :  Programa de Producción de musica 2010: Tema 1    *
'*  Author  : [mecatrodatos                                     *
'*  Notice  : Copyright (c) 2010 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 28/07/2010                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************

'-----------Inicializacion ---------

    define OSC 20           ' Establece la frecuencia de operación del microcontrolador
                            'A 20 MHz.
    TRISB = %11111000          ' Configura RB0 - 3 de PORTB como salida
    
    PORTB = %00000000        ' Establece todos los pines en PORTB en Bajo (0 V).          



' La variable "x" representa la octava nota. La longitud de tiempo que la
' corchea (x) es detereminada por el valor fijado en 200.
' Un cuarto de nota es dos veces una corchea o 2x.

    x var Word 
    
' Estas son las constantes que se utiliza para declarar las frecuencias Como señala.
'Por ejemplo los grupos de autoayuda representa Super G de alta que tiene una frecuencia de 1568 Hz.
    
    shg con  1568
    shef con 1244
    shc con  1046
    shbf con 932
    shaf con 830
    hg con   784
    hf con   698
    hef con  622
    hd con   587
    hc con   523
    hbf con  466
    haf con  415
    g con    392
    f con    349
    ef con   311
    d con    293
    c con    261
    bf con   233
    af con   208
    lg con   196
    lf con   174
    lef con  155
    ld con   146
    lc con   130
    lbf con  116
    laf con  103
    slg con  98
    slf con  87
    slef con 78
    sld con  73
    slc con  65
    
'-------------programa principal------------    
    
    x = 200             ' Una nota de sesiones (x) será de 200 ms largo.
      
  Pause 1000            ' Pausa 1000 ms antes de iniciar la generación de tonos.
    
' linea 1  

  FreqOut 1, x, g       ' Usamos FreqOut Para generar un tono. 1 representa
'pin de salida RB1 en el PIC16F88. "X" simboliza la
'corchea. "G" se define como la frequecy 392 Hz.
                        
  FreqOut 1, x, f       
  FreqOut 1, x, g
  FreqOut 1, x, f
  FreqOut 1, x, ef
  FreqOut 1, x, c
  FreqOut 1, 4*x, ef
  FreqOut 1, 4*x, d
  FreqOut 1, x, g
  FreqOut 1, x, f
  FreqOut 1, x, g
  FreqOut 1, x, f
  FreqOut 1, x, ef
  FreqOut 1, x, c
  FreqOut 1, 4*x, ef
  FreqOut 1, 4*x, d
  FreqOut 1, x, g
  FreqOut 1, x, f
  FreqOut 1, x, g
  FreqOut 1, x, f
  
 'linea 2
 
  FreqOut 1, x, ef
  FreqOut 1, x, c
  FreqOut 1, 3*x, d
  FreqOut 1, x, ef
  FreqOut 1, x, d
  FreqOut 1, x, c
  FreqOut 1, x, bf
  FreqOut 1, x, af
  FreqOut 1, 8*x, ef
  FreqOut 1, x, hg
  FreqOut 1, x, hf
  FreqOut 1, x, hg
  FreqOut 1, x, hf
  FreqOut 1, x, hef
  FreqOut 1, x, hc
  FreqOut 1, 2*x, hef
  
  'linea 3
  
  FreqOut 1, 2*x, hef
  FreqOut 1, 4*x, hd
  FreqOut 1, x, hg
  FreqOut 1, x, hf
  FreqOut 1, x, hg
  FreqOut 1, x, hf
  FreqOut 1, x, hef
  FreqOut 1, x, hc
  FreqOut 1, 4*x, hef             
  FreqOut 1, 4*x, hd                         
  FreqOut 1, x, hg
  FreqOut 1, x, hf
  FreqOut 1, x, hg
  FreqOut 1, x, hf
  FreqOut 1, x, hef
  FreqOut 1, x, hc
  FreqOut 1, 2*x, hd
  FreqOut 1, x, hef
  FreqOut 1, x, hd
  FreqOut 1, x, hc
  
  'linea 4
  
  FreqOut 1, x, hbf
  FreqOut 1, x, haf
  FreqOut 1, 9*x, hef
  FreqOut 1, 4*x, 0  
  FreqOut 1, x, ef
  FreqOut 1, x, d
  FreqOut 1, x, c
  FreqOut 1, x, bf
  FreqOut 1, x, c
  FreqOut 1, x, d 
  FreqOut 1, 2*x, lg 
  FreqOut 1, x, ef
  FreqOut 1, x, d
  FreqOut 1, x, c
  FreqOut 1, x, bf
  FreqOut 1, 2*x, c
  FreqOut 1, x, ef
  FreqOut 1, x, d
  FreqOut 1, x, c
  FreqOut 1, x, bf
  FreqOut 1, x, c
  FreqOut 1, x, d
  FreqOut 1, 2*x, lg 
  FreqOut 1, x, ef
  FreqOut 1, x, d
  
  'linea 5 
  
  FreqOut 1, x, c
  FreqOut 1, x, bf
  FreqOut 1, 2*x, c 
  FreqOut 1, x, ef
  FreqOut 1, x, d
  FreqOut 1, x, c
  FreqOut 1, x, bf
  FreqOut 1, x, c
  FreqOut 1, x, d
  FreqOut 1, 2*x, lg
  FreqOut 1, x, ef
  FreqOut 1, x, d
  FreqOut 1, x, c
  FreqOut 1, x, d
  FreqOut 1, 2*x, c
  FreqOut 1, x, hef
  FreqOut 1, x, hd
  FreqOut 1, x, hc
  FreqOut 1, x, hbf
  FreqOut 1, x, hc
  FreqOut 1, x, hd
  FreqOut 1, 2*x, g
  FreqOut 1, x, hef
  FreqOut 1, x, hd
  FreqOut 1, x, hc
  FreqOut 1, x, hbf
  FreqOut 1, 2*x, hc
  
  'linea 6
  
  FreqOut 1, x, hef
  FreqOut 1, x, hd
  FreqOut 1, x, hc
  FreqOut 1, x, hbf
  FreqOut 1, x, hc
  FreqOut 1, x, hd
  FreqOut 1, 2*x, g
  FreqOut 1, x, hef
  FreqOut 1, x, hd
  FreqOut 1, x, hc
  FreqOut 1, x, hbf
  FreqOut 1, 2*x, hc
  FreqOut 1, x, hef
  FreqOut 1, x, hd
  FreqOut 1, x, hc
  FreqOut 1, x, hbf
  FreqOut 1, x, hc
  FreqOut 1, x, hd
  FreqOut 1, 2*x, g
  FreqOut 1, x, hef
  FreqOut 1, x, hd
  FreqOut 1, x, hc
  FreqOut 1, x, hd
  FreqOut 1, 2*x, hc
  FreqOut 1, 2*x, hg
  FreqOut 1, 2*x, shC
  
  'linea 7
  
  FreqOut 1, 2*x, shef
  FreqOut 1, 4*x, shg
  FreqOut 1, x, g
  FreqOut 1, x, f
  FreqOut 1, x, g
  FreqOut 1, x, f
  FreqOut 1, x, ef
  FreqOut 1, x, c
  FreqOut 1, 4*x, ef
  FreqOut 1, 4*x, d
  FreqOut 1, x, g
  FreqOut 1, x, f
  FreqOut 1, x, g
  FreqOut 1, x, f
  FreqOut 1, x, ef
  FreqOut 1, x, c
  FreqOut 1, 4*x, ef
  FreqOut 1, 4*x, d
  
  'linea 8
  
  FreqOut 1, x, g
  FreqOut 1, x, f
  FreqOut 1, x, g
  FreqOut 1, x, f
  FreqOut 1, x, ef
  FreqOut 1, x, c
  FreqOut 1, 3*x, d
  FreqOut 1, x, ef
  FreqOut 1, x, d
  FreqOut 1, x, c
  FreqOut 1, x, bf
  FreqOut 1, x, af
  FreqOut 1, 8*x, ef
  FreqOut 1, x, hg
  FreqOut 1, x, hf
  FreqOut 1, x, hg
  FreqOut 1, x, hf
  FreqOut 1, x, hef
  FreqOut 1, x, hc
  FreqOut 1, 2*x, hef
  
  'linea 9
  
  FreqOut 1, 2*x, hef
  FreqOut 1, 4*x, hd
  FreqOut 1, x, hg
  FreqOut 1, x, hf
  FreqOut 1, x, hg
  FreqOut 1, x, hf
  FreqOut 1, x, hef
  FreqOut 1, x, hc
  FreqOut 1, 4*x, hef             
  FreqOut 1, 4*x, hd                         
  FreqOut 1, x, hg
  FreqOut 1, x, hf
  FreqOut 1, x, hg
  FreqOut 1, x, hf
  FreqOut 1, x, hef
  FreqOut 1, x, hc
  FreqOut 1, 2*x, hd
  FreqOut 1, x, hef
  FreqOut 1, x, hd
  FreqOut 1, x, hc
  FreqOut 1, x, hbf
  FreqOut 1, x, haf
  FreqOut 1, 6*x, hef             
  End
 
que tal te dejo el código


mm no encuentro mayor diferencia que el microcontrolador..
sera por mi computadora?.. la simulacion en proteus va lenta "due exesive CPU load"

sera esto el micro controlador?

Código:
define xtal 4
device 16f84A
'tempo = 150
'60/150 = duracion de una nota negra
'redonda = 1600
'blanca = 800
'negra = 400
'corchea = 200
'semi corchea = 100
'Ejemplo del comando
'FREQOUT portb.0, 2000, 7200 sacar una frecuencia 
'de 7,2 Khz durante 2 segundos por el Puerto B.0

start:
'primer compas
Freqout portb.0, 400, 659
Freqout portb.0, 200, 493
Freqout portb.0, 200, 523
Freqout portb.0, 400, 587
Freqout portb.0, 200, 523
Freqout portb.0, 200, 493
'segundo compas
Freqout portb.0, 400, 440
Freqout portb.0, 200, 440
Freqout portb.0, 200, 523
Freqout portb.0, 400, 659
Freqout portb.0, 200, 587
Freqout portb.0, 200, 523
'tercer compas
Freqout portb.0, 400, 493
Freqout portb.0, 200, 493
Freqout portb.0, 200, 523
Freqout portb.0, 400, 587
Freqout portb.0, 400, 659
'cuarto compas
Freqout portb.0, 200, 523
Freqout portb.0, 400, 440
Freqout portb.0, 800, 440
'quito compas
pause 200
Freqout portb.0, 400, 587
Freqout portb.0, 200, 698
Freqout portb.0, 400, 880
Freqout portb.0, 200, 783
Freqout portb.0, 200, 698
'sexto compas
Freqout portb.0, 400, 659
pause 500
Freqout portb.0, 200, 523
Freqout portb.0, 400, 659
Freqout portb.0, 200, 587
Freqout portb.0, 200, 523
'tercer compas
Freqout portb.0, 400, 493
Freqout portb.0, 200, 493
Freqout portb.0, 200, 523
Freqout portb.0, 400, 587
Freqout portb.0, 400, 659
'cuarto compas
Freqout portb.0, 200, 523
Freqout portb.0, 400, 440
Freqout portb.0, 800, 440

                                
END

las pausas son los silencios, lo divido en compases para mejor lectura, no quise mandarme a escribir todas las octavas con el var y
 
eh leido atentamete el programa que dejastes pero tengo un duda con una isntrucciones dadas

movwf tempo
movlw tune0 / 0x100

lo q no tengo claro es operador "/" con respecto a la tabla "tune0"; no entiendo que es lo q lee o retorna a "w"

Si puedes me explicas mejor por que usan ese operador.

Gracias
 
Hola. Buen día.
Todo el código esta entendible, pero tengo la misma duda que el compañero @wilor8.
¿Por qué divides y le sacas el modulo ?

movlw tune0 / 0x100
movwf tptrh
movlw tune0 % 0x100

Espero tu respuesta. Gracias.
 
¿Cómo podemos hacer la conversión de 1Mhz a 4Mhz para el Cristal Oscilador?
Gracias.
No entiendo muy bien tu pregunta, podrias reeplantearla.

Si te refieres a convertir un cristal de 1Mhz a un cristal de 4Mhz, no se.
Si te refieres a convertir ese codigo del doorbell de 1Mhz a 4Mhz, el autor del hilo explica muy bien como se logra, usando tablas de la frecuencia de cada nota musical, si tienes un cristal de 4Mhz debes generar tus tablas de duración de los ciclos del micro o por interrupciones, te recomiendo usar el PICTimerCalculator.
 
Atrás
Arriba