Proyecto piano control de interfaces
matehusu
Created on November 4, 2020
More creations to inspire you
Transcript
Control de interfaces
La programación
La física del sonido y la musica
Los componentes
Introducción
La Física del sonido
- La energía con la que vibra un objeto y transmite al aire como sonido se mide en decibelios (dB), esto determina que tan fuerte es el sonido.
- Su agudez o gravedad es según la frecuencia básica con la que vibran en el aire, a esta se la conoce como frecuencia fundamental
- Su armonía consta de la frecuencia fundamental, más las frecuencias secundarias, que lo acompañan de una forma precisa según el objeto. Eso hace que dos instrumentos con la misma nota suenen distintos, o que un sonido sea agradable o desagradable.
- La duración del sonido depende de la longitud de la onda.
La Física del sonido
#define F_CPU 1000000
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "piano.h"
int main (void) {
TCCR0A = 0x83; //interruptor
TCCR0B = 0x03;
TIMSK0 = 0x01;
sei ();
PCICR = 0b00000011; // PCINT0 activada (Interrupciones en todo el Puerto B)
PCMSK0 = 0xFF; // interrupcion en PB0
PCMSK1 = 0b00011111; // "" PC0
while (1) {
}
return 0;
}
ISR (PCINT0_vect) { //interrupción en PB
switch (PINB) {
case 0b00000001: NOTA(C4);
break;
case 0b00000010: NOTA(C4S);
break;
case 0b00000100: NOTA(D4);
break;
case 0b00001000: NOTA(D4S);
break;
case 0b00010000: NOTA(E4);
break;
case 0b00100000: NOTA(F4);
break;
case 0b01000000: NOTA(F4S);
break;
case 0b10000000: NOTA(G4);
break;
default: NOTA(0);
break;
}
}
ISR (PCINT1_vect) { //interrupción en PC
switch (PINC) {
case 0b01000001: NOTA(G4S);
break;
case 0b01000010: NOTA(A4);
break;
case 0b01000100: NOTA(A4S);
break;
case 0b01001000: NOTA(B4);
break;
default: NOTA(0);
break;
}
}
ISR (TIMER0_OVF_vect) { //interrupción general
switch (get_nota()) { //reubicar la nota después de la interrupción
case C4: NOTA(C4);
break;
case C4S: NOTA(C4S);
break;
case D4: NOTA(D4);
break;
case D4S: NOTA(D4S);
break;
case E4: NOTA(E4);
break;
case F4: NOTA(F4);
break;
case F4S: NOTA(F4S);
break;
case G4: NOTA(G4);
break;
case G4S: NOTA(G4S);
break;
case A4: NOTA(A4);
break;
case A4S: NOTA(A4S);
break;
case B4: NOTA(B4);
break;
case C5: NOTA(C5);
break;
}
}
MCU=atmega328p
PART=m328p
F_CPU=1000000
CC=avr-gcc
OBJCOPY=avr-objcopy
CFLAGS=-std=c99 -Wall -g -Os -mmcu=${MCU} -DF_CPU=${F_CPU} -I.
TARGET=main
SRCS=main.c piano.c
PROGRAMMER=usbasp
all:
${CC} ${CFLAGS} -o ${TARGET}.bin ${SRCS}
${OBJCOPY} -j .text -j .data -O ihex ${TARGET}.bin ${TARGET}.hex
flash:
avrdude -p ${PART} -c ${PROGRAMMER} -U flash:w:${TARGET}.hex:i
#include "piano.h"
void corchea (unsigned char nota) {
NOTA(nota);
_delay_ms (375);
}
void negra (unsigned char nota) {
NOTA(nota);
_delay_ms (750);
}
void blanca (unsigned char nota) {
NOTA(nota);
_delay_ms (1500);
}
unsigned char get_nota (void){ //medicion de nota post interrupción
switch (OCR0A) {
case C4 + (256-C4)/2: return C4;
break;
case C4S + (256-C4S)/2: return C4S;
break;
case D4 + (256-D4)/2: return D4;
break;
case D4S + (256-D4S)/2: return D4S;
break;
case E4 + (256-E4)/2: return E4;
break;
case F4 + (256-F4)/2: return F4;
break;
case F4S + (256-F4S)/2: return F4S;
break;
case G4 + (256-G4)/2: return G4;
break;
case G4S + (256-G4S)/2: return G4S;
break;
case A4 + (256-A4)/2: return A4;
break;
case A4S + (256-A4S)/2: return A4S;
break;
case B4 + (256-B4)/2: return B4;
break;
case C5 + (256-C5)/2: return C5;
break;
default: return 0;
}
}
#include <util/delay.h>
#include <avr/io.h>
#define C4 196
#define C4S 200
#define D4 203
#define D4S 206
#define E4 209
#define F4 211
#define F4S 214 //resultados del traspaso de onda cuadrada a pulsos
#define G4 216
#define G4S 218
#define A4 220
#define A4S 222
#define B4 224
#define C5 226
#define NOTA(OCR) TCNT0 = OCR; \
OCR0A = OCR + (256-OCR)/2 //establecer la semi interrupción (se mide en pulsos)
void corchea (unsigned char nota);
void blanca (unsigned char nota);
void negra (unsigned char nota);
unsigned char get_nota (void); //declaramos medicion post interrupción