Compiler fuer PIC 16C84

background image

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

background image

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.

background image

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”.

background image

; 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

background image

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’

background image

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

background image

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.


Wyszukiwarka

Podobne podstrony:
Mini Programmer fuer PIC16F84 16C84
Betriebssystem fuer PIC PICXEX fuer PIC16C7x
Noch ein PIC Compiler
Dzień Pięćdziesiątnicy (gr tłumaczenie pl )
M Dąbrowska Kobieta piękną jest
pic kka
pic ia
Nr 60 NIEBIESKA – PIĘKNA
PIC Programmer All Flash USB Ki Nieznany
Jak pić dla sportu
Drahtloser MD Programmer Titelanzeige fuer MiniDiscs
Electronica Pic Lcd Usb(1)
PIC Alarm
PC gesteuerter 32 Kanal Dimmer Luxus Regler fuer ohmsche und induktive Lasten
Dlaczego dzieci powinny pić tran
pic prog
Jak pić kawę , kuchnia, ciekawostki
PiÄ™kno contra piÄ™kno, Językoznawstwo

więcej podobnych podstron