Embedded Intelligent Systems 9783486593280

Das Buch vermittelt Kenntnisse zur Technologie und dem Design von Embedded Intelligent Systems. Dazu werden neben der Ke

218 87 44MB

German Pages 208 [199] Year 2009

Report DMCA / Copyright

DOWNLOAD PDF FILE

Recommend Papers

Embedded Intelligent Systems
 9783486593280

  • 0 0 0
  • Like this paper and download? You can publish your own PDF file online for free in a few minutes! Sign Up
File loading please wait...
Citation preview

#

Oldenbourg Lehrbücher für Ingenieure Herausgegeben von

Prof. Dr.-Ing. Bernhard Hoppe

Embedded

Intelligent Systems

von

Peter Nauth

Oldenbourg Verlag München Wien

Prof. Dr. Peter Nauth forscht und lehrt seit 1998 an der Fachhochschule Frankfurt a.M. im Fachbereich Technische Informatik. Von 1975 bis 1981 studierte er Elektrotechnik an der TU Darmstadt und promovierte 1985 an der Universität Mainz mit dem Thema Mustererkennung. Es folgte ein Forschungsaufenthalt in den USA an der University of Rochester, New York. Anschließend war Peter Nauth acht Jahre in leitender Position eines weltweit tätigen Unternehmens für die Entwicklung intelligenter Sensoren verantwortlich.

Bibliografische Information Der Deutschen Bibliothek Die Deutsche Bibliothek verzeichnet diese Publikation in der Deutschen

Nationalbibliografte; detaillierte bibliografische Daten sind im Internet über abrufbar.

© 2005 Oldenbourg Wissenschaftsverlag GmbH Rosenheimer Straße 145, D-81671 München Telefon: (089)45051-0

www.oldenbourg.de Das Werk einschließlich aller Abbildungen ist urheberrechtlich geschützt. Jede Verwertung außerhalb der Grenzen des Urheberrechtsgesetzes ist ohne Zustimmung des Verlages unzulässig und strafbar. Das gilt insbesondere für Vervielfältigungen, Übersetzungen, Mikroverfilmungen und die Einspeicherung und Bearbeitung in elektronischen Systemen.

Lektorat: Kathrin Mönch

Herstellung: Anna Grosser Umschlagkonzeption: Kraxenberger Kommunikationshaus, München Gedruckt auf säure- und chlorfreiem Papier Druck: Oldenbourg Druckerei Vertriebs GmbH & Co. KG Bindung: R. Oldenbourg Graphische Betriebe Binderei GmbH ISBN 3-486-27522-4 ISBN 978-3-486-27522-3

Vorwort des Autors Dieses Buch basiert auf verschiedenen Vorlesungen, die ich an der Fachhochschule Frankfurt a.M. halte. Vor allem die Fächer „Mikrocomputertechnik", „Embedded Systems" und „Mustererkennung" zeigen eine immer stärkere Verzahnung, weil wegen der leistungsstärkeren Mikroprozessoren intelligente Mustererkennungsalgorithmen in zunehmendem Maße auf eingebetteten Mikrocomputern implementiert werden. Da auch die Industrie solche Embedded Intelligent Systems verstärkt einsetzt, entstand die Idee, dieses Buch zu schreiben. Das Buch stellt nicht einzelne Teilaspekte der Thematik, sondern das System in den Mittelpunkt. Daher vermittelt es sowohl die mathematischen Grundlagen zur Mustererkennung als auch die technischen Kenntnisse über die Hard- und Software und zeigt an mehreren Beispielen, wie man diese Komponenten für die Realisierung von Embedded Intelligent Systems

integriert. Das Buch wendet sich vor allem an Studenten der Ingenieurwissenschaften und der Informatik. Es ist aber auch für Entwicklungsingenieure, Projektleiter und Entscheidungsträger mit technischem Hintergrund ein geeignetes Werkzeug, sich in das Thema einzuarbeiten oder es als Nachschlagewerk zu nutzen.

Frankfurt

Prof. Dr. Peter Nauth

Vorwort des

Herausgebers

Geräte mit eingebetteten Computersystemen (Embedded Systems) umgeben uns. Sie bestehen aus Mikroprozessoren und anwendungsspezifischer Elektronik, mit der Sensoren, Aktoren oder Displays verbunden sind. Embedded Systems arbeiten in Mobiltelephonen, Waschmaschinen, in industriellen Produktionsanlagen, im Auto und tun dies fast unbemerkt im Hintergrund. Embedded Systems sind heute das mit am stärksten wachsende Segment der Elektronikindustrie. Die Effizienz, mit der solche Systeme ihre vielfältigen Aufgaben bewältigen, entsteht durch den engen Bezug zwischen Prozessorhardware einerseits und den einprogrammierten Softwarekomponenten andererseits. Mit Software lassen sich Embedded Systems flexibel an spezifische Aufgaben adaptieren. Die Hardware sorgt für die resourcenschonende kostengünstige Umsetzung der Funktionen.

Intelligente Embedded Systems grenzen sich gegen die herkömmlichen Systeme dadurch ab, dass sie weniger starre Algorithmen verwenden. Die auszuwertenden Daten werden nicht auf die üblichen festen mathematischen Modelle abgebildet, sondern es werden lernfähige Algorithmen und andere sich selbst organisierende Verfahren eingesetzt. Diese können die für die Aufgabe nötigen Informationen direkt aus den zur Verfügung stehenden Signalen extrahieren und so zu Verfahren kommen, die interessierenden Daten zu verarbeiten. Intelligente Systeme sind daher adaptionsfähig und können sich selbst im Laufe des Einsatzes sogar noch im Hinblick auf die jeweilige Anwendung optimieren. vorliegende Buch konzentriert sich aber nicht nur auf diese fortgeschrittenen Anwendungen und neuen Entwicklungstendenzen, sondern führt zunächst systematisch in die Grundlagen der Funktionsweise wie auch in den Entwurfsablauf für eingebettete Systeme

Das

ein. Die Hardwarebasis bildet dabei der Mikrocontroller SAB 80535, der im Detail vorgestellt wird. Übungsaufgaben werden bereitgestellt und der Zugang zu einem Softwaresimulationswerkzeug und einem Embedded-Systems-Experimentalaufbau eröffnet. Hier kann der Leser selbst programmieren, um das Gelernte praktisch anzuwenden. Auf der beiliegenden CD finden sich viele lehrreiche Beispielprogramme. Nachdem die Grundlagen gelegt sind, werden im Anschluss die wichtigsten Algorithmen für den Einsatz von Mikrokontrollern in Intelligenten Systemen vorgestellt, wobei der Schwerpunkt auf Mustererkennungsverfahren liegt. Danach werden Embedded Intelligent Systems aus unterschiedlichen Anwendungsbereichen vorgestellt. Ein Ausblick auf die neuesten Entwicklungstrends im Bereich der Embedded Intelligent Systems beschließt das Werk.

VIII

Vorwort des

Herausgebers

Auf knappen Raum werden dem Leser so alle wesentlichen Grundlagen in Bezug auf Hardund Software vermittelt. Das Buch führt direkt in die industrielle Anwendung und ist daher ein ideales Lehrbuch für eine praxisbezogene Ausbildung.

Darmstadt

Prof. Dr. Bernhard

Hoppe

Inhalt 1

Einleitung

2

2.2

5 Spezifikation und Design von Embedded Systems Grundlagen.5 Spezifikation und Design.5

2.3

Übungsaufgaben.9

3

3.6

11 Mustererkennung Definition und Verarbeitungsschritte.11 Musterrepräsentation.14 Signalakquisition.15 Signalvorverarbeitung.16 Segmentierung.17 Merkmalsberechnung.19

3.7

Klassifikation.21

3.8

Übungsprogramm zur Bildverarbeitung.28 Übungsaufgaben.33

2.1

3.1 3.2 3.3 3.4 3.5

3.9 4 4.1

4.2 4.3

1

35 Mikrocomputer für Embedded Systems Grundlagen der Digitaltechnik.35 Grundlagen der Mikrocomputertechnik.40

4.4

Mikrocontroller.46 Betriebssysteme.47

5

Aufbau

5.1 5.2

Architektur.49 Speicherorganisation des SAB 80515/535.55

5.3

Der

von

Embedded

Systems mit dem Mikrocontroller SAB 80515/535

49

Stack.60

Inhalt

X

5.6

Experimentalsystems SAB 80515/535.61 Realisierung eines Embedded Systems.63 Integrated Development Environment (IDE).76

6

Assembler-Programmierung des SAB 80515/535

6.1

Grundlagen.85

6.2

Die Befehlsfamilie des SAB 80515/535.87

6.3

6.4

Adressierungsarten.96 Programmbeispiel.97

6.5

Sprünge und Schleifen.99

6.6

6.9

Unterprogramme.105 Tabellenverarbeitung.108 Interrupts.109 Programmierung des Embedded Systems in Assembler.113

6.10

Übungsaufgaben.114

7

Hardwarenahe

5.4 5.5

6.7

6.8

Aufbau eines

85

7.2

119 Programmierung des SAB 80515/535 in C Grundlagen.119 Programmierung des Embedded Systems in C.123

8

Embedded

7.1

8.1 8.2

135 System als Lernender Farbsensor Grundlagen.135 Entwicklung eines Intelligenten Sensors zur Farberkennung.136

9.3

141 Spracherkennung mit Embedded Systems Allgemeines.141 Methoden der Spracherkennung bei der Einzelwortverarbeitung.142 Das Sprachmodul „Voice Direkt 364".144

9.4

Betrieb in Stand-Alone-Modus.145

9.5

Aufbau eines Embedded Voice

9.6

Operation mit dem „Voice Direct 364"-Modul im Slave-Modus.155

10

Embedded

9

9.1

9.2

10.1 10.2

Recognition Systems mit dem SAB

80515/535

..

149

159 System als intelligenter Barcode-Sensor Grundlagen.159 Entwicklung eines einfachen intelligenten Sensors zur Barcode-Lesung.168

Inhalt_XI 11

Zusammenfassung und Ausblick

12

177 Anhang Quellcode des Bildverarbeitungsprogramms.177 Bezugsquellen.180 Lösung der Übungsaufgaben aus Kapitel 2.180 Lösung der Übungsaufgaben aus Kapitel 3.181 Lösung der Übungsaufgaben aus Kapitel 6.182 Initialisierung des LCD-Displays.188

12.1 12.2 12.3 12.4 12.5 12.6

173

Literaturverzeichnis

191

Index

193

1

Einleitung

Embedded Systems, im Deutschen auch „eingebettete Systeme" genannt, übernehmen, häufig vom Benutzer unbemerkt, in vielen Geräten des Konsum- und Industriegüterbereichs wichtige Funktionen. Sie lassen sich als mikroprozessorgesteuerte Systeme definieren, die • spezifische Aufgaben für übergeordnete Anwendungen durchführen und • als eigenständige Geräte oder Geräteteile konstruiert sind. Im sis

Gegensatz zu den Embedded Systems erlaubten die ersten Geräte auf Mikroprozessorba-

relativ einfache Steuerungs- und Regelungsaufgaben. In den letzten Jahren wurde es jedoch durch die zunehmende Leistungsfähigkeit der Prozessoren und die höhere Integrationsdichte möglich, aufwendigere Algorithmen und Kommunikationsprotokolle in kompakte Geräte zu integrieren. Diese sind in größeren Systemen „eingebettet", wie z.B. das ABS in einem Bremssystem. Dadurch entstand der Begriff „Embedded Systems". nur

Embedded Systems operieren häufig mit einem hohen Maß an Autonomie. Dies umfasst sowohl Interaktionsmöglichkeiten mit der Umwelt durch die Erfassung und Ausgabe analoger und digitaler Signale als auch Schnittstellen zur Kommunikation mit anderen Embedded Systems und Rechnern. Je nach Aufgabenstellung sind Eingebettete Systeme daher in Netzwerke integrierbar oder verfügen über Anschlüsse für Tastaturen und Anzeigekomponenten. Die Funktionalitäten vieler Embedded Systems lassen sich nur durch leistungsfähige Algorithmen realisieren, die vor kurzem noch Forschungsthema der Bereiche „Künstliche Intelligenz" und „Mustererkennung" waren und auf Workstations programmiert wurden. Eingebettete Systeme, auf denen diese intelligenten Algorithmen implementiert sind, nennt man Embedded Intelligent Systems.

Typische Realisierungsbeispiele dafür sind: • Handys, die mittels Spracherkennung wählen. • „Intelligente" Kameras, die Bilder sowohl aufnehmen als auch selbstständig die darin enthaltenen Objekte erkennen und z.B. an einen Rechner zur Steuerung autonom-mobiler Systeme weiterleiten. • „Intelligente" Barcode-Sensoren mit integrierter Dekodierung des Barcode-Musters. • •

„Lernende" Farbsensoren. Abstandswarnsensoren in Automobilen, die die Distanz zu einem Objekt messen, den Zeitpunkt eines möglichen Aufpralls abschätzen und Maßnahmen zu dessen Vermeidung oder Folgenminimierung einleiten.

2

1

Einleitung

Da diese Systeme zunehmend an Bedeutung gewinnen, konzentriert sich der Inhalt dieses Buchs auf die theoretischen Grundlagen der Funktionsweise, des Designs und der Entwicklung von Embedded Intelligent Systems. Die besondere Herausforderung bei der Entwicklung von Embedded Intelligent Systems liegt in der Notwendigkeit, unterschiedliche technische Disziplinen zu verbinden und die resultierenden widersprüchlichen Anforderungen zu managen. Während die klassische Hardwareentwicklung nur schaltungsbezogene Parameter berücksichtigt und der Softwareentwickler von einem „idealen" Rechner ausgeht, muss der Entwickler von Embedded Intelligent Systems Hardware, Software sowie Mechanik aufeinander abstimmen, um den Kundenanforderungen zu genügen. Der Aspekt des „Embedded Designs" entscheidet hier wesentlich über den Erfolg eines Produkts. Das Buch wendet sich sowohl an Studenten der Ingenieurwissenschaften und der Informatik als auch an Entwicklungsingenieure und Entscheidungsträger. Durch die enge Verzahnung von Theorie und Praxis werden sowohl die Grundlagen Eingebetteter Intelligenter Systeme als auch Realisierungsmethoden und -beispiele behandelt. Der Leser kann sich primär mit dem im Buch vermittelten theoretischen Wissen befassen, dieses mit Übungsaufgaben und Softwaresimulationen vertiefen oder einen Embedded-Systems-Experimentalaufbau programmieren, um das Gelernte praktisch anzuwenden.

Nach dieser Einleitung behandelt das Buch in Kapitel 2 die Vorgehensweise bei der Spezifikation und dem Design von Eingebetteten Systemen sowie die wichtigsten Aspekte zum

Management von Entwicklungsprojekten.

Kapitel 3 werden Algorithmen für Intelligente Systeme vorgestellt, wobei der Schwerpunkt auf Mustererkennungsverfahren liegt. Der Hardwareaufbau und die Programmierung von Embedded Intelligent Systems sind Thema der Kapitel 4 bis 7. Die Erklärungen konzentrieren sich dabei auf den Mikrocontroller SAB 80515/535 als Hardwarebasis. Die zahlreichen, auf der beiliegenden CD enthaltenen Beispielprogramme, aber auch selbst geschriebene Software, lassen sich auf dem bereits erwähnten Embedded-System-Experimentalaufbau implementieren. Embedded Intelligent Systems aus unterschiedlichen Anwendungsbereichen werden in den Kapiteln 8 bis 10 vorgestellt. Einige einfache Beispiele wie ein intelligenter Barcode-Sensor, ein lernender Farbsensor und ein System zur Spracherkennung kann der Leser, basierend auf dem Experimentalaufbau, als Hardware realisieren, programmieren und testen. Abschließend informiert der Ausblick in Kapitel 11 über die neuesten Entwicklungstrends zum Thema Embedded Intelligent Systems. In

1

3

Einleitung

An der Erstellung der in diesem Buch aufgeführten Programme und der Hardware waren Herr Dipl.-Ing. Grote und Herr Dipl.-Ing. Harling wesentlich beteiligt. Dazu gehören die meisten der vorgestellten Assembler-Programme. Das Embedded Systems Experimentalboard und die vorgestellten C-Programme basieren auf Entwicklungen von Herrn Grote. Herr Harling hat unter anderem wesentlichen Anteil an den Ausführungen zur Hardware des Barcode-Sensors. Dafür und für ihre wichtigen Beiträge und Ideen möchte ich mich herzlich bei Herrn Grote und Herrn Harling bedanken.

Herausgeber dieser Buchreihe, Anregungen und Diskussionen. Dem

Herrn Prof. Dr.

Hoppe,

danke ich für die zahlreichen

Ganz besonders möchte ich mich bei meiner Frau Anna-Kristina und meinen Söhnen Alexander, Manuel und Julian für ihre Geduld und Rücksichtnahme bedanken. Ohne ihre liebevolle Unterstützung wäre dieses Buch nicht entstanden.

2

Spezifikation und Design von Embedded Systems

2.1

Grundlagen

Die Entwicklung eines Embedded Systems beinhaltet die Hard- und Software sowie den mechanischen Aufbau. Diese zentralen Komponenten lassen sich nicht unabhängig voneinander betrachten. Ihre Abhängigkeiten müssen beim Entwurf erfasst und bei der Entwicklung berücksichtigt werden, wie beispielsweise in folgenden Fällen: • Die Interaktion von Software und (digitaler) Hardware hat vor allem Einfluss auf die Rechenzeit und den Speicherplatzbedarf. Algorithmen hoher Komplexität, die schnell ausgeführt werden müssen, erfordern Prozessoren mit kurzen Zykluszeiten und evt. speziellen Architekturen. Es ist in diesem Zusammenhang empfehlenswert, in der Planungsphase Softwaremodulen Zeit- und Ressourcenanforderungen zuzuordnen. • Systeme, die unter Echtzeitbedingungen arbeiten, erfordern Algorithmen und Betriebssysteme mit deterministischem Zeitverhalten sowie geeignete Prozessoren. • Intelligente Sensoren übernehmen Messdaten und werten diese aus. Dazu sind die passenden Prozessoren bzw. Controller auszuwählen. Häufig ist die Größe des Prozessors und dessen Energieverbrauch für diesen Produktbereich ein Bewertungskriterium, was in Konflikt zu einer gegebenenfalls erforderlichen hohen Rechenleistung stehen kann.

2.2

Spezifikation und Design

Ein

typisches Embedded-System-Projekt gliedert sich in die Spezifikations-, die Entwicklungs- und die Testphase. Es umfasst prinzipiell die folgenden Stufen, wobei die Benennung und Anzahl der Stufen kultur- und unternehmensabhängig unterschiedlich sein kann (z.B. werden häufig die Kundenanforderungen in das Pflichtenheft integriert, u.a. wenn der Kunde schon detaillierte Vorstellungen vom Produktaufbau hat): Das Lastenheft (engl: User Requirement Specifications URS) spezifiziert die Anforderungen an das zu entwickelnde System aus Kundensicht, wie beispielsweise die Lesegeschwindigkeit eines intelligenten Sensors, die Ablaufsequenz von Bedienfunktionen oder die Festlegung von Schutzmaßnahmen (z.B. gegen Staub und Feuchtigkeit). Darüber hin•

=

6

2 aus

beinhaltet das Lastenheft

Spezifikation und Design von Embedded Systems

Anforderungen

an

Herstellungskosten, Entwicklungszeit,

Wartbarkeit, Erweiterbarkeit, Verfügbarkeit und Zuverlässigkeit des Produkts sowie die Konformität mit (oft branchenspezifischen) Standards zur Sicherheit, zu Entwicklungsabläufen und zur Dokumentation (z.B. ISO 9000). Um Missverständnisse zu vermeiden, müssen die Kundenanforderungen quantitativ formuliert sein. „Weiche" Anforderungen wie „das Produkt soll alle Applikationen des alten Produkts abdecken, aber die doppelte

besitzen" sind gefährlich, da Applikationen eine gewisse Variationsbreite haben und von Randbedingungen abhängen. Im Pflichtenheft (engl: Functional Design Specifications FDS) werden der Aufbau des Systems aus einzelnen Modulen (Komponenten, Subsysteme), also die Systemarchitektur, und die Anforderungen an die Funktionen der einzelnen Module (Pflichten), wie z.B. an die Abtastrate eines AD-Wandlers, beschrieben. Auf dieser Basis lassen sich dann die Technologien für die Realisierung der Module auswählen. Weitere Kriterien, die diese Auswahl beeinflussen, sind die Verfügbarkeit von Komponenten und die Erfahrungen, die mit einer Technologie bereits durch vorher durchgeführte Projekte vorhanden sind, um Entwicklungszeiten und -risiken zu minimieren. Die Modulspezifikationen (engl: Module Design Specifications = MDS), auch Design- oder technische Spezifikationen genannt, spezifizieren detailliert die Modulrealisierungen aus technischer Sicht einschließlich ihrer Schnittstellen. Dazu gehören u.a. die Datenblätter von Hard-

Lesegeschwindigkeit





=

warekomponenten, Zeitverhalten, Schaltpläne, Berechnungen, Programmablaufdiagramme -struktogramme sowie Programmanforderungen, -beschreibungen und -skelette. Entwicklung der Module. Test der einzelnen Module gegen die Modulspezifikationen. Integration der Module und Test des Produkts gegen das Lastenheft. bzw.



• • •

Test des Produkts gegen das Lastenheft und Abnahme durch den Kunden.

Diese Schritte entsprechen dem sog. V-Modell (Abb. 2.1), bei dem die drei Spezifikationsschritte auf der linken Seite eines Vs und die Entwicklungs- und Testschritte auf der entsprechenden Position der rechten Seite dargestellt sind (Blan 1998). Das V-Modell erlaubt ein kontrolliertes Vorgehen. Bei dynamischen Anforderungen an den Entwicklungsprozess stößt das V-Modell an seine Grenzen. Ein gewisser Grad an Flexibilität kann erreicht werden, indem Rückkopplungen und Iterationen zwischen den Stufen vorgesehen werden. Dagegen sind andere Modelle, wie das Spiralmodell oder das Rapid Development Modell (Hrus 2002), von der Grundstruktur her auf eine hohe Flexibilität angelegt, worunter aber die Kontrollierbarkeit eines Projekts leiden kann. Die

Entscheidung über ein eher starres oder ein eher flexibles Entwicklungsmodell hängt u.a. der Beherrschbarkeit einzusetzender Technologien, der Systemkomplexität und der Bereitschaft (oder dem Wunsch) des Kunden zur Adaption der Spezifikationen während der Entwicklungszeit ab. Hier sind Risikoanalysen und besondere Vereinbarungen mit dem von

