Mikrokontroller tyg tongeneratorn i C-kod (8 / 8 steg)
Steg 8: kod
Många människor gillar Arduino för denna kodning och det är inget fel med att använda det, förutom att jag känner det tillför en hel del svälla till ett normalt enkelt program. Också, jag visste C och vet inte Arduino. Kanske en dag, om det finns tid. :)
Kod:
{{{
#include < avr/io.h >
Använda en PIN-kod till vända på SPK
Typdefinitioner / / /
TypeDef unsigned char u8;
int main(void)
{
U8 btnState0;
U8 btnState1;
U8 btnState2;
U8 btnState3;
U8 btnState4;
U8 btnState5;
U8 btnState6;
DDRB = (1 << DDB6); Ställ in SPK för utdata
PORTD = (1 << PD0) | (1 << PD1) | (1 << PD2) | (1 << PD3) | (1 << PD4); Ställa in knappen High
PORTC = (1 << PC4) | (1 << PC6);
TCCR2B = (1 << CS21); Ställ in Timer
samtidigt (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);
om (btnState0)
{
om (TCNT2 > = 190)
{
PORTB ^ = (1 << PD6); Flip SPK Pin
TCNT2 = 0;
}
}
om (btnState1)
{
om (TCNT2 > = 179)
{
PORTB ^ = (1 << PD6); Flip SPK Pin
TCNT2 = 0;
}
}
om (btnState2)
{
om (TCNT2 > = 159)
{
PORTB ^ = (1 << PD6); Flip SPK Pin
TCNT2 = 0;
}
}
om (btnState3)
{
om (TCNT2 > = 142)
{
PORTB ^ = (1 << PD6); Flip SPK Pin
TCNT2 = 0;
}
}
om (btnState4)
{
om (TCNT2 > = 126)
{
PORTB ^ = (1 << PD6); Flip SPK Pin
TCNT2 = 0;
}
}
om (btnState5)
{
om (TCNT2 > = 119)
{
PORTB ^ = (1 << PD6); Flip SPK Pin
TCNT2 = 0;
}
}
om (btnState6)
{
om (TCNT2 > = 106)
{
PORTB ^ = (1 << PD6); Flip SPK Pin
TCNT2 = 0;
}
}
}
}
}}}
Varifrån kommer tomterna? Lite matematik behövdes. Atmega 168 klocka timer körs vid 1MHz. Det är mycket för fort för ljud så vi måste använda prescaler /8. Eftersom vi måste vända utgångsstiftet högt då låg för att göra 1 cykel, måste vi dela svaret med 2 för att komma med rätt tonhöjd. Formeln ser ut så här,
Planen att sätta i koden = (1000000/8) / (rikta frekvens * 2)
A(440) skulle detta ta 125000/880 = 142.045 eller 142 för våra ändamål, eftersom värdet måste vara ett heltal.
Target frekvenserna av anteckningar finns bara om någonstans på nätet och är i allmänhet alla samma.
Jag vill ändå lägga ett case-uttryck istället för att använda en massa Ifs och använda PWM att bättre styra volymen och pitch av högtalaren, men för nu, det fungerar.