Animus94
03.06.2012, 20:42
Hi,
Bräuchte mal eure Hilfe.
Ich habe an meiner C-Control Mega 128 ein Lautsprecher angeschlossen. Er befindet sich an einem PWM Ausgang mit Tiefpass.
In einem Array hab ich eine Sinustabelle angelegt, die den Sinusverlauf als PWM-Werte (0-255) wiedergibt.
Eigentlich muss ich jetzt ja nur noch die Frequenz es Sinus für verschiedene Töne ändern... Aber genau hier liegt das
Problem. Im Prinzip gibt es ja zwei möglichkeiten das zu tun entweder ein Sleep zwischen dem Abfragen der Sinus-werte oder mann überspringt einfach ab und zu
ein paar Werte des Arrays.
Aber irgendwie klappt das nicht so, ich meine ich kann keine verschiedenen Töne erzeugen.
int delval; // globale Variablendeklaration
float i;
int counter;
float rate;
int Sinustabele[256] = {
127,130,133,136,139,143,146,149,152,155,158,161,16 4,167,170,173,
176,178,181,184,187,190,192,195,198,200,203,205,20 8,210,212,215,
217,219,221,223,225,227,229,231,233,234,236,238,23 9,240,242,243,
244,245,247,248,249,249,250,251,252,252,253,253,25 3,254,254,254,
254,254,254,254,253,253,253,252,252,251,250,249,24 9,248,247,245,
244,243,242,240,239,238,236,234,233,231,229,227,22 5,223,221,219,
217,215,212,210,208,205,203,200,198,195,192,190,18 7,184,181,178,
176,173,170,167,164,161,158,155,152,149,146,143,13 9,136,133,130,
127,124,121,118,115,111,108,105,102, 99, 96, 93, 90, 87, 84, 81,
78, 76, 73, 70, 67, 64, 62, 59, 56, 54, 51, 49, 46, 44, 42, 39,
37, 35, 33, 31, 29, 27, 25, 23, 21, 20, 18, 16, 15, 14, 12, 11,
10, 9, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 9,
10, 11, 12, 14, 15, 16, 18, 20, 21, 23, 25, 27, 29, 31, 33, 35,
37, 39, 42, 44, 46, 49, 51, 54, 56, 59, 62, 64, 67, 70, 73, 76,
78, 81, 84, 87, 90, 93, 96, 99,102,105,108,111,115,118,121,124};
#define Led1 5
void main(void)
{
Port_DataDirBit(Led1,1);
Port_WriteBit(Led1,1);
counter = 0;
rate = 2;
while(1)
{
Timer_T0PWM(Sinustabele[counter],PS0_256);
counter = counter + rate;
if(counter > 256)
{
counter = 0;
}
}
Port_WriteBit(Led1,0);
}
Eigentlich müsste sich doch jetzt über die variable "rate" die frequenz irgendwie verändern lassen, weil je nachdem gibt es ja verschieden viele Ticks.
Aber es Funktioniert nicht , der Ton bleibt immer gleich.
Achso , angeschlossen ist der Lautsprecher wie folgt : --> http://www.mikrocontroller.net/articles/Klangerzeugung#Digital-Analog-Wandlung_.28DAC.29
Hoffe ihr habt eine Idee das ich verändern muss ^^
Danke im vorraus
Bräuchte mal eure Hilfe.
Ich habe an meiner C-Control Mega 128 ein Lautsprecher angeschlossen. Er befindet sich an einem PWM Ausgang mit Tiefpass.
In einem Array hab ich eine Sinustabelle angelegt, die den Sinusverlauf als PWM-Werte (0-255) wiedergibt.
Eigentlich muss ich jetzt ja nur noch die Frequenz es Sinus für verschiedene Töne ändern... Aber genau hier liegt das
Problem. Im Prinzip gibt es ja zwei möglichkeiten das zu tun entweder ein Sleep zwischen dem Abfragen der Sinus-werte oder mann überspringt einfach ab und zu
ein paar Werte des Arrays.
Aber irgendwie klappt das nicht so, ich meine ich kann keine verschiedenen Töne erzeugen.
int delval; // globale Variablendeklaration
float i;
int counter;
float rate;
int Sinustabele[256] = {
127,130,133,136,139,143,146,149,152,155,158,161,16 4,167,170,173,
176,178,181,184,187,190,192,195,198,200,203,205,20 8,210,212,215,
217,219,221,223,225,227,229,231,233,234,236,238,23 9,240,242,243,
244,245,247,248,249,249,250,251,252,252,253,253,25 3,254,254,254,
254,254,254,254,253,253,253,252,252,251,250,249,24 9,248,247,245,
244,243,242,240,239,238,236,234,233,231,229,227,22 5,223,221,219,
217,215,212,210,208,205,203,200,198,195,192,190,18 7,184,181,178,
176,173,170,167,164,161,158,155,152,149,146,143,13 9,136,133,130,
127,124,121,118,115,111,108,105,102, 99, 96, 93, 90, 87, 84, 81,
78, 76, 73, 70, 67, 64, 62, 59, 56, 54, 51, 49, 46, 44, 42, 39,
37, 35, 33, 31, 29, 27, 25, 23, 21, 20, 18, 16, 15, 14, 12, 11,
10, 9, 7, 6, 5, 5, 4, 3, 2, 2, 1, 1, 1, 0, 0, 0,
0, 0, 0, 0, 1, 1, 1, 2, 2, 3, 4, 5, 5, 6, 7, 9,
10, 11, 12, 14, 15, 16, 18, 20, 21, 23, 25, 27, 29, 31, 33, 35,
37, 39, 42, 44, 46, 49, 51, 54, 56, 59, 62, 64, 67, 70, 73, 76,
78, 81, 84, 87, 90, 93, 96, 99,102,105,108,111,115,118,121,124};
#define Led1 5
void main(void)
{
Port_DataDirBit(Led1,1);
Port_WriteBit(Led1,1);
counter = 0;
rate = 2;
while(1)
{
Timer_T0PWM(Sinustabele[counter],PS0_256);
counter = counter + rate;
if(counter > 256)
{
counter = 0;
}
}
Port_WriteBit(Led1,0);
}
Eigentlich müsste sich doch jetzt über die variable "rate" die frequenz irgendwie verändern lassen, weil je nachdem gibt es ja verschieden viele Ticks.
Aber es Funktioniert nicht , der Ton bleibt immer gleich.
Achso , angeschlossen ist der Lautsprecher wie folgt : --> http://www.mikrocontroller.net/articles/Klangerzeugung#Digital-Analog-Wandlung_.28DAC.29
Hoffe ihr habt eine Idee das ich verändern muss ^^
Danke im vorraus