You are on page 1of 7

UNIVERSIDAD PRIVADA DEL VALLE

FACULTAD DE INFORMATICA Y ELECTRONICA


INGENIERIAEvaluacin
ELECTRONICA
CAMPUS TIQUIPAYA

MICROPROCESADORES II
PRACTICA # 3
PIANO ELECTRONICO
Grupo A

Estudiantes: Gregory Oquendo Tapia


Tania Rub Alcocer
Ariel Adrin Carvajal Pardo
Docente: Msc. Ing. Gerson Prez Villarroel
Cochabamba 25 de Junio
Gestin I 2015
UNIVERSIDAD PRIVADA DEL VALLE
SERVICIOS DE LABORATORIO
LABORATORIOS DE DISEO ELECTRONICO II

PRACTICA N 3
PIANO ELECTRONICO
1. Utilizar el Mdulo CCP1 de un microcontrolador PIC16F877 ( PIC16F877A) en modo PWM
para Realizar un programa que genere notas musicales de 2 octavas de un teclado
musical correspondientes a las frecuencias que van desde 261,1 Hz hasta 987,77 Hz. Las
frecuencias para cada nota se muestran en la figura 4.

Las 2 octavas a
ser representadas

Figura 4.- frecuencias de las notas musicales


Utilice el CCP1 como salida del sonido, se recomienda que use teclados matriciales 5x5 para las
conectar las 24 teclas correspondientes a las 2 octavas. Para generar las frecuencias de las notas
use por comodidad solo CCPR1L y un Prescaler para TMR2=16. El tiempo en Duty o de trabajo
(Ton) debe ser el 50% del periodo, por tanto la duracin de los pulsos o de los periodos (T) ser:

T=1/fHz = (PR2+1)* Prescaler_TMR2 * 4/4MHz


De esta ecuacin se obtiene el valor que se debe cargar a PR2 para obtener el periodo
correspondiente a cada una de las notas. El tiempo en Duty o de trabajo (Ton) est dado por:
Ton=1/(2*fHz)=4*(CCPR1L) * Prescaler_TMR2 * 1/4MHz
De esta ecuacin se obtiene el valor que se debe cargar a CCPR1L para obtener el tiempo Duty
o de trabajo del periodo correspondiente a cada una de las notas.
CODIGO
Para la primera parte del cdigo se tuvo:
#include <18F4520.h>
#device adc=8
#FUSES NOWDT

//No Watch Dog Timer

#FUSES WDT128

//Watch Dog Timer uses 1:128 Postscale

#FUSES XT

//Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD

#FUSES NOPROTECT
#FUSES NOBROWNOUT
//#FUSES BORV20

//Code not protected from reading


//No brownout reset
//Brownout reset at 2.0V

#FUSES NOPUT

//No Power Up Timer

#FUSES NOCPD

//No EE protection

#FUSES STVREN

//Stack full/underflow will cause reset

#FUSES NODEBUG
#FUSES NOLVP
#FUSES NOWRT
#FUSES NOWRTD
#FUSES IESO

//No Debug mode for ICD


//No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
//Program memory not write protected
//Data EEPROM not write protected
//Internal External Switch Over mode enabled

#FUSES FCMEN

//Fail-safe clock monitor enabled

#FUSES PBADEN

//PORTB pins are configured as analog input channels on RESET

#FUSES NOWRTC

//configuration not registers write protected

#FUSES NOWRTB

//Boot block not write protected

#FUSES NOEBTR

//Memory not protected from table reads

#FUSES NOEBTRB
#FUSES NOCPB
#FUSES LPT1OSC
#FUSES MCLR
#FUSES NOXINST

#use delay(clock=4000000)

//Boot block not protected from table reads


//No Boot Block code protection
//Timer1 configured for low-power operation
//Master Clear pin enabled
//Extended set extension and Indexed Addressing mode disabled (Legacy mode)

Y para la segunda parte del archivo se tuvo:


