Paso 8: código
Mucha gente gusta Arduino para esta codificación y no hay nada malo en utilizarlo, excepto creo que añade un montón de engordar un programa normalmente simple. También, sabía C y no sé Arduino. Tal vez un día, si hay tiempo. :)
Código:
{{{
#include < avr/io.h >
Utilizar un pin para activar el SPK
Definiciones de tipos / / /
typedef unsigned char u8;
int Main
{
U8 btnState0;
U8 btnState1;
U8 btnState2;
U8 btnState3;
U8 btnState4;
U8 btnState5;
U8 btnState6;
DDRB = (1 << DDB6); SPK conjunto para la salida
PORTD = (1 << PD0) | (1 << PD1) | (1 << PD2) | (1 << PD3) | (1 << PD4); Configurar botón alto
PORTC = (1 << PC4) | (1 << PC6);
TCCR2B = (1 << CS21); Configurar temporizador
mientras (1)
{
btnState0 = ~ PINC & (1 << PC5);
btnState1 = ~ PINC & (1 << PC4);
btnState2 = ~ PIND & (1 << PD0);
btnState3 = ~ PIND & (1 << PD1);
btnState4 = ~ PIND & (1 << PD2);
btnState5 = ~ PIND & (1 << PD3);
btnState6 = ~ PIND & (1 << PD4);
Si (btnState0)
{
Si (TCNT2 > = 190)
{
PORTB ^ = (1 << PD6); Perno de tirón de la SPK
TCNT2 = 0;
}
}
Si (btnState1)
{
Si (TCNT2 > = 179)
{
PORTB ^ = (1 << PD6); Perno de tirón de la SPK
TCNT2 = 0;
}
}
Si (btnState2)
{
Si (TCNT2 > = 159)
{
PORTB ^ = (1 << PD6); Perno de tirón de la SPK
TCNT2 = 0;
}
}
Si (btnState3)
{
Si (TCNT2 > = 142)
{
PORTB ^ = (1 << PD6); Perno de tirón de la SPK
TCNT2 = 0;
}
}
Si (btnState4)
{
Si (TCNT2 > = 126)
{
PORTB ^ = (1 << PD6); Perno de tirón de la SPK
TCNT2 = 0;
}
}
Si (btnState5)
{
Si (TCNT2 > = 119)
{
PORTB ^ = (1 << PD6); Perno de tirón de la SPK
TCNT2 = 0;
}
}
Si (btnState6)
{
Si (TCNT2 > = 106)
{
PORTB ^ = (1 << PD6); Perno de tirón de la SPK
TCNT2 = 0;
}
}
}
}
}}}
¿De dónde vienen los tonos? Se necesitaba un poco de matemáticas. El reloj en el atmega 168 opera a 1MHz. Es mucho demasiado rápido para el audio, así que tenemos que utilizar el prescaler de 8. A continuación, ya que necesitamos mover de un tirón el pin de salida alto y bajo para hacer 1 ciclo, tenemos que dividir la respuesta por 2 para venir para arriba con el tono adecuado. La fórmula se ve así,
Paso a poner en código = (1000000/8) / (destino frecuencia * 2)
Para A(440) esto sería 125000/880 = 142.045 o 142 para nuestros propósitos, puesto que el valor debe ser un entero.
Las frecuencias objetivo de notas se pueden encontrar casi en cualquier lugar en línea y generalmente son todos iguales.
Todavía quiero añadir una instrucción case en lugar de usar un montón de Ifs y usar PWM para mejor control del volumen y el tono de la bocina, pero por el momento, esto funciona.