PIC-Assembler - Erweiterter Befehlssatz

die zusätzlichen Befehler der "high-performance"-PIC16-Typen mit ENHANCED MID-RANGE CPU

zurück zu PIC-Prozessoren , Elektronik , Homepage

Erweiterter Befehlssatz?
Die zusätzlichen Assembler-Befehle

weiter zu 'Pseudo-Befehlen'

zurück


Erweiterte Befehle

ADDWCF , ASRF , LSLF , LSRF ,

MOVLB , MOVLP , BRA , BRW , RESET

ADDFSR , MOVIW , MOVWI 


Erweiterter Befehlssatz?

Die klassischen PIC16 kennen nur 35 unterschiedliche Befehle. Es gibt aber nun auch sogenannte high-performance-Typen mit ENHANCED MID-RANGE CPU, die sich besser für den Einsatz von C als Programmiersprache eignen, und dafür mit 14 zusätzlichen Befehlen ausgestattet wurden. Die hier aufgelisteten Befehle stehen also nur einigen PICs zur Verfügung, und dürfen auf anderen PICs nicht eingesetzt werden. PICs mit erweitertem Befehlssatz sind:
Diese Typen haben darüberhinaus:


herhömmlicher 14-Bit-Kern
ENHANCED MID-RANGE CPU
Hardware-Stack
8 Stufen tief
16 Stufen tief
Retten und Wiederherstellen von Registern bei Interrupt
PC
PC, W, STATUS, BSR, FSR0, FSR1, PCLATCH
File select register
1 x 8 bit
2 x 16 Bit
Befehle
35
49


nach oben

 

ADDWCF Addiere den Wert des Carry-Flags und des Arbeitsregisters W zum Register f
Syntax: ADDWCF  f,d
Bedeutung: Zum Inhalt des Registers f wird der Wert des Registers w addiert. Diese Summe wird noch um 1 erhöht, falls das C-Flag gesetzt ist.

wenn d=0:
Das Ergebnis wird Arbeitsregister W gespeichert. Die Speicherzelle f bleibt unverändert.

wenn d=1 
Das Ergebnis wird wieder in der Speicherzelle f gespeichert

Beispiel: MOVLW  0x05
ADDWCF 0x20,1  ; Falls das C-Flag gesetzt ist, wird der Inhalt der Speicherzelle

               ;   20h um 6 erhöht, ansonsten nur um 5. Die Summe wird in der 
               ;   Speicherzelle 20h abgelegt.
Flags: C, DC, Z


ASRF arithmetische Rechtsverschiebung (mit Erhalt des Vorzeichens)
Syntax: ASRF  f,d
Bedeutung: Die unteren 7 Bit des Registers f (Bit 6..0) werden um eine Position nach rechts verschoben.
Das LSB des Registers f (Bit 0) wird dabei in das C-Flag geschoben, während das alte C-Flag in das Bit 6 des Registers f geschoben wird.
Es handelt sich also um eine Rechtsrotation durch das C-Flag, von dem das Bit 7 des Registers (also das Vorzeichen des darin gespeicherten Zahlenwertes) ausgenommen ist.

wenn d=0:
Das Ergebnis wird Arbeitsregister W gespeichert. Die Speicherzelle f bleibt unverändert.

wenn d=1 
Das Ergebnis wird wieder in der Speicherzelle f gespeichert

Beispiel: MOVLW  0x8F
MOVWF  0x20
ASRF   0x20,1  ; Falls das C-Flag gesetzt war, steht nun in der Zelle 0x20 der Wert 0xC7

               ; Falls das C-Flag nicht gesetzt war, steht nun in der Zelle 0x20 der Wert 0x87
Flags: C, Z


LSLF logische Linksverschiebung in (aber nicht durch) das C-Flag
Syntax: LSLF  f,d
Bedeutung: Die 8 Bits des Registers f werden um eine Position nach links verschoben.
Das Bit 7 (MSB) des Registers f wird in das C-Flag geschoben. Der alte C-Flag-Wert geht verloren.
Das Bit 0 des Registers f wird mit 0 beschrieben.

wenn d=0:
Das Ergebnis wird Arbeitsregister W gespeichert. Die Speicherzelle f bleibt unverändert.

wenn d=1 
Das Ergebnis wird wieder in der Speicherzelle f gespeichert

Beispiel: MOVLW  0x8F
MOVWF  0x20
LSLF   0x20,1  ; nun steht in der Zelle 0x20 der Wert 0x1E; das C-Flag ist gesetzt

Flags: C, Z