#include "C:\Users\ArielAdrian\Documents\Ariel - Jr\I - 2015\Microprocesadores II\Practica Final - Piano electrnico\codigo
fuente\piano electrnico.h" //Indicar ruta correcta para compilar
#include <TONES.c> //inclumos la libreria para generar los sonidos.
#include <kbd.c>
int S_corchea=125,corchea=250,fusa=62;
long negra=500,blanca=1000,redonda=2000;
char k;
int i;
void h_alegria(){
generate_tone(E_NOTE[0], negra);
generate_tone(E_NOTE[0], negra);
generate_tone(F_NOTE[0], negra);
generate_tone(G_NOTE[0], negra);
generate_tone(G_NOTE[0], negra);
generate_tone(F_NOTE[0], negra);
generate_tone(E_NOTE[0], negra);
generate_tone(D_NOTE[0], negra);
generate_tone(C_NOTE[0], negra);
generate_tone(C_NOTE[0], negra);
generate_tone(D_NOTE[0], negra);
generate_tone(E_NOTE[0], negra);
generate_tone(E_NOTE[0], 750);
generate_tone(D_NOTE[0], corchea);
generate_tone(D_NOTE[0], blanca);
generate_tone(E_NOTE[0], negra);
generate_tone(E_NOTE[0], negra);
generate_tone(F_NOTE[0], negra);
generate_tone(G_NOTE[0], negra);
generate_tone(G_NOTE[0], negra);
generate_tone(F_NOTE[0], negra);
generate_tone(E_NOTE[0], negra);
generate_tone(D_NOTE[0], negra);
generate_tone(C_NOTE[0], negra);
generate_tone(C_NOTE[0], negra);
generate_tone(D_NOTE[0], negra);
generate_tone(E_NOTE[0], negra);
generate_tone(D_NOTE[0], 750);
generate_tone(C_NOTE[0], corchea);
generate_tone(C_NOTE[0], blanca);
generate_tone(D_NOTE[0], negra);
generate_tone(D_NOTE[0], negra);
generate_tone(E_NOTE[0], negra);
generate_tone(C_NOTE[0], negra);
generate_tone(D_NOTE[0], negra);
generate_tone(E_NOTE[0], corchea);
generate_tone(F_NOTE[0], Corchea);
generate_tone(E_NOTE[0], negra);
generate_tone(C_NOTE[0], negra);
generate_tone(D_NOTE[0], negra);
generate_tone(E_NOTE[0], corchea);
generate_tone(F_NOTE[0], corchea);
generate_tone(E_NOTE[0], negra);
generate_tone(D_NOTE[0], negra);
generate_tone(C_NOTE[0], negra);
generate_tone(D_NOTE[0], negra);
generate_tone(196, blanca);
generate_tone(E_NOTE[0], negra);
generate_tone(E_NOTE[0], negra);
generate_tone(F_NOTE[0], negra);

generate_tone(G_NOTE[0], negra);
generate_tone(G_NOTE[0], negra);
generate_tone(F_NOTE[0], negra);
generate_tone(E_NOTE[0], negra);
generate_tone(D_NOTE[0], negra);
generate_tone(C_NOTE[0], negra);
generate_tone(C_NOTE[0], negra);
generate_tone(D_NOTE[0], negra);
generate_tone(E_NOTE[0], negra);
generate_tone(D_NOTE[0], 750);
generate_tone(C_NOTE[0], corchea);
generate_tone(C_NOTE[0], blanca);
delay_ms(2000);
}
void para_elisa(){
generate_tone(E_NOTE[1], corchea);
generate_tone(Eb_NOTE[1], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(Eb_NOTE[1], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(B_NOTE[0], corchea);
generate_tone(D_NOTE[1], corchea);
generate_tone(C_NOTE[1], corchea);
generate_tone(A_NOTE[0], 750);
generate_tone(C_NOTE[0], corchea);
generate_tone(E_NOTE[0], corchea);
generate_tone(A_NOTE[0], corchea);
generate_tone(B_NOTE[0], 750);
generate_tone(E_NOTE[0], corchea);
generate_tone(Ab_NOTE[0], corchea);
generate_tone(B_NOTE[0], corchea);
generate_tone(C_NOTE[1], 750);
generate_tone(E_NOTE[0], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(Eb_NOTE[1], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(Eb_NOTE[1], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(B_NOTE[0], corchea);
generate_tone(D_NOTE[1], corchea);
generate_tone(C_NOTE[1], corchea);
generate_tone(A_NOTE[0], 750);
generate_tone(C_NOTE[0], corchea);
generate_tone(E_NOTE[0], corchea);
generate_tone(A_NOTE[0], corchea);
generate_tone(B_NOTE[0], 750);
generate_tone(E_NOTE[0], corchea);
generate_tone(C_NOTE[1], corchea);

generate_tone(B_NOTE[0], corchea);
generate_tone(A_NOTE[0], 750);
generate_tone(B_NOTE[0], corchea);
generate_tone(C_NOTE[1], corchea);
generate_tone(D_NOTE[1], corchea);
generate_tone(E_NOTE[1], 750);

generate_tone(E_NOTE[1], corchea);
generate_tone(Eb_NOTE[1], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(B_NOTE[0], corchea);
generate_tone(D_NOTE[1], corchea);
generate_tone(C_NOTE[1], corchea);
generate_tone(A_NOTE[0], 750);

generate_tone(G_NOTE[0], corchea);
generate_tone(F_NOTE[1], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(D_NOTE[1], 750);

generate_tone(C_NOTE[0], corchea);
generate_tone(E_NOTE[0], corchea);
generate_tone(A_NOTE[0], corchea);
generate_tone(B_NOTE[0], 750);

generate_tone(F_NOTE[0], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(D_NOTE[1], corchea);
generate_tone(C_NOTE[1], 750);

generate_tone(E_NOTE[0], corchea);
generate_tone(C_NOTE[1], corchea);
generate_tone(B_NOTE[0], corchea);
generate_tone(A_NOTE[0], 1500);

generate_tone(E_NOTE[0], corchea);
generate_tone(D_NOTE[1], corchea);
generate_tone(C_NOTE[1], corchea);
generate_tone(B_NOTE[0], 750);

delay_ms(2000);
}

generate_tone(E_NOTE[0], corchea);
generate_tone(E_NOTE[0], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(E_NOTE[0], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(E_NOTE[2], corchea);
generate_tone(Eb_NOTE[1], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(Eb_NOTE[1], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(Eb_NOTE[1], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(B_NOTE[0], corchea);
generate_tone(D_NOTE[1], corchea);
generate_tone(C_NOTE[1], corchea);
generate_tone(A_NOTE[0], 750);
generate_tone(C_NOTE[0], corchea);
generate_tone(E_NOTE[0], corchea);
generate_tone(A_NOTE[0], corchea);
generate_tone(B_NOTE[0], 750);
generate_tone(E_NOTE[0], corchea);
generate_tone(Ab_NOTE[0], corchea);
generate_tone(B_NOTE[0], corchea);
generate_tone(C_NOTE[1], 750);
generate_tone(E_NOTE[0], corchea);
generate_tone(E_NOTE[1], corchea);
generate_tone(Eb_NOTE[1], corchea);

void main()
{
setup_adc_ports(NO_ANALOGS|VSS_VDD);
setup_adc(ADC_CLOCK_DIV_2|ADC_TAD_MUL_0);
setup_psp(PSP_DISABLED);
setup_spi(SPI_SS_DISABLED);
setup_wdt(WDT_OFF);
setup_timer_0(RTCC_INTERNAL);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillator
Config tab
// TODO: USER CODE!!
//::::::::::::::::::: Condiciones Iniciales :::::::::::::::::::::::::::::::
set_tris_A(0111111); //Puerto A como salida "0" Pin 13/14
entradas Xtal
set_tris_C(0xFF); //Puerto c como salida
set_tris_B(0xFF); //Puerto B como salida "0"
set_tris_D(0xFF); //Puerto d como entrada "1"
set_tris_E(0xC); //Puerto E como entrada
output_C (0x00);
output_D (0x00);
output_A (0xC0);
output_E (0xC);
output_B (0x00);
//::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

//::::::::::::::::::::::::::::::::::::::::::::::::::::::::
while(1){
while (INPUT_STATE(PIN_C0) ==1){generate_tone(C_NOTE[0], negra);}
while (INPUT_STATE(PIN_C1) ==1){generate_tone(Db_NOTE[0], negra);}
while (INPUT_STATE(PIN_C2) ==1){generate_tone(D_NOTE[0], negra);}
while (INPUT_STATE(PIN_C4) ==1){generate_tone(Eb_NOTE[0], negra);}
while (INPUT_STATE(PIN_C5) ==1){generate_tone(E_NOTE[0], negra);}
while (INPUT_STATE(PIN_C6) ==1){generate_tone(F_NOTE[0], negra);}
while (INPUT_STATE(PIN_C7) ==1){generate_tone(Gb_NOTE[0], negra);}
while (INPUT_STATE(PIN_D0) ==1){generate_tone(G_NOTE[0], negra);}
while (INPUT_STATE(PIN_D1) ==1){generate_tone(Ab_NOTE[0], negra);}
while (INPUT_STATE(PIN_D2) ==1){generate_tone(A_NOTE[0], negra);}
while (INPUT_STATE(PIN_D3) ==1){generate_tone(Bb_NOTE[0], negra);}
while (INPUT_STATE(PIN_D4) ==1){generate_tone(B_NOTE[0], negra);}
while (INPUT_STATE(PIN_D5) ==1){generate_tone(C_NOTE[1], negra);}
while (INPUT_STATE(PIN_D6) ==1){generate_tone(Db_NOTE[1], negra);}
while (INPUT_STATE(PIN_D7) ==1){generate_tone(D_NOTE[1], negra);}
while (INPUT_STATE(PIN_B7) ==1){generate_tone(Eb_NOTE[1], negra);}
while (INPUT_STATE(PIN_B6) ==1){generate_tone(E_NOTE[1], negra);}
while (INPUT_STATE(PIN_B5) ==1){generate_tone(F_NOTE[1], negra);}
while (INPUT_STATE(PIN_B4) ==1){generate_tone(Gb_NOTE[1], negra);}
while (INPUT_STATE(PIN_B3) ==1){generate_tone(G_NOTE[1], negra);}
while (INPUT_STATE(PIN_B2) ==1){generate_tone(Ab_NOTE[1], negra);}
while (INPUT_STATE(PIN_B1) ==1){generate_tone(A_NOTE[1], negra);}
while (INPUT_STATE(PIN_B0) ==1){generate_tone(Bb_NOTE[1], negra);}
while (INPUT_STATE(PIN_A5) ==1){generate_tone(B_NOTE[1], negra);}
while (INPUT_STATE(PIN_A4) ==1){generate_tone(C_NOTE[2], negra);}
while (INPUT_STATE(PIN_A3) ==1){ h_alegria();}
while (INPUT_STATE(PIN_A2) ==1){ para_elisa();}
}
}

SIMULACION

You might also like