Kunden gungen.

mierung.

notwendig, wie z.B. ein reguläres Update der Spezifikationen oder AbbruchbedinFeasibility-Studien und Prototypenentwicklungen sind Methoden zur Risikomini-

2.2

Spezifikation und Design

7

Abnahmetest

Kundenan

forderungen -

Systemarchitektur, Spezifikation der

Integrationstest

Modulfunktionen Modultest

Moduldesign

Entwicklung Abb. 2.1: Das V-Modell

Schon in der Planungsphase müssen Testszenarien etabliert werden, mit denen das Einhalten der Spezifikationen eindeutig nachzuweisen ist. Der Kunde sollte die Verpflichtung eingehen, das Produkt abzunehmen, wenn alle zu den Spezifikationen gehörigen Testszenarien erfolgreich durchgeführt wurden. Als Planungsmittel stehen unterschiedliche Methoden zur Verfügung. Zur Umsetzung der im Lastenheft spezifizierten Kundenanforderungen in die im Pflichtenheft spezifizierten Produktfunktionen empfiehlt sich eine Anhängigkeitstabelle, in der die einzelnen Kundenanforderungen (z.B. Lesegeschwindigkeit eines intelligenten Barcode-Sensors) den daraus resultierenden Funktionalen Spezifikationen der einzelnen Module (z.B. Abtastrate des Analog/Digital-Umsetzers ADC des Moduls Mikrocontroller) gegenübergestellt werden. Dadurch lassen sich Spezifikationen zurückverfolgen und Abhängigkeiten dokumentieren. Eine

Abhängigkeitstabelle (Tab.2.1) kann folgenden Aufbau haben:

Tab. 2.1: Ausschnitt aus einer Abhängigkeitstabelle (ADC= Analog-ZDigital-Umsetzer)

Kunden-

anforderungen Max. Lesegeschwindigkeit: 1 m/sec

Hardwaremodul Mikrocontroller

Softwaremodul Auswerteroutine

Rechenleistung: 1 Programmbe-

Berechnung der Balken-

fehl/

us

breite in

max.

Mechanikmodul

Optik

500 Pro-

grammbefehlen

Lesegeschwindigkeits- Entweder 2 ADC: Algorithmus für unabhängige Auswer- Abtastrate 50 ps Geschwindigkeitsoder 2 Timer: schätzung tung

2 Photoelemente

Farbiger Pharmacode

Weißlicht 5500 mcd

Zählrate 50 ps

8-Bit-Datenbreite

Algorithmus für Kontrastanpassung

2

8

Spezifikation und Design von Embedded Systems

In einer Optionstabelle (Tab. 2.2) sind die möglichen alternativen Lösungsvarianten von Software (z.B. verschiedene Algorithmen, verschiedene Betriebssysteme), Hardware (z.B. verschiedene Prozessortypen) und Mechanik (z.B. verschiedene Gehäusetypen) gegen die im Pflichtenheft spezifizierten Module aufgelistet. Alle technisch realisierbaren Lösungskombinationen (Optionen) werden markiert, um daraus die optimale Variante herauszusuchen. Lösungskombinationen bestehen aus Lösungen, die zueinander passen. Beispielsweise ist die Option „Mikrocontroller: Lösung 3 / Auswerteroutine: Lösung 1 / Optik: Lösung 2" realisierbar, weil der SAB 80535 einen ADC besitzt. Dies ist notwendig, um die im Softwaremodul geforderte Auswertung abgetasteter Werte durchzuführen. Die Entscheidung für die beste Option basiert auf einem Bewertungsmaß. Häufig verwendete Bewertungsmaße sind der maximale Gewinn, das minimale Entwicklungsrisiko oder eine Kombination aus beiden. Hängt das Bewertungsmaß nicht nur von der Lösungskombination, sondern zusätzlich von Randbedingungen ab, so gruppiert man diese in Szenarien. Für jedes Szenario und jede Option lässt sich ein Bewertungsmaß berechnen und in einer Entscheidungsmatrix auflisten. Eine mögliche Entscheidungsstrategie ist es dann, aus dem Szenario, das mit der größten Wahrscheinlichkeit eintritt, die Option mit dem besten Entscheidungsmaß zu wählen. Tab. 2.2: Ausschnitt aus einer Optionstabelle

Lösung

Hardwaremodul Mikrocontroller PIC 16C74B

Lösung 1

Softwaremodul Auswerteroutine

Optik Auswertung abgetaste- Glühlampe

ter

Lösung 2

8051

Lösung 3

SAB 80535

Die Basis für die

Mechanikmodul

Werte

Auswertung von Ti-

LED

merdaten

ist ein Projektplan, in dem, üblicherweise für jedes Geräten und Finanzmitteln über der Zeit aufgetragen Personal, sind. Häufig findet dafür das GANT-Diagramm (Blan 1998) Verwendung (Abb. 2.2). Abweichungen vom Zeitplan oder der erreichten Entwicklungsziele erfordern eventuell ein rechtzeitiges Überarbeiten des Projektplans oder der Spezifikationen. Bei größeren Projekten ist es wichtig, in den Projektplan Meilensteine einzuarbeiten. Das sind feste Termine, an denen ein Projektzwischenstand erreicht sein soll, und die mit Testszenarien überprüft werden. Damit lässt sich frühzeitig feststellen, ob sich ein Projekt innerhalb der Planung bewegt, um bei Abweichungen Gegenmaßnahmen einzuleiten.

Projektüberwachung

Modul, die Allokation

von

2.3

Übungsaufgaben

9 1/05

Mikrocontroller

11/05

m/05

IV/05

1/06

11/06

Platinendesign Bestückung Modultest

Auswerteroutine Entwurf

Implement. Modultest

Optik

Platinendesign Bestückung Modultest

Integration

Integration Funktionstest

Abb. 2.2: Ausschnitt aus einem GANT-Diagramm: Die Balken markieren den geplanten Zeitraum für eine Projektphase. Die 2. Hälfte des 4. Quartals 2005 dient als Zeitpufferfür ungeplante Verzögerungen, daher sind hier keine Aktivitäten eingetragen.

2.3

Übungsaufgaben

Aufgabe 2.1

Nennen Sie die besondere

Systems.

Problemstellung

bei der

Entwicklung

von

Embedded

Intelligent

Aufgabe 2.2

Welche Modelle werden für sich?

Entwicklungsprojekte verwendet und worin unterscheiden diese

Aufgabe 2.3

Nennen Sie die wichtigsten Stufen, in die ein dem V-Modell untergliedert ist.

Embedded-Systems-Entwicklungsprojekt nach

Mustererkennung : Intelligente Algorithmen für Embedded Systems Definition und Verarbeitungsschritte

3.1 Die

Erfassung physikalischer Größen wie Strom, Spannung oder Schalldruck und eine Ablei-

Überschreitung eines Schwellwerts ist durch einfache Verdie z.B. auf geeigneten Mikrocontrollern implementiert sind, möglich.

tung ihrer Bedeutung wie die

gleichsoperationen, Häufig

sind

jedoch

Informationen in

komplexen

oder mehrdimensionalen

Signalverläufen

„versteckt" und nicht direkt messbar. Dazu gehören beispielsweise gesprochene Worte und Bilder (Abb. 3.1 und Abb. 3.2). Man spricht bei diesen Signalen auch von Mustern. Mit Hilfe

Mustererkennungsverfahren lassen sich diese Signale analysieren und ihr aufgabenbezogener Informationsgehalt, wie Wörter in einem Sprachsignal oder Objekte in einem Bild, erkennen und verstehen. Intelligente Embedded Systems, die auf komplexe Signale reagieren müssen, verfügen über entsprechende Algorithmen. von

Signal zum Shop der Maschine

Benutzer

Implementierter Mustererkennungs-Algorithmus erkennt das Wort "Ausschalten"

Abb. 3.1:

Spracherkennung als Beispiel einer Mustererkennungsapplikation

12

Abb. 3.2:

3

Mustererkennung

Bildverarbeitung mit einer intelligenten Kamera als Beispiel einer Mustererkennungsapplikation

Mustererkennung lässt sich daher definieren als: Die Analyse eines komplexen Signals (=Muster), um Objekte samt ihren Eigenschaften zu erkennen oder um dessen Bedeutung im Zusammenhang mit einer Aufgabe und Umgebungsbedingungen zu verstehen. Die typische Ablaufsequenz eines Mustererkennungssystems ist in Abb.3.3 dargestellt: Im ersten Schritt wird das Muster aufgenommen, digitalisiert, gespeichert und, falls notwendig, einer Vorverarbeitung unterzogen. Anschließend erfolgt die Segmentierung in einzelne Objekte. Dazu zählt beispielsweise die Unterteilung eines Sprachsignals in diejenigen Bereiche, die einzelne Wörter darstellen. Für jedes Objekt werden Merkmale berechnet und auf der Basis eines Modells klassifiziert. Das Ergebnis einer Mustererkennung sind ein oder mehrere klassifizierte Objekte wie ein erkanntes Wort (Spracherkennung), erkannte Hindernisse (Robot Vision) oder ein Produkt guter bzw. schlechter Qualität (Qualitätskontrolle).

3.1 Definition und

Verarbeitungsschritte

13

Wenn das Ergebnis keine Entscheidung für eine Klasse, sondern eine Hypothese darstellt, sind weitere Iterationsschritte mit hypothesenabhängigen Modifikationen erforderlich. Dabei wird gezielt überprüft, ob die in der ersten Mustererkennungsiteration erstellte Hypothese bestätigt werden kann oder zu verwerfen ist. Dieser Fall macht die Erstellung einer neuen Hypothese erforderlich. Die oben genannten Schritte sind Teil der sog. Erkennungsphase, in der ein unbekanntes Muster analysiert wird. Voraussetzung dazu ist die Anpassung des Mustererkennungssystems an einen Problembereich, damit das System „weiß", was es erkennen und unterscheiden soll. Dazu wird der Klassifikator entweder mittels Parametrisierung oder in einer Lernphase an den Problembereich adaptiert. Die Parametrisierung ist dann ausreichend, wenn sich die zu unterscheidenden Klassen arithmetisch beschreiben lassen. Dagegen ist der Einsatz von Lemstrategien dann sinnvoll, wenn die Merkmale der verschiedenen Klassen a priori unbekannt oder statistischen Variationen unterworfen sind. Dazu gehört das „Erlernen" der Wörter, die das System erkennen soll.

Erkennungsphase

Analoges Signal f(a)

Signalakquisition und -vorverarbeitung Digitales Signal f(s)

Segmentation M

Objekte

A Merkmalsberechnung N Merkmale pro

Modell

Klassifikation

Hypothese

Zuordnung von jedem Objekt zu einer Klasse Q ¡

Lernphase oder Parametrisierung Abb. 3.3:

Objekt

Verarbeitungsschritte eines Bildverarbeitungssystems

3

14

Mustererkennung

Beim überwachten Lernen wird dem System eine Lernstichprobe aus Mustern, deren Klassen bekannt sind, präsentiert. Durch ein Optimierungsverfahren lässt sich der Klassifikator auf die optimale Trennung hin adaptieren. Waren die Lernstichproben repräsentativ, so kann der Klassifikator nach der Lernphase unbekannte Muster richtig klassifizieren.

Strategien für ein unüberwachtes Lernen finden selbstständig Cluster im Merkmalsraum, als Klassen interpretiert werden.

die

Manche der beschriebenen Schritte können applikationsabhängig übersprungen oder in sehr einfacher Form mit Look-up-Tabellen oder Toleranzbereichen anstelle der Klassifikation realisiert werden. Man kann unter diesem Gesichtspunkt auch die Erkennung von Barcodes als sehr einfaches Mustererkennungproblem ansehen, da auch hier die oben genannten Verarbeitungsschritte ablaufen.

Gegenstand die genauere

3.2

der nächsten Abschnitte ist die mathematische Formulierung von Mustern und Beschreibung der einzelnen bei der Mustererkennung ablaufenden Schritte.

Musterrepräsentation

die Muster repräsentieren, lassen sich als ein Satz von Funktionen darstellen, die mehreren Variablen abhängen. Die mathematische Beschreibung eines Musters lautet:

Signale, von

ff^,a2,...aK)^ Iia)

=

f2(ax,a2,..xiK)

fL(a„a2,...aK)^ Einige Beispiele von Mustersignalen sind: • Sprachsignal: f(a)=p(t) •

Monochrome Bilder:

Farbbilder:

p(t) ist der Schalldruck als Träger der

f(a],a2) h(x,y) =

Sprachinformationen; h(x,y) ist die Helligkeit keit der Koordinaten

x

in Abhängigund y;

fi(al,a2) r(x,y) r(x,y), g(x,y) and b(x,y) sind f2(ax,a2) g(x,y Basisfarben Rot, Grün und Blau; f1(ai,a2) =b(x,y) =

die

=

Elektronische Nase: f(a)

=

d(m)

d(m) ist die Dichte der

gelagerten külart;

am

Moleküle mit

m

Sensor abals Mole-

3.3

Signalakquisition

15

Eine einzelne Funktion /, (a) wird manchmal Kanal genannt wie der Rot-, Grün oder Blaukanal bei einer Farbkamera. Hängt eine Funktion von der Zeit t ab (z.B. beim Sprachsignal), so spricht man vom Zeitbereich, stellen die Variablen Ortskoordinaten dar, so ist der Begriff Ortsbereich geläufig.

3.3

Signalakquisition

Signalakquisition wandelt ein Sensor physikalische Signale f(a) wie Schalldruck oder Lichtintensität in elektrische Signale um. Sind diese gewandelten Signale analoger In der Phase der

Natur, wie bei einem Schallwandler oder einer Photodiode,

so ist anschließend eine AnaBildsensoren liefern log/Digitalwandlung erforderlich. Moderne dagegen direkt digitalisierte Werte. Das digitalisierte Muster f(s) ist dann ein Satz von Funktionen in Abhängigkeit der diskreten Variablen s, die im Zeitbereich Abtastzeitpunkte, im Bild die Koordinaten bedeuten.

Wesentliche Kenngrößen der Sensorelemente sind deren spektrale Empfindlichkeit und die Richtcharakteristik. In der Regel ist das Muster keine aktive Signalquelle, sondern reflektiert oder streut die von einem Sender, wie einer Lichtquelle oder einem Ultraschallwandler, kommenden Wellen. Zur Bestimmung der Gesamt-Übertragungsfunktion sind die spektralen und die Richtungseigenschaften sowohl vom Sender als auch vom Empfänger (Sensor) zu

berücksichtigen. In einigen Anwendungsfallen

muss das gewünschte Muster aus den Sensoren erst rekonstruiert werden. Dazu zählen Bilder, deren Generierung durch Triangulation, Laufzeitmessungen oder Tomographie-Algorithmen (Backprojection) erfolgt.

Die Mustersignale f(a) hängen in den meisten Fällen von der Variablen Zeit t oder von den Ortskoordinaten x und y (bei 3-D-Bildern auch von z) ab. Daher unterscheidet man den Zeitund den Ortsbereich. In beiden Fällen ist die Abtastrate und die Auflösung problemorientiert zu dimensionieren. Für die Bestimmung der Abtastfrequenz ist das Shannonsche Abtasttheorem zu berücksichtigen. Dies besagt, dass die Abtastfrequenz fs mindestens doppelt so groß wie die höchste im Mustersignal vorkommende Frequenz fmax (genau genommen die Bandbreite) sein muss:

fs>2 fmax Für den Fall, dass die höchste in einem Sprachsignal vorkommende Frequenz 1 kHz ist, muss mindestens mit einer Abtastfrequenz von 2 kHz gearbeitet werden. Da Störungen aber höhere Frequenzen beinhalten können, ist eine höhere Abtastfrequenz sowie die Verwendung eines

Anti-Aliasing-Filters, das das Signal bei/s/2 abschneidet, notwendig.

Die in einem Bild vorkommenden Ortsfrequenzen lassen sich als Helligkeitsschwingungen interpretieren. Kleine Objekte korrespondieren mit hohen, große Objekte mit niedrigen Ortsfrequenzen. Das Shannonsche Theorem ist verletzt, wenn eine „Ortsschwingung" auf weniger als zwei Pixel abgebildet wird. Dann können die sog. Moiree-Muster entstehen.

3

16

Die abgetasteten Signale werden zumindest rationen gespeichert.

Mustererkennung

temporär für die weiteren Mustererkennungsope-

Die Bezeichnung für einen einzelnen abgetasteten Wert ist Sample, in zweidimensionalen Bildern ist der Begriff Pixel, in dreidimensionalen Bildern der Begriff Voxel üblich.

Signalvorverarbeitung

3.4 Die

aufgenommenen Signale können Störungen oder Inhomogenitäten, die dem Muster überlagert sind, enthalten. Dies kann die Ausführung der nächsten Schritte beeinträchtigen. In diesen Fällen ist für eine erfolgreiche Segmentierung vor allem eine Signalvorverarbeitung notwendig. Nachfolgend ist eine Auswahl bekannter Verfahren aufgelistet: Kontrastverbesserung durch Verstärkungsänderung oder Histogrammangleichung; • Tiefpassfilter zur Störungsreduktion oder zur Verstärkung großer Strukturen; Morphologische Filter zur Störungsreduktion unter Beibehaltung der Kanten; Hochpassfilter zur Verstärkung kleiner Strukturen; Signaldemodulation; • Inverse Filter zur Kompensation der Übertragungsfunktion des Aufnahmesystems. Die Realisierung von Tiefpassfiltern basiert auf einer Mittelwertbildung. Im eindimensionalen Fall eines Sprachsignals wird der n-te Abtastwert p(tn) durch den Wert pv(tn) mit •



• •

pv(tn) S p(tn+k)/K =

ersetzt, wobei die Summenbildung über k = -K/2 K/2 durchgeführt wird. K ist typischerweise eine gerade Zahl zwischen 2 und 10. Diese Mittel Wertberechnung erfolgt für alle Abtastwerte. Im zweidimensionalen Fall von Bildern wird der Mittelwert über beide Koordinaten berechnet. ...

Hochpassfilter erzielen durch eine Differenzbildung zwischen dem aktuellen Wert p(tn) und der Umgebung die Kontrastverstärkung. Der gefilterte Wert pv(tn) berechnet sich aus der Differenz zwischen dem aktuellen Wert p(tn) und der Summe aus den ihn umgebenden Werten:

pv(tn)

=

p(tn)) I p(tn+k)/K. -

Die

Summenbildung des Minuenden erfolgt wie oben über k

Zum Studium weiterer verwiesen.

Filteralgorithmen

=

-K/2

...

K/2.

sei auf die weiterführende Literatur (Paul 2003)

3.5

17

Segmentierung

3.5

Segmentierung

Die digitalisierten und gegebenenfalls vorverarbeiteten Muster enthalten Bereiche, in denen die zu erkennenden Informationen enthalten sind, wie die schon erwähnten Wörter eines Sprachsignals, und Bereiche ohne Nutzen für die Mustererkennung, wie Sprechpausen. Segmentierung ist die Identifizierung der Objekte von Bedeutung in einem Muster, dem sog. Vordergrund. Abhängig vom Signal können Objekte z.B. Wörter oder Phoneme sein oder Bildteile einer bestimmten Helligkeit, Farbe, Kontur oder Textur. Nur diese Objekte werden im Gegensatz zum verbleibenden Hintergrund weiterverarbeitet.

Die Segmentierung erfolgt in der Regel in zwei Schritten: 1. Die Identifizierung von Vordergrundsamples, d.h. Samples, die mit hoher Wahrscheinlichkeit Objekten angehören. Hier lassen sich drei Ansätze unterscheiden: a) Die intensitätsbasierte Methode, auch Schwellwertmethode genannt, nutzt als verbreitetstes Verfahren die Tatsache aus, dass alle Vordergrund-Samples eine ähnliche Intensität aufweisen. Sie lassen sich daher identifizieren, indem für jedes Sample überprüft wird, ob dessen Intensität innerhalb eines durch Schwellwerte spezifizierten Bereichs liegt. Diese Methode wird daher Schwellwertmethode genannt. b) Die regionorientierten Verfahren analysieren Intensitäten in zusammenhängenden Gebieten auf gemeinsame Eigenschaften wie statistische Charakteristika. c) Kantenorientierte Techniken erkennen aus Diskontinuitäten Kanten und versuchen ihnen zu folgen. Aus diesen Ansätzen resultiert ein Binärmuster, in dem Vordergrundsamples (bzw. die Kanten) mit 1, Hintergrundsamples mit 0 markiert sind. 2. Das Erkennen aller Vordergrundsamples, die zu einem einzelnen Objekt gehören, und die Zuordnung einer Nummer zu diesem Objekt. Dazu werden alle Vordergrundpixel, die räumlich verbunden sind, also benachbarte Samples haben, als zu einem Objekt zugehörig angesehen und mit derselben Objektnummer m markiert. Dieser Ansatz wird Label-

ling genannt. Nach der Segmentierung Objektnummer m besitzt.

ist das Muster in M

Objekte separiert,

wobei

jedes Objekt eine

Am Beispiel eines einfachen Bildmusters soll die Segmentierung mit Schwellwertverfahren erläutert werden: Ein digitalisiertes Bild (Abb. 3.4a) habe einen Helligkeitsbereich von 0 255 (Digitalisierungstiefe 8 bit) und bestehe aus einem hellen Hintergrund der Helligkeit 190 (± 35) und 4 kreisförmigen Objekten der Helligkeit 50 (± 25). Zur Segmentierung werde nun eine Schwelle von 100 gewählt, wodurch alle Pixel mit einer Helligkeit unterhalb von 100 als objektzugehörig gewertet und daher mit 1, die übrigen Pixel mit 0 markiert werden. Das resultierende Schwellwertbild (Abb. 3.4b) hat also binären Charakter. ...

3

18

Mustererkennung

oo oo b)

a) Abb. 3.4:

Originalbild mit 4 dunklen Bereichen der mittleren Intensität 50. 100) sind alle Pixel des Vordergrunds mit 1 markiert.

