PIC-Assembler Einstieg


zurück zu PIC-Prozessoren , Elektronik , Homepage

Allgemeines
Der Weg zum HEX-File
Ein einfaches Projekt mit MPLAB erstellen
Das Gerüst für ein Assemblerprogramm
Schreibregeln
Welche Befehle gibt es?
Was ist das "w"? Was ist "f"? Was ist "$"?
Wo sind die Flags?

Weiter zu den Assembler-Befehlen

zurück


Allgemeines

Wer schon mal in Assembler programmiert hat, egal für welchen Prozessor, sollte keine größeren Probleme haben PIC-Programme zu schreiben. Kleine Fragen, die immer wieder auftauchen sind im Folgenden behandelt.

Hallo Anfänger.
Der Begriff Assembler wird für zwei unterschiedliche Dinge verwendet:

  1. Assembler ist eine einfache Programmiersprache. In ihr geschriebene Programme sind Assembler-Programme, die als Quellcode bezeichent werden.
  2. Der Assembler ist ein spezielles Programm, das das menschenlesbare Assembler-Programm in ein maschinenlesbares Objekt- bzw. HEX-File umwandelt. Diesen Vorgang bezeichnet man als assemblieren. Bei höheren Programmiersprachen (z.B. C) heißt der selbe Vorgang compilieren, und  wird z.B. vom C-Compiler vorgenommen. Der Assembler ist also sozusagen der Compiler für ein Assembler-Programm. Für PICs heißt der Assembler MPASM, und er gehört zur kostenlosen Entwicklungsumgebung MPLAB.
Man sollte sich also nicht verwirren lassen, wenn im Folgenden das Wort Assembler unterschiedslos für die Programmierspache und für den Codewandler  verwendet wird.

Es gibt unterschiedliche Assembler-Dialekte, Ich verwende den Dialekt von Microchip. Gelegentlich findet man auch Assemblercode im Parallax-Dialekt. Der hat durchaus einige Vorzüge, da er verkürzte übersichtliche Schreibweisen erlaubt, letztendlich dominiert aber die Micrchip-Version.
nach oben

Der Weg zum HEX-File

Normalerweise schreibt man ein Programm nicht im Maschinencode des Prozessors, sondern in einer dem Menschen mehr oder weniger verständlichen Programmiersprache wie Assembler oder C. Der mit einem Text-Editor geschriebene Programmtext wird Quellcode genannt. Um aus diesem Quellcode ein maschinenlesbares Programm zu machen, muss der Quellcode compiliert (oder assembliert) und gelinkt werden (was das bedeutet, wird später beschrieben) . Im Falle eines Assemblerprogramms sind für diesen Prozess der Assembler (MPASM) und der Linker (MPLINK) zuständig. Man füttert Assembler & Linker mit dem Quelltext und erhält ein HEX-File, dass man dann mit einem Programmiergerät in den PIC-Prozessor brennen kann.
Neben dem HEX-File werden noch eine ganze Reihe von Protokolldateien erzeugt. Die interessanteste davon ist die LST-Datei (List). Dabei handelt es sich um den mit Adressen, Maschinencode und Kommentaren angereicherten Assembler-Quellcode. Der kann bei einer Fehlersuche sehr hilfreich sein.

ein einfaches Projekt
Bei kleinen Assembler-Projekten kann man durchaus den gesamten Quellcode in ein *.ASM-File schreiben, es ist aber üblich, einzelne Programmblöcke in Include-Dateien (*.INC) auszugliedern. Der Assembler tut dann so, als wäre das Includefile an einer  bestimmten Stelle  im Quellcode eingefügt. Typische Include-Files sind z.B. die Files, die die prozessorspezifischen Definitionen (z.B. von Registern) enthalten. Solche Files werden mit MPLAB für jeden PIC-Typ mitgeliefert. Sie liegen nach der MPLAB-Installation unter:
...\MPLAB IDE\MPASM Suite\

Man kann aber auch Teile das Assemblertextes in eine Include-Datei auslagern, wenn man diesen ASM-Code wie einen Textbaustein für verschiedene Projekte verwenden will.


 

ein umfangreiches Projekt
Bisher haben wir Assembler und Linker als eine Einheit betrachtet, sie erfüllen aber unterschiedliche Aufgaben.
Der Assembler wandelt den menschenlesbaren Text des Assembler-Codes in einen Objektcode um. Das ist eine Art Maschinencode, der aber noch nicht auf spezifische Adressen im Prozessor bezogen ist. Er enthält also noch keine absoluten Adressen. (relocatable code)

Der Linker legt dann fest, wo dieser Objektcode im Programmspeicher des Prozessors stehen soll, und ersetzt die relativen Adressen des Objectcodes durch absolute Adressen des Prozessors. Erst danach ist der Code im Prozessor lauffähig. (executable code) Der Linker benötigt für seine Arbeit Informationen über den Speicheraufbau des jeweiligen PIC-Typs. Die entnimmt er einem Linker-Skript. Das ist ein File, dass für jeden PIC-Typ von MPLAB mitgeliefert wird (...\MPLAB IDE\MPASM Suite\LKR\).

