www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 13Bit 2-Zweierkomplement in auf 16Bit auffüllen


Autor: Luky S. (luky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Titel sagt eigendlich shcon alles:
Ich lese einen 13-Bit (12+Sign) Wert von einem Bipolaren ADC (AD7322) 
und möchte den Wert nun in ein digitales Filter (16Bit signed Int) 
schicken.
Sind die Werte positiv passt alles, aber bei negativen Werten muss ich 
ja mit dem MSB des 13Bit Wertes auffüllen.
Das Problem ist nur, das es möglichst schnell gehen soll, der arme µc 
(AT91SAM7s) ist ja schon mit dem Digitalfilter recht ausgelastet.
Kennt jemand bitte einen Trick?

Autor: Peter Roth (gelb)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es müsste doch genügen, das Vorzeichenbit zu testen und zu verzweigen. 
Wenn dieses Bit gesetzt ist mit 0b11100000 oderieren und evtl. vorher 
noch das Komplement des ganzen Wertes bilden, je nach dem, wie das 
Ergebnis genau angeliefert wird.

Das sind insgesamt so 5 bis 7 Befehle, das wird er wohl noch schaffen 
nebenbei, der arme µC...

Grüße, Peter

Autor: Albi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
^Geht es nicht, das ganze als unsigned short nach links zu schieben 
sodass das Vorzeichenbit an der richtigen position ist und dann das 
ganze als signed short wieder zurück zu schieben?

Die erste Operation wird aufgrund des unsigneds ein logisches schieben - 
also alle bits. Die zweite operation schieb nur die unteren 15 bit, weil 
ja signed - arithmetisches schieben.

Kann sein das ich mich irre... man könnte es aber doch mal probieren.

Ich meine das so:

signed short bla = ((unsigned shiort)(_13BitSignedValue)) << 3;
bla >>= 3;

???

MFG

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if( wert & (1<<12) ) {
 wert |= 0xE000;
}

Autor: Albi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
funktioniert meine Variante wäre sie unschlagbar kurz.

shl xxx, 3
asr xxx, 3

fertig.

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Albi wrote:
> funktioniert meine Variante wäre sie unschlagbar kurz.
>
> shl xxx, 3
> asr xxx, 3
>
> fertig.
Ja unschlagbar auf einem AVR mit Barrelshifter und 16 bit Architektur...
Keine Ahnung ob der SAM sowas hat???
Sonst wird da ja sowas draus:
lsl X_L
rol X_H
lsl X_L
rol X_H
lsl X_L
rol X_H

asr X_H
ror H_L
asr X_H
ror H_L
asr X_H
ror H_L
 = 12 Takte

Aus meiner Variante könnte der Compiler machen:
andi X_H, HIGH(1<<12)
brne _skip
ori X_H, HIGH(0xE000);
skip:
= 3 Takte

Leztendlich ist es aber wohl ne Aufgabe die der µC noch gerade so 
schaffen sollte ;)

Autor: Jünger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ADC += 0xF000;
ADC ^= 0xF000;

jetzt mal 16 Bit Arithmetik voraus gesetzt :-)

Autor: Albi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun wirds interessant. Ich denke der SAM hat das :-)

Autor: Resonator (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Läubi:

Warum die 12-Takt-Version nicht auf eine 6-Takt-Version schrumpfen, das 
Schieben der unteren 8 Bit kann man doch sein lassen:

rol X_H
rol X_H
rol X_H

asr X_H
asr X_H
asr X_H

= 6 Takte, naja 6 Befehle

Deine "compilergenerierte" Version wird allerdings nicht funktionieren, 
weil ein AND-Befehl, wie ich ihn kenne, zerstörend auf die Nutzdaten 
wirkt, die hinten wieder gebraucht werden. Da muss also nochmal 
irgendwie zwischengespeichert werden.
Ein Branch-Befehl braucht mehr als einen Takt, ein AND und/oder OR (LOL) 
mit Konstante auch. Von 3 Takten ist da weit und breit keine Spur zu 
sehen... :-)

Autor: Läubi .. (laeubi) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Recht mein Fehler, man könnte aber ein "skip if bit is set" ;)
beim AVR dauern aber alle and/or/xor 1 Takt,
ein Sprung dauert 1 Takt wenn er nicht genommen wird und 2 wenn nicht.

Aber wie gesagt ich kenn mich mit dem SAM+Befehlssatz nicht aus :(

Alles in allem aber dauert der Spaß nicht soooooooooo lang das man da 
optimierungspotenzial hat.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dem SAM (ARM7) ist es egal, ob ein Byte oder ein 32-Bit-Wort, ob um 1
oder um 19 Bits geshiftet wird. Deswegen ist die von Albi vorgeschlagene
Methode, erst an den linken Anschlag und dann wieder zurückzushiften,
wahrscheinliche die schnellste.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.