PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Sound() - Erklärung



HiroakiShi
04.06.2011, 16:49
Ich möchte für mein Projekt diesen Befehl für mein Projekt verwenden.



void Sound (
uint16_t freq,
uint16_t duration_msec,
uint8_t amplitude)
{
uint16_t wait_tics;
uint32_t n,k,period_usec,dauer_usec;

period_usec = 1000000L / freq;
dauer_usec = 1000 * (uint32_t) duration_msec;
k = dauer_usec / period_usec;

//IR Interuptfreq=36KHz
//Wavefreq=18KHz

wait_tics = 18000 / freq;

MotorSpeed (amplitude, amplitude);

for (n = 0; n < k; n++)
{
MotorDir (FWD, FWD);
Sleep (wait_tics);
MotorDir (RWD, RWD);
Sleep (wait_tics);
}
MotorSpeed (0, 0);
}
Vom Prinzip her versteh ich es aber den Teil kapier ich nicht ganz.


period_usec = 1000000L / freq;
dauer_usec = 1000 * (uint32_t) duration_msec;
k = dauer_usec / period_usec;

//IR Interuptfreq=36KHz
//Wavefreq=18KHz

wait_tics = 18000 / freq;

was ist z.B. 1000000L
ist dauer_usec : 1000 "mal" duration_msec, und warum (uint32_t)

woher kommen die: IR Interuptfreq=36KHz
Wavefreq=18KHz


Hoffe man kann mir helfen.

TobiKa
04.06.2011, 18:42
was ist z.B. 1000000L
1 Periode = 1 Sekunde = 1.000.000 µSekunden


ist dauer_usec : 1000 "mal" duration_msec, und warum (uint32_t)
"duration_msec" ist vom Typ "uint16_t" und muss auf "uint32_t" gecastet werden um es zusammen addieren zu können. Sonst würde es ne Warnung vom Compiler (oder schlimmeres) geben.


//IR Interuptfreq=36KHz
//Wavefreq=18KHz

Sind weiter nicht von Interesse, da auskommentiert.

HiroakiShi
05.06.2011, 09:42
die zahl steht also für die mikrosekunden, aber warum steht da das "L"?



"duration_msec" ist vom Typ "uint16_t" und muss auf "uint32_t" gecastet werden um es zusammen addieren zu können. Sonst würde es ne Warnung vom Compiler (oder schlimmeres) geben.

ist * = addieren? ich dachte das wäre multipizieren.

TobiKa
05.06.2011, 10:22
die zahl steht also für die mikrosekunden, aber warum steht da das "L"?
Das "L" steht für "long".


ist * = addieren? ich dachte das wäre multipizieren.
Ich meinte natürlich multiplizieren.

radbruch
05.06.2011, 10:40
woher kommen die: IR Interuptfreq=36KHz
Wavefreq=18KHz

wait_tics = 18000 / freq; Die kommen von der Trägerfrequenz für die IR-Kommunikation. In der Library des asuro wird diese Frequenz mit dem Timer2 erzeugt.

Zusätzlich ist es auch die Zeitbasis für die Sleep()-Funktion. In der orginalen CD-Version der Library war es allerdings ein 72kHz-Takt, deshalb muss man die Werte anpassen (verdoppeln), wenn man mit der orginalen Lib arbeitet. Sleep(1) dauert 1/36000 bzw. 1/72000 Sekunde. Sleep(36) bzw. Sleep(72) dauert eine Millisekunde.

HiroakiShi
05.06.2011, 10:52
warum muss da das L stehen?
würde die zahl nicht schon reichen?kann man das weglassen?
Oder muss man bei so großen Zahlen immer L hinschreiben?

ASUR0
10.06.2011, 14:16
Ja, das L wird unbedingt benötigt. Du kannst ja mal ausprobieren, was passiert, wenn du's weglässt, der Compiler wird dir eine Fehlermeldung ausgeben. Zahlen werden standardmäßig als uint16 interpretiert, d.h. bis maximal 2^16 - 1 = 65535, größere müssen durch das L als uint32 gekennzeichnet werden.
Gruß
ASUR0