www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem mit swapf


Autor: Mark K. (spliff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo

wenn ich

asm
  {
    swapf portd
  }

habe und dass Teil eines C++ Programms ist, bekomme ich ständig den
error: error in built-in assembly beim builden.
woran könnte das liegen?

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe jetzt keine Ahnung um welchen Controller/Assembler es geht, 
aber ich kann mir schwer vorstellen, dass swapf auf einem Port 
funktioniert. Leg den Wert mal in einem Register ab, führ' dann das 
swapf aus und leg das Ergebnis wieder auf den Port.

Gruß

Kai

Autor: Mark K. (spliff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich schreibs für einen PIC 16f877a

könnte das so gehen (hab noch nie wirklich ASM programmiert)
asm
  {  bsf    temp
    movf  portd,temp
    swapf   temp
    movf  temp,portd
  }

???

Autor: Kai G. (runtimeterror)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei den meisten Assembler-Sprachen ist der erste Parameter einer 
MOV-Anweisung das Ziel also
movf temp, portd
swapf temp
movf portd, temp

Was macht 'bsf'? Anstelle von temp muss der Name eines Registers 
eingetragen werden. Lies dich mal durch den Befehlssatz des Controllers 
durch - da steht eigentlich alles drin. Alternativ solltest du mal ein 
Tutorial durcharbeiten.

Ich kenne die PICs selbst gar nicht - die Frage sollte dir aber jeder 
PIC-Programmierer beantworten können.

Für einen einzelnen Befehl macht es meist keinen Sinn den 
Inline-Assembler zu bemühen. Der Overhead oft größer, als eine reine 
C-Implementation.

Autor: Dieter Werner (dds5)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Befehl swapf braucht insgesamt 2 Parameter denn nach der Quelle ( 
hier portd bzw. temp) muss noch das Ziel benannt werden.

Da käme in Frage: 1, d.h. Ziel ist gleich Quelle oder 0 dann wird das 
Ergebnis in das wreg geschrieben.

Für den o.g. Fall wäre also richtig

swapf portd,1

Autor: Mark K. (spliff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hab ich schon probiert, weil ich mir den Befehl im Datasheet 
angesehen habe, aber dann bekomm ich den Error:

error: unknown assembly identifier 'portd' (did you forget to put '_' in 
front of variable name)

Autor: Dieter Werner (dds5)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manchmal ist die Schreibweise entscheidend, vielleicht geht PORTD oder 
der Compiler hat eine eigene Ansicht darüber wie der Port D heissen 
soll.

Autor: Mark K. (spliff)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habs jetzt danke!!!

Der Befehl muss so aussehen:
_ da ich damit ja einen Port anspreche.
swapf _portd,1

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.