LSRF logische Rechtsverschiebung in (aber nicht durch) das C-Flag
Syntax: LSRF  f,d
Bedeutung: Die 8 Bits des Registers f werden um eine Position nach rechts verschoben.
Das Bit 0 (LSB) des Registers f wird in das C-Flag geschoben. Der alte C-Flag-Wert geht verloren.
Das Bit 7 des Registers f wird mit 0 beschrieben.

wenn d=0:
Das Ergebnis wird Arbeitsregister W gespeichert. Die Speicherzelle f bleibt unverändert.

wenn d=1 
Das Ergebnis wird wieder in der Speicherzelle f gespeichert

Beispiel: MOVLW  0x8F
MOVWF  0x20
LSRF   0x20,1  ; nun steht in der Zelle 0x20 der Wert 0x47; das C-Flag ist gesetzt

Flags: C, Z




MOVLB schreibe eine Zahl in das Register BSR
Syntax: MOVLB  k
Bedeutung: Die Zahl k wird in das Register BSR geschrieben.
Die Zahl k darf nur Werte von 0 bis 31 annehmen.
Der Befehl eigent sich ideal zum Umschalten zwischen den RAM-Speicherbanken des PIC.
Beispiel: MOVLB  0x00    ; Das BSR-Register wird  mit 0 beschrieben. Die RAM-Bank 0 ist nun im Zugriff.
Flags: -


MOVLP schreibe eine Zahl in das Register PCLATCH
Syntax: MOVLP  k
Bedeutung: Die Zahl k wird in das Register PCLATCH geschrieben.
Die Zahl k darf nur Werte von 0 bis 127 annehmen.
Der Befehl eigent sich zum Umschalten zwischen den FLASH-Programmspeicher-Banken des PIC.
Beispiel: MOVLP  0x00    ;
Flags: -


BRA relativer Sprung
Syntax: BRA  k
Bedeutung: Ausgehend von der diesem Befehl folgenden Programmspeicheradresse kann um 255 Befehle vorwärts oder um 256 Befehle rückwärts im Code gesprungen werden.
K ist eine vorzeichenbehaftete 9-Bit-Zahl. Die Sprungweite k kann also Werte von -256 bis +255 annehmen. Die Sprungzieladresse ist PC+1+k.

In der Praxis erledigt der Assembler oder Compiler die genaue Berechnung von k.
Beispiel: BRA  Zielmarke  ; Sprung zur Adresse Zielmarke
Flags: -


BRW relativer Sprung mit W
Syntax: BRW
Bedeutung: Ausgehend von der diesem Befehl folgenden Programmspeicheradresse kann um bis zu 255 Befehle vorwärts im Code gesprungen werden.
Die Sprungweite im Register w kann Werte von 0 bis 255 annehmen. Die Sprungzieladresse ist PC+1+W.

Der Befehl eignet sich für Sprünge zu berechneten Zieladrssen, z.B. in RETLW-Tabellen.

Beispiel: MOVLW  0x05
BRW            ; Sprung um 6 Befehle nach vorn

Flags: -


RESET löst einen Hardware-Reset aus
Syntax: RESET
Bedeutung: Es wird ein Reset des Prozessors ausgelöst.
Das nRI-flag im PCON-Register wird gelöscht.
Beispiel: RESET          ; und noch mal alles von vorne
Flags: -




Diese PICs verfügen über zwei 16-Bit-große File-Select-Register (FSR0 und FSR1) zur indirekten Adressierung. Mit ihnen lassen sich sowohl RAM-Zellen wie auch Flash-ROM-Zellen adressieren, die dann durch die Pseudoregister INDF gelesen (und beim RAM auch beschrieben) werden können. Aus dem Flash-Programmspeicher lassen sich jeweils nur die unteren 8 Bit einer 14-Bit-Speicherzellen auslesen (INDF ist nur 8-Bit groß).

Zur effektiven Nutzung dieser indirekten Adressierungstechnik dienen die nachfolgenden Befehle.

ADDFSR Addiere eine Zahl zu einer indirekt adressierten Speicherzelle
Syntax: ADDFSR  n,k
Bedeutung: Zum Inhalt des indirekt adressierten Registers INDF0 oder INDF1 wird der Wert der vorzeichenbehaftete 6-Bit-Zahlenwert k addiert.
Die Zahl k liegt im Bereich von -32 bis +31.

wenn n=0:
Es wird die Zelle INDF0 verwendet, die durch FSR0 adressiert ist.

wenn n=1 
Es wird die Zelle INDF1 verwendet, die durch FSR1 adressiert ist.

Beispiel: MOVLW  0x00    ; untere Bits der Adresse 0x0020
MOVWF  FSR1H