(Schwellwert

Nach einer Schwellwertoperation

=

Durch die anschließende Zugehörigkeitsanalyse werden alle mit 1 markierten zusammenhängenden Pixel als eigene Objekte erkannt und mit einer Objektnummer versehen (Abb. 3.5).

Abb. 3.5:

Segmentiertes Bild mit Objektnummern

Dazu durchsucht der

Algorithmus das Bild zeilenweise, von links oben beginnend, nach Vordergrundpixel ab. Sobald eines gefunden ist, wird dieses mit einer (noch nicht verwendeten) Objektnummer gekennzeichnet. Existiert rechts bzw. senkrecht oder diagonal darunter ein weiteres Vordergrundpixel, so erhält dieses dieselbe Objektnummer. Setzt man dieses Verfahren zeilenweise fort, so lassen sich alle Pixel dieses Objekts detektieren und mit der Objektnummer versehen. Der Ansatz wird dann für die weiteren Objekte wiederholt. Feste Schwellen lassen sich, falls bekannt, nur Intensitätscharakteristika verwenden. Ansonsten

zur

Segmentierung

muss

von

der Anwender bei

Mustern ähnlicher

jedem

neuen

Mus-

3.6

19

Merkmalsberechnung

die Schwelle interaktiv einstellen oder es wird ein adaptives Verfahren zur automatischen Schwellwertbestimmung eingesetzt. Ein bekannter Ansatz ist die Histogrammmethode. Dabei erfolgt die Ermittlung des optimalen Schwellwerts aus dem Histogramm des digitalisierten Bilds, z.B. aus der Lage des absoluten Minimums. ter

Abb. 3.6: Ideales Histogramm eines monochromen Bildes man das Histogramm (Abb. 3.6) des in Abb. 3.4 dargestellten Bilds, so erkennt zwei Maxima, die sich aus den Vordergrundpixeln, die ein Maximum bei der Intensität 50 ausprägen, und den Hintergrundpixeln mit einem Maximum von 190 zusammensetzen. Die Berechnung des absoluten Minimums aus dem Histogramm ergibt die optimale Schwelle 100. Als geeigneter Algorithmus für die Minimumsuche ist das Gradientenverfahren 1. Ordnung zu nennen. Das Verfahren arbeitet adaptiv, da sich die Schwellwertsuche unterschiedlichen Helligkeiten anpasst. Wäre das Bild in Abb. 3.4 um 20 Stufen heller, so würde sich auch das Minimum auf 120 ändern und die daraus ermittelte Schwelle wäre für dieses helleren Bild wieder optimal. Es funktioniert allerdings nur, wenn sich Vorder- und Hintergrund in der Intensität eindeutig unterscheiden und im Histogramm zu differenzieren sind. Dies setzt häufig den Einsatz geeigneter Vorverarbeitungsalgorithmen, z.B. zur Elimination von

Analysiert man

Störungen, voraus.

bei der Mustererkennung ein zweistufiger Merkmalsberechnungsprozess: Im ersten Schritt der Segmentierung werden Merkmale zur Vordergrunderkennung bestimmt (Intensität einzelner Samples, statistische Verteilung von Intensitäten, Kanten), daran anschließend werden die Merkmale zur Charakterisierung der Objekte ermittelt, wie sie im nächsten Kapitel beschrieben sind.

Prinzipiell erfolgt

Merkmal sberechnung

3.6 Bei der

Merkmalsberechnung wird von jedem der M Objekte ein Merkmalsvektor x

x -1\x 1 —


VGND (OV) 0 >

Im

DAPR

Singel-Modus (ADM = 0) wird

der AD-Wandler gestartet, sobald

.—

MX2 MX1

.

,

(UAll)

in das DAPR-Register geschrieben wird. Dann erfolgt eine Wandlung.

-

MXO

ADM

ANO Analog Input 0 AN1 Analog Input 1 AN2 Analog Input 2 AN3 Analog Input 3 AN4 Analog Input 4 AN5 Analog Input 5 AN6 Analog Input 6 AN7 Analog Input 7 AD-Wandler-Modus ADM 0 eine Wandlung ADM = 1 ständige Wandlung =

BSY

Busy

BSY BSY

= =

0 1

Wandlung beendet Die AD-Wandlung läuft

HEX

DAPR (.7-4) DAPR

(.3-0)

0000

=

VlntGND

=

5V * 5V *

DAPR(7-4) /16 DAPR(.3-.0) / 16

mit mit

DAPR(.7-.4) > 3 DAPR(.3-.0) < 13

VintREF muß mindestens 1 V größer sein als VintREF

Ueln Uein

=

VintREF

=

VtntGND

ergibt ADDAT FFh ergibt ADDAT 00h =

=

VlntGND

V

0.0000 V 0,3125V 0,6250 V 0,9375 V

1,2500 V 1,5625 V

1,2500 V 1,5625 V 1,8750 V 2,1875 V 2,5000 V 2,8125V 3,1250V 3,4375 V 3,7500 V

5.000

0001 0010 0011 0100 0101 0110

1.8750 V

0111

2.1875V 2,5000 V 2,8125V 3,1250 V 3,4375 V 3,7500 V 4,0625 V 4.3750 V 4,6875 V

1000 1001 1010

VintREF

VlntRef

1011 1100 1101

1110

Hinweise für genauere Anwendungen: 1. Verbesserung der Auflösung, Indem VintREF und Vmgnd durch sinnvolle Programmierung des DAPR-Registers optimal eingestellt werden. Die Meßbereichseinstellung 0.5 V ergibt bei 8 Bit eine Auflösung von ca. 20 mV. Dagegen verbessert sich die Auflösung bei einer Meßbereichseinstellung von z.B. 1,25 2,5 V auf ca. 5 mV. 2. Auch die beiden niederwertigen Bits des 10 Bit AD-Wandlers verwenden. Reg. ADDATl (DAh) Bit 7 und 6 (LSB). 3. Separate 5V Referenzspannung erzeugen. ...

Abb. 5.13: Der AD-Wandler im Mikrocontroller 80535

5 Aufbau

74

von

Embedded

Systems mit dem Mikrocontroller SAB

Serielle Schnittstelle Die Programmierung der seriellen Schnittstelle benutzt das

80515/535

Special-Function-Register

(Tab. 5.3) • • •

• •

SCON mit den Initialisierungs- und Kontrollbits SMO, SM1, SM2, REN, TI und RI, PCON mit dem Initialisierungsbit SMOD, ADCON mit dem Initialisierungsbit BD und den seriellen Buffer SBUF sowie, falls Interrupts verwendet werden sollen, IENO mit den Bits ES und EAL (nur bei Verwendung von Interrupts).

Der SAB 80515/535 stellt dafür vier Modi zur Verfügung. Dem Standardfall einer seriellen 8-Bit-Übertragung mit variabler Baudrate entspricht der Modus 1. Dieser wird selektiert, indem man im SFR SCON das Bit SMO löscht und das Bit SM1 setzt. Es ist weiterhin für die Initialisierung erforderlich, sowohl REN (Freigabe des Empfangs) als auch TI zu setzen, SM2 (Ignorieren des Stoppbits) und RI aber zu löschen. Da TI und RI bei der Schnittstellenbenutzung signalisieren, dass die Schnittstelle ein Zeichen gesendet (TI = 1) bzw. empfangen hat (RI 1), ist deren Initialisierung nur notwendig, wenn sie im Programm abgefragt werden (s.u.). TB8 und RB8 haben für Modus 1 keine Bedeutung und können gelöscht werden. Als Alternative zur Änderung der beschriebenen Bits kann SCON mit dem Wert 01010010b geladen werden, um die Initialisierung zu erreichen. Modifiziert man hingegen die einzelnen Bits, so reicht es, nur den zu setzenden Bits den Wert 1 zu geben. Da nach dem Einschalten des Prozessors SCON auf 0 gesetzt ist, haben die zu löschenden Bits automatisch ihren richtigen Wert 0. =

Ein Setzen des Bits BD schaltet den Baudratengenerator ein, durch Setzen bzw. Löschen des Bits SMOD kann die Baudrate auf 9600 bzw. 4800 Baud eingestellt werden. Letzteres entspricht dem Laden von 80h bzw. 00h in das nicht bitadressierbare Register PCON. Ein Byte wird gesendet, sobald es in das Register SBUF reichen Senden setzt der Mikrocontroller TI auf 1.

geschrieben wird. Nach dem erfolg-

Beim Empfang eines Werts wird RI automatisch auf 1 gesetzt. Das empfangene Byte steht in SBUF. Soll der dabei ausgelöste Interrupt 4 (Interruptvektor 0023h) genutzt werden, so müssen in der Initialisierung die Bits EAL und ES gesetzt worden sein. Interrupts unterbrechen das laufende Programm, um andere Funktionen auszuführen. Ihre Funktionsweise wird in Kapitel 6 erklärt. zu vermeiden, darf ein Programm die Schnittstelle erst dann verwenTI = 1 bzw. RI 1 ist. Nur dann ist die Schnittstelle frei zum Senden bzw. nur dann wurde ein Zeichen empfangen. War die Abfrage positiv, so muss das Programm zunächst TI bzw. RI löschen und kann danach das nächste Zeichen senden bzw. das empfangene Zeichen aus SBUF auslesen.

Um

den,

Zugriffskonflikte wenn

=

Timer Für genaue Zeitsteuerungen ist die Verwendung von Timern wichtig. Von den drei Timern Timer 0, Timer 1 und Timer 2 sollen im Folgenden nur Timer 0 und Timer 1 behandelt werden. Als Timerregister dienen die Special-Function-Register (Tab 5.3)

5.5

Realisierung eines Embedded Systems



THO, TLO,

• •



75

TH1 und THO.

Für Timer O werden TLO und (abhängig vom gewählten Modus) THO nach dem Timerstart synchron mit dem Prozessortakt inkrementiert und enthalten damit die erfasste Zeit. TL1 und TH1 übernehmen diese Funktion für Timer 1.

Über das Special-Function-Register • TMOD, das die Bits Gate, C/T, MO, Ml enthält, werden beide Timer initialisiert. Es ist nicht bitadressierbar. Deswegen lassen sich dessen Bits nur verändern, indem das ganze Byte auf einmal beschrieben wird. Der Kontrolle dienen die Special-Function-Register • TCON mit den Bits TRO und TR1 sowie, falls Interrupts verwendet werden, • IEON mit den Bits ETO, ET1 und EAL. Beide Timer lassen sich in vier Modi betreiben. Der eingestellte Modus ergibt sich aus der Wertigkeit der Bitkombination Ml/MO: • Mode 0 (MI/MO = 00) THO und TLO bzw. TH1 und TL1 sind kaskadiert und arbeiten jeweils als 13-Bit-Zähler. Davon sind die unteren 5 Bit in TLO bzw. TL1, die oberen 8 Bit in THO bzw. TH1 enthalten. Die oberen drei Bit von TLO bzw. THO werden ignoriert. • Mode 1 (MI/MO 01) THO und TLO bzw. TH1 und TL1 sind kaskadiert und arbeiten als 16-Bit-Zähler. • Mode 2 (MI/MO =10) TLO bzw. TL1 arbeiten als 8-Bit-Zähler. THO bzw. TH1 beinhalten Reloadwerte, mit denen TLO und TL1 vor jedem Zählerstart vorbesetzt werden. • Mode 3 (MI/MO 11) THO bzw. TLO arbeiten als getrennte 8-Bit-Zähler. TH1 bzw. TL1 werden angehalten, sobald Timer 1 in Mode 3 geschaltet wird. =

=

Der im Folgenden genauer untersuchte Modus 2 konfiguriert die Timer als automatisch inkrementierende 8-Bit-Zähler, deren Zähllänge und damit die Timerdauer sich über einen Reloadwert einstellen lassen. Modus 2 wird durch Laden des Werts 02h für Timer 0 bzw. von 20h für Timer 1 in das nicht bitadressierbare Register TMOD eingestellt. Damit sind die Bits Ml MO sowie und GATE und C/T nicht eingeschaltet. In gesetzt jeweils gelöscht TMOD beziehen sich die oberen 4 Bit auf die Einstellung von Timer 1, die unteren 4 Bit auf Timer 0. Zur

Initialisierung des Timers sind neben MO/MI die Timer-Interrupts genutzt werden sollen.

auch die Bits EAL und ETO

zu

setzen,

wenn

Das Setzen des Bits TRO (Timer 0) bzw. TR1 (Timer 1) startet den Timer, der das Register TLO bzw. TL1 mit der Frequenz von 1/12 des Oszillatortakts (also mit 1 MHz bei einer Oszillatorfrequenz von 12 MHz) inkrementiert. Sobald TLO (bzw. TL1) 255 = FFh ist, wird =

_5 Aufbau von Embedded Systems mit dem Mikrocontroller S AB 80515/535

76

1 (Interruptvektor OBh) bzw. Interrupt 3 (Interruptvektor OOlBh) ausgelöst, TLO bzw. TL1 mit einem Reloadwert geladen und die Inkrementierung fortgesetzt.

Interrupt

Die Dauer der Inkrementierungsphase lässt sich durch den Reloadwert, welcher in THO bzw. TH1 geladen ist, determinieren, da der Timer das Register TLO bzw. TL1 ab dem Reloadwert hochzählt. Ein großer Reloadwert bedeutet eine kurze Timerzeit. Die Zeit, die zwischen den vom Timer ausgelösten Interrupts vergeht, berechnet sich aus: At (255 THO) us, wobei THO den im Register THO gespeicherten Reloadwert darstellt. =

-

Durch das Setzen der jeweiligen Gate-Bits (Special-Function-Register TMOD) lassen sich die Timer mit einem externen High-Signal an P3.2 (Timer 0) bzw. P3.3 (Timer 1) starten und mit einem Low-Signal stoppen. TRO bzw. TR1 müssen gesetzt sein. Möchte man also Timer 0 in Modus 2 betreiben und extern triggern, so erfordert dies, TMOD mit dem Wert OAh zu laden. Damit gilt für die Bits 0 3 von TMOD die Konfiguration: GATE=1, C/T=0, Ml l und M0=0. Die Benutzung von Timer 1 als Zähler bei exter7 nem Trigger setzt voraus, dass der Wert EOh in TMOD steht. Damit gilt für die Bits 4 M 1=1 und M0=0. die Konfiguration: GATE=1, C/T=0, ...

=

...

Ein Setzen der C/T-Bits schaltet die Timer auf die Zähler Counter 0 und Counter 1 um, Ereignisse mit negativer Flanke an P3.4 (Counter 0) bzw. P3.5 (Counter 1) zu zählen.

5.6

um

Integrated Development Environment (IDE)

Als

Entwicklungsumgebung für Assembler- und C-Programme wird nachfolgend die IDE „p.Vision" der Fa. Keil (Abb. 5.14) erläutert. Über die Menüleiste oder die Symbole können Projekte, in denen alle zu einem Programm gehörenden Komponenten zusammengefasst sind, bearbeitet und Entwicklungsfunktionen ausgeführt werden. Die auf einen Programmcode von 2kByte begrenzte Evaluierungsversion ist unter der Homepage der Fa. Keil http://www.keil.com/demo/ erhältlich. Größere Programme erfordern die Vollversion. In einem Projekt sind alle zusammengehörenden Dateien unter einem Namen organisiert. Es steht ein Editor, ein Compiler, ein Linker und ein Debugger für die Simulation des Programmablaufs und das Ausführen auf dem Zielsystem zur Verfügung. Es empfiehlt sich, die Projekte so zu organisieren, dass das Hauptprogramm in einer Datei (*.c für C- bzw. *.a oder *.src für AssemblerProgramme) abgespeichert ist, •





die Funktionen in einer Datei (*.c für C- bzw. *.a oder *.src für Assemblerfunktionen) zusammengefasst werden und, nur bei C-Programmen erforderlich, die Headerdatei (*.h) die Funktionsprototypen (Funktionsname (Parametertyp 1,..)) enthält.

Alle Sourcefiles *.c *.a und *.src werden in die Sourceliste der Projektverwaltung (Abb. 5.17) unter Target 1 » Source Group 1 aufgenommen, die Headerdateien *.h nicht. Letztere

5.6 Integrated Development Environment (IDE)

77

aber im selben Verzeichnis wie die Sourcefiles liegen, wenn die Preprozessoranweisung zum Einbinden im Hauptprogramm #include "headerdateiname.fi" lautet.

muss

Nach Installation und Programmstart sind folgende Schritte beim Arbeiten mit durchzuführen: • Anlegen eines Projekts: New Project, Umgebungsvariablen setzen, Save; • Erstellen des/der Sourcefiles: New File, Editieren, Save; • Compilieren und Linken: Build Target; • Ausführen: Start Debug, Run. H UseFunct

p_Vision

(C:\Eigene DateierARueck c|

uVision2

P) Re Edit View Project Debug Pefiphetals à c* y m (a # 'Si c p -a «r ä -

Jools SVCS Window Help

3#*

*


i C?

RAV

2234

-

AM>. 5.74: Bedienoberfläche der Entwicklungsumgebung pVision

1. Neues Projekt anlegen Das Anlegen eines neuen Projekts

erfolgt mit der Befehlssequenz

Project » New Project Im nun angezeigten Pop-up-Window „Create New Project" gibt der Benutzer den Projektnamen ein und speichert ihn ab. Die Vergabe der Extension *.uv2 zur Kennzeichnung einer Projektdatei

5 Aufbau

78

Embedded

von

Systems mit dem MikroController SAB 80515/535

automatisch. Diese und die weiteren zu erstellenden Dateien werden defaultmäßig im Verzeichnis „Eigene Dateien" abgespeichert. Möchte man in einem eigenen ProjektArbeitsverzeichnis arbeiten, so ist die Angabe des entsprechenden Pfads Voraussetzung.

erfolgt

2.

Umgebungsvariablen setzen Im nachfolgenden Pop-up-Window „Select Device for Target ,Target 1 wählt der Benutzer zunächst den Mikrocontrollerhersteller und dann den Controllertyp aus. In diesem Beispiel (Abb. 5.17) wird ein Evaluationsboard mit einem 80C515 Controller verwendet, die Auswahlmöglichkeit des SAB 80C535 existiert selbstverständlich auch. '"

H^MHHM^^^^^^^^^^^H^HHBH^HBnBMBgHflBIJSjxJ

Debug Peripherals Tools

Edit View Project

ndow

Help

Select Device foi Taiget "Target 1"

CPU

lu a

Target

I

Vendor:

Infineon

Device:

C515C-L

Family:

MCS-51

UseL251 instead of BL51

Database

Description:

~~3

_JC51 A-R _JC51 1-R _JC51 3A--2R

C500 señes 8051 CMOS CAN contoller with 4ch PWM.WDT, a DPTRs, 8ch ADC/10. HW FWD 57 i/0 lines. 3 Timers/Counters, 15 Interrupts/4 priorty levels ROM-less. 256 Bytes On-chip RAM + 2048 Bytes addition XRAM -

_l 051 3A-L

_I C51 ::a--r _I C51 3-R

_JC51 5-1R _I C51 5A-4R

Hr..

j|

_| C51 5A-L _| C51 5B-2R _|C51 5C-8R/-: _J _JC51 5-L

I IMN|\Ml±i Ready

R/W

i|B Start) ¿/J S ¡Si |5|Beisp¡elp!o¡ekt |iVi».. -

Abb. 5.15: Auswahl des MikroControllers

Damit ist die Entwicklungsumgebung bereits für den Betrieb im Simulationsmode eingestellt und kann als „virtuelle Hardware" benutzt werden, wie sie in Kap. 5.4 beschrieben ist. Die

Bediensequenz Project » Options for Target "Target

1

"

5.6

79

Integrated Development Environment (IDE)

ruft das Fenster für die Einstellungen zum Betrieb mit einem Zielsystem wie dem Evaluationsboard (Kap. 5.4) auf (Abb. 5.16). Das Anklicken von Target 1 im Projektfenster (links unterhalb der Menü- bzw. Sybolleisten) und die Auswahl von „Options for Target ,Target 1 aktiviert dieses Fenster ebenfalls. '"

-Ifl|x| File Edit View

Project Debug Peripherals Tools SVCS Window Help

%BaSkW3EMB

01

mal

Target] Output) Listing) C51 | A51 | L51 Locate| L51 Mise (~ Use Simulator

LU CU

ff Use:

ry Load Application at Startup

R Go fill

rrtainj]

Initialization File:

^ iGLtf1'."^. i)

JKeilMonitor-51 Driver

p1 Load Application at Startup

¡V Go

tillmainf)

Initialization File:

Target

Brome...

Browse

Restofe Debug Session Settings

Restore Debug Session Settings

W Breakpoints

W Toolbox

P Breakpoints F" Watchpoints f~ Memory Display

P Watchpoints & PA P Memory Display

Bf-

Debug

l~~ Tootbox

g Dialog DLL:

ID500 DLL

j-p515C

Dialog DLL:

Parameter:

T500.DLL

-p515C

Abbrechen

Defaults

I iHn|\HLiL Ready

JBSIartJ

R/W

°Vi 3

|iVis

20:07

Einstellungen zum Arbeiten mit dem Zielsystem

In der

Registrierkarte „Output" wird jetzt „Create HEX-File" angeklickt und in „Debug" werden „Use Keil Monitor 51 Driver" sowie „Load Applikation at Startup" und „Go till mainO" eingestellt. Die Einstellung der verwendeten Taktfrequenz findet sich unter „Target", die beim Compilieren erstellten Dokumente werden unter „Listings" ausgewählt. Die Schnittstelle zum Zielsystem ist auf COMÍ und 9600 Baud vorkonfiguriert, Änderungen lassen sich in „Settings" vornehmen. Nach dem

Abspeichern ist die Erstellung eines Projekts damit abgeschlossen.

3. Erstellen der Sourcefiles Nachdem ein Projekt angelegt oder ein existierendes

Project » Open Project

Projekt mit

5 Aufbau

80

von

Embedded

Systems mit dem MikroController S AB 80515/535

geöffnet wurde, kann das Programm erstellt werden. Headerfiles ist möglich über die Sequenz File

»

Das Editieren der

Quellcodes oder der

File New

wodurch das Editierfenster rechts unterhalb der Menü-/Symbolleisten erscheint. Nach der Eingabe des Programmcodes bzw. der Kontrollanweisungen erfolgt die Speicherung (Extensions *.c, *.src, *.a bzw. *.h ) im Arbeitsverzeichnis durch die Befehlsfolge File

»

Save As.

r#n^T^BïJ»«flfflfn^nr

.tero gramme,

h"

Memory Window

i1

r2 i3 r4

Symbol Window

r5 iG r7 B

^ Serrai Window Öl ^ Serial Window 82 ^ ToolboK

Sys

HF

â

Run m rrc

Workbook Mode

Optjons...

Connected to Monit Load "C:\NEigene I

ASM ASSIGN

lnH!HuK

Tonlänge

R7 R1

->

131 ->R6

Zeitverzögerung Schleifendauer 19 usec Nein

DECR6

THZ -> R7

DECR1

Abb. 6.5:

Tonprogramm zur Entkopplung von

Tonhöhe und Tondauer (THZ=Tonhöhenzahl)

