Forum: Mikrocontroller und Digitale Elektronik MPLAB _Q15abs und Assembler


von Andreas T. (skycurve)


Lesenswert?

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

von Chris B. (dekatz)


Lesenswert?

Andreas True schrieb:
> Und zu sac.r finde ich wieder nichts
Store Rounded Accumulator
Macht einen signed 4-Bit Shift mit dem angegeben Accumulator.
Die Art und Weise der Rundung wird in CORCON.RND - Bit festgelegt.

> mpy W4*W5, A
Der mpy-Befehl arbeitet nur mit bestimmten Registerpaarungen
Wm * Wn können sein [W4 * W5; W4 * W6; W4 * W7; W5 * W6; W5 * W7; W6 * 
W7]

(nur so auf die Schnelle, genaueres im
16-bit MCU and DSC Programmer’s Reference Manual DS70157D)

von Andreas T. (skycurve)


Lesenswert?

Danke für deine Antwort :)

Bedeutet dann sac.r Rechtsshift und sac.l Linksshift?

zB:

FracMpy(250, 3);

1.Schritt: Multiplizieren

250      *        3 = 750

11111010 * 00000011 = 1011101110

2.Schritt: Nach rechts signed 4-Bit Shift

1011101110 >> 4 = 1111101110

1111101110(Bin) = 1006(Dez)

Wäre in diesem Beispiel der Rückgabewert 1006?

Weiß noch jemand irgendetwas zu der oben genannten _Q15abs(..) Funktion?

Grüße
Andreas

von Chris B. (dekatz)


Lesenswert?

Andreas True schrieb:

> Bedeutet dann sac.r Rechtsshift und sac.l Linksshift?
>

Es gibt nur SAC.R - ob Links oder Rechtsshift bestimmt das Vorzeichen:
Zitat:

Perform an optional, signed 4-bit shift of the specified accumulator, 
then
store the rounded contents of ACCxH (Acc[31:16]) to Wd. The shift
range is -8:7, where a negative operand indicates an arithmetic left 
shift
and a positive operand indicates an arithmetic right shift. The Rounding
mode (Conventional or Convergent) is set by the RND bit,
CORCON<1>. Either register direct or indirect addressing may be used
for Wd.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.