Hallo,
ich habe leider kein MPLAB installiert, da ich mit dsPIC noch nicht
gearbeitet habe. Jetzt bin bei einer APPNote auf den Funktionsaufruf
1 | _Q15abs(<Q15_Format_value>);
|
gestoßen. Kurz: ich will testweise diese Funktion nachbauen, finde aber
keinen Quellcode dazu, dafür folgende Beschreibung:
Description: The function finds the absolute value of a Q15 value.
Argument: x a fixed point number in Q15 format, which ranges from-2^15
to 2^15-1. The value of this argument ranges from -32768 to 32767.
Return Value: This function returns the absolute value of x in Q15
format. This value ranges from 0 to 32767.
Die Funktion liefert also den absoluten Wert einer Q15-Zahl. Wird die
Q15-Zahl zuerst in Normalformat zurückgewandelt, davon der abs. Wert
genommen und dann wieder nach Q15-Format verwandelt? Oder wird einfach
das Vorzeichen der Q15 entfernt?
Könnte vllt jemand mit MPLAB und Debugger folgenden Code durchlaufen
lassen und mir die Ergebnisse schreiben.
Die _Q15abs Funktion befindet sich in
\MPLAB C30\support\generic\h\libq.h
1 | int v1 = -32768;
|
2 | int v2 = -25000;
|
3 | int v3 = -16386;
|
4 | int v4 = -14000;
|
5 | int v4 = -2000;
|
6 | int v5 = -5;
|
7 | int v6 = 0;
|
8 | int v7 = 5;
|
9 | int v8 = 2000;
|
10 | int v9 = 14000;
|
11 | int v10 = 16384;
|
12 | int v11 = 25000;
|
13 | int v12 = 32767;
|
14 | v1 = _Q15abs(v1);
|
15 | v2 = _Q15abs(v2);
|
16 | v3 = _Q15abs(v3);
|
17 | v4 = _Q15abs(v4);
|
18 | v5 = _Q15abs(v5);
|
19 | v6 = _Q15abs(v6);
|
20 | v7 = _Q15abs(v7);
|
21 | v8 = _Q15abs(v8);
|
22 | v9 = _Q15abs(v9);
|
23 | v10 = _Q15abs(v10);
|
24 | v11 = _Q15abs(v11);
|
25 | v12 = _Q15abs(v12);
|
Noch eine Frage zu Assembler. Zugegeben, ich habe mit Assembler noch nie
etwas gemacht und es handelt sich hier vermutlich um eine sehr banale
Frage
1 | _FracMpy:
|
2 | FracMpy:
|
3 |
|
4 | push W4
|
5 | push W5
|
6 | mov W0, W4
|
7 | mov W1, W5
|
8 | mpy W4*W5, A
|
9 | sac.r A, W0
|
10 | pop W5
|
11 | pop W4
|
12 | return
|
13 |
|
14 | .global _FracDiv
|
15 | .global FracDiv
|
Funktionsaufruf dazu
1 | FracMpy(s->OmegaFltred,Q15(_PI / IRP_PERCALC));
|
Ich verstehe nicht, warum hier mit W4 und W5 gearbeitet wird, die
Übergabeparameter werden doch der Reihe nach in W0, W1, .. geladen.
Dann wird von W4 nach W0 und von W5 nach W1 kopiert. W4 multipliziert
mit W5.
Und zu sac.r finde ich wieder nichts
Analog dazu noch diese Funktion
1 | _FracDiv:
|
2 | FracDiv:
|
3 |
|
4 | push W2
|
5 | mov W1, W2
|
6 | repeat #17
|
7 | divf W0, W2
|
8 | pop W2
|
9 | return
|
10 |
|
11 | .end
|