Unabhängig

davon wird die 19p:s-Schleife endgültig verlassen, wenn diese so oft durchlaufen ist, dass die Tonlänge erreicht ist. In der Regel wird dazu die Struktur einer geschachtelten Schleife notwendig sein. Speichert man in einem Register (z.B. R6) den Wert 131 als Schleifenzähler der inneren (19us) Schleife, so kann man über ein anderes Register (z.B. RI) als Schleifenzähler der äußeren Schleife die Tonlänge bequem variieren:

Tonlänge

=

RI

R6

19us

=

RI 2,5 •

ms.

6.6

105

Unterprogramme

Es empfiehlt sich zum Abspielen von Melodien die Folge von Tonhöhenzahlen und Tonlängen in einer Tabelle abzuspeichern und nacheinander einzulesen (s. Kapitel 6.7, Tabellenver-

arbeitung).

6.6

Unterprogramme

Wird in einem (Haupt-) Programm ein identischer Teil des Codes mehrfach verwendet, wie z.B. die Ansteuerung einer LCD-Anzeige (s. Kapitel. 5.5) oder bei der Tonerzeugung (s. Kapitel 6.5), so ist es für die Übersichtlichkeit des Programms vorteilhaft, diesen Teil als Unterprogramm zu schreiben und im Hauptprogramm dort aufzurufen, wo dessen Funktionen benötigt werden (Abb. 6.3).

Unterprogramm kann prinzipiell an jede Stelle des Programmcodes geschrieben werden, empfehlenswert ist allerdings die Platzierung vor oder nach dem Hauptprogramm. Der Name (z.B. upname) steht im Labelfeld und es wird mit dem Befehl „ret" abgeschlossen: Ein

upname:

.

ret

Unterprogramme werden im Hauptprogramm mit ihrem Unterprogrammnamen aufgerufen: lcall upname

Beim Aufruf erfolgt zunächst die Zwischenspeicherung der Rücksprungadresse, d.h. der Adresse des nächsten Befehls, im Stack. Dazu sind zwei Byte erforderlich, der Stackpointer wird also um zwei erhöht. Der anschließende Sprung an die Adresse des Unterprogramms führt zur Abarbeitung dieser Befehlszeilen. Der letzte Befehl ret veranlasst den Prozessor, die Rücksprungadresse wieder aus dem Stack auszulesen (Dekrementierung des Stackpointers um 2) und das Hauptprogramm an dieser Stelle fortzusetzen. Bei verschachtelten Unterprogramm-Aufrufen sind mehrere Rücksprungadressen hintereinander im Stack gespeichert. Die

Parameterübergabe erfolgt

entweder über

Register oder

über direkte Adressen. Zwecks

Standardisierung kann der Stack genutzt werden. Dieser dient dann als Zwischenspeicher entweder für die Parameter selbst oder für die Adresse des ersten Parameters und die Parameteranzahl. Mit letzterem Ansatz lässt sich eine große Anzahl von Parametern mit nur zwei

Stackzugriffen übergeben.

106

6

Assembler-Programmierung des SAB 80515/535

Start

Rücksprungadresse im Stack speichern, danach

Sprung zu UP

Abarbeitung des Unterprogramms UP

aus

Rücksprungadresse Fortsetzung des Rücksprungadresse

Stack lesen, danach

Weitere Befehle des

Hauptprogramms an

Hauptprogramms

Rücksprungadresse im Stack speichern, danach Sprung zu UP

Abarbeitung des Unterprogramms UP

Lcall UP

Rücksprungadresse Stack lesen, danach

Fortsetzung des Hauptprogramms an Rücksprungadresse aus

Ende

Abb. 6.6: Unterprogramm-Aufruf

Unterprogramme können, z.B. zur Anzeige eines Buchstabens (hier: A), genutzt werden, um die notwendige Verzögerung nur einmal programmieren zu müssen (hier: DELAY). Wegen des LCD-Displays wird zur Implementierung das Embedded System benötigt. Im folgenden Programmbeispiel 6.3 (Emb) wird zunächst das Display gelöscht, um anschließend das Zeichen A darzustellen. Das Steuerzeichen bzw. der ASCII-Code für A liegen an P5 und werden übernommen, wenn an P4.1 eine negative Flanke erzeugt wird. Die Übernahme und das Löschen bzw. die Anzeige erfordern bis zu 2 ms (genau: 1,64 ms), die durch das Unterprogramm DELAY erzeugt wird. CLR MOV

P4.2

SETB CLR LCALL

P4.1 P4.1 DELAY

P5,

#01

(Modus: Einstellen) (Steuerwort für Löschen und Cursor an 1. Stelle in 1. Zeile)

(Vorbereitung des Triggers) (Negative Flanke triggert Ausführung der Steuerung) (Verzögerung)

6.6

107

Unterprogramme P4.2

SETB MOV SETB CLR LCALL

#41 h

P5, P4.1 P4.1 DELAY

Die Verzögerung erreicht: DELAY: LOOPB: LOOPA:

von

2

MOV MOV DJNZ DJNZ RET

(Modus: Anzeigen) (ASCII-Code des Zeichens "A")

(Vorbereitung des Triggers) (Negative Flanke triggert Ausführung der Anzeige) (Verzögerung)

im

ms

Unterprogramm

R2, #5 Rl,#200 RI, LOOPA R2, LOOPB

DELAY wird durch eine

(1 Zyklus (1 Zyklus (2 Zyklus (2 Zyklus (2 Zyklus

Die Laufzeit des Unterprogramms und damit die erreichte mäß Kap. 6.5 aus: t

=

= =

= = =

Doppelschleife

lps) lps) 2us) 2ps) 2ps)

Verzögerung

berechnet sich ge-

(b (a z + vb) + v) tz (5 (200 2 + 3) + 3) ps 2018ps •





=



= =

2

ms

Vor Nutzung des

LCD-Displays muss dieses initialisiert werden (s. Kapitel 12.6).

Folgendes Programmbeispiel 6.4 (Eval, Emb) benutzt Schleifen und Unterprogramme, um die auf dem Evaluierungsboard vorhandene LED blinken zu lassen. Die LED ist mit P1.0 verbunden und wird daher durch wiederholtes Aufrufen des CPL Pl.O-Befehls zum Blinken gebracht. Die Laufzeit eines Unterprogramms bestimmt den Zeitabstand zwischen den Aufrufen und damit die Blinkfrequenz: LOOP: P1.0 CPL LCALL DELAY LJMP LOOP DELAY: MOV R2,#5 (1 Zyklus = lps) LOOPB: MOV Rl,#200 (1 Zyklus = lps) LOOPA: MUL AB (4 Zyklus = 4ps) AB MUL (4 Zyklus 4ps) DJNZ RI, LOOPA (2 Zyklus = 2ps) LOOPB DJNZ R2, (2 Zyklus 2ps) RET (2 Zyklus 2ps) =

=

=

Die Laufzeit des Unterprogramms und damit die erreichte mäß Kap. 6.5 aus: t

=

(b (a z + vb) + v) tz (250 (200 10 + 3) + 3) ps •

= =





498750 ps



Verzögerung

berechnet sich ge-

6

108 Das

Assembler-Programmierung des SAB 80515/535

Hauptprogramm erfordert zusätzliche 5

ps, wobei das Intervall

zur

Ansteuerung der

LED, das einer halben Periode der Blinkfrequenz entspricht, T/2

498755 ps

=

dauert. Die mit dem obigen f

=

1/T

=

Programm erzeugte Blinkfrequenz beträgt also:

1/(2 498750 ps)

=

1,0025 kHz.



6.7

Tabellen Verarbeitung

Tabellen dienen der Speicherung von Daten und ermöglichen den indizierten Zugriff auf diese, wie z.B. auf Tonhöhenzahlen und Tondauern bei der Erzeugung von Melodien (s. Kapitel 6.5). Das Tonprogramm liest nacheinander die Einträge der Tabelle aus und führt dann die entsprechenden Töne aus. Ebenso können in Tabellen die Buchstaben (als ASCIIWerte) kompletter Texte, die am LCD-Display angezeigt werden sollen, hinterlegt werden. Tabellen sind bei Prozessoren der 8051-Familie im externen Programmspeicher abgelegt und durch den Tabellennamen und die Zuweisung DB (= Define Byte) mit anschließender Auflistung des Tabelleninhalts im Programm deklariert: TAB:

DB

Wertl, Wert2, Wert.3,...,

wobei die Tabelleninhalte Wertl, Wert2 usw. Zahlen zwischen 0 und 255 darstellen. Der Zugriff auf den externen Datenspeicher (und damit auf die Tabelle) erfolgt indirekt indiziert mit dem Befehl: MOVC A, @A Nutzt

+

DPTR.

den Data Pointer DPTR als Basiszeiger und setzt diesen Anfangsadresse der Tabelle mit dem Befehl

man nun

zugriff auf die MOV

vor

dem Tabellen-

DPTR, #TAB,

so lässt sich über das A-Register als Indexzeiger ein Wert A=0 greift man auf Wertl, mit A=l auf Wert2 usw. zu.

Das folgende Programm kopiert den dritten ter und danach in R0: KENNL: DB 01,04,09, 16,25 MOV DPTR, #TAB MOV A, #02 MOVC A, @A + DPTR MOV R0, A

aus

der Tabelle adressieren. Mit

Eintrag einer Kennlinien-Tabelle in das A-Regis(Tabellendeklaration) (Basiszeiger auf Tabellenadresse) (Indexzeiger auf dritten Tabellenwert)

(Tabellenzugriff) (Speicherung des Tabellenwerts in R0) (Weitere Befehle)

.

6.8

109

Interrupts

Außerdem lassen sich durch Tabellenverarbeitung dynamische Programmverzweigungen erreichen. Im folgenden Programm sind die Sprungbefehle zu unterschiedlichen Programmabschnitten in der Tabelle JMPJTBL aufgelistet. Der Index des auszuführenden Programmabschnitts gibt der Anwender über Pl ein. Dieser Index ist mit 2 zu multiplzieren, damit die Adressen der Tabelleneinträge um zwei Byte auseinander liegen:

Programmverzweigung abhängig vom Wert des A-Registers Input: A-Register * Verarbeitung: Sprunganweisungen in Tabelle JMPJTBL * Operationen abhängig von dem Wert des A-Registers Output:

* *

MOV MOV CLR RLC

DPTR, #JMP_TBL A, Pl

JMP SJMP SIMP

@ A + DPTR

Tabellenzugriff

PRGRO PRGR1

für A für A

SJMP

PRGRn

C A

Basiszeiger auf Tabellenadresse Einlesen des Indexzeigers von Pl Löschen des C-Registers Multiplikation mit zwei durch Linksrotation

JMP TBL:

PRGRO: PRGR1:

=

=

00 02

; für A = 2 n; Faktor ; Byte-Befehl

2, da SJMP 2-

PRGRn: END

6.8

Interrupts

Um Embedded

Systems die Fähigkeit zu geben, auf Ereignisse schnell zu reagieren, bedient man sich der Interrupt-Technik. Wird dieses Ereignis vom Prozessor generiert, so spricht man von einem internen, bei einem Ereignis von außen von einem externen Interrupt. Nachfolgend sollen nur die externen Interrupts behandelt werden. Ein externer Interrupt (IR) ist die Unterbrechung eines laufenden Programms zu einem unvorhergesehenen Zeitpunkt, ausgelöst durch ein externes Signal. Dieses Unterbrechungsereignis nennt man auch Interrupt-Request (IRQ). Es veranlasst den Sprung zu einem Programmteil, den man Interrupt-Serviceroutine (ISR) nennt. Sie sind Unterprogrammen ähnlich, werden aber durch die Hardware gestartet. Eine Interrupt-Serviceroutine wird immer mit einem RETI-Befehl abgeschlossen.

6

110

Assembler-Programmierung des SAB 80515/535

Sobald im Programm ein Interrupt initialisiert und freigegeben ist, reagiert der Prozessor auf einen IRQ. Er kann an jeder beliebigen Stelle im Programm ausgelöst werden. Im Moment des Interrupts wird der aktuelle Befehl im Programm noch komplett abgearbeitet und anschließend die Adresse des nächsten Befehls im Stack gespeichert. Der Programmzähler verzweigt dann zur Interrupt-Einsprungadresse (Interruptvektor), also einer Adresse im Programmspeicher, die für jeden Interrupt unterschiedlich, aber fest ist. Ab hier beginnen die Befehle der Interrupt-Serviceroutine, die bis zum RETI-Befehl abgearbeitet werden. Beim Rücksprung wird die Rücksprungadresse aus dem Stack geholt, sodass das Programm an der unterbrochenen Stelle weiter abgearbeitet werden kann. Die Interruptvektoren sind fest vorgegeben und liegen im Codespeicher des Adressbereichs 0003h-006Bh. Sie sind in Tab. 6.12 zusammen mit den Pins, an die die Leitung für den Interrupt-Request angeschlossen werden, den defaultmäßigen Signalformen der Interrupt-Requests und den Defaultprioritäten aufgeführt: Tab 6.12: Parameter der externen Interrupts

Ext.

Interrupt Anschluss (Pin) Einsprungadresse

Low

Priorität 0

53h

Interrupt-Request Pegel Low Pegel Negative Flanke Negative Flanke

5Bh 63h 6Bh

Positive Flanke Positive Flanke Positive Flanke

0

P3.2

03h

P3.3 P1.4

13h 4Bh

P 1.0 P 1.1

P 1.2 P 1.3

Die Signalformen für den Interrupt-Request von Interrupt 0 und 1 lassen sich durch Setzen der Bits ITO und IT1 auf negative Flanke ändern. Durch Setzen der Bits IFR2 und IFR3 ist der Interrupt-Request von Interrupt 2 und 3 auf eine positive Flanke geändert. Die übrigen Interrupts lassen eine Modifikation nicht zu. Ein Löschen der jeweiligen Bits stellt die Bedingungen wieder auf Defaultwerte ein. Für die

Nutzung von Interrupts in einem Programm ist es erforderlich, diese freizugeben und aktivieren. Die Freigabe aller Interrupts erfolgt durch Setzen des Bits EAL, für die Aktivierung eines Interrupts n (n=0...6) muss man das Bit EXn (EX0...EX6) setzen. Dies ist für jeden verwendeten Interrupt notwendig. Die Bits EAL und EX0-EX6 sind in den SpecialFunction-Registern IENO und IEN1 zu finden. zu

III

6.8

Interrupts

Ein

interruptfähiges Programm hat folgenden Aufbau: ORG Einsprungadresse des gewählten Interrupts n LJMP ISR

ORG Startadresse der Interrupt-Serviceroutine ISR:

....

Code der Interrupt-Serviceroutine

...

RETI

ORG Startadresse des Hauptprogramms SETB EAL SETB EXn

;n ist Nummmer der

....Code des Hauptprogramms

gewählten Interrupts

....

Abb. 6.7 zeigt den Aufbau eines Programms, das aus der Endlosschleife Loop besteht und mit Interrupt 0 arbeitet. Die Interrupt-Serviceroutine ist ISRO und der Interruptvektor liegt an der Adresse 3. Im Programm müssen die Bits EAL und EXO gesetzt werden. Beim Auslösen des Interrupts wird die Rücksprungadresse, also die Adresse, an der das laufende Programm fortgesetzt wird, im Stack gespeichert. Diese wird am Ende der Interrupt-Serviceroutine (Befehl RETI) wieder aus dem Stack ausgelesen. Es gibt vier Prioritätsstufen 0 (niedrigste Priorität) bis 3 (höchste Priorität), die durch Einstellen der Special-Function-Register IP 0 und IP 1 verändert werden können. Defaultmäßig haben alle Interrupts die gleiche, nämlich die niedrigste Priorität. Ein Interrupt einer höheren Priorität kann einen aktiven Interrupt mit niedrigerer Priorität unterbrechen. Bei gleichzeitigem Eintreffen von Prioritätsanforderungen gilt, dass ein Interrupt mit höherer Priorität zuerst behandelt wird. Eine wichtige Größe bei der Nutzung von Interrupt-Techniken ist die Interrupt-Latenzzeit. Sie repräsentiert die Verzögerungszeit vom Auftreten eines Interrupt-Requests bis zum Start der Interrupt-Serviceroutine und berechnet sich im besten Fall (Best Case) aus: 1 Zyklus Speichern des Interrupt-Requests in speziellen Bits 1 Zyklus Abfragen der Bits 2 Zyklen Sprung zum Interruptverktor 2 Zyklen Sprung zur IR-Serviceroutine (LCALL-Befehl) 6 Zyklen Interrupt-Latenzzeit Die

Interrupt-Requests werden in den Bits

IEO, IE 1 IEX2-IEX6

für IR 0 und 1 für IR 2-IR 6

(im SFR TCON) und (im SFR IRCON)

112

6

org 0003h Ijmp ISRO

2. Unterbrechung des Programms und Sprung zur Adresse 3h

1. an

Assembler-Programmierung des SAB 80515/535 3. zu

Sprung ISRO

setb EAL setb EXO

Low-Signal Pin 3.2 löst

loop:

Interrupt aus Pin 3.2

Ijmp loop

4. Rücksprung und Fortsetzung

des

ISRO:

'

Programms

reti Abb. 6.7.- Ablaufmechanismen für Interrupt 0

Sie werden gesetzt, wenn das Interrupt-Requestsignal an dem entsprechenden Pin auftritt, und vom Prozessor permanent abgefragt (Polling). Ergibt die Abfrage, dass eines dieser Bits gesetzt ist, so erfolgt der Sprung zum Interruptvektor.

gespeichert.

Die Interrupt-Latenzzeit von 6ps wird nur dann erreicht, wenn das Programm beim Auftreten des Interrupt-Requests während der Flag-Abfrage einen 1-Byte-Befehl oder das letzte Byte eines Mehrbytebefehls abarbeitet. Außerdem darf zu diesem Zeitpunkt kein anderer Interrupt einer gleichen oder höheren Priorität gestartet sein. Im schlechtesten Fall

(Worst Case) muss der Prozessor noch einen Mehrbytebefehl, den er ausführt, gerade fertig abarbeiten oder er muss eine schon laufende Interrupt-Serviceroutine beenden. Deshalb erhöht sich bei der Worst-Case-Betrachtung die Interrupt-Latenzzeit um: 1. die Zyklenanzahl des längsten Befehls minus 1. Dabei werden nur das Hauptprogramm und die Unterprogramme, nicht aber die Interrupt-Serviceroutinen betrachtet. 2. die Bearbeitungszeit bereits aktiver Interrupts mit gleicher oder höherer Priorität.

Nur eine auf dem Worst-Case-Szenario ermittelte Interrupt-Latenzzeit kann garantiert werden. Sie berechnet sich bei einem Programm mit einem Interrupt und einem MUL ABBefehl ( 4 Zyklen) als längstem Befehl aus: tz

=

6us

+

(4us lps) = 9ps -

6.9

113

Programmierung des Embedded Systems in Assembler

Programmierung des Embedded Systems

6.9

in Assembler Der Aufbau des Embedded Systems und die Funktionsweise der Peripherie LCD-Anzeige, Tastatur, AD-Wandler und serielle Schnittstelle wurden in Abschnitt 5.5 erläutert. Das Programmbeispiel 6.3 aus Kapitel 6.7 behandelte bereits die Programmierung der LCD-Anzeige. In diesem Abschnitt folgen nun einige grundlegene Programme, um Daten über diese Peri-

pherien zu erfassen und auszugeben.

Programmbeispiel 6.5 (Emb) befasst sich mit dem Mechanismus, die Wertigkeit einer ge-

drückten Taste der digitalen Matrixtastatur zu erkennen. Dazu werden die Zeilenleitungen auf 1 (= 5V) gesetzt, abgefragt und in R3 gespeichert. War eine Taste gedrückt, so ist diese durch den Wert 0 in der entsprechenden Zeilenleitung und damit dem dazugehörigen Bit von Pl zu erkennen. Entsprechend geht man mit den Spalten vor. Durch eine Oder-Verknüpfung erhält man die Spalten-/Zeilenkombination, die dann über eine Tabelle dem Tastenwert zuzuordnen ist. MOV Pl, #11111000b MOVR3, Pl

MOVPl,#10000111b MOVA, Pl ORL A, R3 MOVR3,A '

(Zeilen auf 1, Spalten auf 0) (Abfrage der Zeilen) (Spalten auf 1, Zeilen auf 0) (Abfrage der Spalten) (Kombination von Spalten und Zeilenwerten) (Abspeichern der Zeilen-/Spaltenkombination der Taste) (Zuordnung von R3 zu dem Tastenwert durch Tabelle)

Programmbeispiel 6.6 (Emb) skizziert den Mechanismus zur Ansteuerung des AD-Wandlers 0: Der Controller signalisiert, dass der AD-Wandler frei ist, indem er das Bit BSY auf 0 setzt. Durch das Schreiben eines Werts (hier 0) in das Special-Function-Register DAPR

startet der Wandler und schreibt den digitalisierten Wert in das Special-Function-Register ADD AT. Da keines der Bits MXO, MX1 und MX2 gesetzt wurde, ist der Wandler 0 ausgewählt.

WAIT:

CLR JB

MOV AD:

JB MOV

A DM (Nur eine Wandlung durchführen) BSY, WAIT (Wiederhole den Befehl JB, solange BSY=1 ist

=> Warten bis Wandler bereit ist) (Start der AD-Wandlung, Wandlerbereich: 0 5 V) (Wiederhole den Befehl JB, solange BSY=1 ist => Warte, solange die AD-Wandlung läuft) A, ADDAT (Digitalisierten Wert auslesen)

DAPR, #0 BSY, AD

...

Programmbeispiel 6.7 (Emb) befasst sich mit der seriellen Schnittstelle. Zunächst

muss

diese über das Bit BD und die Special-Function-Register PCON und SCON eingestellt werden. Ein Byte wird gesendet, sobald es in das Register SBUF geschrieben wird. Nach dem erfolgreichen Senden wird TI auf 0 gesetzt:

114

W:

6 SETB MOV MOV

BD

JNB

TI, W

CLR MOV

TI

PCON, # 10000000b SCON, #01011010b

Assembler-Programmierung des SAB 80515/535 (Baudratengenerator aktivieren)

(9600 Baud einstellen) (Modus 1 ausw., REN=1,TI=1, RI=0) (Wiederhole JNB solange TI=0 ist => Warte bis Schnittstelle frei ist) (Schnittstelle bereit zum Senden) (Zeichen aus A senden, nach Senden

SBUF, A

wird TI automatisch auf 1

Wird ein Wert

empfangen,

W:

der Controller das Bit RI auf 1. Das A-Register ausgelesen werden:

so setzt

steht in SBUF und kann in das

gesetzt)

