Betriebssystem fuer PIC PICXEX fuer PIC16C7x

background image

69

Elektor

5/98

schnell genug sein für Echtzeitergeb-
nisse. Bei vielen Mikrocontrollerappli-
kationen wird erheblicher Program-
mieraufwand für diese Koordination
getrieben. Manchmal sind beide Funk-
tionen so stark miteinander verwoben,
daß eine effiziente Fehlersuche fast
unmöglich erscheint..
PICXEX ist ein Versuch, dieses Problem
zu lösen. Ungeachtet seiner Einfachheit
und geringen Größe hat sich PICXEX
als Schlüsselwerkzeug für diese realen
Mikrocontrollerapplikationen erwiesen.
PICXEX wurde auf einem PIC16C73
von Microchip mit Assembler MPASM
und Simulator MPSIM implementiert.
Der Kode braucht über 140 Speicher-
plätze, vier Register und verbraucht
einen Stack-Level. PICXEX ist in sich
sehr einfach aufgebaut und kann auch
auf andere Mikrocontroller angewandt
werden. Eine auf Assembler basie-
rende Applikation für einen PIC16C73
dürfte ohne viel Federlesens auch von
PICXEX verarbeitet werden.

P I C X E X

U N T E R D E R

H

A U B E

PICXEX stellt 16 Routinen, sogenannte
CALL-Befehle zur Verfügung, die
jeweils mit einem bit (flag) verbunden
sind. Wenn ein Flag gesetzt ist, wird
der entsprechende CALL-Befehl aus-
geführt, ansonsten übersprungen. Dies
erlaubt einen Mechanismus zur selek-

tiven Ausführung von 16 Subroutinen
(Tasks) vor.
Die Flags von acht der Tasks mit der
Bezeichnung Event-Tasks werden von
allen Kodes gesetzt beziehungsweise
zurückgesetzt. So kann man nach
Bedarf Ereignis-Tasks aktivieren und
deaktivieren, wenn dies notwendig ist.
Die Flags, die mit den anderen acht
Tasks, den Time-Tasks verbunden sind,
werden von einem Zeitplaner (Sche-
duler) zu ausgesuchten Zeitintervallen
gesetzt.
PICXEX besteht aus zwei Teilen, der
Task-Executive und dem Time-Task-
Scheduler.

Task-Executive
Bild 1
zeigt ein Flußdiagramm der Task-
Executive. In der ersten Sektion werden
alle Time-Tasks mit gesetzten Flags aus-
geführt. Wenn der Scheduler alle 20 ms
das Flag für ein bestimmtes Time-Task
setzt, wird der Task-Executive das Task
auch etwa alle 20 ms auszuführen.
Event-Tasks werden auf ähnliche Weise
ausgeführt. Deren Flags können von
jedem Teil des Applikationsprogramms
aus (andere Tasks, Interrupt-Service-
Routinen und so weiter) mit den
Makros XEX_ON_EVENT und
XEX_OFF_EVENT beeinflußt werden.

Time-Task-Scheduler
Der Scheduler in Form einer Subrou-
tine muß zu festen Intervallen von

Heutzutage müssen

die meisten Elektro-

nik-Enthusiasten

erkennen, daß soft-

warebasierte Steuer-

schaltungen gewisse

Vorteile gegenüber

den festverdrahteten

Gegenstücken bieten,

aber ...

Von L. Legrange

Betriebssystem

für PIC

PICXEX für PIC16C7x

GOTO CURRENT
ENTRY POINT

SERVICE
WATCHDOG

ENTRY POINT = 0

TIME
EXIT

XEX01

XEX00

EXECUTE ALL
ACTIVE TIME
TASKS

EXECUTE ALL
ACTIVE EVENT
TASKS

980034 - 11

1

Bild 1. Task-
ausführung

für mich war es die große Frage, wie ich
vom ersten Softwarestückchen, das
eine LED zum Blinken brachte, zu
einer echten Applikation gelangen
sollte, wie ich sie schon immer in einem
Mikrocontroller implementieren wollte.
Zwar habe ich nach einer Menge Pro-
grammierarbeit, Fehlersuche und (wie-
derholtem) Brennen von Chips das
System zwar dazu gebracht, mehr oder
weniger das zu tun, was ich wollte,
aber mittlerweile haben sich Zweifel an
den Vorteilen softwarebasierender
Systeme eingeschlichen. Dennoch
erschien die Idee, Software und Mikro-
controller zu nutzen, weiterhin sym-
pathisch. So kehrte ich an den Schreib-
tisch zurück

