Also ich habe für das erste Problem eine Lösung gefunden.
Eine kurze Erklärung dazu:
Die Division von 0xFFFFFFFF / 48000000 ist ja ein Konstanter Wert. Den
habe ich in 5 Teile zerlegt. Jeder einzelne Teil wird mit der
eingestellten Frequenz multipliziert. Dann werden die einzelnen Werte
dividiert um das Komma zu setzten. Jetzt noch addieren und fertig.
1 | void set_new_frequ( void )
|
2 | {
|
3 | unsigned double f1 = 89, f2 = 47, f3 = 84, f4 = 85, f5 = 31, fges = 0;
|
4 |
|
5 | // Umrechnen der Frequenz
|
6 | f1 *= frequ;
|
7 | f2 *= frequ;
|
8 | f3 *= frequ;
|
9 | f4 *= frequ;
|
10 | f5 *= frequ;
|
11 |
|
12 | f2 /= 100;
|
13 | f3 /= 10000;
|
14 | f4 /= 1000000;
|
15 | f5 /= 100000000;
|
16 |
|
17 | fges = f1 + f2 + f3 + f4 + f5;
|
18 |
|
19 | Frequenz._word = fges;
|
20 | }
|
Mein zweites Problem habe ich noch. Ich habe mit union was gebaut
allerdings bekomme ich nicht das richtige heraus.
1 | typedef unsigned char byte; // 8-bit
|
2 | typedef unsigned double word; // 16-bit
|
3 |
|
4 | union _WORD
|
5 | {
|
6 | word _word;
|
7 | struct
|
8 | {
|
9 | byte HMSB;
|
10 | byte LMSB;
|
11 | byte HLSB;
|
12 | byte LLSB;
|
13 | };
|
14 | } Frequenz;
|
Ausgelesen werden die Werte so:
1 | .
|
2 | .
|
3 | Frequenz._word = fges;
|
4 | .
|
5 | .
|
6 | WriteSPI( Frequenz.HMSB );
|
7 | // Write other 8 Frequency bits to Register 88 L MSB
|
8 | WriteSPI( 0x22 );
|
9 | WriteSPI( Frequenz.LMSB );
|
10 | // Write other 8 Frequency bits to Register 88 H LSB
|
11 | WriteSPI( 0x31 );
|
12 | WriteSPI( Frequenz.HLSB );
|
13 | // Write other 8 Frequency bits to Register 40 L LSB
|
14 | WriteSPI( 0x20 );
|
15 | WriteSPI( Frequenz.LLSB );
|
16 | .
|
17 | .
|
Leider bekomme ich nicht die richtigen Werte heraus. Mit einer
Testfrequenz von 12630 Hz steht in der Variable bzw. dem union 1130113
dez drinnen. das bedeutet es sollte in den Bytes doch 0x00, 0x11, 0x3E
und 0x81 stehen. Leider kommt dort aber irgendwas heraus.
Könnt ihr das bitte durchsehen und mir sagen was da nicht funktioniert?
BG
Andreas