|
|
| Zeile 188: |
Zeile 188: |
| | | Wenn das Bit b im Register f 0 ist, dann wird der nachfolgende Befehl nicht und stattdessen ein NOP ausgeführt. Wenn das Bit b 1 ist, dann wird der nächste Befehl ausgeführt. | | | Wenn das Bit b im Register f 0 ist, dann wird der nachfolgende Befehl nicht und stattdessen ein NOP ausgeführt. Wenn das Bit b 1 ist, dann wird der nächste Befehl ausgeführt. |
| | |} | | |} |
| − |
| |
| − | ====Beispiel:====
| |
| − | <pre>
| |
| − | ...
| |
| − | BSF STATUS, RP0 ;Setzt das Bit RP0 auf 1 -> Wechsel auf Bank1
| |
| − | BSF TRISB,0 ;Macht den Pin 0 des PORTB's zum Eingang
| |
| − | BCF STATUS, RP1 ;Löscht das Bit RP0 auf 0 -> Wechsel auf Bank0
| |
| − | ...
| |
| − | </pre>
| |
| − | Setzt ganz einfach ein Bit eines Registers auf 0. Dabei kann man die Stelle im Register als Zahl angeben, oder aber auch den Namen, wenn man die Stelle nicht weis und sofern das Bit einen hat.
| |
| | | | |
| | == BTFSS == | | == BTFSS == |
Version vom 11. April 2007, 11:08 Uhr
Assembler Befehle
ADDLW
| ADDLW
|
ADD Zahl und W
|
| Syntax:
|
ADDLW k
|
| Operanten:
|
0 ≤ k ≤ 255
|
| Operation:
|
(W) + k → (W)
|
| Beeinflusste Statusbits:
|
C, DC, Z
|
| Beschreibung:
|
Der Inhalt des W Registers wird mit der 8-Bit Zahl k ADD addiert und das Ergebnis landet wieder im W Register
|
ADDWF
| ADDWF
|
ADD W und f
|
| Syntax:
|
ADDWF f,d
|
| Operanten:
|
0 ≤ f ≤ 127 und d ∈ [0,1]
|
| Operation:
|
(W) + (f) → (destination)
|
| Beeinflusste Statusbits:
|
C, DC, Z
|
| Beschreibung:
|
Der Inhalt des W Registers wird mit dem Register f addiert und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1)
|
ANDLW
| ANDLW
|
AND Zahl mit W
|
| Syntax:
|
ANDLW k
|
| Operanten:
|
0 ≤ k ≤ 255
|
| Operation:
|
(W) + k → (W)
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Der Inhalt des W Registers wird mit der 8-Bit Zahl k verundet und das Ergebnis landet wieder im W Register
|
Beispiel:
...
MOVLW 0xCC ;Ladet Die Zahl 0xCC (Hex) in den Arbeitsregister.
;Sieht Binär so aus: '11001100'
ANDLW 0xF0 ;Führt die Logische Operation "AND" (UND)
;mit 0xF0 (binär: '11110000') durch und ladet die Zahl
;wieder ins Arbeitsregister W.
;Nun steht im Arbeitsregister 0xC0 ('11000000')
...
Mit der Logischen Operation "AND" lässt sich sehr schön ein Teil eines Bytes auf 0 setzen. Und zwar werden alle Teile auf 0 gesetzt, wo eine 0 im 2.Byte steht, dort wo eine 1 stand, bleibt alles erhalten.
siehe Logiktabelle
ANDWF
| ANDWF
|
AND W mit f
|
| Syntax:
|
ANDWF f,d
|
| Operanten:
|
0 ≤ f ≤ 127 und d ∈ [0,1]
|
| Operation:
|
(W) .AND. (f) → (destination)
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Der Inhalt des W Registers wird mit dem Register f verundet und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1)
|
Beispiel:
...
MOVLW 0x07 ;Ladet die Zahl 0x07 ('00000111') in das Arbeitsregister...
MOVWF 0x22 ;...und anschließend in den Register 0x22
MOVLW 0xCC ;Ladet Die Zahl 0x84 (Hex) in das Arbeitsregister.
;Sieht Binär so aus: '10000100'
ANDWF 0x22,1 ;Führt die Logische Operation "AND" (UND)
;mit dem Inhalt des (GPR)Registers mit der Adresse 0x22
;durch und ladet die Zahl
;danach wieder in den in den Register 0x22 zurück.
;Nun steht an der Adresse 0x22 die Zahl 0x04 ('00000100')
...
Mit der Logischen Operation "AND" lässt sich sehr schön ein Teil eines Bytes auf 0 setzen. Und zwar werden alle Teile auf 0 gesetzt, wo eine 0 im 2.Byte steht, dort wo eine 1 stand, bleibt alles erhalten.
siehe Logiktabelle
BCF
| BCF
|
Bit Clear f
|
| Syntax:
|
BCF f,b
|
| Operanten:
|
0 ≤ f ≤ 127 und 0 ≤ b ≤ 7
|
| Operation:
|
0 → (f)
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Bit ‘b’ in Register ‘f’ wird auf 0 gesetzt
|
Beispiel:
...
BSF STATUS, RP0 ;Setzt das Bit RP0 auf 1 -> Wechsel auf Bank1
BSF TRISB,0 ;Macht den Pin 0 des PORTB's zum Eingang
BCF STATUS, RP1 ;Löscht das Bit RP0 auf 0 -> Wechsel auf Bank0
...
Setzt ganz einfach ein Bit eines Registers auf 1. Dabei kann man die Stelle im Register als Zahl angeben, oder aber auch den Namen, wenn man die Stelle nicht weis und sofern das Bit einen hat.
BSF
| BSF
|
Bit Set f
|
| Syntax:
|
BSF f,b
|
| Operanten:
|
0 ≤ f ≤ 127 und 0 ≤ b ≤ 7
|
| Operation:
|
0 → (f<b>)
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Bit ‘b’ in Register ‘f’ wird auf 1 gesetzt
|
BTFSC
| BTFSC
|
Bit Test f, Skip if Clear
|
| Syntax:
|
BTFSC f,b
|
| Operanten:
|
0 ≤ f ≤ 127 und 0 ≤ b ≤ 7
|
| Operation:
|
skip if (f<b>) = 0
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Wenn das Bit b im Register f 0 ist, dann wird der nachfolgende Befehl nicht und stattdessen ein NOP ausgeführt. Wenn das Bit b 1 ist, dann wird der nächste Befehl ausgeführt.
|
BTFSS
| BTFSS
|
Bit Test f, Skip if Set
|
| Syntax:
|
BTFSS f,b
|
| Operanten:
|
0 ≤ f ≤ 127 und 0 ≤ b ≤ 7
|
| Operation:
|
skip if (f<b>) = 1
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Wenn das Bit b im Register f 1 ist, dann wird der nachfolgende Befehl nicht und stattdessen ein NOP ausgeführt. Wenn das Bit b 0 ist, dann wird der nächste Befehl ausgeführt.
|
CALL
| CALL
|
Call Subroutine
|
| Syntax:
|
CALL k
|
| Operanten:
|
0 ≤ k ≤ 2047
|
| Operation:
|
(PC) + 1 → TOS,
k → PC<10:0>,
(PCLATH<4:3>) → PC<12:11>
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Als erstes wird die Rückkehradresse (PC+1) in den Stack geschrieben. Dann Die 11bit Sprungadresse in den PC geladen (die 2 MSB kommen aus dem PCLATH).
|
CLRF
| CLRF
|
Clear f
|
| Syntax:
|
CLRF f
|
| Operanten:
|
0 ≤ f ≤ 127
|
| Operation:
|
00h → (f),
1 → Z
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Das komplette Byte im Register f wird gelöscht (lauter 0er). Das hat zur folge, das Z gesetzt wird.
|
CLRW
| CLRW
|
Clear W
|
| Syntax:
|
CLRW
|
| Operanten:
|
/
|
| Operation:
|
00h → (W),
1 → Z
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Das Arbeitsregister W wird gelöscht und anschließed das Z-Bit auf 1 gesetzt.
|
CLRWDT
| CLRWDT
|
Clear Watchdog Timer
|
| Syntax:
|
CLRWDT
|
| Operanten:
|
/
|
| Operation:
|
00h → WDT,
0 → WDT prescaler,
1 → TO,
1 → PD
|
| Beeinflusste Statusbits:
|
TO, PD
|
| Beschreibung:
|
Der Watchdogtimer (TMR0) wird resettet. es wird ebenfalls der Prescaler resettet. Die Statusbits T0 und PD werden gesetzt.
|
COMF
| COMF
|
Complement f
|
| Syntax:
|
COMF f,d
|
| Operanten:
|
0 ≤ f ≤ 127 und
d ∈ [0,1]
|
| Operation:
|
(f) → (destination)
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Alle Bits des Registers f werden invertiert (1 wird 0 und 0 wird 1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert.
|
DECF
| DECF
|
Decrement f
|
| Syntax:
|
DECF f,d
|
| Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
| Operation:
|
(f) – 1 → (destination)
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Das Register f wird decrementiert (f=f-1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert.
|
DECFSZ
| DECFSZ
|
Decrement f, skip if 0
|
| Syntax:
|
DECFSZ f,d
|
| Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
| Operation:
|
(f) – 1 → (destination), skip if result = 0
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Das Register f wird decrementiert (f=f-1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert. Danach wird überprüft, ob das Ergebnis 0 war. Wenn ja, dann wird an Stelle des nächsten Befehls ein NOP durchgeführt.
|
GOTO
| GOTO
|
uncontitional Branch
|
| Syntax:
|
GOTO k
|
| Operanten:
|
0 ≤ k ≤ 2047
|
| Operation:
|
k → PC<10:0>,
PCLATH<4:3> → PC<12:11>
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Goto veranlasst einen Sprung an die Adresse k im Programmspeicher. Es werden aber nur die 11 niedrigstens Bit der Adresse mit GOTO bestimmt, die beiden höchsten werden aus dem Register PCLATH geladen.
|
INCF
| INCF
|
Increment f
|
| Syntax:
|
INCF f,d
|
| Operanten:
|
0 ≤ f ≤ 127,
d ∈ [0,1]
|
| Operation:
|
(f) + 1 → (destination)
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Das Register f wird incrementiert (f=f+1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert.
|
INCFSZ
| INCFSZ
|
Increment f, skip if 0
|
| Syntax:
|
INCFSZ f,d
|
| Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
| Operation:
|
(f) + 1 → (destination), skip if result = 0
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Das Register f wird incrementiert (f=f-1) und das Ergebnis entweder in den Arbeitsregister W (d=0) oder wieder in das Register f (d=1) gespeichert. Danach wird überprüft, ob das Ergebnis 0 war. Wenn ja, dann wird an Stelle des nächsten Befehls ein NOP durchgeführt.
|
IORLW
| IORLW
|
Inclusive OR Literal with W
|
| Syntax:
|
IORLW k
|
| Operanten:
|
0 ≤ k ≤ 255
|
| Operation:
|
(W) .OR. k → (W)
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Der Inhalt des W Registers wird mit der 8-Bit Zahl k verodert und das Ergebnis landet wieder im W Register
|
IORWF
| IORWF
|
Inclusive OR W und f
|
| Syntax:
|
IORWF f,d
|
| Operanten:
|
0 ≤ f ≤ 127 und d ∈ [0,1]
|
| Operation:
|
(W) .OR. (f) → (destination)
|
| Beeinflusste Statusbits:
|
C, DC, Z
|
| Beschreibung:
|
Der Inhalt des W Registers wird mit dem Register f verodert und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1)
|
MOVF
| MOVF
|
Move f
|
| Syntax:
|
MOVF f,d
|
| Operanten:
|
0 ≤ f ≤ 127 und d ∈ [0,1]
|
| Operation:
|
(W) + (f) → (destination)
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Der Inhalt des Registers f wird entweder in das Arbeitsregister W (d=0) oder wieder in sich selbst kopiert (d=1). Das "in sich selber kopieren" hat den Sinn, zu überprüfen, ob das Register leer ist. Wenn dem nämlich so wäre, dann würde das Z-Bit gesetzt werden.
|
MOVLW
| MOVLW
|
Move Literal to W
|
| Syntax:
|
MOVLW k
|
| Operanten:
|
0 ≤ k ≤ 255
|
| Operation:
|
k → (W)
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Die Zahl k wird in das Arbeitsregister geladen
|
MOVWF
| MOVWF
|
Move W to f
|
| Syntax:
|
MOVWF f
|
| Operanten:
|
0 ≤ f ≤ 127
|
| Operation:
|
(W) → (f)
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Das Arbeitsregister W wird in das Register f geladen
|
NOP
| NOP
|
No Operation
|
| Syntax:
|
NOP
|
| Operanten:
|
/
|
| Operation:
|
/
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Ein Takt lang wird NICHTS gemacht.
|
RETFIE
| RETFIE
|
Return from Interrupt
|
| Syntax:
|
RETFIE
|
| Operanten:
|
/
|
| Operation:
|
TOS → PC,
1 → GIE
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Dieser Befehl steht am Ende der Interrupt Service Routine - aber auch NUR dort!!! Damit wird das Programm wieder an der Stelle fortgesetzt, wo es von einem Interrupt unterbrochen wurde.
|
RETLW
| RETLW
|
Return with Literal in W
|
| Syntax:
|
RETLW k
|
| Operanten:
|
0 ≤ k ≤ 255
|
| Operation:
|
k → (W);
TOS → PC
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Der Wert k wird in das W Register geschrieben, dann die Returnadresse aus dem Stack geholt und in den PC geladen. Das Programm wird an der Stelle fortgesetzt, wo die letzte Subroutine aufgerufen wurde.
|
RETURN
| RETURN
|
Return from Subroutine
|
| Syntax:
|
RETURN
|
| Operanten:
|
/
|
| Operation:
|
TOS → PC
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Das Programm wird an der Stelle fortgesetzt, wo die letzte Subroutine aufgerufen wurde.
|
RLF
| RLF
|
Rotate Left f through Carry
|
| Syntax:
|
RLF f,d
|
| Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
| Operation:
|
siehe unten
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Das Register F wird links rum über das Carryflag "rotiert". D.h. das MSB landet im Carryflag und das Carryflag landet im LSB. Das Ergebnis landet entweder im Arbeitsregister W (d=0) oder wieder im Register f (d=1).
|
RRF
| RRF
|
Rotate Right f through Carry
|
| Syntax:
|
RRF f,d
|
| Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
| Operation:
|
siehe unten
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Das Register F wird rechts rum über das Carryflag "rotiert". D.h. das Carryflag landet im MSB und das LSB landet im Carryflag. Das Ergebnis landet entweder im Arbeitsregister W (d=0) oder wieder im Register f (d=1).
|
SLEEP
| SLEEP
|
Sleep
|
| Syntax:
|
SLEEP
|
| Operanten:
|
/
|
| Operation:
|
00h → WDT,
0 → WDT prescaler,
1 → TO,
0 → PD
|
| Beeinflusste Statusbits:
|
TO, PD
|
| Beschreibung:
|
Das Powerdownstatusbit (PD) wird gelöscht und das Timeoutstatusbit (TO) wird gesetzt. Der Watchdog wird samt seinem Prescaler Resetet. Danach wird der Prozessor "schlafen" geschickt und der Oszillator angehalten.
|
SUBLW
| SUBLW
|
Subtract W from Literal
|
| Syntax:
|
SUBLW k
|
| Operanten:
|
0 ≤ k ≤ 255
|
| Operation:
|
k – (W) → (W)
|
| Beeinflusste Statusbits:
|
C, DC, Z
|
| Beschreibung:
|
Das Arbeitsregister W wird von der Zahl k Subtrahiert und das Ergebnis wird in W gespeichert.
|
SUBWF
| SUBWF
|
Subtract W from f
|
| Syntax:
|
SUBWF f,d
|
| Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
| Operation:
|
(f) – (W) → (destination)
|
| Beeinflusste Statusbits:
|
C, DC, Z
|
| Beschreibung:
|
Das Arbeitsregister W wird vom Register f Subtrahiert und das Ergebnis wird entweder im Arbeitsregister W (d=0) oder dem Register f (d=1) gespeichert.
|
SWAP
| SWAP
|
Swap Nibbles in f
|
| Syntax:
|
SWAP f,d
|
| Operanten:
|
0 ≤ f ≤ 127
d ∈ [0,1]
|
| Operation:
|
(f<3:0>) → (destination<7:4>),
(f<7:4>) → (destination<3:0>)
|
| Beeinflusste Statusbits:
|
/
|
| Beschreibung:
|
Das obere und das untere Nibble des Registers f werden vertauscht. Das Ergebnis wird entweder im Arbeitsregister W (d=0) oder dem Register f (d=1) gespeichert.
|
XORLW
| XORLW
|
Exclusive OR Literal with W
|
| Syntax:
|
XORLW k
|
| Operanten:
|
0 ≤ k ≤ 255
|
| Operation:
|
(W) .XOR. k → (W)
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Der Inhalt des W Registers wird mit der 8-Bit Zahl k exklusiv verodert und das Ergebnis landet wieder im W Register
|
XORWF
| XORWF
|
Exclusive OR W und f
|
| Syntax:
|
XORWF f,d
|
| Operanten:
|
0 ≤ f ≤ 127 und d ∈ [0,1]
|
| Operation:
|
(W) .OR. (f) → (destination)
|
| Beeinflusste Statusbits:
|
Z
|
| Beschreibung:
|
Der Inhalt des W Registers wird mit dem Register f exklusiv erodert und das Ergebnis landet entweder im W Register (d=0) oder im Register f (d=1)
|
Pseudo Befehle
Pseudobefehle werden je nach Compiler unterstützt. (-oder eben auch nicht.) Sie geben dem Compiler Anweisungen, die z.b. das Ende des Programms angeben oder einfach nur die Position eines Befehls im Prgrammspeicher angeben.
#Define
| #Define
|
| Syntax:
|
#Define name string
|
| Beschreibung:
|
Jedes mal wenn 'name' im Programm verwendet wird, ersetzt der Compiler den Ausdruck mit dem definierten String.
|
END
| END
|
| Syntax:
|
END
|
| Beschreibung:
|
Sollte am Ende jedes Programmes stehen, um dem Compiler zu sagen, dass das Programm hier zu Ende ist. Ohne diesem Befehl (sollte) es auch keine Schwierigkeiten geben.
|
EQU
| EQU
|
| Syntax:
|
name EQU expr
|
| Beschreibung:
|
Definiert eine Zahl unter einem Namen. Zum Beispiel können so Registeradressen leicht zu merkende Namen bekommen.
|
ORG
| ORG
|
| Syntax:
|
ORG expr
|
| Beschreibung:
|
Positioniert Code im Programm an eine Bestimmte Adresse im Programmspeicher.
|
Logiktabelle
| A
|
B
|
|
AND
|
OR
|
NAND
|
NOR
|
XOR
|
XAND
|
| 0
|
0
|
|
0
|
0
|
1
|
1
|
0
|
1
|
| 0
|
1
|
|
0
|
1
|
1
|
0
|
1
|
0
|
| 1
|
0
|
|
0
|
1
|
1
|
0
|
1
|
0
|
| 1
|
1
|
|
1
|
1
|
0
|
0
|
1
|
0
|