Bitte um Hilfe oder Erklärungen.
Aufgabe:
Eine Routine wird mit einem int16_t-Parameter aufgerufen, Beispiel 2008. Beliebige Werte unter 15 (hier die 8 ..) sollen in eine Variable int16_t Il* übernommen werden, Werte über 15 sollen sinngemäß in eine Variable int16_t Iv* übernommen werden. Beide Zielvariablen müssen 16 Bit breit sein.
Mein Code läuft nur mit Tricks - möglicherweise wird etwas wegoptimiert, wahrscheinlicher finde ich meinen fehlerhaften Umgang mit C. Die folgenden Schnippsel zeigen zwei Versionen der betreffenden Routine, wobei nur die zweite Version mit einer Hilfsvariablen läuft.
Der Offset von 1 bei der Umwandlung in den grösseren Wert ist möglicherweise in der Zahlendarstellung begründet, mir ist aber nicht klar, wieso das beim kleineren Wert ohne diese Korrektur geht.
Code:
volatile int16_t Iv_sound; // Sound - Vorgabe = maximaler Faktor => Tonhöhe
volatile int16_t Il_sound; // Soundlänge in tupsi, wird in ISR..COMPB decrem.// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
//Aufruf:
beep ( 2008 ); // Soundausgabe zur Anmeldung inf
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Version geht nicht
void beep ( int16_t paramtr ) // Soundausgabe Einzelton, parameterisierbar
{ //
Iv_sound = paramtr &= 0x000F; // Soundfaktor (Tonhöhe)
Il_sound = paramtr &= 0xFFF0; // Sounddauer
} // Ende von void beep ( int16_t paramtr )
// Dabei ist Iv_sound 8 und Il_sound 0
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// Version geht
void beep ( int16_t paramtr ) // Soundausgabe Einzelton, parameterisierbar
{ //
int16_t dummy = paramtr;
Iv_sound = dummy &= 0x000F; // Soundfaktor (Tonhöhe)
Il_sound = (paramtr &= 0xFFF0) + 1; // Sounddauer
} // Ende von void beep ( int16_t paramtr )
// ============================================================================= =
Ein C-Tutorial zur Bitmanipulation brachte mir keine Hilfe.
Lesezeichen