Forum: Mikrocontroller und Digitale Elektronik dsPIC33E 32Bit Wert mit Barrel-Shifter schieben


von Thomas S. (daimonion)


Lesenswert?

Hallo

Ich möchte eine 32Bit Variable um 0-16 Bits nach links/rechts schieben.

der dsPIC33E hat ja einen Barrel-Shifter drauf, der durch verschiedene 
Assembler und DSP Befehle genutzt wird (ASR, LSR, SL, SAC, SAC.r, SFTAC)

https://microchip.wikidot.com/dsp0201:barrel-shifter

Nun ja, alles mit 16Bit Variablen.

Ich benötige aber den Shift in einer 32Bit Variablen.

Da der dsPIC ja nun 40-Bit Accus hat wovon ich die unteren 32Bit auf 
jeden Fall nutzen kann, dachte ich das ich, wenn ich anstelle eines 
16-Bit Wertes einen 32Bit Wert in den Accu lade und dann mittels SFTAC 
den Shift ausführe, mein Ziel erreiche, aber klappt nicht. Scheinbar 
nutzt SFTAC nur die oberen (mittleren) 16Bit des Accuregisters

Gibt es eine Möglichkeit beim dsPIC33E so einen Shift schnell zu 
realisieren oder muss ich auf konventionelle Algorithmen (C-Standard 
a<<b compiliert was konventionelles) zurückgreifen.

Danke im Voraus für eure Antworten!

Grüße
Daimonion

von (prx) A. K. (prx)


Lesenswert?

Thomas S. schrieb:
> aber klappt nicht

Prima Beschreibung des Problems. Code mit Werten wär besser, verziert 
mit den Werten vorher und nachher.

von Amateur (Gast)


Lesenswert?

Die meisten Prozessoren haben 2 verschiedene Schiebebefehle.
1. Immer 0 reinschieben; Überlauf ins Carry-Bit
2. Carry-Bit reinschieben; Überlauf ins Carry-Bit
Hast Du den ersten Befehl nicht zur Verfügung, so musst Du explizit 
deinen Lieblingswert in Carry-Bit schreiben. Meist ein Clear oder Set 
XX-Befehl.

Hast Du 16 Bit Befehle, so kannst Du auch durch das Kopieren glücklich 
werden. Low-Word ins High-Word kopieren oder umgekehrt und das 
Ausgangsregister löschen.

Kenne aber Deinen Prozessor nicht.

von Thomas S. (daimonion)


Lesenswert?

Es geht hier explizit um einen speziellen Shift Befehl des 33E 
Prozessors.

Wie das normalerweise geht weiß ich.

Daher sind eure Antworten leider nicht zielführend.

@prx

Ich bekomme keine 32Bit Variable in den Accu rein und später auch wieder 
nicht raus.
Der Shiftbefehl selbst sollte theoretisch mittels sftac ohne Probleme 
gehen. Theoretisch, da ich nicht weiß wie sich accul bei einem 
linksshift verhält...

von (prx) A. K. (prx)


Lesenswert?

Thomas S. schrieb:
> Ich bekomme keine 32Bit Variable in den Accu rein und später auch wieder
> nicht raus.

Vielleicht solltest du mal zeigen, wie du das machst.

> Daher sind eure Antworten leider nicht zielführend.

Es gibt keine solide Grundlage für Antworten, die du als zielführend 
ansiehst. Wäre dir "Fehler in Zeile 42" lieber?

: Bearbeitet durch User
von Thomas S. (daimonion)


Lesenswert?

Wie kann ich es zeigen, wenn ich nicht weiß wie es geht?

Der Link in meinem ersten Post ist bisher das einzige Beispiel was ich 
gefunden habe. Alle anderen Beispiel und auch Application Notes von 
Microchip zeigen es so nicht auf oder ich hab es noch nicht gefunden.

Daher die Frage hier im Forum!

von (prx) A. K. (prx)


Lesenswert?

Thomas S. schrieb:
> Wie kann ich es zeigen, wenn ich nicht weiß wie es geht?

Also hast du also noch keine Zeile Code geschrieben? Du suchst einen 
Weg, 32 Bits geschlossen in den Akku zu laden? Gibt es nicht. Ist 
umständlicher.

Woraus sich die Frage ergibt, ob das Verfahren über den DSP die Mühe 
Wert ist. Nur für die Shift-Operation allein dürfte es summarum 
mindestens so aufwändig sein, wie die Alternative aus normalen 16-Bit 
Operationen.

von Thomas S. (daimonion)


Lesenswert?

A. K. schrieb:
> Also hast du also noch keine Zeile Code geschrieben? Du suchst einen
> Weg, 32 Bits geschlossen in den Akku zu laden? Gibt es nicht. Ist
> umständlicher.

Ja, so was hab ich mir fast gedacht. ;) Denke dass das dann irgendwie 
über den X- und Y-Memory funktioniert? Mit dem hatte ich bisher noch 
nichts zu tun.