W

A R U M E I N

B

E T R I E B S S Y S T E M

?

Eine erfolgversprechende Methode,
ein komplexes Problem zu lösen, ist, es
in kleinere, einfachere Teilaufgaben
(Tasks) aufzuteilen. Diese Teilaufgaben
müssen programmiert und
anschließend zentral koordiniert wer-
den. Manche müssen in bestimmten
Intervallen ausgeführt werden, man-
che bei einem bestimmten Ereignis
oder Status, und andere wiederum

background image

Elektor

5/98

70

einer Interrupt-Service-Routine aufge-
rufen werden, die der Timer aktiviert.
Jedes Mal, wenn diese Routine
(SCHED00) ausgeführt wird, holt sie
den nächsten Eintrag aus einer zir-
kulären Lookup-Tabelle und lädt (in
Wahrheit logische Oder-Verknüpfun-
gen) die Maske in ein Register, das die
Aktivierungsflags für acht Zeit-Tasks
enthält. Bild 2 zeigt das Funktionsdia-
gramm des Schedulers. Wenn wir 20
Einträge in der Scheduler-Lookup-
Tabelle vorsehen und es so einrichten,
daß der Scheduler alle 10 ms ausge-
führt wird, wird alle 10 ms eine andere
Maske in das Register geladen, das
acht Zeit-Task-Flags enthält. So wird
der Time-Task Nummer 1 alle 10 ms
ausgeführt, indem man Bit 0 in jeder
der 20 Masken setzt, oder, wenn man
Bit 0 in jeder ungeraden Maske setzt,
wird Time-Task Nummer 1 alle 20 ms
ausgeführt und so weiter. Wenn man
SCHED00 alle 10 ms aufruft, kann man
mit einer 20-Masken-Tabelle die Aus-
führungsintervalle 10, 20, 40, 50, 100
oder 200 ms für einzelne Time-Tasks
selektieren, indem man die dazu-
gehörenden Bits in den Masken setzt.
Eine gute Idee ist es, Bits zu spreizen.
Wenn man mehr als ein Task ausführen
will, beispielsweise bei 40 ms, setzt man
nicht die dazugehörenden Flag-Bits in
den gleichen Masken. So kann man
den Prozessor nicht überlasten.

P I C X E X

D I E

G

R U N D L A G E N

Da PICXEX kein Teil des Applikations-
kodes ist, ist es einfach anzuwenden.

1. Bringen Sie alle Tasks der Applika-
tion in Form von Subroutinen. Die
Subroutinennamen sind gleichfalls
Tasknamen.

2. Arrangieren Sie eine Timer-interrupt-
service-Routine mit einem Call-
SCHED00-Befehl so, daß die Scheduler-

Subroutine alle 10 ms ausgeführt wird.

3. Nach der Start-up-Initialisierung ist
ein Kode einzufügen, um die Flags der
Event-Tasks zu aktivieren, die man
beim Start durchführen möchte, und
um die Steuerung der Task-Aus-
führung von PICXEX zu übergeben.
Listing 2 ist ein Beispiel. Der letzte
Befehl

Goto Main_00 ist sehr wichtig.

4. PICXEX umfaßt eine Konfigurati-
onsdatei, in der man die Task-Namen
spezifiziert, die vier verwendeten Regi-
ster, Timing-Informationen für die
Time-Tasks und die Anzahl der Mas-
ken. Listing 1 ist eine Kopie der Konfi-
gurationsdatei von PICXEX, wie sie in
einem Applikationsbeispiel genutzt
wird, das später in diesem Artikel
erläutert wird.

P I C X E X

G

E N E R E L L E

R

I C H T L I N I E N

Teile die Applikation in kleinere Funktio-
nen/Prozessoren.
Die zeitunabhängigen
Funktionen sind Event-Tasks, die ande-
ren, die in bestimmten Intervallen aus-
geführt werden, sind die Time-Tasks.

