Bei der Programmierung von Mikrocon-
trollern bieten Compiler viele Vorteile.
Die Programmelemente sind an die nor-
male (englische) Sprache angelehnt
und deshalb viel sinnfälliger als die
Akronyme des Assemblers. Wo mit dem
Assembler mühsame Kleinarbeit gelei-
stet werden muss, genügt beim Compi-
ler oft ein einziger Befehl. Die Zeit, die
das Schreiben, Testen und Debuggen
des Assembler-Programms kostet, wird
mit dem Compiler wesentlich verkürzt.
Den Beweis tritt der hier vorgestellte PIC-
Compiler selbst an, denn auch er wurde
mit Hilfe eines Compilers geschrieben.
Basis des PIC-Compilers ist keine
bestimmte höhere Program-
miersprache, man findet jedoch Ele-
mente aus den Sprachen Pascal und
Visual Basic wieder. Die Compiler-Struk-
tur ist flexibel, sie erlaubt die Verwen-
dung mehrerer Syntax-Varianten. Da
der Compiler unter Windows 95/98
läuft, lässt er sich leicht installieren und
bedienen. Die PIC-Befehle werden
innerhalb des Compilers definiert,
externe Setup-Routinen oder Header-
Dateien werden nicht benötigt.
Der Compiler erzeugt den Assembler-
Code unmittelbar aus dem Quelltext,
so dass der Programmierer nicht in die
(Un-)Tiefen der Assembler-Programmie-
rung einsteigen muss. Es kann jedoch
sehr lehrreich sein, den generierten
Assembler-Code mit dem Quelltext zu
vergleichen. Ein solcher Vergleich zeigt,
wie elegant der Compiler die in Hoch-
sprache geschriebenen Kommandos in
den PIC-Assembler übersetzt.
Die vom Compiler erzeugten Output-
Dateien enthalten außer dem PIC-
Assembler-Code auch den Original-
Quelltext einschließlich eventueller
Kommentare. Der Assembler-Code hat
ein Format, das ihn für die Simulation
und Assemblierung mit der ”MPLAP-Soft-
ware” von Microchip, Version 4.12 oder
höher, geeignet macht. Da der Assem-
bler-Code zusammen mit dem
zugehörigen Quelltext im Output-Listing
erscheint, wird die Fehlersuche um ein
gutes Stück erleichtert. Änderungen
und Ergänzungen im kompilierten Teil
werden natürlich von der MPLAB-Soft-
ware berücksichtigt. Microchip stellt die
MPLAB-Software kostenlos zur Verfü-
gung, sie kann von der Microchip-Inter-
net-Site http://www.microchip.com her-
untergeladen werden. Die zur Zeit aktu-
elle Version 4.12.12 hat als ZIP-Datei
einen Umfang von ca. 9 MB.
Ein Assembler-Programm, das in einer
X-10 - 1/2000 Elektor
EXTRA
——————————————————— PC-P
LUS
Programme für Controller der PIC-Familie wer-
den normalerweise in Assembler geschrieben,
was manchmal nicht ganz einfach ist. Beque-
mer geht es mit einem Compiler, der das
Programm aus einer Hochsprache in Assembler-
Mnemonics übersetzt. Die als Freeware erhältli-
che MPLAB-Software von Microchip kann daraus
den PIC-Objekt-Code erzeugen.
Von Roger Thomas
Compiler für PIC 16C84
mit Code-Optimierung
Wichtige Compiler-Eigenschaften
➧ Hochsprachen-Compiler für PIC 16C84
➧ Ausführliches Handbuch (56 S.) auf Diskette
➧ Drei kommentierte Programmbeispiele auf Diskette
➧ Syntax ähnlich Visual BASIC und Pascal
➧ Windows 95/98 kompatibel, keine DLLs
➧ Generierter Assembler-Code geeignet für Microchip MPLAB-Software (Freeware)
➧ Variablen-Typen:
Boolean, Byte und Word
➧ Arithm. Operationen:
+, -, /, *, mod
➧ Numerische Formate:
Dezimal, Hexadezimal, Binär, Character
➧ Bool’sche Funktionen:
=, >, <, >=, <=, <>
➧ Bool’sche Operatoren:
AND, OR, XOR
➧ Compiler-Kommandos:
if...then...else, select/case, while...loop, table, read,
write/read, EEPROM, procedure, directive, ASM directive,
input, output, alias, pin-name, RTTC, prescaler, wait, picfuse
➧ Equation Handler
➧ Code-Optimierung
➧ Error-Meldungen
➧ Interrupt Handling
Hochsprache geschrieben und von
einem Compiler übersetzt wurde, wird
in der Regel etwas langsamer ausge-
führt als ein unmittelbar in Assembler
geschriebenes Programm. Ursache ist
die normalerweise geringere Effizienz
des vom Compiler erzeugten Assem-
bler-Codes. Dieser Effekt ist bei dem
hier beschriebenen PIC-Compiler
praktisch nicht mehr feststellbar. In fast
allen Fällen wird der schnellste Code
erzeugt, der überhaupt möglich ist.
Nur wenn der Compiler Hilfsvariablen
einführen muss oder ein Hochspra-
chen-Befehl ungewöhnlich komplex
ist, kann der vom Compiler erzeugte
Assembler-Code geringfügig länger
sein. Der einzige zusätzlich benötigte
Programm-Code ist der Support für die
Bool’schen und arithmetischen
Befehle. Die Arithmetik arbeitet, wenn
man das Vorzeichen unberücksichtigt
lässt, wahlweise mit 8 bit oder 16 bit
Genauigkeit. Der Compiler belegt
mehrere Byte zur Zwischenspeicherung
arithmetischer Ergebnisse; diese Byte
sind in der Output-Datei mit ”_STACKxx”
gekennzeichnet.
Die Compilierung läuft in zwei Durch-
gängen ab. Beim ersten Durchgang
wird eine Liste der Prozedur-Deklara-
tionen erstellt, beim zweiten Durch-
gang werden die Prozedur-Aufrufe den
Deklarationen zugeordnet. Die Compi-
ler-Syntax unterscheidet nicht zwischen
kleinen und großen Buchstaben, bei
der MPLAB-Software kann die Unter-
scheidung als Option in der Projekt-
Hex-Datei aktiviert werden. In der Com-
piler-Output-Datei erscheinen alle Pro-
zedur- und Variablen-Namen in
Großbuchstaben.
Da der Compiler keine Begrenzung der
Programmlänge kennt, ist er auch für
verwandte PIC-Mikrocontroller geeig-
net. Die weitere Analyse der Pro-
grammstruktur übernimmt der MPLAP-
Assembler; er stellt die Programmlänge
fest und erzeugt auf Wunsch Speicher-
Belegungstabellen und Cross-Refe-
rence-Dateien.
Quellprogramm
Zum Schreiben des Quellprogramms
genügt ein einfacher Texteditor, zum
Beispiel Notepad oder WordPad von
Windows 95/98, und natürlich kann
man auch den zur MPLAB-Software
gehörenden Editor benutzen. Der
Quelltext darf keine Formatierungen
oder Steuerzeichen enthalten, Leer-
zeichen sind dagegen in beliebiger
Anzahl erlaubt. Während beim Schrei-
ben eines Assembler-Programms strikte
Regeln für die Anordnung von Labeln,
Mnemonics, Operanden und Kom-
mentaren gelten, können Leerzeichen
in ein Hochsprachen-Programm freizü-
gig eingestreut werden. Die Leer-
zeichen dienen ausschließlich der
besseren Programm-Lesbarkeit; sie
werden vom Compiler ignoriert und
haben keinen Einfluss auf die Ausführ-
geschwindigkeit des compilierten und
assemblierten Programms.
Die Textdatei muss unter einem Datei-
namen mit der Endung ”.PSF” gespei-
chert werden, was auf ihre Eigenschaft
als ”PIC Source File” hindeutet.
Benutzer-Oberfläche
Durch die Windows-95/98-Oberfläche
ist Handhabung des PIC-Compilers
denkbar einfach. Die wichtigsten
Bedienelemente sind die Buttons
(Schaltflächen), die in der Symbolleiste
(Bild 1) zusammengefasst sind. Dort ste-
hen folgende Funktionen zur Wahl:
Load
Nach Anklicken des Load-Button
erscheint ein Dialogfeld, in dem alle
PC-P
LUS
——————————————————
Elektor
EXTRA
X-11 - 1/2000
Bild 1. Der Compiler auf dem Bildschirm. Die Pin-Belegung des PIC lässt sich mit einem
Mausklick sichtbar machen.
Bild 2. Hier wird ein LCD-Steuerprogramm bearbeitet. Die Prozedur-Namen erscheinen
rechts oben in einem Fenster.
Source-Dateien (Dateinamen-Endung
”.PSF”) aufgelistet sind. Die zu bearbei-
tende Datei kann hier ausgewählt und
durch Mausklick geladen werden. Der
Compiler öffnet stets das Verzeichnis,
das zuletzt benutzt wurde. Beim ersten
Compiler-Start erscheint das Verzeich-
nis, in dem der Compiler installiert ist.
Save
Wenn eine Compilierung erfolgreich
verlief, wird das Ergebnis in Form einer
Output-Datei nach Anklicken des Save-
Button gespeichert. Bis auf die Endung
entspricht der Dateiname dem Namen
der Source-Datei; als Endung fügt der
Compiler automatisch ”.ASM” hinzu. Die
Output-Datei wird in dem Verzeichnis
gespeichert, aus dem die Source-Datei
geladen wurde. In der Output-Datei
sind alle Assembler-Instruktionen und
-Routinen enthalten, die zur Unterstüt-
zung bestimmter Funktionen zusätzlich
benötigt werden.
Error
Das Anklicken des Error-Button hat das
Speichern einer Error-Liste in Form einer
Textdatei zur Folge. Die Datei wird im
gleichen Verzeichnis abgelegt, aus
dem die Source-Datei geladen wurde.
Der Dateiname ist bis auf die Endung
identisch; sie lautet hier ”.SER”, was für
”Source Error” steht. Die Error-Datei ent-
hält alle Fehlermeldungen einschließ-
lich der Zeilennummern, jedoch keinen
Source-Text oder Assembler-Code.
Font
Die Schriftart und -größe, in der Texte
vom Compiler auf dem Bildschirm dar-
gestellt werden, lässt sich nach
Anklicken des Font-Button ändern. Es
erscheint eine Auswahlliste, in der man
das Gewünschte anklicken kann.
Pins
Auf dem Bildschirm werden die Pin-
Bezeichnungen des PIC-Controllers
sowie farbig unterlegt die Input- und
Output-Port-Pins dargestellt.
Display
Fehlermeldungen werden vom Compi-
ler immer in die Compiler-Output-Datei
eingefügt. Außerdem stoppt der Com-
piler an der Fehlerstelle und gibt eine
Meldung auf dem Bildschirm aus. Die
Bildschirm-Fehlermeldungen während
des zweiten Compiler-Durchgangs las-
sen sich mit dem Display-Botton
abschalten.
Source
Die Programmzeilen des Quelltextes
(Source-Datei) werden in die Output-
Assembler-Datei als Kommentare ein-
gefügt. Falls die Übernahme in die Out-
put-Datei nicht erwünscht ist, kann man
sie mit Hilfe des Source-Button unter-
drücken. Zeilen im Quelltext, die aus-
schließlich Kommentare enthalten, wer-
den immer übernommen.
Abort
Durch Anklicken dieses Button wird die
Compilierung abgebrochen.
Auf dem Bildschirm sind neben den
acht Button die im Programm benutzten
Prozedur-Namen aufgelistet. Um eine
bestimmte Prozedur zu finden und
deren Text sichtbar zu machen, braucht
nur der Name mit der linken Maustaste
angeklickt zu werden. Der Prozedur-
Name wird daraufhin hervorgehoben
dargestellt, und der Programmtext
scrollt über den Bildschirm, bis die Pro-
zedur sichtbar ist (Bild 2).
Die Hauptprozedur eines PIC-Pro-
gramms hat stets den Namen ”main”;
nach einem Reset startet das Pro-
gramm immer mit dieser Prozedur.
Danach durchläuft der PIC normaler-
weise kontinuierlich eine Warteschleife,
bis ein vom Programm zu verarbeiten-
des Ereignis eintrifft. Controller-Pro-
gramme, die nach dem Start nur ein-
mal linear durchlaufen werden und
dann anhalten, sind äußerst selten.
Code-Optimierung
Nach erfolgreicher Compilierung eines
Quelltext-Segmentes wird die im Com-
piler integrierte Code-Optimierung
aktiv. Sie sucht das erzeugte Compiler-
Output nach redundanten Assembler-
Instruktionen ab, zum Beispiel nach
überflüssigen SET- und READ-Befehlen,
die sich auf die PIC-Status-Flags bezie-
hen.
Ein Programm-Ausschnitt aus einer Ver-
kehrsampel-Steuerung soll dies ver-
deutlichen:
; Quelltext
green = 0 ; schalte Grün aus
yellow = 0 ; schalte Gelb aus
red = 1 ; schalte Rot ein
; nicht optimierter Code
; green = 0 ; schalte Grün aus
MOVLW H’00’
BTFSS _STATUS,_Z
BSF PORTB,GREEN
BTFSC _STATUS,_Z
BCF PORTB,GREEN
; yellow = 0 ; schalte Gelb aus
MOVLW H’00’
BTFSS _STATUS,_Z
BSF PORTB,YELLOW
BTFSC _STATUS,_Z
BCF PORTB,YELLOW
; red = 1 ; schalte Rot ein
MOVLW H’01’
BTFSS _STATUS,_Z
BSF PORTB,RED
BTFSC _STATUS,_Z
BCF PORTB,RED
In der nicht optimierten Version berech-
net der Compiler die Gleichungen und
setzt die Bits entsprechend den Ergeb-
nissen auf Null oder Eins. Die Code-
Optimierung analysiert den Code und
stellt fest, dass die Ergebnisse Konstan-
ten sind und stets den gleichen Wert
haben. Die Zeilen, die zur Berechnung
von Zwischenergebnissen dienen, wer-
den entfernt:
X-12 - 1/2000 Elektor
EXTRA
——————————————————— PC-P
LUS
PIC16C84
OSC2
IC1
OSC1
MCLR
RA4
RA0
RA1
RA2
RA3
RB0
RB1
RB2
RB3
RB4
RB5
RB6
RB7
18
17
13
12
11
10
16
15
14
1
3
9
8
7
6
2
4
5
X1
4MHz
C1
33p
C2
33p
R2
680
Ω
R1
680
Ω
R3
680
Ω
D1
D2
D3
5V
000012 - 13
grün
gelb
rot
Bild 3. Externe Hardware für das Demo-Programm ”Verkehrsampel-Steuerung”.
; optimierter Code
; green = 0 ; schalte Grün aus
BCF PORTB,GREEN
; yellow = 0 ; schalte Gelb aus
BCF PORTB,YELLOW
; red = 1 ; schalte Rot ein
BSF PORTB,RED
PIC-Interrupts
Beim Auftreten eines Interrupt wird der
Befehlszähler mit der Adresse 4 gela-
den. Die dort stehende Routine rettet
den Programmstatus und ruft die Inter-
rupt-Prozedur auf. Am Ende der Inter-
rupt-Prozedur steht ein RETFIE-Befehl
(Return from Interrupt). Im Quellpro-
gramm brauchen die globalen Inter-
rupts nach Abarbeitung einer Interrupt-
Prozedur nicht erneut freigegeben zu
werden, da der RETFIE-Befehl dies
bereits erledigt. Die Routine, die für das
Interrupt-Handling zuständig ist, muss
den Namen ”interrupt” haben.
Die Interrupt-Technik ist dem alternati-
ven Polling, bei dem das Eintreten des
zu behandelnden Ereignisses zyklisch
geprüft wird, stets vorzuziehen. Der
PIC16C84 kennt vier Interrupt-Quellen:
- Interrupt-Signal an Pin RB0,
- Signaländerung an Pin RB4...RB7,
- RTCC-Timer-Überlauf,
- Ende eines EEPROM-Schreibzyklus.
Beim Schreiben in das EEPROM wird der
Interrupt von der Write-EEPROM-Funktion
erzeugt.
Zum Freischalten (Enable) von Interrupts
wird das Kommando irq_enable = true
benutzt; bevor dieses Kommando aus-
geführt wird, muss die Interrupt-Quelle
bestimmt worden sein. Das gegen-
teilige Kommando, das die Behand-
lung von Interrupts sperrt, lautet
irq_enable = false. Dieses Kommando
hat globalen Charakter, da es die Glo-
bal Interrupt Enable-Flag (GIE) zurück-
setzt. Die Interrupt-Prozedur benötigt
einige Byte zur Zwischenspeicherung;
Variablen werden innerhalb der Inter-
rupt-Routine getrennt vom übrigen Pro-
gramm gespeichert.
Da Interrupts zu jeder beliebigen Zeit
auftreten können, kann dies auch
während der Abarbeitung einer 16-bit-
Arithmetik-Prozedur geschehen. Eine
solche Prozedur besteht aus einer Folge
von Instruktionen, denn die niederwer-
tigen und höherwertigen Byte der Ope-
randen müssen einzeln behandelt wer-
den. Wenn ein Interrupt eine solche
Prozedur unterbricht, kann der Fall ein-
treten, dass als Ergebnis eine Kombina-
tion aus dem alten Wert des nieder-
wertigen Byte und dem neuen Wert des
höherwertigen Byte entsteht. Um zu ver-
hindern, dass ein derartiges falsches
Ergebnis zustande kommt, erlaubt der
Compiler keine 16-bit-Arithmetik-Proze-
duren innerhalb der Interrupt-Prozedur.
Wenn nur eine einzige Interrupt-Quelle
PC-P
LUS
——————————————————
Elektor
EXTRA
X-13 - 1/2000
; Traffic Lights 1
; Written by Roger Thomas.
#compiler clock = 4000 ; 4MHz clock
#ASM list p=16C84
#FUSE CP_OFF + PWRTE_ON + WDT_OFF + XT_OSC
var x : word ; create 16 bit variable
var y : byte ; create 8 bit variable
procedure(main)
alias(RB3,red) ; rename port RB3 to red
alias(RB2,yellow) ; rename port RB2 to yellow
alias(RB1,green) ; rename port RB1 to green
output(red) ; make ‘red’ port pin output
output(yellow) ; make ‘yellow’ port pin output
output(green) ; make ‘green’ port pin output
clr(red) ; turn off red = 0
clr(yellow) ; turn off yellow = 0
clr(green) ; turn off green = 0
clr(x) ; initialise = 0
clr(y) ; initialise = 0
while true
inc(x) ; x = x + 1
if x = 1500 then
begin
inc(y) ; y = y + 1
clr(x) ; x = 0
end
else
begin
if (y >= 0) AND (y<= 49) then
begin
red = 1 ; turn on red
yellow = 0 ; turn off yellow
green = 0 ; turn off green
end
if (y >= 50) AND (y<= 75) then
begin
red = 1 ; turn on red
yellow = 1 ; turn on yellow
green = 0 ; turn off green
end
if (y >= 76) AND (y<= 110) then
begin
red = 0 ; turn off red
yellow = 0 ; turn off yellow
green = 1 ; turn on green
end
if (y >= 111) AND (y<= 130) then
begin
red = 0 ; turn off red
yellow = 1 ; turn on yellow
green = 0 ; turn off green
end
if y = 131 then
begin
clr(x)
clr(y)
end
end
loop
Listing 1. Verkehrsampel (1), Quellprogramm
X-14 - 1/2000 Elektor
EXTRA
——————————————————— PC-P
LUS
; 16C84
; RA2 1 | i i | 18 RA1
; RA3 2 | i i | 17 RA0
; RA4 3 | i i | 16 osc2
; mclr 4 | i i | 15 osc1
; Vss 5 | p p | 14 Vdd
; RB0 6 | i i | 13 RB7
; GREEN 7 | o i | 12 RB6
; YELLOW 8 | o i | 11 RB5
; RED 9 | o i | 10 RB4
_PCL
EQU H’02’
_STATUS EQU H’03’
_C EQU H’00’
_Z EQU H’02’
_RP0
EQU H’05’
PORTB
EQU H’06’
_PCLATH EQU H’0A’
_INTCON EQU H’0B’
IRQ_ENABLE
EQU H’07’
_STACK0 EQU H’0C’
_STACK1 EQU H’0D’
_STACK2 EQU H’0E’
_STACK3 EQU H’0F’
_STACK4 EQU H’10’
_STACK5 EQU H’11’
_STACK6 EQU H’12’
_STACK7 EQU H’13’
_STACK8 EQU H’14’
_STACK9 EQU H’15’
X
EQU H’16’
XH EQU H’17’
Y
EQU H’18’
RED
EQU H’03’
YELLOW
EQU H’02’
GREEN
EQU H’01’
ORG 0
goto MAIN
; Traffic Lights 1
; Written by Roger Thomas.
list p=16C84
__config H’3FF9’
; var x : word ; create 16 bit variable
; var y : byte ; create 8 bit variable
MAIN
; alias(RB3,red) ; rename port RB3 to red
; alias(RB2,yellow) ; rename port RB2 to yellow
; alias(RB1,green) ; rename port RB1 to green
; output(red) ; make ‘red’ port pin output
BSF
_STATUS,_RP0
BCF
PORTB,RED
; output(yellow) ; make ‘yellow’ port pin out-
put
BCF
PORTB,YELLOW
; output(green) ; make ‘green’ port pin output
BCF
PORTB,GREEN
; clr(red) ; turn off red = 0
BCF
_STATUS,_RP0
BCF
PORTB,RED
; clr(yellow) ; turn off yellow = 0
BCF
PORTB,YELLOW
; clr(green) ; turn off green = 0
BCF
PORTB,GREEN
; clr(x) ; initialise = 0
CLRF X
CLRF XH
; clr(y) ; initialise = 0
CLRF Y
; while true
_WHILE0
; inc(x) ; x = x + 1
INCF X,F
BTFSC
_STATUS,_Z
INCF XH,F
; if x = 1500 then
_IF1
MOVF X,W
MOVWF
_STACK0
MOVF XH,W
MOVWF
_STACK1
MOVLW
H’FF’
MOVWF
_STACK2
MOVLW
H’DC’
SUBWF
_STACK0,F
BTFSS
_STATUS,_Z
CLRF _STACK2
MOVLW
H’05’
SUBWF
_STACK1,F
BTFSS
_STATUS,_Z
CLRF _STACK2
MOVF _STACK2,W
MOVWF
_STACK0
MOVWF
_STACK1
BTFSC
_STATUS,_Z
GOTO _ELSE1
; begin
; inc(y) ; y = y + 1
INCF Y,F
; clr(x) ; x = 0
CLRF X
CLRF XH
; end
; else
GOTO _END1
_ELSE1
; begin
; if (y >= 0) AND (y<= 49) then
_IF2
MOVF Y,W
MOVWF
_STACK0
MOVLW
H’00’
SUBWF
_STACK0,W
CLRW
BTFSC
_STATUS,_C
ADDLW
H’FF’
MOVWF
_STACK4
MOVF Y,W
SUBLW
H’31’
CLRW
BTFSC
_STATUS,_C
ADDLW
H’FF’
ANDWF
_STACK4,W
BTFSC
_STATUS,_Z
GOTO _ELSE2
; begin
; red = 1 ; turn on red
BSF
PORTB,RED
; yellow = 0 ; turn off yellow
BCF
PORTB,YELLOW
; green = 0 ; turn off green
BCF
PORTB,GREEN
; end
; if (y >= 50) AND (y<= 75) then
_ELSE2
_IF3
MOVF Y,W
MOVWF
_STACK0
MOVLW
H’32’
SUBWF
_STACK0,W
CLRW
BTFSC
_STATUS,_C
ADDLW
H’FF’
existiert, brauchen die individuellen
Interrupt-Flags nicht abgefragt zu wer-
den. Grundsätzlich soll die Interrupt-Pro-
zedur so kurz und einfach wie möglich
gehalten werden. Dabei ist zu beach-
ten, dass aus der Interrupt-Prozedur
keine anderen Prozeduren aufgerufen
werden können.
Es wird empfohlen, jede von der Inter-
rupt-Prozedur benutzte Variable zuerst
zu kopieren und anschließend mit der
Kopie zu arbeiten. Die direkte Benut-
zung von Variablen innerhalb der Inter-
rupt-Prozedur kann zu unvorhersehba-
ren Ergebnissen führen. Wenn im fol-
genden Programm die Variable x von
der Interrupt-Prozedur verändert wird,
verhält sich das Programm möglicher-
weise nicht wie erwartet. Der Wert von
x könnte sich nach der ersten und vor
der zweiten Vergleichsoperation so
ändern, dass das Ergebnis falsch ist:
var x : byte
procedure(main)
if x >=6 and x <= 10 then ;
x = 4
begin
statement
end
; Interrupt tritt auf:
if x >=0 and x <=5 then
; jetzt ist x = 6
begin
statement
end
Wenn eine Byte-Variable innerhalb der
Interrupt-Prozedur inkrementiert, dekre-
mentiert oder auf Null gesetzt werden
soll, sind vorzugsweise die Befehle
inc(x), dec(x) und clr(x) zu verwenden,
denn ihnen entspricht eine einzige
Assembler-Instruktion.
Programm-Beispiele
Die auf der Compiler-Diskette mitgelie-
ferte Dokumentation enthält mehrere
Programm-Beispiele, die helfen sollen,
die Compiler-Sprache und den
Umgang mit dem Compiler verständ-
lich zu machen. Da die Beispiele ledig-
lich als Anschauungsmaterial gedacht
sind, stellen sie nicht unbedingt die
PC-P
LUS
——————————————————
Elektor
EXTRA
X-15 - 1/2000
MOVWF
_STACK4
MOVF Y,W
SUBLW
H’4B’
CLRW
BTFSC
_STATUS,_C
ADDLW
H’FF’
ANDWF
_STACK4,W
BTFSC
_STATUS,_Z
GOTO _ELSE3
; begin
; red = 1 ; turn on red
BSF
PORTB,RED
; yellow = 1 ; turn on yellow
BSF
PORTB,YELLOW
; green = 0 ; turn off green
BCF
PORTB,GREEN
; end
; if (y >= 76) AND (y<= 110) then
_ELSE3
_IF4
MOVF Y,W
MOVWF
_STACK0
MOVLW
H’4C’
SUBWF
_STACK0,W
CLRW
BTFSC
_STATUS,_C
ADDLW
H’FF’
MOVWF
_STACK4
MOVF Y,W
SUBLW
H’6E’
CLRW
BTFSC
_STATUS,_C
ADDLW
H’FF’
ANDWF
_STACK4,W
BTFSC
_STATUS,_Z
GOTO _ELSE4
; begin
; red = 0 ; turn off red
BCF
PORTB,RED
; yellow = 0 ; turn off yellow
BCF
PORTB,YELLOW
; green = 1 ; turn on green
BSF
PORTB,GREEN
; end
; if (y >= 111) AND (y<= 130) then
_ELSE4
_IF5
MOVF Y,W
MOVWF
_STACK0
MOVLW
H’6F’
SUBWF
_STACK0,W
CLRW
BTFSC
_STATUS,_C
ADDLW
H’FF’
MOVWF
_STACK4
MOVF Y,W
SUBLW
H’82’
CLRW
BTFSC
_STATUS,_C
ADDLW
H’FF’
ANDWF
_STACK4,W
BTFSC
_STATUS,_Z
GOTO _ELSE5
; begin
; red = 0 ; turn off red
BCF
PORTB,RED
; yellow = 1 ; turn on yellow
BSF
PORTB,YELLOW
; green = 0 ; turn off green
BCF
PORTB,GREEN
; end
; if y = 131 then
_ELSE5
_IF6
MOVF Y,W
SUBLW
H’83’
MOVLW
H’00’
BTFSC
_STATUS,_Z
ADDLW
H’FF’
ANDLW
H’FF’
BTFSC
_STATUS,_Z
GOTO _ELSE6
; begin
; clr(x)
CLRF X
CLRF XH
; clr(y)
CLRF Y
; end
; end
_ELSE6
_END1
; loop
GOTO _WHILE0
END
Listing 2. Verkehrsampel (1), Assembler-Programm
Die Geschichte der Elektronik (11)
Das Jahr 1907 gilt als das Jahr, in dem die Geburtsstunde der Elek-
tronik schlug, denn in diesem Jahr wurde die Verstärkerröhre erfun-
den. Der amerikanische Physiker Lee de Forest hatte sich mit der
Vakuum-Diode von Fleming ausgiebig beschäftigt und war auf die
Idee gekommen, zwischen dem Glühdraht und der Anode eine dritte
Elektrode in Form eines Metallgeflechts anzubringen, mit der mög-
licherweise der Elektronenstrom gesteuert werden könnte. Wenn man
an dieses ”Gitter” eine negative Spannung legt, so überlegte de
Forest, wird der Elektronenstrom in Abhängigkeit von der negativen
Spannung gebremst. Die Versuche im Jahr 1906 bestätigten die Rich-
tigkeit der Überlegungen. De Forest trat mit seiner Erfindung, von
ihm ”Audion” genannt, im März 1907 zum ersten Mal an die Öffent-
lichkeit, und noch im gleichen Jahr wurde ihm ein Patent erteilt. Das
”Audion” war der ”Triodenlampe” des Österreichers von Lieben bei
weitem überlegen. In den folgenden fünf Jahren musste noch eine
Menge Entwicklungssarbeit geleistet werden, doch schon im Jahr
1912 war es geschafft: Die Verstärkerröhre, nun ”Triode” genannt,
war tauglich für den praktischen Einsatz.
Auch in der Telefontechnik blieb die Entwicklung nicht stehen. Das
Ziel war im ersten Jahrzehnt des 20. Jahrhunderts vor allem die
Automatisierung des Verbindungsaufbaus. Die erste automatische
Ortsvermittlungsstelle ging 1909 im Münchener Stadtteil Schwabing
in Betrieb, sie hatte 2500 Anschlüsse. Die Wähltechnik, die von Sie-
mens & Halske stammte, arbeitete mit weiterentwickelten Hebdreh-
wählern sowie mit einer zentralen Stromversorgung anstelle der
”Ortsbatterien” bei den Teilnehmern. Ferner konnte die Vermitt-
lungsstelle die Gespräche zur Gebührenerfassung und zu Kontroll-
zwecken vollautomatisch registrieren.
Eine Entdeckung der Physik, die auch in der modernen Elektronik
eine wichtige Bedeutung hat, ist die Supraleitung. Um das Jahr
1911 untersuchten die niederländischen Physiker Kamerlingh
Onnes und Gilles Holst das Verhalten verschiedener Stoffe bei Tem-
peraturen nahe des absoluten Nullpunkts. Sie entdeckten, dass
Quecksilber seinen elektrischen Widerstand völlig verliert und keine
Joule’schen Verluste mehr auftreten, wenn die Temperatur unter
4,2 K sinkt. Damals hatte
die Wissenschaft für die-
ses Phänomen noch keine
Erklärung. Die For-
schungsarbeiten wurden
nicht weiter fortgesetzt,
da kein praktischer Nut-
zen erkennbar war und
das flüssige Helium, das
man als Kühlmittel
brauchte, enorme Kosten
verursachte.
Die drahtlose Nachrich-
tentechnik war in den
ersten Jahrzehnten von
der rasanten Ausbreitung
der drahtlosen Telegrafie
geprägt. Die Frequenz-
bänder waren inzwischen
stark belegt, zumal die
damals eingesetzten Fun-
kenentladungssender sehr breitbandige gedämpfte Schwingungen
in den Äther schickten. Eine Erleichterung brachte das rotierende
Entladungsrad von Marconi im Jahr 1907. Eine metallene kreis-
förmige Scheibe drehte sich zwischen zwei fest montierten metalle-
nen Scheiben, wobei die rotierende Scheibe senkrecht zu den bei-
den äußeren Scheiben stand. Die rotierende Scheibe war elektrisch
über Kondensatoren und Spulen mit den äußeren Scheiben ver-
bunden. Die Schwingungserzeugung wurde durch kontinuierliche
Hochspannungsüberschläge aufrechterhalten. Im folgenden Jahr
stellte der Däne Valdemar Poulsen, der rund 20 Jahre zuvor das
erste brauchbare magnetische Tonaufnahmegerät konstruiert hatte,
seinen verbesserten Lichtbogensender vor. Bei diesem Sender war
eine feststehende Kohleelektrode gegenüber einem langsam rotie-
renden Kohlezylinder angebracht. Da sich der Kohlezylinder drehte,
fand der Lichtbogen ständig neue Kontaktpunkte, so dass er nicht
mehr einbrennen konnte.
R
ÜCK
-K
OPPLUNG
optimale Lösung des betreffenden Pro-
blems dar. Der hier abgedruckte Aus-
schnitt wurde aus Platzgründen um
einige weniger wichtige Kommentar-
zeilen gekürzt. Im Listing beginnen alle
Variablen-Namen, die der Compiler
erzeugt, mit einem Unterstrich; sie las-
sen sich dadurch von den Variablen-
Namen des Quellprogramms leicht
unterscheiden.
Bei dem Programm-Beispiel, das hier
etwas näher betrachtet werden soll,
geht es um eine Verkehrsampel-Steue-
rung. Der einfachste Weg, eine solche
Steuerung zu realisieren, ist die Ver-
wendung des Wait-Kommandos, nach-
dem die als ”Ampellichter” dienenden
LEDs umgeschaltet sind:
green = 0 ; Grün ausschalten
yellow = 0 ; Gelb ausschalten
red = 1 ; Rot einschalten
wait(3000) ; 3 Sekunden warten
Die Schaltung des Verkehrsampel-
Modells geht aus Bild 3 hervor. Bei der
praktischen Erprobung ist unbedingt zu
beachten, dass die zulässigen PIC-
Ströme nicht überschritten werden. Port
B kann insgesamt maximal 100 mA lie-
fern, die Obergrenze der einzelnen Port-
leitungen beträgt 20 mA. Die Werte der
Strombegrenzungswiderstände hängen
von den LED-Eigenschaften ab, sie müs-
sen zwischen 470
Ω und 1 k liegen.
Die Verkehrsampel läuft so lange in
einer Endlos-Schleife, bis die Betriebs-
spannung abgeschaltet wird. Das
Quellprogramm ist in Listing 1 wieder-
gegeben. Variable x wird bei jedem
Schleifendurchlauf inkrementiert, und
sobald x einen vorgegebenen Wert
erreicht, wird Variable y inkrementiert.
Die verhältnismäßig langen Schaltzeiten
der Ampel lassen sich nur mit einem
zweistufigen Schleifenzähler realisieren.
Zum Quellprogramm-Text ist noch anzu-
merken, dass die Klammern in den
if...then-Anweisungen nicht vom Com-
piler benötigt werden; sie dienen nur zur
besseren Lesbarkeit. Das Ergebnis der
Compilierung geht aus Listing 2 hervor.
Weitere auf der Diskette enthaltene
Demo-Programme sind eine zweite
Variante der Verkehrsampel-Steuerung
sowie die Steuerung eines LC-Displays.
Auch zu diesen Beispielen gehören
ausführliche Kommentare in den Quell-
programmen und natürlich die vom
Compiler erzeugten Assembler-Listings.
Syntax und Kommandos
Die vollständige Beschreibung der
Compiler-Kommandos und der Compi-
ler-Syntax findet man in dem 56-seiti-
gen Manual, das als Word-Dokumen-
ten-Datei auf der Compiler-Diskette mit-
geliefert wird. Außer dem Compiler
selbst (Dateiname: Compiler84.exe)
und den schon erwähnten Programm-
beispielen ist noch eine Readme-Datei
vorhanden, deren Text die Installation
beschreibt.
(000012)gd
X-16 - 1/2000 Elektor
EXTRA
——————————————————— PC-P
LUS
Lee de Forest (1873 bis 1961) erfand
1907 die Verstärkerröhre.