> Woraus sich die Frage ergibt, ob das Verfahren über den DSP die Mühe
> Wert ist. Nur für die Shift-Operation allein dürfte es summarum
> mindestens so aufwändig sein, wie die Alternative aus normalen 16-Bit
> Operationen.

Die Laufzeitfrage muss man dann definitiv betrachten. Der Overhead ist 
ja schon ziemlich groß. Dennoch würde ich gerne mal einen Vergleich 
aufstellen. Mal schauen ob ich irgendwo noch was finde, oder kennst du 
prinzipiell den Weg?

von (prx) A. K. (prx)


Lesenswert?

Die DSP-Akkumulatoren haben auch eine Adresse im Speicher.

von Thomas S. (daimonion)


Lesenswert?

Okay, danke erst mal. Soweit verstanden.

Sind ja dann schon mal ~4 Befehle (LAC high, LAC Low, Shift Low, Add) 
nur die Daten zusammen in einem Accu zu haben. Dann der Shift und dann 
nochmal ~3 Befehle um die Daten wieder raus zu bekommen.

Ich mach mich mal ran und schau inwieweit ich was effizientes oder eben 
ineffizentes hinbekomme.

Danke erst mal!

Grüße
Daimonion

von (prx) A. K. (prx)


Lesenswert?

Dieser DSP ist eben kein Universalinstrument, sondern für ganz bestimmte 
Anwendungsfälle optimiert. Nämlich bestimmte Formen von Arithmetik wie 
Matrizenmultiplikation, bei denen Zwischenergebnisse eine Weile im Akku 
verbleiben und eine grössere Genauigkeit nur in dieser Phase nötig ist.

: Bearbeitet durch User
von Ste N. (steno)


Lesenswert?

Thomas S. schrieb:
> Da der dsPIC ja nun 40-Bit Accus hat wovon ich die unteren 32Bit auf
> jeden Fall nutzen kann, dachte ich das ich, wenn ich anstelle eines
> 16-Bit Wertes einen 32Bit Wert in den Accu lade und dann mittels SFTAC
> den Shift ausführe, mein Ziel erreiche, aber klappt nicht. Scheinbar
> nutzt SFTAC nur die oberen (mittleren) 16Bit des Accuregisters

Hast Du nun schon Code geschrieben oder nicht? Da es ja nicht klappt, 
mußt Du ja schon was probiert haben...

Wie kommen denn deine 32bit in den Accu? So wie ich das verstehe, kann 
LAC ein W-Register grundsätzlich nur in ACCAH verschieben. Genauso bei 
SAC, es wird immer nur ACCAH gelesen. Ich weiß jetzt nich ob es geht, 
aber hast Du mal versucht die ACCAH-, ACCAL-Register direkt 
anzusprechen?

von Thomas S. (daimonion)


Lesenswert?

Direkt ansprechen kannst du die Register nicht.

Du musst mittels LAC erst das Low Word laden, dann mittels sftac nach 
rechts in AccuL shiften und dann mittels eines weiteren LAC das HighWord 
wieder in AccuH laden. Dann kann man mittels SFTAC nach links shiften. 
In AccuU stehen dann noch einsen drin, und das kann u.U Probleme bei 
einem rechtsshift geben.

Aktuell warte ich noch auf eine Rückmeldung unseres FAE, der mir auch 
noch Infos zukommen lassen wollte, bevor ich was probiere.

von (prx) A. K. (prx)


Lesenswert?

Thomas S. schrieb:
> Direkt ansprechen kannst du die Register nicht.

Doch, wie ich oben nachträglich erwähnte.

> Du musst mittels LAC erst das Low Word laden, dann mittels sftac nach
> rechts in AccuL shiften und dann mittels eines weiteren LAC das HighWord
> wieder in AccuH laden.

Einfacher: Löschen, dann wortweise reinschreiben. Über die Adresse der 
Akkus im Daten-Adressraum (ab 0x0022, => Core Register Map). Genauso 
auch wieder raus.

: Bearbeitet durch User
von Thomas S. (daimonion)


Lesenswert?

Ah, das ging bei mir in der Frequenz der Beiträge unter. Ist natürlich 
auch noch eine Möglichkeit. ;)

von (prx) A. K. (prx)


Lesenswert?

Thomas S. schrieb:

> Du musst mittels LAC erst das Low Word laden, dann mittels sftac nach
> rechts in AccuL shiften und dann mittels eines weiteren LAC das HighWord
> wieder in AccuH laden.

LAC schreibt in alle 40 Bits (zero/sign-extended) des Akkus.

von Thomas S. (daimonion)


Lesenswert?

Aber nur 16 Bit Register oder?

Das ist dann blöd....

von (prx) A. K. (prx)


Lesenswert?

Thomas S. schrieb:
> Das ist dann blöd....

Für dich ja. Für das, wofür dieser DSP gedacht ist, reicht es. 16 Bits 
rein, einige Male mit 40 Bits in Festkommaformat rechnen inklusive 
Überlauf (links) und hoher Genauigkeit für kleine Differenz grosser 
Zahlen (rechts), abschliessend gerundete und evtl. saturierte 16 Bits 
wieder raus.

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.