Der Linker kann aus mehreren Objektcode-Files das endgültige Programm (wie aus Bausteinen) zusammenbauen. Bei größeren Projekten ist das von Vorteil, und man übersetzt nur die ASM-Files neu, in denen man Änderungen vorgenommen hat. Von allen anderen Programmteilen verwendet man die alten Objektcode-Files weiter.

Objecktcode wird nicht nur vom Assembler erzeugt. Auch z.B. C-Compiler erzeugen Objektcode-Files, die der Linker dann in ein HEX-File wandelt. Es ist möglich, Teile eines umfangreichen Projektes in C und andere in Assembler zu schreiben, und die aus den unterschiedlichen Programmiersprachen entstandenen Objektcode-Files vom Linker zusammen in ein HEX-File verarbeiten zu lassen.


 

Bibliotheken
Einige typische Probleme tauchen in vielen Programmen immer wieder auf, z.B. mathematische Berechnungen, die die einfache ALU des PICs nicht beherrscht. Für solche Probleme muss man dann kleine Assember- oder C-Routinen schreiben. Es wäre aber mühselig, das Rad immer wieder neu zu erfinden. Deshalb werden solche hilfreichen Programmschnipsel zu Object-Files assembliert oder compiliert, und diese kleinen Objectfiles in Bibliotheken zusammengefasst.

Wenn man dann später z.B. eine 32-Bit-Division benötigt, dann programmiert man diese nicht neu, sondern verwendet eine fertige Divisionsroutine aus einer Billiothek. Solche Bibliotheken sind Files mit der Endung *.LIB'. Zum Lieferumfang von MPLAB gehörten keine Bibliotheken.

nach oben

Ein einfaches Projekt mit MPLAB erstellen

MPLAB ist die Entwicklungsumgebung für PIC-Prozessoren, die die Firma Microchip kostenlos zum download anbietet. Sie beinhaltet einen Texteditor einen Assembler, einen Linker und Grundeinstellungen für jeden Prozessortyp (als include-Dateien).
Nach dem Start von MPLAB legt man über "Project" - "New..."  zunächst ein neues Projekt an, und legt dabei auch fest, in welchem Directory alle Files dieses Projekts abgelegt werden sollen. MPLAB öffnet nun ein kleines Projekt-File-Fenster, in dem angezeigt wird, welche Files zum Project gehören - anfangs garkeine.

Wir benötigen aber ein ASM-File, in dem das Assembler-Programm als Text geschrieben wird. Desshalb erstellt man mit "File" - "New" und "File" - "Save as" eine Assemblerdatei mit der Extension ".ASM". Im kleinen Projekt-File-Fenster klickt man nun mit der rechten Maustaste auf 'Source Files', wählt 'Add Files..' und kann nun das erstellte ASM-File in das Projekt aufnehmen. Wer bereits ein ASM-File mit einem fertigen Programm hat, kann sich das erstellen eines ASM-Files natürlich sparen. Man kopiert es in den Projekt-Ordner und fügt es (wie gerade beschrieben) zum Projekt hinzu.

Auch wenn im Assembler-File eigentlich der verwendete PIC-Typ schon festgelegt ist, muss man MPLAB noch einmal extra sagen, welchen PIC-Typ man benutzen will. Die Einstellung dafür findet man in MPLAB unter "Configure" - "Selct Device".

Ist das Assemblerprogramm im ASM-File fertig geschrieben, kann man es vom im MPLAB enthaltenen Assembler/Linker in ein HEX-File wandeln lassen. Der Menüpunkt "Projekt" - "Make" oder "Build All" startet den Assembler und wenn im Programm keine Syntaxfehler enthalten sind, schreibt MPLAB eine ".HEX"-Datei in der das fertige Programm enthalten ist.

Es ist durchaus normal, dass der Assembler Warnungen der folgenden Form ausgibt. :
Message[302] ............................. : Register in operand not in bank 0.  Ensure that bank bits are correct.
Das ist keine Fehlermeldung, und behindert die Erstellung des HEX-Files nicht.

nach oben

Das Gerüst für ein Assemblerprogramm

Jedes Assemblerprogramm hat ein Gerüst, in dem Beispiel:
 

    list p=16f84                ;der Prozessortyp wird festgelegt
    include "p16f84.inc"        ;die include-Datei mit vielen Festlegungen wird geladen
                                ;z.B. sind hier Standardnamen für wichtige
                                ;Register und Bits festgelegt

    org    0x00                 ;die Startadresse nach Reset ist 0, hier startet der PIC
    goto   main                 ;Sprung zum Hauptprogramm

    org    0x04                 ;Interruptvector ist 0x04,
                                ;bei Interrupt springt der PIC hierher