Halte Interrupt-Service-Routinen kurz.
Gebrauche Interrupts, um Daten zu
sammeln und zu verschicken und
Ereignisse zu registrieren. Für die Ver-
arbeitung von Daten und Ereignissen
sind Tasks verantwortlich. Denken Sie
daran, daß alle Interrupts PICXEX
ignorieren, während es fröhlich mit
der Ausführung von Tasks voran-
schreitet. Für Interrupt-Service-Routi-
nen und alles, was darin passiert, sind
Sie verantwortlich!
Das Format für den Gebrauch von Tasks.
Sowohl für Event- als auch für Time-
Tasks ist die Form der Subroutine ange-
messen. Sie starten mit einem einzig-
artigen Namen und umfassen einen
oder mehrere RETURN-Befehle.
Benutzen Sie das Makro
XEX_RETURN, das äquivalent zu dem
Return-Befehl ist, aber eine klare
Anzeige in dem Listing ergibt, wo Sie
einen Task in Richtung Task-Executive
verlassen können.
Vermeiden Sie so weit wie möglich
Verzögerungsschleifen innerhalb der
Tasks, sonst wird die Abarbeitung
anderer Tasks verzögert. Mit PICXEX
stehen Ihnen weitaus elegantere
Methoden zur Verfügung, um Verzö-
gerungen zu implementieren.

MASK1

1

1

2

3

4

MASK2

2

MASK3

3

MASK19

19

MASK20

20

......

...

......

...

......

...

OUT

OR

R

TIME-TASK
FLAGS

1

20

SCHED-COUNT

+

SELECT

ADDR.

=

980034 - 12

2

Bild 2. Time-Task-
Scheduler

INC

KEY01

3_2

TEMPB0

0.6

3_1

ON-DELAY

IN

TIME

BIN01

3_3

SW-B

BIN02

BIN03

BIN06

3_7

3_8

3_3

50

350

3_10

3_11

#1

LLBYTE

DEC

KEY02

MANUAL

BIN07

3_5

TEMPB0

0.6

3_4

ON-DELAY

IN

TIME

BIN04

980034 - 13

3_6

SW-B

BIN05

#2

LLBYTE

TEMPB1

TEMPB3

CNTLIM-16

INC

DEC

OUT

WORD01

SPEED
SETPOINT

LLim

HLim

LLWORD

LLWORD

&

&

3

Bild 3. Setpoint Station
(Event-Task 3)

background image

Die Größe eines Tasks. Halten Sie sowohl
Event- als auch Time-Tasks so kurz und
einfach wie möglich, damit eine Aus-
führungszeit von maximal 2 ms sicher-
gestellt ist. Dies ist ausreichend Zeit,
um acht Bytes blockweise in ein seriel-
les EEPROM zu schreiben, und bei
einem 8-MHz-Taktes mehr als genug
für die Befehle einer PID-Routine, die
mit Fließkommazahlen rechnet.
Als letztes sei der Befehl clrwdt am
Ende der Event-Task-Sektion erwähnt,
der den Watchdog-timer löscht. Er ver-
hindert Ärger bei machen Task-Kodes.
Wenn Sie diese Grundlagen bezüglich
Tasklänge und so weiter bei der
Anwendung von PICXEX beachten,

beträgt die nominelle Wartezeit etwa
18 ms.

P I C X E X

A

P P L I K A T I O N S

-

B E I S P I E L
Der beste Weg, mit PICXEX vertraut zu
werden, ist, eine arbeitende Applika-
tion wie die folgende zu studieren. Sie
beschreibt einige Teile einer “echten”
Anwendung, zeigt einige der Möglich-
keiten, wenn PICXEX mit einem
PIC16C73-Mikrocontroller genutzt
wird. Der Quellkode für die beschrie-
benen Tasks, Hilfsprogramme, Funkti-
onsmodul-Makros und das Programm

PICSCOPE sind auf der Projekt-Dis-
kette EPS 986017-1 zu finden. Beden-
ken Sie bei der Ausführung dieser
Applikation durch den MPSIM-Simu-
lator, daß der Ausgang des Übertra-
gungsprozessors (siehe Beschreibung
des Event-Tasks 8 unten) alle 2 s erneu-
ert wird, was eine lange Wartezeit
bedeuten kann. Die Tasks werden wie
folgt zugewiesen.

Time-Task 1
Application Timer Handler wird alle 100
ms ausgeführt und gebraucht, um die
Timer für Funktionsmodule zu steu-
ern. Timing-Perioden im Bereich 0,1 s
bis 6,4 s sind verfügbar.

