Para la feria de ciencias Teslápolis, decidimos presentar una caja musical con un villancico, para demostrar lo que se puede hacer en programación, tanto en Assembler como en C, y además es interesante para las personas que no tengan conocimientos en el campo de la electrónica y programación para que se den una cierta idea de lo que hacemos en la materia.
El proyecto lo hicimos en base a investigación en internet.
Para poder hacer proyecto, primero necesitamos el programa en el cual le vamos a colocar en nuestro PIC16F84A. Luego de haber investigado en internet, encontramos un programa (escrito tanto en Assembler como en C) para nuestro programa y de ejemplo muestra que a la salida (mediante un parlante) podremos escuchar un villancico de Navidad.
Éste es el código:
;------------------------------------------------------
include <p16f84A.inc>
LIST P=PIC16F84A
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
ERRORLEVEL -302
;------------------------------------------------------
ORG 0x00
goto Main
ORG 0x05
CBLOCK 0x0C
d1
d2
d3
d4
ENDC
#DEFINE bank1 bsf STATUS,RP0
#DEFINE bank0 bcf STATUS,RP0
;-----------------------------------------------------------
Main
bank1
clrf TRISB
movlw 0x1F
movwf TRISA
bank0
goto NotasMus
;---------------------------------------------------------------
NotasMus
call NotaRE
call Delay4seg
goto NotasMus
NotaDO
movlw 0x01
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
movwf PORTB
movlw 0x00
goto $+1
goto $+1
goto $+1
goto $+1
goto $+1
movwf PORTB
return
NotaRE
movlw 0x01
goto $+1
goto $+1
goto $+1
goto $+1
nop
movwf PORTB
movlw 0x00
goto $+1
goto $+1
goto $+1
goto $+1
nop
movwf PORTB
return
;Terminan las notas
Delay4seg
movlw 0xB6
movwf d1
movlw 0x99
movwf d2
movlw 0x2C
movwf d3
Delay_0
decfsz d1, f
goto $+2
decfsz d2, f
goto $+2
decfsz d3, f
goto Delay_0
;1 cycle
nop
;------------------------------------------------------
END
;------------------------------------------------------
Éste es el mismo código pero escrito en lenguaje C:
//-----------------------------------------------------
#include<16F84A.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES XT //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT //No Power Up Timer
#FUSES NOPROTECT //Code not protected from reading
#use delay(clock=4000000)
#use fast_io(A)
void pausa(void)
{
output_low(PIN_B0);
delay_ms(5);
return;
}
//Equivalencia de notas musicales
void notaSol(void)
{
Long Sol = 1000000/(393.1*2);
output_high(PIN_B0);
delay_us(Sol);
output_low(PIN_B0);
delay_us(Sol);
return;
}
void notaDoH(void)
{
long DoH = 1000000/(522*2);
output_high(PIN_B0);
delay_us(DoH);
output_low(PIN_B0);
delay_us(DoH);
return;
}
void notaReH(void)
{
long ReH = 1000000/(588*2);
output_high(PIN_B0);
delay_us(ReH);
output_low(PIN_B0);
delay_us(ReH);
return;
}
void notaMiH(void)
{
long MiH = 1000000/(660*2);
output_high(PIN_B0);
delay_us(MiH);
output_low(PIN_B0);
delay_us(MiH);
return;
}
void notaLa(void)
{
long La = 1000000/(439.9*2);
output_high(PIN_B0);
delay_us(La);
output_low(PIN_B0);
delay_us(La);
return;
}
void notaSi(void)
{
long Si = 1000000/(494.0*2);
output_high(PIN_B0);
delay_us(Si);
output_low(PIN_B0);
delay_us(Si);
return;
}
void notaFaH(void)
{
long FaH = 1000000/(698*2);
output_high(PIN_B0);
delay_us(FaH);
output_low(PIN_B0);
delay_us(FaH);
return;
}
void main()
{
set_tris_b(0b00000000); //RB0 como salida, los demás como entrada
int i,j; // Contadores
output_b(0x00); //Limpiamos PORTB
while(TRUE)
{
if(INPUT(PIN_B1))
{
for (i=0;i<131;i++)
{
notaSol();
}
pausa();
for (i=0;i<174;i++)
{
notaDoH();
}
pausa();
for (i=0;i<87;i++)
{
notaDoH();
}
pausa();
for (i=0;i<98;i++)
{
notaReH();
}
pausa();
for (i=0;i<87;i++)
{
notaDoH();
}
pausa();
for (i=0;i<82;i++)
{
notaSi();
}
pausa();
for (i=0;i<147;i++)
{
notaLa();
}
pausa();
for (i=0;i<147;i++)
{
notaLa();
}
pausa();
for (i=0;i<147;i++)
{
notaLa();
}
pausa();
for (i=0;i<196;i++)
{
notaReH();
}
pausa();
for (i=0;i<98;i++)
{
notaReH();
}
pausa();
for (i=0;i<110;i++)
{
notaMiH();
}
pausa();
for (i=0;i<98;i++)
{
notaReH();
}
pausa();
for (i=0;i<87;i++)
{
notaDoH();
}
pausa();
for (i=0;i<164;i++)
{
notaSi();
}
pausa();
for (i=0;i<131;i++)
{
notaSol();
}
pausa();
for (i=0;i<131;i++)
{
notaSol();
}
pausa();
for (i=0;i<220;i++)
{
notaMiH();
}
pausa();
for (i=0;i<110;i++)
{
notaMiH();
}
pausa();
for (i=0;i<116;i++)
{
notaFaH();
}
pausa();
for (i=0;i<110;i++)
{
notaMiH();
}
pausa();
for (i=0;i<98;i++)
{
notaReH();
}
pausa();
for (i=0;i<174;i++)
{
notaDoH();
}
pausa();
for (i=0;i<147;i++)
{
notaLa();
}
pausa();
for (i=0;i<65;i++)
{
notaSol();
}
pausa();
for (i=0;i<65;i++)
{
notaSol();
}
pausa();
for (i=0;i<147;i++)
{
notaLa();
}
pausa();
for (i=0;i<196;i++)
{
notaReH();
}
pausa();
for (i=0;i<165;i++)
{
notaSi();
}
pausa();
for(j=0;j<2;j++)
{
for (i=0;i<174;i++)
{
notaDoH();
}
}
output_low(PIN_B0);
delay_ms(1000);
}
}
}
Luego hicimos la simulación en Proteus para verificar que el programa funcione correctamente.
Éste sería el resultado en práctica con un protoboard, el inconveniente que hubo fue que la melodía se escuchaba a muy bajo volumen, eso se puede arreglar (no ocurre en todos los casos).
No hay comentarios.:
Publicar un comentario