empfangene Byte

SETB MOV MOV

BD

PCON, # 10000000b SCON, #01011010b

(Baudratengenerator aktivieren) (9600 Baud einstellen) (Modus 1 ausw., REN=1,TI=1, RI=0)

JNB

RI, W

(Wiederhole JNB solange RI=0 ist => Warte

MOV CLR

A, SBUF RI

solange

kein Zeichen emp-

fangen wurde) (Empfangenes Zeichen auslesen.) (Schnittstelle bereit zum Empfangen des nächsten Zeichens)

6.10

Übungsaufgaben

Aufgabe 6.1

a) Skizzieren Sie den Aufbau eines Mikrocomputersystems mit dem SAB 80535 und kieren Sie den Adress-, Daten- und Steuerbus.

mar-

b) Nennen Sie die Breite des Daten- und des Adressbusses. c) In welchen Phasen sind die Steuersignale PSEN# und ALE aktiv? Was bewirken sie?

d) In welchen Phasen liegt bei einem 2-Byte-Befehl stabil die gültige Adresse für das 2.

Befehls-Byte an. In welcher Phase wird dieses Befehls-Byte vom Controller eingelesen?

e) Berechnen Sie die maximal tolerierbare Zugriffszeit des ROMs für den externen Programmspeicher in einem 80535-Mikrocomputersystem, das mit 12 MHz getaktet ist. Be-

gründen Sie Ihren Rechenansatz.

f) Erläutern Sie die Arbeitsweise des Stackspeichers und -pointers. Unter welcher Bedingung ist eine

Verschiebung des Stackpointers erforderlich?

6.10 Übungsaufgaben

115

Aufgabe 6.2 Gegeben sei folgender Programmausschnitt: ORG PUSH INC ADD MOV MOV

1000h ACC @R1 A, 00h 02h, A @R0, #02h

a) Geben Sie den Hexadezimalcode mit Speicheradressen an.

b) Das Programm wird gestartet. Tragen Sie in die ten

unten

ein, die nach Ablauf des Programmausschnitts

ternen

an

stehende Tabelle die Ergebnisdaden Adressen 00h bis OBh des in-

Datenspeicher und im A-Register abgelegt sind.

Adressen

00h

01h

02h

03h

04h

05h

06h

07h

08h

09h OAh OBh

Ausgangs-

00h

00h

00h

00h

00h

00h

00h

00h

00h

00h

00h

A-Register

00h 09h

daten

Ergebnisdaten

Aufgabe 6.3 Gegeben sei folgender Programmausschnitt: UP:

PUSH

MAIN:INC

ORG ACC ADD MOV POP RET

0000h

A, 00h 02h, A ACC

1000h ORG @R1 LCALL UP MOV

@R2, A

Programm wird an dem Label MAIN gestartet. Tragen Sie in die folgende Tabelle die Ergebnisdaten ein, die nach Ablauf des Programmausschnitts an den Adressen 00h bis OBh des internen Datenspeicher und im A-Register abgelegt sind. Das

6 Assembler-Programmierung des SAB 80515/535

116 Adressen

00h

01h

02h

03h

04h

05h

06h

07h

08h

09h

OAh

OBh

Ausgangs-

00h

00h

00h

00h

00h

00h

00h

00h

00h

00h

00h

00h

K-Register 02h

daten

Ergebnisdaten

Aufgabe 6.4 Kopieren Sie die Inhalte der Adressen 20h bis 26h des internen Datenspeichers in den externen Datenspeicher ab Adresse 2000h. Überspringen Sie dabei die Adresse 22h, da deren Inhalt nicht kopiert werden soll. Bei Programmende soll eine an Pl.l angeschlossene LED mit einer Frequenz von 0,5 Hz blinken (d.h: Komplementierung der LED mit 0,25 Hz). Aufgabe 6.5

Entwerfen Sie ein

Programm, das den Buchstaben a in der ersten Zeile, zweite Stelle des LCD-Displays anzeigt. Schreiben Sie die Befehle zur LCD-Ansteuerung in ein Unterprogramm.

Aufgabe 6.6.

In einer Tabelle stehen die Dezimalzahlen 04, 230, 89 und 55. Entwickeln Sie ein Assembler-Programm, das diese Dezimalzahlen aus der Tabelle nacheinander in den externen Datenspeicher ab der Adresse 08h kopiert.

Aufgabe 6.7

Ein MikroController 80535 wird mit 12 MHz schlossen.

der

getaktet,

a) Entwickeln Sie ein Programm, das die Töne 0,4 sec dauern.

c

und

e

Lautsprecher

sei

an

P1.0 ange-

abwechselnd spielt. Jeder Ton soll

b) Weisen Sie nach, dass die Frequenzen und die Tondauer von Ihrem Programm eingehalten werden (rel. Fehler < 1%).

Anmerkung:

Ton c: Tonhöhenzahl

=

200, f

=

131 Hz; Ton e: Tonhöhenzahl

=

159, f

=

166 Hz.

Aufgabe 6.8 Ein MikroController 80535 übernimmt Messwerte von P5 und speichert diese fortlaufend an der Adresse 08h ab. Die Ausgabe an P4 erfolgt nur beim Auslösen eines von zwei möglichen Interrupts (getrennte Eingänge) mit folgenden Bedingungen: • bei positiver Triggerflanke wird der gespeicherte Wert an P4 ausgegeben, • bei negativer Triggerflanke wird der um 5 erhöhte gespeicherte Wert an P4 ausgegeben.

6.10

Übungsaufgaben

117

a) Schreiben Sie das Assembler-Programm.

b) Erläutern Sie den Begriff „Interrupt-Latenzzeit". Berechnen Sie die Interrupt-Latenzzeit (Takt: 12 MHz), die in Ihrem Programm maximal auftreten kann.

Aufgabe 6.9

Schreiben Sie ein Programm mit folgenden Funktionen im arithmetischen Zahlenbereich: • Das Hauptprogramm prüft fortlaufend, ob die an P5 anliegenden Werte positiv sind. • Sind sie positiv, so wird ein Unterprogramm aufgerufen, das den Mittelwert zwischen dem aktuell übergebenen und dem vorherigen Wert sowie deren Summe berechnet und an das Hauptprogramm zurückgibt. • Die Parameterübergabe erfolgt mit Hilfe des Stackspeichers, wobei das Hauptprogramm nur den aktuellen Wert, das Unterprogramm aber Mittelwert und Summe übergibt. • Das Hauptprogramm speichert Mittelwert und Differenz fortlaufend im externen Datenspeicher ab. Bei maximal 240 gespeicherten Werten beendet sich das Programm.

Aufgabe 6.10 Ein beliebiger Text stehe in der Tabelle TAB1. Geben Sie diesen Text in der ersten Zeile des LCD-Displays aus, zählen Sie die Anzahl der Nullen und geben Sie diese Anzahl in der zweiten Zeile, angeführt von einem Text, aus.

7

Hardwarenahe Programmierung des S AB 80515/535 in C

7.1

Grundlagen

Während die Assembler-Programmierung dem Programmierer erlaubt, die Ausführungszeit und den Speicherbedarf von Software selbst zu optimieren oder Programme mit einer definierten Laufzeit zu erstellen, sind C-Programme dazu geeignet, aufwendigerer Aufgaben zu implementieren. Die hardwarenahe C-Programmierung des SAB 80535 folgt der ANSI-CSyntax (Bald 1999), erlaubt aber das direkte Ansprechen aller Register und Ports. Dadurch ist der volle Zugriff auf die Hardware gewährleistet. Die Nomenklatur findet sich in der Bibliothek reg515.h, wodurch die Registernamen identisch mit ihren symbolischen Adressen sind. Der serielle Buffer hat beispielsweise die symbolische Adresse SBUF und wird auch in C mit dem Variablennamen SBUF angesprochen, Pl steht für Port 1 usw. Bitadressen müssen zusätzlich mit sbit Bitsymbol = BytesymbolAx deklariert werden. Wird im Programm beispielsweise Bit 6 von Port 5 verwendet, so ist die Deklaration

Lediglich symbolische sbit P5_6 sbit RS

= =

P5A6 oder auch P5A6

erforderlich. Im Programm wird das Bit dann mit P5_6 oder RS Neue oder geänderte Deklaration

Bytesymbole

werden mit „define"

zu

angesprochen.

Programmanfang

#define port P4 weist P4 zusätzlich das

Symbol „port" zu. Folgende Datentypen sind von Bedeutung: 1

Byte Variablen: char

Wertebereich:

unsigned char Wertebereich:

-128...+127 +255

0 ...

deklariert. Die

120

7 Hardwarenahe 2

Byte Variablen:

int

Programmierung des SAB 80515/535 in C

Wertebereich:

-32768

+32767 ...

unsigned int

Wertebereich:

0

+65535 ...

4

Byte Variablen:

float

Wertebereich:

-1,176 E-38 ...+1,176 E+38

long

Wertebereich:

-2147483648... 2147483647

Um den Umfang des Programmcodes, also die Menge der aus dem C-Programm resultierenden Befehls-Bytes, zu minimieren, ist es empfehlenswert, kleine Datentypen zu wählen. Am kompaktesten wird der Code bei Verwendung von Unsigned Char Variablen, die zum einen nur 1 Byte und damit nur ein Register benötigen und zum anderen, da sie nur positive Zahlen im den Maschinencode keine zusätzliche für repräsentieren, Befehls-Bytes Umgang mit

negativen Zahlen erfordern.

Limitierung des Codeumfangs ist besonders wichtig bei einer Verwendung der Evaluierungsversion der pVision-Entwicklungsumgebung. Diese ist auf einen Programmcode von 2 kByte begrenzt. Hauptprogramme beginnen mit ,,main()", Funktionen mit ihrem Funktionsnamen, dem in Klammern die Übergabeparameter angefügt sind, also „funktionsname (pari, par2,...)". In einer geschweiften Klammern folgen Parameterdeklarationen und die Programmbefehle, die jeweils mit einem Semikolon getrennt werden. Der Aufruf von Funktionen erfolgt durch Die

ihren Namen:

main() { int i; Befehl 1; Befehl 2; i= funktionsname Befehl 3 ;

/* Variablendeklaration */ /* Befehle */

(pari, par2,...) ;

/* Funktionsaufruf */

} funktionsname

(

(pari, par2, ...)

int j ; Befehl 4 ; Befehl 5 ;

/* Variablendeklaration */ /* Befehle */

returnfj);

/*

!

Rückgabewert ist j

Mathematische Operationen werden wie mathematische könnte Befehl 4 in der Funktion lauten:

j pari + par2; =

*/

Gleichungen geschrieben,

also

7.1

121

Grundlagen

Kontrollstrukturen wie IF, WHILE und FOR bestehen aus der Kontrollinstruktion, der in einer runden Klammer die Bedingung und in einer geschweiften Klammer die Befehle für den TRUE-Fall (entspricht der Bedingung i 0) folgen: while (i) {Befehl für i== TRUE;} /* wird permanent ausgeführt, solange i TRUE ist */ Befehl für i== FALSE; =

==

if (i) j Befehl für i=TRUE;} Befehl für i=FALSE;

/* wird einmal

for (i=0; i => =>

=> O O =>

Interrupt 0

Timer 0

Interrupt

1

Timer 1 Serielle Schnittstelle Timer 2 AD-Wandler

Interrupt 2 Interrupt 3

(Empfang eines Zeichens)

Es

gelten folgende

7 Hardwarenahe

122 n

=

n

=

n

=

Interrupt 4 Interrupt 5 Interrupt 6

9 10

=>

11

Programmierung des SAB 80515/535 in C

Hat beispielsweise die Interrupt-Serviceroutine für den Interrupt 0 den Funktionsnamen abc und verwendet Registerbank 1, dann lautet die Funktion

void abc()

interrupt 0 using

1

Im Hauptprogramm müssen wie bei der Assembler-Programmierung EAL und EXO mit den Befehlen EAL 1; und EXO 1; gesetzt sein, damit alle Interrupts freigegeben sind und 0 aktiviert ist. Interrupt =

=

Das Einbinden der Datei

def_int.h erlaubt die Verwendung

von

Nummern, z.B. INTO für den Interrupt 0 (n 0).

Symbolen

anstelle

von

=

Das Einbinden von Assemblerfunktionen läuft wie folgt ab: • Leere C-Funktion mit dem Funktionsnamen schreiben, •



• • •

Preprozessoranweisung #pragma.src verwenden, um Assembler-Programm zu erzeugen. Compilieren. In dem erzeugten Assemblercode hinter dem Label (=Funktionsname) die ge-

wünschte Assemblerfunktion schreiben. Speichern des compilierten Programms unter *.src, Einbinden in das Projekt. Prototyp der Funktion in der Headerdatei deklarieren. Die Parameterübergabe bei Assemblerfunktionen erfolgt über RI bis R7, abhängig vom

Parametertyp (Bald 1999).

Das folgende Programmbeispiel 7.1 (Sim, Eval, Emb) illustriert das Ansprechen eines Ports sowie Funktionsaufrufe und den Umgang mit lokalen und globalen Parametern:

/* Include Registerdeklarationen und I/O */ #include #include /* Funktionsprototypen */ int add(); /* Globale Variablen deklarieren; int gla, gib;

gültig im Hauptprogramm und allen Funktionen*/

/*

Hauptprogramm */ main() int a; Í

gla P4; gib P5; =

=

/* Lokale Variable deklarieren*/ /* Einlesen des 1. Summanden von P4 */ /* Einlesen des 2. Summanden von P5 */

7.2

Programmierung des Embedded Systems in C a

=

Pl

}

int

add(); =

a;

123

/* Funktionsaufruf */ /* Ausgabe des Additionsergebnisses auf Pl */

add() int i; i gla + gib;

