mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC 16F887 comf-Befehl sehr eigenartig


Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich wollte gerade ausprobieren ob der COMF Befehl eines PIC 16F887 die 
Bits in einem Byte nur umdreht, oder ob er das Zweierkomplement bildet, 
also mit hinzuaddieren (oder Subtrahieren?) einer 1.

Folgender Code:
  movlw  b'01101001'
  movwf  tmp1
  comf  tmp1,w

ergibt in W: b'10010101' also Zweierkomplement.

dagegen ergibt der Code:
  movlw  b'01101001'
  movwf  tmp1
  comf  tmp1,f

in tmp1: b'10010110' also alle Bits vertauscht ohne eine 1 zu 
subtrahieren.

Kann mir einer sagen warum das so ist? Oder spinnt hier der Simulator? 
In der Doku steht nichts von dieser Eigenheit. Danach müsste bei beiden 
Bsp. das selbe herauskommen. Sehr eigenartig das ist...

Sven

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
comf ist nicht 2-er kompliment, sondern nur negieren.

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ok, aber warum dann das unterschiedliche Ergebnis, je nachdem ob man 
nach w oder nach f speichert? Das ist doch das Problem.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im prozessor kommt bei beidem das identische heraus, es ist das
identische als der ~ operator in c, nur halt 8bit.

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Anbei mal noch ein Bild woran der Fehler zu erkennen ist. Füge ich nach 
dem COMF noch ein NOP ein ist alles so, wie es sein sollte. Ohne dieses 
NOP landet aber in W ein falscher Wert, zumindest im Simulator. Wäre mal 
interessant warum das so ist. Da ich jetzt aber weiß, dass die Bits nur 
negiert werden, ist mein Problem erst mal gelöst. Obwohl... Würde mich 
schon interessieren warum er einen falschen Wert nach W schreibt ** 
grübel **.

Sven

Autor: Master Snowman (snowman)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich assemblere leider nicht. aber vielleicht liegt's daran, dass er für 
w einen takt länger braucht als für f und so zwischenzeitlich ein 
falscher wert in w ist..?

Autor: Sven Stefan (stepp64) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, ich habs gefunden. Manchmal ist man halt doch etwas voreilig....

Da ich nur zum Testen die 3 Befehle gleich ab Adresse 0 geschrieben habe 
belegen diese die Speicheradresse 0-2. Auf Adresse 3 steht im Quelltext 
nichts, aber im Speicher! Dort steht eine gelöschte Zelle 0x3FFF was 
einem ADDLW 0xFF entspricht. Der Assembler führt diesen Befehl aus auch 
wenn er nicht im Quelltext steht. Normalerweise hätte ja hier auch 
irgendein Sprungbefehl gestanden. Da es aber eine schneller Test sein 
sollte kam nun dieser "Fehler" zustande. Trotzdem danke für die Hilfe.

Gruß
Sven

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.