C161-Starterkit

Peter Pramberger

C161pic

Mit diesem Artikel soll eine Einführung in die Programmierung des C161-Starterkits geboten werden. Zu diesem Zweck wird die Mikrocontroller-Platine mit Hardware zur Eingabe und Ausgabe versehen. Anschließend werden dann diese Erweiterungen in einem Beispielprogramm verwendet.


1    Hardware

1.1    Starterkit

Das C161-Starterkit beinhaltet neben dem C161O-Mikrocontroller von Siemens 256 KByte Flash-ROM und 64 KByte RAM. Beide Speicher können auf jeweils 1 MByte ausgebaut werden. Die Platine wird in der Standardausstattung mit einer stabilisierten 5V-Gleichspannung versorgt. Über eine optional erhältliche Erweiterung ist dann auch der direkte Anschluß einer unstabilisierten Spannung von 8–12V möglich. Weiters befinden sich auf der Platine die Anschlüsse für die beiden seriellen Schnittstellen. Das serielle Verbindungskabel befindet sich leider nicht im Lieferumfang, kann aber mit der mitgelieferten Anleitung leicht selbst hergestellt werden. Über eine 152-polige Steckerleiste sind alle relevanten Anschlüsse des Mikrocontrollers zugänglich. Dadurch ist ein einfacher Anschluß von externer Hardware möglich.

Im Paket ist jede Menge an Dokumentation zum Starterkit und zum Mikrocontroller enthalten. Daneben finden sich noch zwei CD-ROMs, eine mit den aktuellen Datenblättern und Handbüchern zu den Siemens-Mikrocontrollern und eine zweite mit den Programmen zur Verwendung der Platine und den C-Compilern. Diese sind zwar nur eingeschränkte Versionen, trotzdem lassen sich damit kleinere Programme realisieren.

1.2    C161O

C161O

Der C161O ist einer von vier Derivaten der von Siemens entwickelten C161-Mikrocontrollerfamilie. Diese Mikrocontrollerfamilie ist eine preisgünstige Variante der C165/C163-Mikrocontrollerfamilie.

Der C161O arbeitet mit 125 ns Befehlszykluszeit bei 16 MHz und besitzt eine vierstufige Pipeline. Dank dieser kann er bis auf wenige Ausnahmen jeden Befehl in der zuvor genannten Zeit ausführen. Weiters kann der C161O bis zu vier MByte Speicher adressieren und beinhaltet zwei KByte internes RAM. Neben insgesamt 20 Interruptquellen (davon sieben externe Quellen), die auf 16 verschiedene Prioritätsebenen programmiert werden können, verfügt der C161O über acht PEC-Kanäle, die ähnlich einem DMA-Transfer beim PC CPU-unabhängige Speichertransfers ermöglichen. An Peripherie verfügt er über fünf Timer, eine asynchrone (bis zu 500 KBaud), eine synchrone serielle Schnittstelle (bis zu 2 MBaud) und 63 Portleitungen.

1.3    Erweiterungen

Wenn man das Paket auspackt und die Platine vor sich liegen hat, kann man damit zunächst noch nicht viel anfangen. Lediglich die serielle Schnittstelle steht für erste Programmierversuche zur Verfügung. Daher ist es sinnvoll, die Mikrocontroller-Platine mit externer Hardware zur Eingabe (in der Form von Tastern) und zur Ausgabe (in der Form von LEDs) zu erweitern.

Auf der Mikrocontroller-Platine sind die Pins P2.9 bis P2.15 und die Pins P3.2 bis P3.13 frei verfügbar. Die Pins 2.x werden auch als Triggereingänge für die externen Interrupts benutzt. Daher bietet sich Port 2 für den Anschluß der Taster an. Dadurch hat man immer noch die Wahl, ob die externen Tasten über Interrupts oder durch Polling eingelesen werden. Die LEDs werden an Port 3 angeschlossen.