;hier muss die Interruptbehandlungsroutine stehen,
;falls Interrupts genutzt werden sollen

main
;hier steht das eigentliche Hauptprogramm

    end                         ;das Ende des Programms
 

Microchip liefert in MPLAB für jeden PIC-Typ ein umfangreiches, massgeschneidertes Programmgerüst mit. Diese ASM-Files befinden sich nach der Installation von MPLAB im Verzeichnis
...\MPLAB IDE\MPASM Suite\Template\Code\
Man kann diese Vorlagen in sein eigenes Projektverzeichnis kopieren, und als Grundlage eines eigenen ASM-Programms benutzen.

Will man aus dem ASM-File ein Object-File erstellen lassen, so benutzt man die Vorlagen in
...\MPLAB IDE\MPASM Suite\Template\Object\
 

nach oben

Schreibregeln

Nur Marken und Kommentare sollten auf der ersten Position einer Zeile beginnen. Vor einem Assemblerbefehl sollte dagegen ein Tabulator stehen.
Bei Namen von Variablen und Marken unterscheidet MPLAB zwischen Groß- und Kleinbuchstaben. Also sorgfältig schreiben.

Schreibweisen der verschiedenen Zahlensysteme:
Zahlensystem Schreibweise
hexadezimal 0x20  oder  20
dezimal D'128'  oder  .128
binär B'10101010'

Eine nicht besonders gekennzeichnete Zahl wird normalerweise als hexadezimale Zahl verstanden, dass kann aber mit der list r= -Direktive umgestellt werden.

Ein Semikolon leitet einen Kommentar ein, mit dem man sinnvolle Erläuterungen in den ASM-Quelltext einfügen kann. Der Assembler ignoriert alles von einem Semikolon bis zum Ende der Zeile.
Bei mehrzeiligen Kommentaren muss an jedem Zeilenanfang wieder ein Semikolon stehen.

nach oben

Welche Befehle gibt es?

Ein typischer 14-Bit-PIC kennt weniger als 40 unterschiedliche Befehle. Eine Liste aller Befehle findet man hier auf meiner Homepage oder in der PIC-Beschreibung, die man auf der Microchip-Homepage dowloaden kann.
nach oben

Was ist das "w"? Was ist "f"? Was ist "$"?

Das Arbeitsregister, das oft auch Akku genannt wird heißt im PIC aus unerklärlichen Gründen "w" und nicht etwa "A". (Man gab mir den Tip, das "w" könne von "working register" - also Arbeitsregister abgeleitet worden sein.)
    clrw             ; lösche den Akku
 

Dagegen steht "f" im Befehl für alle anderen Register. Natürlich muss der Name oder die Adresse des Registers dann noch genau angegeben werden.
    incf    0x20     ; incrementiere den Inhalt des
                     ;   Registers mit der hexadezimalen Adresse 0x20
    clrf    STATUS   ; lösche das STATUS-Register
 

Gelegentlich findet man das $-Zeichen innerhalb von Adress-Berechnungen. Dabei steht $ für den momentanen Stand des Programmcounters (PC). Der PC weist zu diesem Zeitpunkt auf den aktuellen Befehl. $ kann somit zur Berechnung von Sprungziehlen benutzt werden, ist aber viel unflexibler als die Verwendung von Marken.
    goto    $+2      ; überspringe ein Wort im Programmspeicher
    clrw             ; irgendein 1-Wort-Befehl der übersprungen wird
    incw             ; irgendein Befehl zu dem gesprungen wird
das gleiche lässt sich sauberer wie folgt programmieren:
    goto    ziel     ; überspringe ein Wort im Programmspeicher
    clrw             ; irgendein 1-Wort-Befehl der übersprungen wird
ziel
    incw             ; irgendein Befehl zu dem gesprungen wird
 

nach oben

Wo sind die Flags?

Auch ein PIC kennt die üblichen Flags wie z.B. C (Carry) und Z (Zero) die eine Überlauf oder ein Nullergebnis der vorangegangenen Operation kennzeichnen. Sie sind aber als einzelne Bits des Registers STATUS versteckt.
Falls also bei gesetztem Zero-Flag ein Sprung zur Marke "Nirwana" ausgeführt werden soll, muss das Entsprechende Bit des Registers STATUS getestet werden:

    btfsc    STATUS,Z  ; teste das Bit Z (Zero) im Register STATUS (bt - bit test),
                       ; wenn es nicht gesetzt ist ignoriere den nächsten Befehl
                       ; (sc - skip if clear)
    goto     Nirwana   ; ansonsten springe nach Nirwana

nach oben

Weiter zu den Assembler-Befehlen


zurück zu PIC-Prozessoren , Elektronik , Homepage

Autor: sprut
letzte Änderung: 30.03.2010