lunes, 16 de septiembre de 2013

Proyecto de Teslápolis: Caja Musical

   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