mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik RESHI und RESLO dividieren


Autor: wuddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Habe diesmal ausmahmsweise ein Problem das nur indirekt mit dem MSP zu 
tun hat. Und zwar geht es darum, das ich mir mit dem Hardware Multiplier 
einen Wert errechnen lasse. Dies geschieht allerdings in Assembler, 
folglich hab ich das Ergebniss in RESHI und RESLO. Anschließend soll 
noch eine Division stattfinden. Wie verknüpfe ich jetzt die beiden 
Register damit ich einen eizigen Wert erhalte den ich dann dividieren 
kann?


 erg= RESHI;
  erg= erg<<16;
  erg= erg| RESLO; 

erg ist als long definiert.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die MSP430-Entwickler haben sich schon was dabei gedacht, die 
Ergebnisregister direkt hintereinander im Speicher anzuordnen:
UINT32 Result = *(UINT32*)&RESLO;

Autor: wuddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry aber daraus werd ich nicht ganz schlau. UINT32, damit spielst du 
bestimmt auf einen 32 bit integer an. Aber weiter kann ich mit dem 
Ausdruck nix anfangen. Wo ist das Problem bei meiner Vorgehensweise?
Auf einem PIC konnt ich genauso realisieren.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dann lerne C. Problem an deiner Vorgehenseweise ist kein prinzipielles. 
Nur je nach Optimierungsfähigkeiten des Kompilers dauert das mehrere 
Takte. Dadurch, dass die beiden Register direkt hintereinander im 
Speicher liegen kann man die auch gleich direkt als 32 Bit Wert 
betrachten. Ob das nun INT32 oder UINT32 ist, hängt ja von den 
Ausgangsdaten und dem verwendeten Modus ab (signed/unsigned).

Der Befehl erstellt einen Pointer auf eine 32-Bit Variable und 
dereferenziert diesen im gleichen Schritt wieder. Also steht in Result 
gleich der 32-Bit Wert. Übrig bleiben 3 Assembler-Befehle:
    6d76:  1f 42 3c 01   mov  &0x013c,r15  ;0x013c
    6d7a:  b2 4f 8e 12   mov  @r15+,  &0x128e  ;
    6d7e:  b2 4f 90 12   mov  @r15+,  &0x1290  ;

Im Gegensatz zu deinem Rotieren:
    6d76:  1f 42 3c 01   mov  &0x013c,r15  ;0x013c
    6d7a:  0e 4f         mov  r15,  r14  ;
    6d7c:  0f 43         clr  r15    ;
    6d7e:  82 4e 8e 12   mov  r14,  &0x128e  ;
    6d82:  82 4f 90 12   mov  r15,  &0x1290  ;
    6d86:  1e 42 8e 12   mov  &0x128e,r14  ;0x128e
    6d8a:  1f 42 90 12   mov  &0x1290,r15  ;0x1290
    6d8e:  0d 4e         mov  r14,  r13  ;
    6d90:  0c 43         clr  r12    ;
    6d92:  82 4c 8e 12   mov  r12,  &0x128e  ;
    6d96:  82 4d 90 12   mov  r13,  &0x1290  ;
    6d9a:  1c 42 3a 01   mov  &0x013a,r12  ;0x013a
    6d9e:  0d 43         clr  r13    ;
    6da0:  1e 42 8e 12   mov  &0x128e,r14  ;0x128e
    6da4:  1f 42 90 12   mov  &0x1290,r15  ;0x1290
    6da8:  0e dc         bis  r12,  r14  ;
    6daa:  0f dd         bis  r13,  r15  ;
    6dac:  82 4e 8e 12   mov  r14,  &0x128e  ;
    6db0:  82 4f 90 12   mov  r15,  &0x1290  ;

Optimierung jeweils -O2 beim MSPGCC.

Autor: wuddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mag sein das meine Variante "aufwendiger" ist aber das Problem ist sie 
tut nicht und das wundert mich. Nach ausführen des letzten Befehls ist 
erg "unavailable"

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lerne C. Kann man nur nochmals sagen. Wenn die Variable nicht gebraucht 
wird, wirft die der Kompiler weg. Musst du halt als volatile 
deklarieren, dann kommt sie in den RAM und wird nicht wegoptimiert. 
Außerdem sollte der Kompiler dann eine Warnung bringen, dass du die 
Variable nicht benutzt.

Autor: wuddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK sehe ja ein das die Pointerlösung geschickter ist, hab das jetzt auch 
mal versucht anzuwenden aber das Problem ist das mein Compiler mit 
UINT32 / IN32 nix anfangen kann. Der Punkt ist doch das mit
UINT32 Result = *(UINT32*)&RESLO;
 ein zeiger angelegt wird der auf eine 32bit Variable verweist, die 
wiederum einre 32bit Variablen zugewiesen wird. Also müsste es doch auch 
mit einem anderen 32bit Datentyp gehen?

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na jetzt stell dich doch nicht so an. Hast du noch nie C programmiert? 
Dann nimm halt einen beliebigen 32-Bit breiten Datentyp.
meinetwegen

long Result = *(long*)&RESLO;

Wenn long bei deinem Kompiler 32 Bit sind....welchen Kompiler benutzt du 
eigentlich?

Autor: wuddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry aber ich versteh die welt nicht mehr. Hab die Geschicht von oben 
jetzt mal in ein anderes, kleies Testprogramm eigebunden und es tut 
einwandfrei; beider Varianten. In meinem Ursprungsprogramm will es 
allerdings nicht.
Entschuldige mich aber erstmal dafür einen so begriffsstutzigen Eindruck 
gemacht zu haben. Aber es hat einfach keinen Sinn ergeben. Wenn mal den 
halben Tag damit zubringt sowas simples zum laufen zu bringen sieht man 
irgendwann den Wald vor lauter Bäumen nicht mehr :D

Ach ja... ich programmiere mit IAR Embedded Workbench. Nähere Compiler 
Infos hab ich auf die schnelle jetzt nicht gefunden.

Autor: wuddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, hab jetzt den fehler beseitigt und jetzt tut es auch im 
Hauptprogramm! Danke für die Hilfe

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Woran lag´s denn?

Autor: wuddy (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das willst du jetzt nicht wirklich wissen :D
Alt bekanntes Problem ( Variablengültigkeit). Hab jetzt die variablen 
die ich brauch global definiert und siehe da es geht. Also das ist ein 
Fehler der mir nicht mehr so häufig unterlaufen wird.

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenigstens bist du lernfähig....wir haben hier auch viele 
lernresistente...

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.