Event-Task 3
Setpoint Station wird unter Anwendung
der Funktionsmodule-Programmie-
rung wie in Bild 3 implementiert.
Diese Programmiermethode ist schnell
zu implementieren und einfach zu kor-
rigieren. Ein 16-bit-Zähler, Funktions-
modul 3_11, wird über zwei Tasten
erhöht oder verringert. Jede Taste weist
eine Auto-repeat-Funktion auf, wenn
sie länger als 0,65 s in Betrieb ist. Set-
point kann wegen der MANUAL-Sta-
tus-Verriegelung nur während des
manuellen Modus geändert werden.
Der Zählerausgang ist auf 50...350 limi-
tiert. Beachten Sie, daß die Funktions-
kodemodule gemäß der Tasknummern
und der Ausführungssequenz nume-
riert sind. Die gleichen Nummern wer-
den als Labels im Quellkode genutzt,
um den Start der bestimmten Funktion
zu markieren.

Event-Task 7
Debug Tool. Dieser Task ist eine nützli-
che Hilfe bei der Fehlersuche in Funk-
tions-Modulen. Zusammen mit
ASYNCH03 (ein Utility für die serielle
Schnittstelle) und PICSCOPE (PC-Soft-
ware) kann man die Register des PICs
in Bit, Byte, Wort und im Fließkomma-
format lesen und schreiben.

Event-Task 8
Performance Processor. Auch mit Funkti-
onsmodulen implementiert, berechnet
dieses Task, wieviel mal pro Sekunde
es ausgeführt wird. Mit PICSCOPE ist
es leicht, die Systemauslastung zu
beobachten.
Bei einem Wert unter 60 kann man
davon ausgehen, daß der PIC-interne
Watchdog aktiv wird.

Außer den bei Microchip kostenlos
erhältlichen Programmen MPASM und
MPSIM sind alle Programme, Quellko-
des, Makros und Hilfsmittel, von
denen in diesem Artikel die Rede war,
auf der Diskette EPS 986017-1 erhält-
lich. Näheres dazu finden Sie auf den
Service-Seiten in der Heftmitte.

(980034-1)

71

Elektor

5/98

LISTING 1

; Define start of task code here. For unused tasks
; leave as is at 0.

#DEFINE TimeTask1 APP_TIMERS ; service task for timer modules
#DEFINE TimeTask2 0

; TimeTask2 code label

.......................
.......................

#DEFINE TimeTask6 0

; TimeTask6 code label

#DEFINE TimeTask7 0

; TimeTask7 code label

#DEFINE TimeTask8 0

; TimeTask8 code label

#DEFINE EventTask1 0

; EventTask1 code label

#DEFINE EventTask2 0

; EventTask2 code label

#DEFINE EventTask3 SETP_STATION ; setpoint station

.......................
.......................

#DEFINE EventTask6 0

; EventTask2 code label

#DEFINE EventTask7 Debug

; Debug tool

#DEFINE EventTask8 PERF_PROC

; Performance Processor

; registers in Bank0 used by operating system

; TIME_TASK_STATUS

EQU 0 ; time-task active flags

; EVENT_TASK_STATUS

EQU 0 ; event-task active flags

; EVENT_TASK_ENTRY

EQU 0 ; task loop entry point

; SCHED_COUNT

EQU 0 ; Scheduler counter

; definitions for Scheduler look-up masks

#DEFINE Mask1 B’00000001’ ; Mask 1
#DEFINE Mask2 B’00000000’ ; Mask 2
#DEFINE Mask3 B’00000000’ ; Mask3
#DEFINE Mask4 B’00000000’ ; Mask4
#DEFINE Mask5 B’00000000’ ; Mask5

.......................

#DEFINE MASK10 B’00000001’ ; Mask10

.......................

#DEFINE Mask17 B’00000000’ ; Mask 17
#DEFINE Mask18 B’00000000’ ; Mask 18
#DEFINE Mask19 B’00000000’ ; Mask 19
#DEFINE Mask20 B’00000000’ ; Mask 20

NR_OF_MASKS SET D’20’ ; no. of scheduler masks

LISTING 2

.....................................

. . . . . . . . . . . . . . . . . . . . . . . . . . . . .

clrf TIME_TASK_STATUS

; ensure no Time-Tasks active

clrf EVENT_TASK_STATUS

; ensure no Event_Tasks active

clrf EVENT_TASK_ENTRY

; reset Event-Task loop entry-point

clrf SCHED_COUNT

; clear Scheduler mask selector

XEX_ON_EVENT 3

; start with Event-Task 3 on

goto Main_00

; make it fly!


Wyszukiwarka

Podobne podstrony:

więcej podobnych podstron