Für die meisten Anwendungen müßten vier bis sechs LEDs und zwei bis drei Taster vollkommen ausreichend sein. Für das nachfolgende Beispielprogramm sind mindestens vier LEDs und zwei Taster notwendig.

Die Schaltungen können entweder direkt auf der Mikrocontroller-Platine oder auf einer eigenen Platine, die dann über ein Flachbandkabel mit der Mikrocontroller-Platine verbunden wird, angeschlossen werden.


2    Programmierung

IMG0040

Für die Programmierung des C161-Starterkits wird der auf der CD-ROM mitgelieferte C166-Compiler von Keil verwendet, da er die geringeren Einschränkungen und den größeren Funktionsumfang aufweist. Dabei wird vorausgesetzt, daß der Compiler bereits installiert ist.

2.1    Lauflicht

Als Beispielprogramm wurde ein Lauflicht gewählt, welches über zwei externe Taster gesteuert werden kann. Der erste Taster ermöglicht eine Auswahl aus fünf verschiedenen Lichtfolgen, während der zweite Taster zur Umschaltung der Laufrichtung dient. Die Ausgabe erfolgt an fünf LEDs, die an Port 3 angeschlossen sind. Die zwei Taster sind an Port 2 angeschlossen und aktivieren den jeweiligen externen Interrupt.

Für die Weiterschaltung der LEDs wird Timer 3 eingesetzt. Er läuft im Timer-Mode mit etwa 50 ms Intervall. Bei einem Überlauf wird das entsprechende Flag in der Interrupt-Service-Routine gesetzt und der Timer nachgeladen. Für die Taster werden die externen Interrupts 1 und 2 verwendet. Bei einem Tastendruck wird das entsprechende Flag in der zugehörigen Interrupt-Service-Routine gesetzt. Die Verarbeitung der Flags erfolgt dann im Hauptprogramm. Je nach Betätigung der Taste 1 wird die Variable Program erhöht und dadurch eine andere Lichtfolge gewählt. Je nach Betätigung der Taste 2 wir die Variable LED_Direction auf 0 oder 1 gesetzt und damit die Laufrichtung umgeschaltet.

Mit jedem Timerüberlauf wird die Lichtfolge um eine LED weitergeschaltet, und zwar mit den Funktionen _irol_ bzw. _iror_. Diese Funktionen verschieben den Inhalt von Port 3 um jeweils eine Stelle nach links bzw. rechts. Zur Tastenentprellung werden einfach die externen Interrupts für eine Dauer von sieben Timerüberläufen gesperrt.

2.2    Erstellung des lauffähigen Programms

2.2.1    Startup-Code

Zunächst muß die Datei START161.A66 von der CD-ROM in das Verzeichnis des Beispielprogramms kopiert werden. Sie enthält den angepaßten Startcode für die Mikrocontroller-Platine und befindet sich auf der CD-ROM im Verzeichnis

R:\CDROM\3RDTOOLS\PHYTEC\FLASH166\
STARTUP.

Anschließend muß sie mit folgendem Aufruf übersetzt werden. Dabei muß die Angabe des Speichermodells unbedingt mit dem Speichermodell des Programms übereinstimmen, in diesem Fall SMALL.

A166 START161.A66 MOD167 SET(SMALL)

Der Assembler erzeugt daraus die Datei START161.OBJ, die später zum fertigen Programm dazugelinkt werden muß.

2.2.2    Kompilieren

Anschließend wird das Beispielprogramm mit folgendem Aufruf kompiliert. Auch hier muß unbedingt das verwendete Speichermodell angegeben werden.

C166 LLICHT.C MOD167 SMALL

Der Compiler erzeugt die Datei LLICHT.OBJ, die dann zum Linken verwendet wird, und die Datei LLICHT.LST, die Informationen zum übersetzten Programm enthält.

2.2.3    Linken