MOVLW  0x20    ;
untere 8 Bits der Adresse 0x0020
MOVWF  FSR1L
ADDFSR 1,5     ; Zum Wert der Zelle 0x0020 wird 5 hinzuaddiert.

Flags: -


MOVIW lade den Inhalt einer indirekt adressierte Speicherzelle nach W
1. Syntax: MOVIW  n  mm
1. Bedeutung:

wenn n=0:  Es wird die durch FSR0 adressierte Speicherzelle verwendet (INDF0).
wenn n=1:  Es wird die durch FSR1 adressierte Speicherzelle verwendet (INDF1).

Der Inhalt der durch FSR0 oder FSR1 adressierten Speicherzelle wird in W geladen. FSR0/FSR1 wird vor bzw. nach dem Laden decrementiert bzw incrementiert.

dementsprechend gibt es für jedes FSR je vier unterschiedliche MOVIW-Befehle:

MOVIW   --FSRx    ; decrementiere FSRx vor dem Datentransfer

MOVIW   ++FSRx    ; incrementiere FSRx vor dem Datentransfer

MOVIW   FSRx--    ; decrementiere FSRx nach dem Datentransfer

MOVIW   FSRx++    ; incrementiere FSRx nach dem Datentransfer

2. Syntax: MOVIW  k[n]
2. Bedeutung: wenn n=0:  Es wird die durch FSR0 adressierte Speicherzelle verwendet (INDF0).
wenn n=1:  Es wird die durch FSR1 adressierte Speicherzelle verwendet (INDF1).

Der Inhalt der durch FSR0+k oder FSR1+k adressierten Speicherzelle wird in W geladen. FSRx wird dabei nicht verändert.
K kann jeden Wert im Bereich von -32 bis +31 annehmen.

Für k=0 kann die vereinfachte Schreibweise
MOVIW   FSRx
verwendet werden.
Beispiel: MOVLW  0x00    ; untere Bits der Adresse 0x0020
MOVWF  FSR1H

MOVLW  0x20    ;
untere 8 Bits der Adresse 0x0020
MOVWF  FSR1L
MOVIW  FSR1++  ; Der Wert der Zelle 0x20 wird nach W geladen
MOVIW  FSR1    ; Der Wert der Zelle 0x21 wird nach W geladen
MOVIW  1[FSR1] ; Der Wert der Zelle 0x22 wird nach W geladen
Flags: Z


MOVWI lade den Inhalt von W in eine indirekt adressierte Speicherzelle
1. Syntax: MOVWI  n  mm
1. Bedeutung:

wenn n=0:  Es wird die durch FSR0 adressierte Speicherzelle verwendet (INDF0).
wenn n=1:  Es wird die durch FSR1 adressierte Speicherzelle verwendet (INDF1).

Der Inhalt von W wird in die durch FSR0 oder FSR1 adressierte Speicherzelle geladen. FSR0/FSR1 wird vor bzw. nach dem Laden decrementiert bzw incrementiert.

dementsprechend gibt es für jedes FSR je vier unterschiedliche MOVWI-Befehle:

MOVWI   --FSRx    ; decrementiere FSRx vor dem Datentransfer

MOVWI   ++FSRx    ; incrementiere FSRx vor dem Datentransfer

MOVWI   FSRx--    ; decrementiere FSRx nach dem Datentransfer

MOVWI   FSRx++    ; incrementiere FSRx nach dem Datentransfer

2. Syntax: MOVWI  k[n]
2. Bedeutung: wenn n=0:  Es wird die durch FSR0 adressierte Speicherzelle verwendet (INDF0).
wenn n=1:  Es wird die durch FSR1 adressierte Speicherzelle verwendet (INDF1).

Der Inhalt von W wird in die durch FSR0+k oder FSR1+k adressierte Speicherzelle geladen. FSRx wird dabei nicht verändert.
K kann jeden Wert im Bereich von -32 bis +31 annehmen.

Für k=0 kann die vereinfachte Schreibweise
MOVWI   FSRx
verwendet werden.
Beispiel: MOVLW  0x00    ; untere Bits der Adresse 0x0020
MOVWF  FSR1H

MOVLW  0x20    ;
untere 8 Bits der Adresse 0x0020
MOVWF  FSR1L
MOVWI  FSR1++  ; Der Wert aus W wird in die Zelle 0x20 geladen
MOVWI  FSR1    ; Der Wert aus W wird in die Zelle 0x21 geladen
MOVWI  1[FSR1] ; Der Wert aus W wird in die Zelle 0x22 geladen
Flags: -


nach oben

zurück zu PIC-Prozessoren , Elektronik , Homepage

erstellt am: 12.04.2011
letzte Änderung: 26.04.2011