{

=

return

/* Lokale Variable deklarieren */ /* Addition */

i;

umfangreichen Programmen speichert man das Hauptprogramm als eigene Datei (z.B. main.c) und alle Unterprogramme in einer anderen Datei (z.B. unterprogramme.c) ab. Die

Bei

Funktionsprototypen und weitere Deklarationen wie die Symbolanweisungen für einzelne Bits oder Bytes stehen in einer Headerdatei (z.B. unterprogramme.h), die dem Hauptprogramm mit einer #include-Anweisung bekannt gemacht wird.

7.2

Programmierung des Embedded Systems in C

Der Aufbau des

Programmpakets zur Tastatureingabe und Displayausgabe von Zeichen, zur AD-Wandlung, zur Timerfunktion und zur seriellen Kommunikation ist in Abb. 7.1 dargestellt. Für die Implementierung der Programme mit der Entwicklungsumgebung uVision 2 erstellt man für jede dieser Applikationen ein eigenes Projekt, das das jeweilige Hauptprogramm (mit evtl. erforderlichen Interrupt-Service-Routinen), die Bibliothek (unterprogramme.c) und die Headerdatei (unterprogramme.h) enthält. Da die Bibliothek alle Funktionen enthält, unterscheiden sich die Projekte nur in ihrem Hauptprogramm. Alle Hauptprogramme, die Bibliothek und die Headerdatei können von der beliegenden CD in das Arbeitsverzeichnis des Projekts kopiert werden. Um die Funktionsweise der Programme zu verstehen, ist es wichtig, sich mit den Mechanisder Hardwarekomponenten beschäftigt zu haben. Diese wurden in Abschnitt 5.5 erläutert. Die Special-Function-Register, die diese Komponenten steuern, sind in Tab. 5.3 im Kapitel 5.2 aufgelistet. men

Die meisten Programme benutzen die Funktion taste() zur Steuerung des Programmablaufs oder zur Dateneingabe und putchar() zur Anzeige am LCD-Display. taste() fragt die durch das Drücken einer Taste generierten Spannungswerte ab und ordnet sie dem korrespondierenden Zeichen zu. Im Folgenden werden C-Programme zum Timer, zur AD-Wandlung und zum seriellen Senden bzw. Empfangen erläutert. Dazu sind zunächst die jeweiligen Hauptprogramme und anschließend die Datei mit den Unterprogrammen aufgelistet.

7 Hardwarenahe

124

Programmierung des S AB 80515/535 in C

LCD-Display Als Beispiel für die Programmierung des o.g. Embedded Systems in C sei zunächst die Ausgabe des Textes „Hello World" auf dem LCD-Display aufgeführt. Das Hauptprogramm Haupt_LCD() hat folgenden Aufbau (Programmbeispiel 7.2 (Emb)): /* LCDJVlain

*/

#include #include #include "Unterprogrammen"

void main(void)

{

printf("\n%C, CLEAR_DISPLAY) //Display löschen world\n%cWie geht"s?\n%c",zeilel,zeile2,zeilel); printf("\n%cHello while(l);

I Die Systemfunktion printf() ist in der Bibliothek stdio.h enthalten und ruft normalerweise eine Standardfunktion putchar() auf, um ein Zeichen auszugeben. Anstelle dieser wird nun eine Funktion gleichen Namens so geschrieben und in unterprogramme.c gespeichert, dass die Ausgabe auf dem LCD-Display erfolgt: /* Function putchar()

#include

*/

char putchar (char zeichen)

I

if (zeichen

==

"\n")

E=0;

// Steuermodus einstellen

PORT= zeichen;

// Zeichen

eise

E=l; E=0;

Zeit(2,100); RS=1 ; return

zeichen;

an

LCD-Eingang legen

// Negative Flanke an E: Übernahme //2 ms warten // Anzeigemodus einstellen

7.2

125

Programmierung des Embedded Systems in C

Durch die Headerdatei (s.u.) sind E das Bit P4.1, RS das Bit P4.2, PORT der Port P5 und CLEAR_DISPLAY der Wert 01 zugewiesen. Übergibt printf() nun ein \n an putchar(), so bewirkt dies ein Löschen von RS, was das Display damit in den Steuermodus schaltet. Das nächste übergebene Byte interpretiert das Display als Steuerbyte und führt die entsprechende Steuerfunktion durch (die negative Flanke an E triggert die Übernahme des Bytes). Die Steuerzeichen sind 0x01 (Konstante CLEAR_DISPLAY) bzw. 0x80 (Konstante zeilel) und OxCO (Konstante zeile2). Sie bewirken das Löschen des Displays bzw. das Setzen des Cursors an den Anfang der ersten bzw. zweiten Zeile. Die Bedeutung der Steuerbytes können Tab. 5.7 entnommen werden.

putchar() durch Setzen von RS in den Anzeigemodus um, so dass das nicht ein \n ist, angezeigt wird. Die Funktion zeit() ist eine Verzögerungsschleife, um die 2ms Wartezeit nach der Datenübernahme zu gewährleisten. In der Headerdatei befinden sich vorläufig folgende Deklarationen: #if Idefined (_unterprogramme_) Anschließend schaltet nächste Zeichen,

wenn es

#define _unterprogramme_ #define CLEAR_DISPLAY 0x01 #define zeilel 0x80 #define zeile2 OxCO #define PORT P5 sbitE P4Al; sbit RS P4A2 ; =

=

char putchar (char zeichen); void zeit (unsigned char, unsigned #end

Analog-

J—

werte

char)

;

*J ADJVamlle Main Tastatur Main

1-K

LCD-

Anzeige

pu tenar

; seriell

Serie li_Send Main



en

seriell

empf j

MW

SerielïJ-sn-

Í

Timer

l'SR

llnterprogr. -

pfangenMain Main _

yAbb. 7.1: Architektur des

Laborsystems „Embedded Systems"

Haupt-

[

I

7 Hardwarenahe

126

Programmierung des SAB 80515/535 in C

Die gesamte Headerdatei und Unterprogramm-Bibliothek, die die Anweisungen und Funktionen für alle Programme beinhalten, sind am Ende dieses Abschnitts aufgelistet. Timer Die Programmierung einer Stoppuhr mit Timer 0 im Mode 2 (dazu muss in das Register TMOD der Wert 2 kopiert werden, um das Bit M1 zu setzen) basiert auf dem Prinzip, dass der Timer alle 250ps einen Interrupt auslöst (dazu muss THO auf 5 ps gesetzt werden, da 255 ps 5 ps 250ps ergibt). In der Interrupt Service Routine timer() wird bei jedem Aufruf die Variable j inkrementiert. Sobald diese den Wert 40 erreicht hat, sind 10 msec vergangen und die Variable ms wird inkrementiert. =

-

Das Hauptprogramm HauptJTimer() fragt 100 hat, ist eine Sekunde vergangen und es Variable ms wird dann gelöscht.

Eine Minute ist dann erreicht,

wenn

die Variable ms ab. Sobald diese den Wert erfolgt die Inkrementierung der Variable sec. Die nun

die Variable

sec

den Wert 60 hat.

Maint)

if(ms= 100) {sec++; ms

=

0;}

if(sec 60) =

{. Der Timer wird durch ein

Interrupt-Requestsignal am externen Interrupt 0 gestoppt. Die dazugehörige Interrupt-Serviceroutine stopQ löscht das Bit EAL und deaktiviert dadurch alle Interrupts einschließlich des Timer-Interrupts. Das Inkrementieren ist damit beendet. Möchte man den Timer durch ein externes Signal starten und stoppen, so ist es erforderlich, das Bit GATE im SFR TMOD zu setzen. Dafür wird TMOD nicht mit dem Wert 2, sondern mit 10 geladen. Dadurch erhalten die Bits Ml und GATE den Wert 1, die übrigen Bits sind auf 0 gesetzt. Der Timer

liegt.

läuft, wenn das externe Signal, das mit P3.2 verbunden werden muss, auf H-Pegel

7.2

127

Programmierung des Embedded Systems in C

Das

Timer-Programm Programmbeispiel 7.3 (Emb) umfasst folgende Befehle: */

/* Timer_Main.C

#include ttinclude "Unterprogrammen" #include int ms=0; int sec=0; int min=0; void main

//Zähler 10ms //Zähler 1 s //Zähler 1 min

(void)

TH0=5;

//Reloadwert 5 für einen Timerdurch-

TMOD=0x02;

//Timer 0 Modus2 //Interrupt Timer 0 aktivieren //externer Interrupt 1 aktivieren //Alle Interrupts freigeben //Timer starten

//laufvon250ps

ET0= 1 ;

EX0=1; EAL=1; TR0=1;

printf("\n%c",CLEAR_DISPLAY); //Display löschen printf("\n%cStoppuhr: ,zeile 1 ) ; //Textausgabe while(min!=60) //Sekunden und Minuten zählen { if(ms==100) //10ms 100= 1000ms= ls { sec++;

ms=0;

if(sec==60) ( }

)

min++; sec=0;

printf("\n%c%02d:%02d:%2d",zeile2,min,sec,ms); }

EAL=0;

//Ende,

printf("\n%cEnde while(l); void timer(void)

{

wenn

60 min erreicht

",zeilel); //Ende

main()

interrupt 1 using 0

//Timer ISR

7 Hardwarenahe Programmierung des SAB 80515/535 in C

128

1++;

if(j >= 40) //250ps-40=

10ms

{

ms++;

j=0; }

}

void stop

Í

(void) interrupt 0 using 0 //Ende durch ext.

EAL=0;

//Int.O ISR

Interrupt

Analog/Digital-Wandler Das C-Programm AD_Wandler_Main (Programmbeispiel 7.4 (Emb)), das zwei analoge Werte über die AD-Wandler 0 und 1 quasi-parallel digitalisiert und am LCD-Display darstellt, löscht zunächst das Bit ADM, um pro Schleife eine Wandlung durchzuführen. Die Selektion des Wandlers 0 bzw. 1 erfolgt durch die drei Bit MXO, MX1 und MX2 (letztere sind defaultmäßig auf 0 gesetzt). Die Funktion wandler(), die vom Hauptprogramm aufgerufen wird, startet die Digitalisierung durch Laden des Werts 0 in das Register DAPR und wartet durch eine Abfrage des BSY-Flags auf 1 bis diese beendet ist. Anschließend wird der digitalisierte Wert aus dem Register ADDAT ausgelesen, zurückgegeben (in die Variable AD) und zur Umrechnung in mV mit 20 multipliziert. Da DAPR auf 0 gesetzt wurde, umfasst der Wandlerbereich 0 5V. Bei 255 Digitalisielässt dem Wert AD sich der aus mit folgender Formel rungsstufen analoge digitalisierten berechnen: ...

U[mV]=^^AD 255

=

20mV.AD

/* ADJWandler_Main

*/

#include #include #include "Unterprogramme.h" //Messwert in mV

int AD; void main

{

(void)

ADM=0;

printf("\n%c", CLEAR_DISPLAY) while

f

//Eine

AD-Wandlung //Display löschen

(1)

MX0=0;

AD=wandler();

//AD-Wandler 0

7.2 Programmierung des Embedded

Systems in C

129

printf("\n%cAD-WandlerO%4imV\0",zeilel,AD); //AD-Wandler 1

MX0=1; AD=wandler();

printf("\n%cAD-Wandlerl%4imV\0"zeile2,AD); }

}

von Zeichen über die serielle Schnittstelle Das Eingeben von Zeichen über die Tastatur und deren Übertragung mit der seriellen Schnittstelle ( Programmbeispiel 7.5 (Emb) ) erfolgt mit dem Programm Haupt_seriell_senden(), das die Funktionen taste() und seriell_Out() aufruft:

Senden

/*

*/

Seriell_Senden_Main.C #include #include "unterprogramme.h" #include char zeichen;

//zu sendendes Zeichen

void main (void)

{

SM1=1; PCON=0x80;

BD= 1 ; TI=1 ;

//Mode 1 Wählen: variable Baudrate, 8 bit //Baudrate 9600 einstellen //Baudratengenerator einschalten //Schnittstelle zum Senden freigegeben

//Display löschen printf("\n%c", CLEAR_DISPLAY); printf("\n%cLöschen= *\n%c",zeilel,zeile2); while(l) I zeichen=taste_c(); if(zeichen=='*')

//Bei Zeichen

eise

//Sonst: Zeichen senden

printf("Vn%c", CLEAR_DISPLAY); printf("\n%cLöschen= *\n%c",zeilel ,zeile2);

{

*

Display löschen

printft "%c",zeichen) ;

seriell_out (zeichen);//Senden der Daten

Empfang von Zeichen über die serielle Schnittstelle Soll das Embedded-System-Zeichen über die serielle Schnittstelle empfangen werden (Hauptprogramm Haupt_seriell_empfangen), so wird beim Empfang der Interrupt 4 ausge-

7 Hardwarenahe Programmierung des S AB 80515/535 in C

130

löst und die Interrupt-Serviceroutine seriell_empfangen() gestartet. Diese schreibt den empfangenen Text mit der printf()-Systemfunktion auf das LCD-Display.

Programm hat folgende Struktur (Programmbeispiel 7.5 (Emb)):

Das

I*

*/

Seriell_EmpfangenJVlain.C #include #include "Unterprogramme.h" #include char zeichen; int i;

//Empfangenes Zeichen

byte a;

void main

(

(void)

printf("\n%c", CLEARJDISPLAY); //Display löschen printf("\n%clnt Freigabe mit #",zeilel); //Textausgabe while

(taste_c()!= '#'); //warten auf Zeichen '#'

printf("\n%cLöschen mit *",zeilel); //Textausgabe RI=0;

BD=1 ;

ES=1;

SM1 1 ; =

//Schnittstelle

//Baudratengenerator ein //Serieller. Interrupt ein

//Mode 1 variable Baudrate 8 bit

PCON=0x80;//Baudrate 9600 //serieller Empfang ein REN=0; EAL= 1 ;

while(l) (

//Interrupts freigegeben zeichen=taste_c();

//Zeichen

von

Tastatur lesen

//Wenn Taste * gedrückt if(zeichen=='*') mit printf("\n%cLöschen *\n%c",LCD_CLEAR,zeile2)

1 void

1

}

seriell_empfangen(void) interrupt 4 using 0 if(RI==l) I

printf("%c",SBUF); RI=0;

(

}

//wenn Zeichen

empfangen

//Ausgabe //Freigabe der Schnittstelle

7.2

131

Programmierung des Embedded Systems in C

Unterprogrammbibliothek Die Unterprogrammdatei unterprogramme.c enthält folgende Funktionen: /* Funktionen

von

*/

unterprogramme.c

#include #include #include "Unterprogramme.h" /* Function

void zeit

{

*/

zeit()

(unsigned char m, unsigned char n) unsigned char i=0,j=0,k=0; for

Byte

//Verzögerung: nmlOus

(i=0;i 4250) return ('7'); if (Value > 3900) return ('4'); if (Value > 3600) return ('1'); if (Value > 3300) return ('0'); if (Value > 3000) return ('8'); if (Value > 2600) return ('5'); if (Value > 2100) return ('2'); if(Value>1600) return ('#'); if (Value > 1000) >

return



return

if (Value

>

return

if (Value

>

('9');

30)

('6');

4)

return

('3');

//Spannungswert der Tastatur abfragen //warten bis

neue

Taste

gedrückt

//Zuordnung Spannung zu Taste

7.2

/* Function

wandler()

int wandler

(void)

{

133

Programmierung des Embedded Systems in C

*/

int messwert;

DAPR=0;

//AD-Wandlung starten

while(BSY);

//Warten bis

messwert=ADDAT 20; •

Wandlung beendet ist

//Messwert in Volt wandeln

return(messwert);

/* Function

*/

seriell_out()

seriell_out (char Sendedaten) I

while( !TI);

//Warten bis Schnittstelle frei

TI=0;

//Schnittstelle reservieren

SBUF=Sendedaten;

//Daten senden

1

angegebene Verzögerungszeit der Funktion zeit() kann der Leser leicht durch das vom Compiler erzeugte Listing überprüfen. Das Listing enthält den zu dem C-Progamm gehörenden Assemblercode, wenn die Umgebungsvariablen des Projekts für das Listing auf „Include Assembly Code" gestellt sind (s. Abschnitt 6.2). Alternativ dazu sind auf der CD im Programm SPEED_Test_Main() der Assemblercode und die Zyklenzahlen für die wichtigsten C-Kontrollstrukturen und Rechenoperationen aufgelistet, um die Ausführungszeiten von CProgrammteilen abzuschätzen. Die

Headerdatei Die Headerdatei hat nach der

notwendigen Erweiterung folgenden Aufbau:

#define CLEAR_DISPLAY 0x01 //CLEAR_DISPLAY = 01 h #defme zeilel 0x80 //zeilel = 80h #defme zeile2 OxCO //zeile2 = COh #define PORT P5 //PORT = P5 #define zeüe_matrix OxOF8 //nur für Matrixtastatur notwendig

7 Hardwarenahe

134

Programmierung des S AB 80515/535 in C

#define spalte_matrix 0x87 sbit E P4A1 ; sbit RS P4A2;

//nur für Matrixtastatur notwendig //Zuweisung Port 4 Bit 1 //Zuweisung Port 4 Bit 2

char putchar(char zeichen); char taste_c(void); int wandler(void); void zeit(unsigned char,unsigned

//Prototypen

=

=

char);

seriell_out(char Sendedaten); void lcd_init(void); void

busy(void);

#endif Neben den oben erläuterten Funktionen enthält die Headerdatei auch die Prototypen von lcd_init() und busy(). Diese werden vom Programm LCD_init_main()aufgerufen, welches nach dem Einschalten des Embedded-Systems-Experimentalaufbaus ausgeführt werden muss um das LCD-Display zu initialisieren. Beide Funktionen sind in der Bibliothek „Unterprogramme, c" auf der CD enthalten.

Die

Interruptfunktionen

void StoppO interrupt 0 using 0 • void timer () interruot 1 using 0 • void seriell_out interrupt 4 using 0 sind in den Dateien der jeweiligen Hauptprogrammen deklariert werden. •

abgespeichert

und brauchen nicht

zu

8

Embedded System als Lernender Farbsensor

8.1

Grundlagen

intelligenter Farbsensor kann Farben lernen und eingelernte Farben wiedererkennen. Er basiert auf dem Prinzip, dass sich jeder Farbton aus drei Grundfarben additiv zusammensetzen lässt. Für die Farbmessung wird daher das von einem farbigen Objekt reflektierte Licht in drei Spektralbereichen, die in der Regel den Grundfarben Rot (R), Grün (G) und Blau (B) entsprechen, gemessen. Diese Messwerte spannen einen dreidimensionalen Merkmalsraum auf, den ein intelligenter Farbsensor zur Erkennung unbekannter Farben auswertet. Ein Konstruktionsprinzip für die Entwicklung eines Farbsensors basiert auf der Verwendung einer Fotodiode, die über das gesamte sichtbare Spektrum empfindlich ist. Die Beleuchtung besteht aus drei LED mit den Farben Rot, Grün und Blau und ist dadurch schmalbandig. Aktiviert ein MikroController diese LEDs nacheinander und misst den jeweiligen resultierenden Fotostrom, so stehen die drei Farbwerte zur weiteren Verarbeitung zur Verfügung. Das alternative Prinzip nutzt das von Glühbirnen oder weißen LEDs emittierte weiße Licht, also eine breitbandige Beleuchtung. Zur Farberkennung muss der Detektor aus drei Fotodioden bestehen, die jeweils nur in einem begrenzten Wellenspektrum, das der zu messenden Farbe entspricht, empfindlich sind (Abb. 8.1). Ein

375

425

475

525

575

625

675

725

775

Lichtwellenlänge (nm) Abb. 8.1:

Spektrale Empfindlichkeit eines 3-kanaligen Farbdetektors

8 Embedded

136

System als Lernender Farbsensor

Entwicklung eines Intelligenten Sensors zur Farberkennung

8.2

Der im Folgenden beschriebene Aufbau eines einfachen intelligenten Farbsensors (Abb. 8.2) besteht aus weißen LEDs als Beleuchtungsquellen, einem 3-elementigen Farbsensor MCS3 der Fa. MAZeT mit drei nachgeschalteten Operationsverstärkern und dem im Kap. 5 beschriebenen Embedded System. Die Bezugsquellen sind im Anhang angegeben.

Spannungsversorgung MikroController ANO AN1 AN2

URot

Abb. 8.2:

UGri

ÜBla

Aufbau eines Farbsensors mit einem 3-kanaligen Farbdetektor.

Die aus dem Verstärker abgeleiteten Signale der drei Farbkanäle URot, UGrün und UBlau sind mit den AD-Wandlereingängen ANO, AN1 und AN2 des Controllers verbunden.

8.2

Entwicklung eines Intelligenten Sensors zur Farberkennung

137

Die Software basiert auf den im Kapitel 3 beschriebenen Mustererkennungs-Algorithmen, wobei die Segmentierung nicht erforderlich ist, da der Sensor Punktmessungen durchführt, also Orts- und Zeitinformationen nicht ermittelt. Bei den aus den drei Farbkanälen aufgenommenen Signalen handelt es sich damit um stationäre Daten und die Merkmale sind identisch mit diesen drei digitalisierten Farbwerten: X

=

(xj,X2,Xi)

r

=

(URot, ÜGrün, LfBlau)

t

den minimalen Abstandsklassifikator für die Farbzuordnung, Lernphase der Referenzvektor (Mittel wert vektor) der (Farb-)Klasse Qi, Nutzt

man

üi

=

(pj ,,

uj

2,

yj j

so

wird während der

)T,

mehreren Messungen von Lernstichproben dieser Farbe berechnet, indem die Mittelwerte diesen Messungen für jeden der drei Farbkanäle gebildet werden. Durch Wiederholung dieses Vorgangs für alle (Farb-)Klassen existiert am Ende der Lernphase für alle Farben ein Referenzvektor. Im Sinne einer hohen Bedienerfreundlichkeit ist es empfehlenswert, die (Farb-)Klassen nicht nur über ihre Nummer i, sondern auch über einen Namen, den der Beaus aus

vergibt, anzusprechen. Während der Erkennungsphase erfolgt nutzer

die Zuordnung zu der Farbe, zu deren eingelernten Referenzvektor die drei Farbwerte (Merkmale) der zu erkennenden Farbe den geringsten Abstand im Merkmalsraum haben. Die Klassennummer bzw. der Name der Farbe wird durch LEDs angezeigt bzw. auf dem LCD-Display oder an einen Hostcomputer ausgegeben.

Die Grundstruktur eines solchen lernfähigen Programms mit einer sehr einfachen Bedienung ist im nachfolgenden Programmbeispiel 8.1 (Sim.Eval.Emb) gezeigt. Das Programm sollte zur Ausnutzung der vollen Funktionalität auf dem Embedded System (mit Farbsensor) implementiert werden, aber auch die Anwendung auf dem Evaluation Board oder sogar ohne Hardware, wenn man nur den Klassifikator testen möchte, ist möglich. Das

Programm lernt zwei Farben ein und klassifiziert danach unbekannte Farben durch Zuordnung zu einer der beiden eingelernten Klassen. Das Hauptprogramm main() fragt die Tastatur ab, welche der möglichen Operationen „Lernen der Farbe 1" (Taste 1), „Lernen der Farbe 2" (Taste 2) oder „Klassifizieren" (Taste 3) der Anwender durchführen möchte und ruft die entsprechenden Funktionen auf. Diese lesen über die Analogeingänge ADO, AD1 und AD2 die Farbwerte der Farbkanäle Rot, Grün und Blau ein, wobei sie zur Ansteuerung der AD-Wandler auf die Funktion wandler() zurückgreifen, die in Kapitel 7 erklärt wurde.

Das Einlernen der beiden Referenzvektoren (für Farbe 1: refrot(O), refgruen(O) und refblau(O); für Farbe 2: refrot(l), refgruen(l) und refblau(l)) in der Funktion lerne() basiert auf der gleitenden Mittelwertbildung. Durch die Verwendung von Integerdaten sind Rundungsfehler bei vielen Lerndurchläufen nicht auszuschließen. Die Funktion klassifiziere() berechnet die Diskriminanzwerte Dl und D2 der unbekannten Farbe durch Abstandsbestimmung der Farbwerte zu den Referenzvektoren und gibt das Er-

gebnis am LCD-Display aus (notwendige Funktion: putchar() aus Kapitel 7).

8 Embedded

138 Der Aufbau ist

System als Lernender Farbsensor

folgendermaßen:

/*

*/

Farberkennung.c

ttinclude #include #include 'Unterprogramme. h" '

/##************* punktionsprototypen (der Headerdatei void klassifiziere^ void); void lerne(unsigned char klasse, unsigned char m); / *^

-t-

-l^

*T*

^r* -I» -f* *ï- ^i^^i^^^.^^^îjî^^^c^:^^^;^:^;^^;

int refrot[2], void

f

I /"\r"\Q

j f* \j or"i o r\ lí^fl

refgruen[2], refblau[2];

*r*

hinzufügen)*****************/

^î^ *t^

*t* -t-

-t^ ^i^ ^i^ -t^ -T^ -ï^ ^ï^ *t^ ^1^ 't* ^4^ *l^ *î^

'f*

-t* *P ^ï^ ^í* *t* *t* 't* *t* 'T* ^t^ /

//Referenzvektoren

main(void)

{

unsigned char anzahl_l=0; unsigned char anzahl_2=0; printf("\n%c",CLEAR_LCD); while(l)

//Lerniterationen für Farbe 1 //Lerniterationen für Farbe 2

I if (taste()

==

{

"1 ")

//Lernen Farbe 1

lerne

(0, anzahl_l); anzahl_l++; ! if (taste()

==

"2")

//Lernen Farbe 2

{ lerne

(1, anzahl_2);

anzahl_2++;

} if (taste()

"3") klassifiziereO; ==

printf("\n%c Nächste Farbe", zeile 1); } ) /************* Punktion Lerne ************/ void lerne

(unsigned char klasse, unsigned char m)

//Klassifizieren

printf("\n%c Lernen", zeile 1); MXO = 0: MX1=0: refrot

//Rotkanal

(ADO) einstellen

(klasse) (wandler()/m) + (refrot (klasse)/m)-(m-l);

//Gleitender Mittelwert

=

MXO 1 : MX1 = 0:

//Gruenkanal (AD 1 ) einstellen

=

refgruen (klasse) (wandler()/m) + (refgruen (klasse)/m)(m-l); //Gleitender Mittelwert =

MXO 0: MX1 1: refblau (klasse)

//Blaukanal (AD2) einstellen

= =

void klassifiziere

//Gleitender Mittelwert

(wandler()/m) + (refblau (klasse)/m)(m-l);

=

(void)

I int rot, gruen,

blau;

int D1,D2;

//Farbwerte der unbekannten Farbe //Diskriminanzfunktionen für Farbe 1 und Farbe 2

printf("\n%c Klassifizieren", zeile 1); MXO = 0; MX1 = 0; rot

=

//Rotkanal

wandler();

//Kanal

(ADO) einstellen

abfragen

MX0=1; MX1 = 0; gruen wandler();

//Gruenkanal (AD0) einstellen //Kanal abfragen

MXO = 0; MX1 1; blau = wandler();

//Blaukanal

=

(ADO) einstellen

=

//Kanal

Dl=(rot-refrot[0])(rot-refrot[0]); D1=D1 D1=D1

+

(gruen-refgruen[0])(gruen-refgruen[0]);

+

(blau-refblau[0])(blau-refblau[0]);

D2=(rot-refrot[l])(rot-refrot[l]); D2=D2 + (gruen-refgruen[l])(gruen-refgruen[l]); D2=D2

+

abfragen //Diskriminanzf. 1

//Diskriminanzf. 2

(blau-refblau[l])(blau-refblau[l]);

if (Dl 2 fmax, wobei das analoge Signal zuerst mit einem Tiefpassfilter gefiltert wird, um Aliasingeffekte zu vermeiden. Somit gilt als Mindestanforderung für die Abtastfrequenz: f > 16 kHz. Es finden typischerweise 8 bit oder 16 bit breite AD-Wandler Verwendung, die in vielen Mikrocotrollern vorhanden sind. 2. Segmentation Zur Segmentierung des akustischen Signals in einzelne Worte werden Abtastwerte des Schallsignals p(s), die eine vorgegebene Intensitätsschwelle überschreiten, als wortzugehörig markiert, die übrigen Samples als Sprechpausen angesehen. Ein typischer Intensitätswert beträgt 10% des Aussteuerungsbereichs, was bei einer Digitalisierungsbreite von 8 bit und damit einem Maximalwert von 255 einer Schwelle von 26 entsprechen würde. Bei der Einzelworterkennung beschränkt sich die Anzahl der Objekte auf M = 1. 3. Merkmalsberechnung Da die Merkmale spektraler Natur sind, wird das digitalisierte Signal typischerweise über 25,6 msec mit einem Hammingfenster gefiltert und einer Kurzzeit-Fourier-Tranformation unterzogen, die 512 Abtastpunkte bei einer Abtastfrequenz von f = 20kHz umfasst. Das Fenster wird in Abständen von 10 msec fortgeschaltet, so dass alle 10 msec ein neues Spektrum berechnet wird. Insgesamt entstehen J Spektren pro Wort, wobei die Spektren mit dem Index j 1 J nummeriert werden. =

...

Eine

Analyse der Spektren erlaubt nun die Ableitung spektraler Merkmale wie der Mittenfrequenz, der Bandbreite und der Schiefe. Bildet man mittels logarithmierter Spektren das Übertragungsverhalten des menschlichen Hörsystems nach, wie dies z.B. beim Cepstrum (Logarithmierung des Spektrums mit anschließender Fourier-Rücktransformation) der Fall ist, so ergeben sich trennschärfere Merkmale. Aus J (logarithmierten) Spektren pro Wort und N Merkmalen pro Spektrum ergeben sich insgesamt J

x

N Merkmale pro

Wort,

144

9

Spracherkennung mit Embedded Systems

die in einer Matrix abgelegt werden. Man hat also pro Objekt (=Wort) nicht nur einen, sondern eine Sequenz von J Merkmalsvektoren. Durch ein sog. Dynamik Time Warping, (DTW)-Verfahren wird erreicht, dass ein Wort auch bei unterschiedlich langer Aussprache auf denselben Spektrenverlauf komprimiert wird. 4. Klassifikation Die Klassifikation erfolgt mit Hilfe neuronaler Netze oder dem Hidden-Markov-Modell (Wend 2004), aber auch eine modifizierte Version des minimalen Abstandsklassifikators kann Verwendung finden. In diesem Fall werden die Abstände der Merkmalsvektor-Sequenzen zu den Referenzvektor-Sequenzen der Wörter, die während der Trainigsphase erlernt wurden, über j integriert, so dass der Summenabstand über alle Spektren der Sequenz zu den einzelnen Klassen berechnet wird. Der minimale Summenabstand ergibt das Klassifikationsergebnis, d.h. das erkannte Wort. Für den Einsatz im Embedded-System-Bereich werden spezielle Hardware-Lösungen angeboten. Derzeit sind Erkenner auf dem Markt, die sprecherunabhängig oder sprecherabhängig Einzelworterkennung mit geringem Wortumfang leisten. Sprecherunabhängige Lösungen werden mit etwa 200 Sprachdatensätzen (typische Erkennungsrate 96%), sprecherabhängige mit typischerweise 2-3 Wiederholungen (typische Erkennungsrate 99%) trainiert. Dabei sind folgende Aspekte für Embedded-Systems-Applikationen wichtig: • • •

geringer Leistungsverbrauch; geringer Platzbedarf; kostengünstig.

Als Beispiel wird im Folgenden das Sprachmodul „Voice Direct 365" der Fa. erläutert und ein Applikationsbeispiel beschrieben.

9.3 Ein

Das

Sensory

Inc.

Sprachmodul „Voice Direkt 364"

sprecherabhängiges Spracherkennungsmodul

ist das Voice Direct 364 (VD 364), das, 15 bzw. 60 Worten trainiert werden kann und eine Erkennungsrate von 99% aufweist. An den Chip wird ein omnidirektionales Elektret-Mikrofon mit mindestes -60 dB Empfindlichkeit und ein Lautsprecher angeschlossen. Das interne EPROM besitzt eine Speicherkapazität von 8 kByte, als Taktgeber dient ein externer 14,318 MHz Oszillator.

abhängig vom Betriebsmodus, mit

Der Voice Direct 364 kann im Slave-Modus oder im Stand-Alone-Modus betrieben werden.

1. Stand-Alone-Betrieb Im Stand-Alone-Betrieb gibt das Voice Direct die Nummer eines erkannten Worts über Lautsprecher und als digitalen Wert über einen Port aus. Es ist möglich, bis zu 15 Wörter zu unterscheiden. Eine Steuerung durch einen Prozessor ist nicht unbedingt erforderlich,

9.4 Betrieb in Stand-Alone-Modus

145

wird in der Regel in einem Embedded System ein Prozessor die Nummer des erkannten Worts einlesen und daraus Steuerungs- und Regelungsaktionen generieren.

allerdings

2. Slave-Betrieb Als Slave Device empfangt und bearbeitet der IC über eine serielle Schnittstelle Befehle von einem Host Controller und schickt Statusmeldungen und erkannte Wörter (als Nummern) oder eine fehlgeschlagene Erkennung (No Match) dorthin zurück. Mit dem Befehlssatz ist es dem Entwickler möglich, bis zu 60 Wörter zu unterscheiden und die Spracherkennung komplett in eine Anwendung zu integrieren. Das VD 364 führt eine sprecherabhängige Erkennung diskreter Wörter durch den Vergleich mit vorher trainierten Sprachmustern in Echtzeit durch. Das Sprachsignal wird kontinuierlich erfasst, digitalisiert, in den Frequenzbereich transformiert, geglättet und analysiert. Während des Trainings erzeugt das VD 364 eine Sequenz von Referenzmerkmalsvektoren. Diese werden in einem EEPROM abgelegt. Während der Erkennungsphase wird eine neue Sequenz produziert, die mit der gespeicherten verglichen wird, um festzustellen, welches Wort gesprochen wurde. Das VD 364 beinhaltet integrierte Sprachrückmeldungen (Prompts) für die Trainings- und Wiedergabeprozedur, die den Erkennungsablauf wie folgt steuert: 1. Das VD 364 fordert den Benutzer mit dem Satz „Say a word" zum Sprechen eines Wortes auf. 2. Das Schallsignal wird verstärkt, gefiltert und in digitale Werte umgewandelt. 3. Aus dem Hintergrundsignal wird der Rauschpegel bestimmt. Bei hohem Rauschanteil erfolgt die Fehlerausgabe „Too Noisy". 4. Das VD 364 analysiert den Sprachsignalverlauf (Vordergrundsignal) und ermittelt dessen Güte, u.a. in Bezug auf die Aussteuerung. Bei unzureichender Güte erfolgt eine Fehlermeldung wie „Louder, please". Bei hinreichender Signalgüte erfolgt die Berechnung der Merkmalsvektor-Sequenzen aus 5. dem Vordergrundsignal. 6. Die aus dem Wort ermittelten Merkmale werden mit Hilfe eines neuronalen Netzwerks klassifiziert, also demjenigen der vorher trainierten Worte zugeordnet, zu dem die größte Übereinstimmung existiert. Der Grad der Übereinstimmung (Score) muss allerdings oberhalb eines vordefinierten Grenzwertes liegen. Unter dieser Voraussetzung ordnet VD 364 das unbekannte Muster einem vorher trainierten Wort zu, gibt die Nummer des erkannten Worts, z.B. „Wortl", über den Lautsprecher aus und setzt den entsprechenden Ausgang. Wenn zu keinem der vorher trainierten Wörter eine Übereinstimmung oberhalb des Grenzwertes festgestellt werden kann, erfolgt die Aussage „Word not recognized".

9.4

Betrieb in Stand-Alone-Modus

Die Anschlüsse des VD 364 sind in vier Anschlussleisten JP1-JP4 gruppiert (Tab. 9.1). Für den Betrieb im Stand-Alone-Modus wird der Anschluss MODE (Pin 13, JP3) auf Masse gelegt, indem man ihn mit Pin 12 von JP3 verbindet (Abb. 9.1). Zum Aktivieren der Funkti-

146

9

Spracherkennung mit Embedded Systems

RESET, TRAIN und RECOGNIZE verbindet man Pin 14 von JP3, Pin 11

von JP4 und Pin 10 von JP4 jeweils über einen Taster mit Masse. Das Drücken der jeweiligen Taste legt die entsprechenden Anschlüsse auf Low-Pegel und löst damit einen Reset, das Einlernen und das Erkennen von Wörtern aus. onen

Lernphase ordnet das System den gelernten Wörtern Nummern zu, die gemäß der Einlernreihenfolge vergeben werden. Nach dem Drücken der Taste TRAIN fordert das VD 364 den Benutzer zum Sprechen eines Worts und zu dessen Wiederholung auf. Stimmen die Merkmale beider Eingaben überein, so akzeptiert der Chip das Wort und speichert unter In der

dessen Nummer die Merkmale.

Während der Erkennungsphase (Drücken der Taste RECOGNIZE) gibt das VD 364 die Nummer erkannter Wörter sowohl mittels Sprachsynthese akustisch über den Lautsprecher als auch digital über Port 1 (Tab. 9.1), also den Pins JP-2/12 bis JP-2/19, als Active High Signal aus. Bei der Erkennung von Wort Nr. 1 beispielsweise setzt des System P1.0, bei Wort Nr. 2 P 1.1 usw. für ca. 1 sec auf High. Wort Nr. 8 ist dann an dem gesetzten Bit P1.7 zu erkennen. Zur Identifizierung der Wort-Nummern 8 bis 15 setzt das Modul P1.7 und einen weiteren Pin. Die Spracherkennung hat Wort Nr. 9 erkannt, wenn die Bits P1.0 und P1.7 auf H-Pegel liegen. Sind die Pins P1.6 und P1.7 gesetzt, so wurde das Wort mit der Nummer 15 gesprochen und vom Modul als solches auch erkannt.

Die Dekodierung der Wörter 8 bis 15 erfolgt per Software oder erfordert eine spezielle Hardware. Vorteile erzielt die Hardwarelösung damit, dass sich durch eine entsprechende Logikschaltung die über 8 Bit eingehende Information in ein 4 Bit Wort umsetzen lässt, wodurch ein halber Port am Mikrocontroller gespart wird. Findet das System keine hinreichende Übereinstimmung mit einem der so bleibt Pl unverändert auf Low-Pegel und es erfolgt die akustische

recognized".

eingelernten Wörter, Ausgabe „Word not

VD 364 erlaubt es im Stand-Alone-Modus nicht, schon eingelernte Wörter einzeln zu löschen oder neu zu trainieren. Das Trainieren eines neuen Worts bedeutet dessen Zuordnung zur nächst höheren Wortnummer. Erst das Löschen des gesamten Speicherinhalts durch ein gleichzeitiges Drücken der Tasten TRAIN und RECOGNIZE ermöglicht es, das Lernen wieder bei Wort Nr. 0 beginnen zu lassen. Mit der in Abb. 9.1

gezeigten Beschaltung ist der Chip auf eine hohe Sensitivität und niedriSpezifität eingestellt, es werden also Wörter auch bei eher geringer Übereinstimmung eingelernt bzw. erkannt. Möchte man die Spezifität erhöhen und dafür die Sensitivität reduge

zieren,

schaltet

den Tasten TRAIN und RECOGNIZE einen Widerstand an den jeweiligen Pins ab und stellt die Erkennungsgenauigkeit entsprechend ein. Die beschriebene Einzelworterkennung (SD = Single Detection) reagiert sofort, wenn ein Wort erkannt wurde. Schwierigkeiten entstehen dann, wenn die Verwechslung mit einem ähnlichen Wort ungewollt sicherheitskritische Aktionen auslöst. Dieses Problem lässt sich mit einem zweistufigen hierarchischen Konzept lösen (CL Continuous Listening). Dabei verlangt das VD 364 so

man

parallel

zu

(z.B. 100 kO). Beim Einschalten oder Reset fragt das VD 364 die Spannung

=

9.4 Betrieb in Stand-Alone-Modus

147

zunächst das Sprechen eines Schlüsselworts, z.B. „Roboter!". Erst wenn dieses erkannt wurde, ist er scharf gestellt und bereit, das eigentliche Einzelwort, z.B. „Komm!" zu analysieren und einer Klassennummer zuzuordnen. Um das CL-Schlüsselwort einzulernen, wird Pin 2 von JP4 über einen Taster CL TRAIN auf Masse gelegt. Der Pegel an Pin 1 von JP4 entscheidet über die Anzahl der zugelassenen Schlüsselwörter: ein Low-Pegel erlaubt ein Schlüsselwort, zu dem bis zu 15 Einzelwörter gehören, ein High-Pegel erlaubt bis zu drei Schlüsselwörter mit jeweils 5 Einzelwörtern. Für die Worterkennung im CL-Modus wird nur die Taste RECOGNIZE gedrückt. Der Benutzer spricht dann zunächst das Schlüsselwort und, nachdem das VD 364 dessen Erkennung akustisch bestätigt hat, das Einzel wort.

01

17

01

JP-1 JP-4

JP-3

Voice Direct 364

JP-2 19

11 10

07 06 05 04 03 02 01

Reset Train

Recognize

Abb. 9.1: Anschluss für den Stand Alone Betrieb.

n

9

148

Spracherkennung mit Embedded Systems

Tab. 9.1: Anschlussbelegung des Voice Direct 364

Pin#

Beschreibung

Name

JP1: Unbenutzt

0-17

JP2: 01 02

03 04

05 06 07 08

09

MICIN MIC BIAS MIC RETURN + 5V GND SPEAKER SPEAKER DACOUT MHS

(+) ( ) -

(P0.0) 10

RECOG

(PO-D 11

TRAIN

(Pl-0)

12

OUT1

13

OUT2 (Pl.l) OUT3

14

(Pl-0)

(Pl-2) 15

OUT4

16

OUT5

17

OUT6 (Pl-5) OUT7/-SHS

19

OUT8/-DATA

(P1.3)

(P1.4)

(P1.6) JP3:

(P1.7)

0-09

Mikrofon-Eingang Mikrofon-Bias (Electret-Mikrofon) Analog GNP. 5 Volt (+) Versorgungsspannung Masseanschluss

Lautsprecheranschluss (positiv) Lautsprecheranschluss (intern mit GND verbunden) Analog Ausgang (unverstärkt)

Stand-Alone-Modus: unbenutzt Slave-Modus: Serielles Interface Master Handshake (MHS) Stand-Alone-Modus: Erkennungsselektivität (siehe unten) Slave-Modus: unbenutzt Stand-Alone-Modus: Trainingsselektivität (siehe unten) Slave-Modus: unbenutzt Stand-Alone-Modus: Ausgang 1 oder 9 (Aktive high) Slave-Modus: Talk Stand-Alone-Modus: Ausgang 2 oder 10 (Aktive high) Slave-Modus: Konfigurierbare I/O # 0 Stand-Alone-Modus: Ausgang 3 oder 11 (Aktive high) Slave-Modus: Konfigurierbare 170 # 1 Stand-Alone-Modus: Ausgang 4 oder 12 (Aktive high) Slave-Modus: Konfigurierbare I/O # 2 Stand-Alone-Modus: Ausgang 5 oder 13 (Aktive high) Slave-Modus: Konfigurierbare I/O # 3 Stand-Alone-Modus: Ausgang 6 oder 14 (Aktive high) Slave-Modus: Konfigurierbare I/O # 4 Stand-Alone-Modus: Ausgang 7 oder 15 (Aktive high) Slave-Modus: Serielles Interface Slave Handshake (SHS) Stand-Alone-Modus: Ausgang 8 (Aktive high) Slave-Modus: Serielles Interface Data (DATA) -

ROR/PROCESS

(P0.3)

11 12

13 14

GND GND MODUS -RESET

JP4: CFG

TALK/CLl

(P0.6) 02

nicht beschälten

Unbenutzt ER-

10

nicht beschälten -

CL TRAIN

(P0.7)

Stand-Alone-Modus Error LED Slave-Modus: Low während der Kommandoverarbeitun£ Masse Masse Slave/Stand-Alone: Modus Auswahl Reset

(Active low)

Stand-Alone-Modus: TALK LED, Single-CL/Multi-CL Auswahl Slave-Modus: unbenutzt Stand-Alone-Modus: CL-Trainingsselektivität (siehe unten» Slave-Modus: unbenutzt

9.5 Aufbau eines Embedded Voice

Recognition Systems mit dem SAB 80515/535

149

Aufbau eines Embedded Voice Recognition Systems mit dem SAB 80515/535

9.5

Für den Aufbau eines Embedded Spracherkennungssystems im Stand-Alone-Modus wird der Port Pl des Voice Direct 364 mit dem Port eines Mikrocomputers, z.B. Pl, oder den Interrupteingängen des SAB 80C535 (Evaluationsboard) verbunden. Dadurch kann dieser nach einer erfolgreich durchgeführten Sprachanalyse die Nummer des erkannten Worts übernehmen, um weitere Aktionen daraus abzuleiten. Am einfachsten ist die Verwendung der Interrupts, da keine Pollingroutinen zu programmieren sind und jede Interrupt-Serviceroutine die Steuerungsaktionen für genau eine Wortnummer beinhaltet. Der Trigger für den Interrupt-Request ist auf positive Flanke einzustellen.

Ein einfaches Beispiel soll dies erläutern: P1.0 bis P1.4 des VD 364 seien an den Eingängen der externen Interrupts 2 bis 6 des SAB 80C535 angeschlossen (Abb. 9.2). Verbindet man nun dessen Portpins P4.4 bis P4.7 mit den Eingängen der Roboterarm-Motoren, die den Arm horizontal und vertikal bewegen, so lässt sich der Roboterarm sprachgesteuert nach links oder rechts bzw. nach oben oder unten bewegen und stoppen.

Voice Direct

SAB 80C535

Ansteuerung der Robotermotoren

Abb. 9.2:

P1.0

IR2

P1.1

IR3

P1.2

IR4

P1.3

IR5

Motor links

P1.4

IR6

Motor rechts

Motor hoch P4

Ansteuerung eines sprachgesteuerten Roboters

Dabei wird das Training folgender Wörter vorausgesetzt: Wort 1: stopp Wort 2: hoch Wort 3: herunter Wort 4: links Wort 5: rechts

Motor herunter

150

9

Das Skelett dieses Instruktionen:

Spracherkennung mit Embedded Systems

Programms (Programmbeispiel 9.1 (Emb)) enthält folgende wesentliche

/*

Spracherkennung_main.c

*/

void main(void)

{ EAL=1 EX2=1 EX3 1 EX4=1 EX5 1 EX6=1

//Freigabe der Interrupts

IFR2 IFR3

//Interrupt 2 und 3 IRQ auf pos. Flanke

=

=

=

=

1 1

while(l)

} void

{

stopp(void) interrupt 7 using

1

//ISR

von

Interrupt 2

//ISR

von

Interrupt 3

P4=0;

} void hoch(void)

i

interrupt 8 using

1

P4.4= 1;

//Armbewegung nach oben

} void

{

herunter(void) interrupt 9 using

Interrupt 4

void

//ISR

links(void) interrupt 10 using 1

void

{

rechts(void) interrupt

P4.7= 1;

von

Interrupt 5

//Armbewegung nach links

}

zu

von

//Armbewegung nach unten

I

Um

//ISR

P4.5= 1;

P4.6=l;

!

1

11

using

1

//ISR

von

Interrupt 6

//Armbewegung nach rechts

verhindern, dass der Roboter aufgrund zufällig gesprochener Worte seinen

Arm be-

wegt, kann der CL-Modus verwendet werden. Erst nach dem Sprechen eines Schlüsselworts, z.B. „Roboter", ist das VD 364 aktiviert und bereit, ein Steuerwort

zu

erkennen.

9.5 Aufbau eines Embedded Voice

Recognition Systems mit dem SAB 80515/535

151

Ein Embedded System im Behindertenbereich könnte mit einem ähnlichen Aufbau sprachgesteuert die Raumtemperatur ändern, Fenster öffnen und schließen oder bei gesundheitlichen Problemen die Telefonnummer für den Notarzt wählen. Steht dem Leser keine Motoransteuerung zur Verfügung, so kann er das Programm dahingehend abwandeln, dass es das erkannte Wort auf dem LCD-Display anzeigt. Dazu ist es erforderlich, in jeder Interrupt-Serviceroutine die erste Zeile so zu ändern, dass anstelle der Anweisung zum Setzen des Bits von P4 eine Textausgabe mit printf() steht. Der Text muss mit dem jeweiligen eingelernten Wort identisch sein.

Kombiniert man das Spracherkennungssystem aus Voice Direct und Mikrocontroller mit einem Bild Verarbeitungssystem, das auf einem PC oder einer intelligenten Kamera implementiert ist, und weiteren Sensoren und Aktoren, so lassen sich die Bildberarbeitungsoperationen durch Spracheingabe steuern (Abb. 9.3). Sprachkommandos können außerdem Sensoren wie einen Temperaturfühler ein- und ausschalten und vom Benutzer gewünschte Daten anzeigen. Der Mikrocontroller steuert den Roboter abhängig von dem Kommando und den

Sensorauswertungen. aß^L

J3

"Kommando"

mu> >>3HE>

[jTl yj

nnnd>

Voice-Modul

Benutzer

u

Controller

ummii

Steuerung der Komponenten

50-

25^ Embedded Vision

System

Abb. 9.3: „Hörendes", „sehendes" und

Ein solches

sicherheit,

It cd'

lODdO

J

k.

¿

Anzeige

Roboter

Temper atursensor

„fühlendes" Embedded Intelligent System

und „fühlt". Erzielt es eine ausreichende Erkennungsist es, z.B. als autonom-mobiler Roboter, ebenfalls zur Unterstützung Behin-

System „hört", „sieht"

so

derter einsetzbar. Der Benutzer nennt diesem System einen Gegenstand, den er haben möchte, oder einen Ort, zu dem er das System dirigieren möchte. Das System sucht dann mittels der Bildverarbeitungskomponente den Gegenstand oder den Ort. Nach erfolgreicher Identifizierung holt er diesen oder steuert den Platz an (Abb. 9.4).

152

9

Spracherkennung mit Embedded Systems Anzeige

der gezählten Objekte und deren Position

1."Computer"

il

Z^'Wo?" 3."Wieviel?"

u

IDOdC>

.lilJUU

idocicO

Steuerung der Komponenten

Benutzer

1 ."Computer":

Controller

Aktivierung

des Voicemoduls

von

Kontrolldaten

Daten

2."Wo?": Abfrage der Koordinaten eines Objekts

Anzeige

Rückgabe

Abfrage der

\LCD\

Rückgabe der Werte

3,'Wieviel?1': Abfrage der Anzahl der Objekte

Embedded Vision System

Industrie

Haushalt

Abb. 9.4: Ablauf der sprachgesteuerten

Roboter

Markierungen

Bildverarbeitung

Der Mikrocontroller liest vom VD 364 über P5 die Nummer des erkannten Sprachkommandos (z.B. „Wo?") ein, ermittelt über eine Case-Struktur den dazugehörigen ASCII-String (z.B. „labviewwhere" bei der Erkennung des gesprochenen Worts „Wo?") und sendet diesen über die serielle Schnittstelle an das Bildverarbeitungssystem (Abb. 9.5). Dieses ist in LabVIEW programmiert und verzweigt abhängig von dem eingelesenen String zu demjenigen Mustererkennungs-Algorithmus, der dem Sprachkommando entspricht. Die Erkennungsergebnisse (z.B. die Position des Objekts) sendet das LabVIEW-Programm als ASCII-Zahlen hintereinander über die serielle Schnittstelle an den Mikrocontroller, der sie einliest, auf dem LCD-Display anzeigt und den Roboter zu diesem Objekt steuert, um es zu holen. Die Softwarestruktur zur Verarbeitung der Worte „Wieviel" und „Wo", die den Wortnummern 2 bzw. 3 entsprechen und die Bildverarbeitungsroutinen zur Erkennung der Anzahl bzw. der Position von Bildobjekten starten, kann dem nachfolgenden Programmausschnitt entnommen werden (Belt 2004, Güne 2005):

9.5 Aufbau eines Embedded Voice

Recognition Systems mit dem SAB 80515/535_153 */

Sprachsteuerung eines Bildverarbeitungssystems

/*

/* ABFRAGEN DER WORTNUMMER */

do

I

delay_15000(); SM_EIN P5; =

}

/* 15ms Warten */ /* P5 liest Ausgang des

Sprachmoduls ein */

while(SM_EIN==0x00); /* Wenn kein Wort erkannt, Einlesen wiederholen*/ switch

/*

(SM_EIN)

I case

{

0x02

Verarbeitung des erkannten Worts */

/* PORT DES SPRACHMODULS

:

=

0x02 */

/* LÖSCHEN DER DISPLAY ANZEIGE */ Clear_Display(); Wie viel"); /* SCHREIBEN AUF DAS DISPLAY */ Zeile_l(); printf("Wort2: sprintf(ausgabe, "labv_wieviel"); /* UMWANDLUNG VON CHAR/NUM IN

STRINGS */

laenge=strlen (ausgäbe); SerielLOUT (ausgabe,laenge);

Zeile_4(); REN= 1 ;

for (s_l=0;

s_l

}

b[i]= 0;

printf ("%c",b [i] )

zaehler

i++;

=

0;

7

using

c)

ms

2

bis

max.

10 Striche

Referenzbalken

//Auswertung

Barcodebalken

//Dünner ;

0,2 5

//Auswertung

//Breiter

else

}

1

//Codeauswertung

else

{if

using

//Inkrementierung jede

void auswertung (void) while

\n%c", zeilel, zeile2);

Auswertung

//Ausgabe

Balken Balken

der Balkenbreite

//Rücksetzen des Zaehlerstands //Nächster Balken

10.2

Entwicklung eines einfachen intelligenten Sensors zur Barcode-Lesung

171

Die aufgerufenen Funktionen putchar() und zeit(), die von printf() benutzt werden, sind in der Bibliothek Unterprogramme.c enthalten und in Kapitel 7.2 erläutert. Ebenso kann die Headerdatei aus Kapitel 7.2 verwendet werden, wobei es ausreicht, die Prototypen dieser beiden Funktionen zu deklarieren. Durch elektromagnetische Störungen verursachte Impulse können dazu führen, dass der Timer oder der Interrupt fehlerhaft augelöst wird. Dies lässt sich abfangen, indem man Zählerstände mit sehr kleinen Werten (Richtwert: zaehler < 10) ignoriert. Weiterhin hilft es in diesem Fall, erst in der Interrupt-Serviceroutine des Timers den externen Interrupt 2 mit dem Befehl EX2 = 0 zu aktivieren. Möchte

das

dass alle Codestriche als Informationskönnen anstelle des die weißen Zwischenräume als ersten Balkens träger genutzt werden, Referenz für die Berechnung der Balkenbreite dienen. Dazu muss ein weiterer Zähler immer dann inkrementiert werden, wenn der Sensor jeweils einen Zwischenraum abtastet. Auf diesen wird dann der Zählerwert des davorliegenden (oder nächsten) Balkens bezogen. man

Programm dahingehend erweitern, so

11

Zusammenfassung und Ausblick

Schwerpunkt dieses Buchs war die Theorie von Embedded Intelligent Systems und ihre Realisierung mit dem 8-Bit-Mikrocontroller SAB 80515/535. Speziell wurde der Aufbau und die Programmierung eines lernenden Farbsensors, eines intelligenten Barcode-Sensors und eines Spracherkennungssystems behandelt. Vor dem Hintergrund der stetigen Weiterentwicklung von MikroControllern finden zunehmend Embdedded Intelligent Systems auf 16- und 32-Bit-Controllern Verbreitung. Damit lassen sich anspruchsvollere Applikationen mit höheren Rechengeschwindigkeiten realisieren. Als Beispiel werden nachfolgend intelligente Ultraschall-Abstandssensoren für den Automobilbereich und intelligente Kameras vorgestellt. In Automobilen lassen sich unterschiedliche

Hilfssysteme zur Hinderniserkennung und Abstandsmessung implementieren (Abb. 11.1), um den wachsenden Anforderungen, die heute an Fahrzeugführer u.a. aufgrund des stetig steigenden Verkehrsaufkommens gestellt werden, entgegenzuwirken. Aufgrund der kompakten Bauform, den hohen Anforderungen an intelligente Auswertealgorithmen und dem autonomen Verhalten sind sie als Embedded Intelligent Systems einzuordnen. Ultraschallsensoren operieren wie Radarsensoren nach dem Puls-Echo-Verfahren. Dabei werden mehrere Ultraschallschwingungen ausgesendet, an einem Objekt reflektiert und wieder empfangen. Aus der Laufzeit t, die zwischen dem Senden und Empfangen vergeht, und der Schallgeschwindigkeit c lässt sich der Objektabstand d gemäß der folgenden Formel berechnen:

d = c 112 •

Auf Ultraschall basierende Einparkhilfen (Parking Assistance), auch bekannt als Parkpilot, sind bereits serienmäßig erhältlich. Unterschreitet ein erkanntes Objekt einen Minimalabstand, so warnt der Parkpilot den Fahrer akustisch oder visuell, ohne dass er aktiv in die

Fahrzeugsteuerung eingreift.

Eine weitere Funktion, die sich mit Ultraschallsensoren realisieren lässt, ist die Parklückenvermessung (PLV): Fährt der Kraftfahrzeugführer an einer Reihe geparkter Fahrzeuge vorbei, wird die Größe der Parklücke vermessen. Dem Fahrer wird dann signalisiert, wenn eine für sein Fahrzeug ausreichende Parklücke gefunden wurde. Auf einer Kombination von Parkpilot und Parklückenvermessung basieren semi-autonome Einparkhilfen. Sie stellen dem Fahrer nach erfolgreicher Parklückenvermessung eine Unterstützung zum Rückwärtsfahren mit Hilfe akustischer Signale und eines optimal angepassten

11

174

Zusammenfassung und Ausblick

Lenkeinschlags zur Verfügung. Autonome Einparkhilfen steueren das Fahrzeug selbstständig in die Parklücke.

Die Toter-Winkel-Detektion wird genutzt, um die im Toten Winkel (Blind Spot) befindlichen Objekte bzw. Fahrzeuge zu orten. Eine Kollisionswarnung vor dem Ausscheren, z.B. bei einem Überholvorgang auf der Autobahn, wird dem Fahrzeugführer in Form einer Warnfunktion angezeigt.

Abbildung 11.1: Umfeldsensierungskonzept

Precrash-Sensoren detektieren während der Fahrt auf der Fahrbahn befindliche Objekte und berechnen bei Kollisionsgefahr den wahrscheinlichen Aufprallzeitpunkt. Wegen der kurzen Zeitspanne, die für die Berechnung zur Verfügung steht, und dem hohen Störpegel in den empfangenen Schallsignalen stellen sie extrem hohe Anforderungen sowohl an die Hardware als auch an die verwendeten Algorithmen. Wird eine Gefahrensituation erkannt, die zusätzlich

unweigerlich

zum

Zusammenstoß führt, können

des Fahrers präventive Maßnahmen ergriffen werden. Zu diesen Maßnahmen zählen unter anderem die frühzeitige Zündvorbereitung und die auf die erwartete Aufprallgeschwindigkeit optimierte Einstellung für den Airbag. Auch das Auslösen eines automatischen Gurtstraffers mildert die Unfallfolgen ab. Denkbar ist ein durch den PrecrashSensor veranlasstes Abbremsen, bei dessen Umsetzung aber haftungsrechtliche Fragen zu beachten sind. zur

Warnung

Sensorinformationen über den

Stop-and-Go-Funktion

nutzen.

Objektabstand lassen sich auch für die Implementierung einer Die Stop-and-Go-Funktion ist eine Erweiterung des Tempo-

mats, durch die der Fahrer unterstützt werden soll. Dem Fahrer wird in Anfahr- und Auffahrsituationen, z.B. bei zäh fließendem Verkehr, bei Staus oder an Verkehrsampeln, durch gezieltes Anfahren und Abbremsen geholfen. Auch hier sind haftungsrechtliche Aspekte zu

berücksichtigen. Mit Ultraschallsensoren lassen sich nur Objekte erkennen, die wenige Meter vom Fahrzeug entfernt sind. Daher ist die Laufzeit des Pulses im Millisekundenbereich und erfordert leistungsfähige Rechner für die Auswertung. In der Regel setzt man dazu 32-Bit-Prozessoren mit einem Takt von 50 MHz ein. Eigenentwicklungen basieren dabei häufig auf dem ARM 7 Kern. Die wesentlichen Herausforderungen dabei sind die sichere Hinderniserkennung auch bei Störungen und eine hinreichend genaue Schätzung des Aufprallzeitpunkts.

prinzipielle Ansatz zur Lösung dieser Probleme besteht darin, ein erkanntes Objekt über längere Zeit zu verfolgen. Ist es über mehrere Messzyklen im Schallsignal noch vorhanden, so geht der Algorithmus davon aus, dass es sich um ein wirkliches Hindernis handelt. Durch dieses Tracking lässt sich die Abstandsänderung pro Zeiteinheit und damit die Geschwindigkeit bestimmen, um daraus den Aufprallzeitpunkt vorherzusagen. Unterstützung bei der Hinderniserkennung und bei weiteren Funktionen können dem Fahrer auch intelligente Kameras bieten. In einer intelligenten Kamera sind in einem Gehäuse, das wenig größer als das einer „normalen" Kamera ist, sowohl das Kameramodul zur Bildaufnahme (CCD-Matrixsensor oder CMOS-Sensor) als auch ein Mikrocontroller und Signalprozessoren zur schnellen Durchführung der Mustererkennungs-Algorithmen für die Bildverarbeitung integriert. Als Ergebnis liefert diese Kamera Informationen an einen übergeordneten Rechner oder eine Prozesssteuerung darüber, ob ein oder mehrere gesuchte Objekte mit vorgegebenen Eigenschaften erkannt wurden oder nicht. Embedded Vision Systeme werden als intelligente Kameras von vielen Herstellern, wie z.B. von der Fa. Cognex und der Fa. Vitronic, angeboten. Die Auslieferung erfolgt mit einer Bildverarbeitungssoftware, die eine Objekterkennung durchführt und über eine Schnittstelle die Anzahl erkannter Objekte sowie deren Merkmale wie Position und Größe überträgt. Die Funktionalität dieser intelligenten Kameras ist in der Regel auf Schwarz-Weiß-Bilder und einfache Algorithmen beschränkt. Alternativ kann die Rechnereinheit eines Embedded Systems zur Bildauswertung eigenständig konstruiert sein, wobei die Kamera als Bildsensor jedoch abgesetzt ist. Dies ist in der Regel für komplexere Anwendungen notwendig, die anspruchsvolle Bildverarbeitungsprogramme erfordern. Eine Realisierungsvariante ist das Realtime Compact Vision System NI Der

CVS-1454 der Fa. National Instruments, die in LabVIEW (s. Abschnitt 3.8 und 12.1) programmiert wird und das um die Bildverarbeitungsbibliothek IMAQ-Vision erweitert ist.

12

Anhang

12.1

Quellcode des Bild Verarbeitungsprogramms

LabVIEW-Applikationen bestehten aus der in Abschnitt 3.8 gezeigten Bedienoberfläche, auch Front Panel genannt, und dem eigentlichen Programm, das auch mit Diagramm bezeichnet wird. Dieses wird graphisch erstellt, indem Funktionsblöcke (Icons) verbunden werden. Die Signale fließen von links nach rechts. »^MIWIM,«— Datei Bearbeiten Ausführen Werkzeuge Durchsuchen Fenster Hufe

\% C:\Referenz.xlsr

HHÑJ ET-

1 ù

d d g d d d o g

g

a

a d

ù ú

&m 2 [Q .4] -Kl-5-0 üoaDDODODudflaflflfj

I Berechnung undDarstellung des segmentlerten Bilds |Display in V7in 1 |

| Position of Win 11

0-

Q}-

ti

oe-gmenlieiungl tietles Bild

L

jSegmentiertes Bild o."k~]

®

quDgpoDpaooDbDü b..b.tt-.aiar.o |uQoflharjpabBqpbnoDflnD

ft^l

Ba

_____

ÜBS'"'| 'A 3 O Abb. 12.1:

Darstellung!

l_ Einschritt)

m



|Referenzvektor[|

a

Speicher Segmen-

BJInteffiEmSys,.

j _JCAWINDOW...| UhVIEW

Übungsprogramm zur Bildverarbeitung mit Frame 2

1

[ ¡gBV_L«n.vi |||§BV_Lein.y- ÏS^W 'i

± 1534

12

178

Anhang

Abb. 12.1 zeigt den prinzipiellen Aufbau des Übungsprogramms zur Bildverarbeitung. Der wesentliche Teil besteht aus zwei geschachtelten For-Schleifen mit einer Sequenz aus fünf Frames als Schleifenkörper. Die Frames laufen nacheinander ab. Die äußere Schleife wiederholt den Programmablauf für jede der zwei Klassen, die innere für jedes Objekt einer

Lernstichprobe. Das Frame 0 der Sequenz allokiert die Speicher für das Original und das segmentierte Bild. Frame 1 liest das Originalbild ein und stellt es dar. In Frame 2 (Abb. 12.1) findet die Segmentierung statt. Frame 3 (Abb. 12.2) führt die Merkmalsberechnung aus dem segmentierten Bild sowie die Lernprozedur durch, welche in dem Formelknoten, dargestellt durch den schwarz umrandeten Kasten in der rechten Hälfte des Frames, realisiert ist. Frame 4 schließlich gibt die beiden Bildspeicher wieder frei, damit sie für die nächste Iteration wieder zur Verfügung stehen. Nach Beendigung aller Schleifendurchläufe erfolgt die Abspeicherung der eingelernten Referenzvektoren in der Datei „Referenz.xls".

S> BV Lein vi Diagramm Datei Bearbeiten ausführen Werkzeuge Durchsuchen Fenster Hie

ii

>

bS

'

ijasiatl| J} £ i¡l BpIntelEmSys. | _JC:\W1ND0W...| LabVIEW Abb. 12.2:

Merkmalsberechnung und Lernprozedur in Frame 3

-lfl|x|

12.1

179

Quellcode des Bildverarbeitungsprogramms

Das

Klassifikationsprogramm ist ähnlich aufgebaut, kann aber auf die geschachtelte Schleife verzichten, da es nur ein Bild auswertet. Die Frames 0, 1 und 2 dienen ebenfalls der Speicherallokation, Originalbilddarstellung und der Segmentierung. Frame 3 (Abb. 12.3) liest die œ

E> Bv Klassi.vi Diagramm Datei Bearbeiten Ausführen Werkzeuge Durchsuchen Fenster Hilfe

\$>\®\

;

iHjlffiljItajffLJ I 13pt Anwendungsschifart }| ga» jUr¿ ,

-

j

"3

-fi C:\Betaenz. xls|

H 1-1



P¡H::b

nur.

tifa

Speicher

OriqinalbHd

3 [0.41

tH-ü a

a n o tan

"V-a-iWirjOO; I b-1257-x[11/100; D1-(a-K1[0])"2i (b-K1[1])"2; D2=(a-K2(0])"2 < (b-K2[1])"2:

Speichel Segmentier tes Bild

nnaannooaDbD

Merkmalsberechnung und Klassifikation

E ? si Anzahl der 0 biektel

[Entscheidung tur Klasse!

z-1; il(D2=128 );

PORT = c_port_temp; RW = 0;

Anhang

Literaturverzeichnis Bald 1999

Michael Baldischweiler Der C51 Compiler Electronic Media, 1999 ISBN 3-9804331-6-1

Belt 2004

Carlos Beitran Entwicklung eines sprachgesteuerten Embedded Systems Diplomarbeit, Fachhochschule Frankfurt a. M., 2005

Berm2001

Rainer Bermbach Embedded Controller Carl Hanser Verlag, München, 2001 ISBN 3-446-19434-7

Blan 1998

Benjain S. Blanchard, Wolter J. Fabrycky Systems Engineering and Analysis Prentice-Hall, London, 1998 ISBN 0-13-135047-1

Bräu 2003

Thomas Bräul Embedded Robotics

Springer-Verlag, Berlin, 2003

ISBN 3-446-21861-0 Güne 2005

Tahsin Güner, Gholamreza Khanmohammadi Embedded Vision System Diplomarbeit, Fachhochschule Frankfurt a. M„ 2005

Hrus 2002

Peter Hruschka

Agile Softwareentwicklung für Embedded Real-Time Systems mit der

UML Carl Hanser Verlag, München, 2002 ISBN 3-446-21997-8 Jama 2004

Rahman Jamal, Andre Hagestedt LabVIEW Das Grundlagenbuch Addison-Wesley, Deutschland, 2004 ISBN 3-8273-2051-8 -

192

lähn 2002

Literaturverzeichnis Bernd lähn

Digitale Bildverarbeitung Springer Verlag, Berlin, 2002 ISBN 3-540-41260-3

Keim 1996

Volker Keim, Gerhard Schnell 8051 Mikrocontroller Praktikum

Franzis-Verlag, Feldkirchen, 1996 ISBN 3-7723-5214-6 Paul 2003

Dietrich W.R. Paulus, loachim

Hornegger Applied Pattern Recognition Vieweg Verlag, Wiesbaden, 2003 ISBN 3-528-35558-1

Pham 2004

Thanh Thang Pham Vernetzung eines Multisensorsystems mit dem CAN-Bus Diplomarbeit, Fachhochschule Frankfurt a.M., 2004

Proc 2003

E. Prochaska

Digitaltechnik für Ingenieure Oldenbourg Verlag, München, 2003 ISBN 3-486-25969-5 Siem 1995

Microcomputer Components SAB 80515/ SAB 80C515 User's Manual 08.95 Siemens AG, München, 1995

Siem 1996

Microcomputer Components SAB

80C515/ SAB 80C515

Data Sheet 02.96 Siemens AG, München, 1996

Stal 2000

William Stallings

Computer Organization and Architecture Prentice-Hall, London, 2000 ISBN 0-13-081294-3 Tane 2001

Andrew S. Tanenbaum, lames Goodman

Computerarchitektur

Pearson Studium, München, 2001 ISBN 3-8273-7016-7 Tvet 1998

Donald R. Tveter The Pattern Recognition Basis of Artificial IEEE Computer Society ISBN 0-8186-7796-1

Wend 2004

Intelligence

Press, Los Alamitos, 1998

Andreas Wendemuth Grundlagen der stochastischen

Sprachverarbeitung Oldenbourg Verlag, München, 2004 ISBN 3-486-27465-1

Index 21

—A—

Bayes-Klassifikator

absolute Adresse 99, 101 Abstandsmessung 173

Befehlssatz 41,47, 145 Betriebssystem 8, 47

Befehls-Byte 43, 54, 85, 89, 101, 120

Abtastfrequenz 15, 72,

Bildverarbeitung 12, 27, 151, 152,

143

175

Abtasttheorem 15, 143, 161 Adressbereich 36

Binärcode 43

Adressbus 41, 50

Bit 35, 36, 55, 59, 72, 74, 75, 110, 111, 119, 126, 128

Binärsystem

Adressbyte, höherweniges 53, 54 Adressbyte, niederwertiges 53, 54 Adresse, physikalische 55, 99 Adresse, relative 94, 95, 99 Adresse, symbolische 55, 87, 99, 119

Adressierung

96

Akkumulator 44, 55, 59, 89, 90, 91, 92, 93,

94,95 ALE 50,52,54

35

Bitadresse 56, 119

Bitverarbeitungsbefehl 88, 93 Busbreite

36,41,46,47

—c— Carry-Flag 58,90,91,93,94 CISC 41,47 Cluster 14

ALU 45

Compiler 43, 85, 98

Analogtastatur 64, 70 Anzeige 61,67, 71, 105 Anzeigemodus 125

Counter 45, 76

C-Programm 76, 83, 119, 120, 123, 128,

162

Arithmetikbefehl 87,90

—D—

ASCII 38, 39, 67, 106

Assembler-Programmierung

85

Datenbus 41,50,54

—B—

Datenspeicher 40 Datenspeicher, externer 49, 52, 55, 59, 87, 96, 108

Bandbreite 15, 142 Barcode 14, 159

Datenspeicher,

Barcode-Sensor 63, 159, 168 Baud 74,79

Datentyp

interner 47, 49, 55, 60, 87,

96,97

119

Deklaration 119, 123,125

91,

Index

194 Diskriminanzfunktion 22, 26, 27 DJNZ 95, 100, 101, 107

Dynamik

Time

144

Warping

—E— Einzelwortverarbeitung

142

Elektronische Nase 14, 20

Integrated Development Environment Interrupt 109, 110 Interrupt-Einsprungadresse 110 Interrupt-Latenzzeit 111 Interruptnummer 121 Interrupt-Request 109, 110, 162, Interrupt-Serviceroutine 111 Interruptvektor 110

76

163

Entwicklungsumgebung 61, 63, 76, 77, 85, 120, 123 Erkennungsphase 13, 21, 137, 142, 145, 155 Evaluation Board 61,64,78, 149

—K— Klassifikation 21

Klassifikator 13 Kovarianzmatrix 23

—F— Farbsensor 135, 136, 140

Flag 59, 68, 72, 87, 89, 90, 92, 93, 94 Flussdiagramm 101 Formparameter 20

—L—

Funktionsaufruf 122

LabVIEW 28, 36, 155, 180, 185 Lastenheft 5, 6

—G—

LCD-Display 67, 124 Lernphase 13,22, 137 Lernstichprobe 23, 29 Linker 76

GANT-Diagramm 8,9 Gaußverteilung 23

Logikbefehl 88,92

—M—

—H— Harvardarchitektur 41

Headerdatei 76, 125, 126, 133 Hexadezimalcode 43, 82, 99 Hexadezimalzahl 38

Hinderniserkennung

173

Matrixtastatur 64, 69 Merkmal 12, 19, 30, 137, 143, 145 Merkmalsraum 21, 135

Merkmalsvektor 19,21 Mikrobefehl 44

Mikrocomputer 35, 53 Mikrocontroller 7, 35, 40, 46, 49, 151, 159, 173

—I—

Mikroprozessor

I/O-Komponente

41

Instruktionsrate 41,46,47

Mini-Modul 61 MIPS

41,47

40

Index

195 58

Mittelwertsvektor 22

Registerbank

Mittenfrequenz 20, 143 Mustererkennung 11,143 Musterrepräsentation 14 Mustersignal 14, 15

Reload-Wert 75 RISC 41 ROM 41

—N—

—s—

negative Zahl 36 negative Zahlen 120

Schwellwertmethode 17

—o—

Rücksprungadresse 105,110,182

Segmentierung 17, 143, 161 Sensor, intelligenter 136,159,168 Serielle Schnittstelle 74

Objekt 11, 144 Operand 43, 59, 86, 98 Operator 85

—P— Pharmacode 159 Phase 44

Signalakquisition 15, 143 Signalvorverarbeitung 16 Slave Modus 145, 148, 155

Special-Function-Register 55, 72, 74 Speicherkapazität 36 Spracherkennung 11,141 Sprungbefehl 88,94 Stackpointer 60 Stackspeicher 60

Port 46,50, 119, 146

Stand-Alone-Modus 144, 145

Precrash-Sensor 174

State 54

Programmspeicher 49, 85, 98 Projektplan 8

Steuerwerk 44, 45, 46 Strichcode 168

Summenabstand 144

Systemfunktion

-QQuellcode 80,

177

124

—T—

—R—

Tabellen Verarbeitung 108 Timer 46,74, 123

RAM 40, 68

Timing-Diagramm

Rechenwerk 44

Tonhöhenzahl 103

Referenzvektor 21, 28, 137

Tonprogramm 103, 104 Transportbefehl 87,89

Register 44,49,55,71,86,96

53

Index

196 t t

Ultraschallsensor 173

Unterprogrammbefehl 88,94

Vordergrundpixel 17 Vordergrundsample 17

-WWortbreite 35

—V— —z— V-Modell 6,7

von-Neumann-Architektur 41

Zeiger 96