Beim Aufruf des Linkers müssen diesem nicht nur die zu linkenden Module, sondern auch die zu verwendenden Speicherbereiche angegeben werden, also wo ein bestimmter Datentyp oder Code abgelegt werden muß. Da diese Angaben zu lang für eine direkte Befehlszeileneingabe sind, muß man eine Kommandodatei schreiben, die dann dem Linker als Parameter übergeben wird. In diesem Beispiel sieht diese Datei (LLICHT.LNK) folgendermaßen aus:

LLICHT.OBJ,
START161.OBJ
TO LLICHT.ABS
CL(NCODE(000000H-00FFFFH),
FCODE(010000H-037FFFH),
NCONST(000000H-003FFFH),
FCONST(004000H-037FFFH),
HCONST(004000H-037FFFH),
IDATA(00F600H-00FDFFH),
IDATA0(00F600H-00FDFFH),
NDATA(100000H-103FFFH),
NDATA0(100000H-103FFFH),
FDATA(104000H-10FFFFH),
FDATA0(104000H-10FFFFH),
HDATA(104000H-10FFFFH),
HDATA0(104000H-10FFFFH),
BDATA(00FD00H-00FDFFH),
BDATA0(00FD00H-00FDFFH),
SDATA(00C000H-00FFFFH),

Listing der Header-Datei LLICHT.H

Dabei bedeutet:

NCODE

Near Code

FCODE

Far Code

NCONST

Near Constant

FCONST

Far Constant

HCONST

Huge Constant

IDATA

Internes RAM (2 kByte)

IDATA0

Internes RAM (globale Variablen)

NDATA

Near Data

NDATA0

Near Data (globale Variablen)

FDATA

Far Data

FDATA0

Far Data (globale Variablen)

HDATA

Huge Data

HDATA0

Huge Data (globale Variablen)

BDATA

Bit-adressierbarer Speicherbereich (256 Byte)

BDATA0

Bit-adressierbarer Speicherbereich (globale Variablen)

SDATA

Systembereich

Diese Speicherbereiche gelten nur für die Programmierung eines Programms in das Flash-ROM der Mikrocontroller-Platine!

Der Linker wird mit folgender Syntax aufgerufen:

L166 @LLICHT.LNK

Er erzeugt die Datei LLICHT.ABS, die das fertige Programm darstellt. Optional kann noch die Datei LLICHT.M66 erzeugt werden, die Informationen über die Speicherbelegung und die verwendeten Funktionen enthält.

2.2.4    Konvertieren

Bevor das Programm jetzt in das Flash-ROM programmiert werden kann, muß es zunächst in das Intel-Hex-Format konvertiert werden. Dies erfolgt folgendermaßen:

OH166 LLICHT.ABS H167

Damit wird die Datei LLICHT.HEX erzeugt, die dann in das Flash-ROM programmiert werden kann.

2.2.5    Flash-ROM

Um ein Programm in das Flash-ROM zu übertragen, muß Jumper JP4 geöffnet und Jumper JP9 in Stellung 1-2 gesetzt sein. Nachdem man ein serielles Kabel an P2 angeschlossen hat, wird das Programm FLASHT aufgerufen. Es befindet sich auf der CD-ROM im Verzeichnis

Listing des Codeteils

R:\CDROM\3RDTOOLS\PHYTEC\
FLASH166\FLASHT\161.

Zur schnelleren Verarbeitung empfiehlt es sich, eine höhere Baudrate zu verwenden, hier 38400 Baud:

FLASHT BR(38400)

Nachdem die Flash-Tools geladen wurden, erscheint ein Menü mit zahlreichen Optionen. Am einfachsten wird über Punkt 7 (Erase, Load and Software-Reset) der Inhalt des Flash-ROM gelöscht und danach über F2 der Dateiname des Programms (LLICHT.HEX) angegeben. Nach erfolgter Programmierung muß nur noch der Jumper JP9 in Stellung 2-3 gebracht und ein Reset ausgelöst werden und der Mikrocontroller arbeitet ab sofort mit dem neuen Programm.