|
Die Firma Microchip unterscheidet den Befehlssatz für den PIC12F675 in drei Kategorien:
Die PIC-Mikroprozessor-Familie lässt sich in drei Kategorien einteilen, abhängig von der Länge der Befehlsworte. Es gibt Prozessoren mit 12-Bit-Befehlslänge, mit 14-Bit mit 16-Bit und mit 24-Bit. Es handelt sich um so genannte RISC-Prozessoren, d.h. es sind Mikrocontroller mit einem reduzierten Befehlssatz (Reduced Instruction Set Computing ), in der Regel wird ein Befehl in einem Taktzyklus abgearbeitet. Ausnahmen sind hier nur die Sprungbefehle bzw. Rücksprunganweisungen. Diese benötigen zwei Taktzyklen.
Der PIC12F675 gehört zu den PICs mit 14-Bit langen Befehlsworten, dies gilt auch für die von uns vorgestellten PIC16F684 und PIC16F877A, der PIC18F4550 ist ein Controller mit 16-Bit breiten Befehlsworten. Obwohl der PIC16F877A eine sehr viel bessere Ausstattung als der PIC12F675 hat, kommt auch er mit den 35 Assemblerbefehlen aus, über die auch der PIC12F675 verfügt.
Der PIC16F877A verfügt über serielle Schnittstellen (USART, i2cTM -Schnittstelle usw.) Konfiguriert werden diese Schnittstellen durch spezielle Konfigurationsregister, auf die wir zugreifen können. Entsprechendes gilt für Ausgabe und Eingabe. Auf diese Weise muss der Befehlsumfang nicht erweitert werden.
Vorher wurde bereits darauf hingewiesen, dass Datenspeicheradressen mit Hilfe von 7 Bits angesprochen werden, dabei wird das 8. und 9. Bit durch zwei Bits des Statusregisters erweitert, so dass wir maximal 22 =4 Speicherbänke haben. Wollten wir einen direkten Sprung zu jedem Progammspeicherplatz mit Hilfe von GOTO möglich machen, so müssten wir eine die 13 Bit-Adresse direkt übergeben. Dann bliebe aber nur ein Bit als Kennzeichnungszahl für den entsprechenden Maschinenbefehl, deshalb arbeitet man auch hier mit Speicherbänken. Für die gewählte Speicheradresse beim Sprungbefehl stehen 11 Bit zur Verfügung. Mit Hilfe von goto kann hiermit ein Speicherbereich von 211 =2Kb Speicherzellen angesprochen werden. Die restlichen 2 oberen Bits werden wiederum mit Hilfe von zwei Bits in einem Register erzeugt. Es handelt sich hier um das Register PCLATH und in diesem Register um das 3. und 4. Bit. Entsprechendes gilt für den Call-Befehl. Wichtig ist hierbei, dass der Rücksprung aus einer Speicherbank ohne erneute Bankumschaltung gewährleistet ist.
Der Befehlssatz
Im Zentrum der Befehle liegt das Arbeitsregister W. W ist ein 8-Bit-Speicher über den alle Speicheroperationen laufen. Wollen wir beispielsweise den Inhalt zweier Datenspeicher addieren, so müssen den Inhalt eines Datenspeichers nach W kopieren. Erst jetzt können wir den Inhalt eines anderen Datenspeichers hierzu addieren. Wer sich hier schnell einarbeiten will, sollte sich die Programmbeispiele ansehen. In den folgenden Beschreibungen werden nur bestimmte Befehle hervorgehoben werden, wer sich weitergehend mit der Assemblerprogrammierung beschäftigen will, kommt nicht darum herum, sich genauer das Datenblatt des Entsprechenden Prozessors anzusehen.
Die Befehle bestehen aus dem Kürzel (dem so genannten Mnemonik) für den Maschinenbefehl, diese Kürzel werden hier groß geschrieben. In den Programmbeispielen habe ich die Kleinschrift bevorzugt. Der Assembler MPASM ist entsprechend vorkonfiguriert. Gegebenenfalls folgen der neben W zusätzlich betroffene Speicher mit seiner Adresse f, mit der Richtung der Operation d, in manchen Fällen wird das betroffen Bit b angegeben, es kann sein, dass eine Konstante k oder eine Sprungadresse übergeben wird. Die Kürzel sind weitgehend selbsterklärend.
Beispielsweise: DECF f, d bedeutet: Verringere den 8-Bit-Wert im Datenspeicher mit der Adresse f um 1 und schreibe das Ergebnis in den Arbeitsspeicher W, falls d=0 oder wieder nach f falls d=1.
Konkreter: DECF 32, 0 bedeutet: Verringere den Inhalt von Datenspeicher mit der Nr. 32 um 1 (dekrementiere) und lege das Ergebnis der Operation im Arbeitsregister W ab. Hierbei zu beachten ist, dass dies der 32 Speicherplatz in Bank1 aber auch in Bank 2 sein kann. Dies hängt also davon ab, welche Bank ausgewählt wurde.
Die Befehle werden in der Reihenfolge ausgeführt, wie sie im Quelltext aufgeführt sind, es sei denn, dass Sprungbefehle oder Unterprogrammbefehle aufgerufen werden.
Nachfolgend werden die Assemblerbefehle unterteilt nach drei Kategorien aufgeführt.
Byte-orientierte Speicher-Operationen
ADDWF f,d ANDWF f,d CLRF f CLRW COMF f,d
DECF f,d DECFSZ f,d INCF f,d INCFSZ f,d IORWF f,d
MOVF f,d MOVWF f NOP RLF f,d RRF f,d
SUBWF f,d SWAPF f,d XORWF f,d
Bit-orientierte Speicher-Operationen
BCF f,b BSF f,b BTFSC f,b BTFSS f,b
Konstanten- und Kontrolloperationen
ADDLW k ANDLW k CALL k CLRWDT
GOTO k IORLW k MOVLW k RETRFIE
RETLW k RETURN SLEEP SUBLW k
XORLW k
Befehlseinteilung mit Kurzerläuterung
Bei einer Reihe von Operationen werden bestimmte Bits im STATUS-Register verändert. So können bei Additionen bzw. Subtraktionen beispielsweise Fehler auftreten, da mit 8 Bit sich ja nur ganze nicht vorzeichenbehaftete Zahlen zwischen 0 und 255 darstellen lassen. Beispielsweise ergibt sich als Ergebnis von 18 + 25 der Wert 43. Das ist in Ordnung. Das Ergebnis von 240 + 36 ist aber nicht mehr als 8-Bit-Wort darstellbar. Trotzdem wird ein Wert berechnet. In diesem Fall ist es der Wert 21 ( 240 + 15 + 21). Man spricht in diesem Fall von einem Zahlenüberlauf. Damit wir diesen Überlauf erkennen können wird das sogenannte Übertragsbit (Carrybit) gesetzt, welches wir, wenn wir wollen, auswerten können. Entsprechend gibt es weitere Bits, die uns so eine weitergehende Kontrolle über die Ergebnisse bestimmter Operationen geben.
Das Statusregister sieht folgendermaßen aus:
STATUS (03h oder 83h beim 12F675)
|
Bit7
|
Bit6
|
Bit5
|
Bit4
|
Bit3
|
Bit2
|
Bit1
|
Bit0
|
|
IRP
|
RP1
|
RP0
|
nicht TO
|
nicht PD
|
Z
|
DC
|
C
|
Legende:
C:
|
Übertragsbit. Siehe oben. |
| Z: |
Zerobit (Nullbit). Ergibt eine Operation den Wert 0, so wird dieses Bit gesetzt. |
| DC: |
Bit wird gesetzt, wenn bei einer Operation ein Überlauf über das vierte untere Bit hinaus stattfindet. |
| IRP: |
Dieses Bit ist das 8.Bit bei einer indirekten Speicheradressierung. Dieses Bit hat für den 12F675 keine Bedeutung.Bei dem 16f87x gibt es diese Möglichkeit (Siehe Handbuch).
|
| RP0, RP1: |
Bankumschaltung der Datenbänke. Mit RP1=1 und RP0=1 wird beispielsweise Bank 1 ausgewählt. RP1 hat für den 12F675 keine Bedeutung, da dieser Mikrocontroller nur über zwei Datenbänke verfügt. Insgesamt sind bei zwei Bit nur 4 Bänke a 128 Bytes wählbar. Es sind nicht immer alle möglichen Bytes realisiert. Beispielsweise ist das STATUS Register über 83h oder 03h beim 12F675 erreichbar. 11h bis 18h sind nicht als Datenspeicher implementiert u.s.w. . |
Byte-orientierte Speicher-Operationen
Befehl: |
Beschreibung: |
Flags: |
ADDWF f,d
|
Addiere W und f. Schreibe nach W für d=0 oder nach f für d=1. |
C, DC, Z |
| ANDWF f,d |
Bitweise Und-Verknüpfung von W mit f. Schreibe nach W für d=0 oder nach f für d=1.
|
Z |
CLRF f
|
Initialisiere f mit dem Wert 0.
|
Z
|
| CLRW |
Initialisiere W mit dem Wert 0. |
Z
|
COMF f,d
|
Bitweises Komplement von f. Schreibe nach W für d=0 oder nach f für d=1. |
Z |
DECF f,d
|
Verringere f um 1 (dekrementiere). Schreibe nach W für d=0 oder nach f für d=1. |
Z |
| DECFSZ f,d |
Verringere f um 1. Überspringe den nächsten Befehl falls das Ergebnis 0 ist. |
|
INCF f,d
|
Verringere F um 1. Schreibe nach W für d=0 oder nach f für d=1. |
Z |
| INCFSZ f,d |
Verringere F um 1. Überspringe den nächsten Befehl falls das Ergebnis 0 ist.
|
|
IORWF f,d
|
Einschließende bitweise Oder-Verknüpfung. Schreibe nach W für d=0 oder nach f für d=1. |
Z |
MOVF f,d
|
Kopiere f. Schreibe nach W für d=0 oder nach f für d=1. |
Z |
| MOVWF f |
Kopiere W nach f.
|
|
NOP
|
No Operation. Leerbefehl. |
|
RLF f,d
|
Rotiere ein Bit nach links durch das Carry-Bit. Bit 0 nach Bit 1, Bit 1 nach Bit 2,.....,Bit 7 nach Carry-Bit, Carry-Bit nach Bit 0. Schreibe nach W für d=0 oder nach f für d=1. |
C |
| RRF f,d |
Rotiere ein Bit nach rechts durch das Carry-Bit. Bit 0 nach Carry-Bit, Bit 1 nach Bit 0, .... , Carry-Bit nach Bit 7. Schreibe nach W für d=0 oder nach f für d=1. |
C |
SUBWF f,d
|
Subtrahiere W von f. Schreibe nach W für d=0 oder nach f für d=1. |
C,DC,Z |
SWAPF f,d
|
Untere 4 Bits und obere 4 Bits werden miteinander getauscht. Schreibe nach W für d=0 oder nach f für d=1. |
|
XORWF f,d
|
Entweder – Oder -bitweise. Schreibe nach W für d=0 oder nach f für d=1. |
Z |
Bit-orientierte Speicher-Operationen
BCF f,b
|
Setze das b-te Bit in f auf 0.
|
| BSF f,b |
Setze das b-te Bit in f auf 1. |
| BTFSC f,b |
Ist das b-te Bit 0, so überspringe den nächsten Befehl. |
| BTFSS f,b |
Ist das b-te Bit 1, so überspringe den nächsten Befehl |
Konstanten- und Kontroll-Operationen
ADDLW k
|
Addiere die 8-Bit-Konstante k zu W.
|
C,DC,Z |
| ANDLW k |
Verknüpfe 8-Bit-Konstante k mit 8-Bit-Wort in W bitweise mit UND. Schreibe das Ergebnis nach W. |
Z |
CALL k
|
Springe zu Programmspeicherplatz k (11-Bit) in der Speicherbank, die mit Hilfe von Bit 3 und Bit 4 in Register PCLATH voreingestellt ist. Es gibt also maximal 4 Programmspeicherbänke (KB) mit jeweils 2KB. Der 12F675 verfügt nur über 1KB Speicherplatz. Hier ist also eine Bankumschaltung nicht sinnvoll. Wird der Befehl RETURN bzw. RETLW erreicht, so setze das Programm an alter Stelle ( +1) fort. |
|
CLRWDT
|
Setze den Watch-Dog-Timer zurück. |
|
GOTO k
|
Gehe zu Programmspeicherplatz k (11-Bit) in voreingestellter Programmspeicherbank. |
|
IORLW k
|
Einschließendes bitweises Oder der 8-Bit-Konstanten k. mit dem Arbeitsregister W. Das Ergebnis liegt in W. |
Z |
| MOVLW k |
Kopiere die 8-Bit-Konstante k nach W.
|
|
RETRFIE
|
Zurück vom Interrupt.
|
|
RETLW k
|
Unterprogramm ist zu Ende. Lege 8-Bit-Konstante k in W ab und setze das Programm an alter Stelle fort. S.a. CALL-Befehl. |
|
RETURN
|
Springe zum Call-Befehl zurück +1. Setze das Programm fort. (s.a. CALL-Befehl). |
|
SLEEP
|
Gehe in den Standby-Modus.
|
|
SUBLW k
|
Subtrahiere W von der 8-Bit-Konstanten k. Ergebnis liegt in W. |
C,DC,Z
|
XORLW k
|
Bitweises Entweder -Oder. Der 8-Bit-Konstanten k mit dem Arbeitsspeicher W. Das Ergebnis liegt in W. |
|
[HIER WIRD GEBASTELT UND ES ENTSTEHT IN KÜRZE MEHR]
|