Programmierung eines Mikrocontrollers
©2012
Studienarbeit
50 Seiten
Zusammenfassung
Die Zielsetzung des Projektes ist es, einen Mikrocontroller “C8051 F0200“ von „Silicon Laboratoratories“ zu programmieren und dabei das Hochzählen im Sekundentakt zu realisieren. Die Programmierung des Mikrocontrollers kann sowohl mit „Visual C++ 2010 Express“ als auch mit der beigelegten Development Software IDE auf „C-Basis“ durchgeführt werden. Der dabei entstehende Programmcode soll charakterisiert und anschließend auf einer 7-Segmentanzeige ausgegeben werden. Diese Arbeit stellt im weiteren Sinne eine Dokumentation der einzelnen Entwurfsschritte da und möge die Funktionalität der dabei entstehenden Digitaluhr beweisen. Dabei ist vorrangig auf die Möglichkeit der Umsetzung im Labormaßstab bei minimalen Kosten zu achten.
Leseprobe
Inhaltsverzeichnis
Rufnummer und den Aufbau des Telefonats benötigt. Mit Handys kann man heute aber auch Videos
machen und Musik hören. Für diese Funktionen bedarf es allerdings schon einens PC. Da es nicht für
jede Aufgabe einen speziellen Mikrocomputer gibt, kann man aus einer Vielzahl von Baumustern
einen geeigneten selektieren. Es gibt unterschiedliche Hersteller, die viele Varianten von Controllern
produzieren, welche sich aber in der grundsätzlichen Funktionsweise kaum unterscheiden. Mikrocon-
troller variieren in der Anzahl von Ein- und Ausgängen sowie über spezielle Hardwarebausteine im
Inneren, mit denen verschiedene Aufgaben vereinfacht werden. In der Regel verfügen Cs über ei-
nen Timer, mit dem man Zeiten bestimmen und Signale definierter Länge generieren kann. Auße r-
dem haben viele Bausteine einen integrierten Analog-Digital-Wandler, der es ermöglicht, analoge
Signale wie z.B. Temperatur oder Batteriespannung zu messen. Die Große des Mikrocontrollers wird
durch die Anzahl seiner Pins definiert. Die Anzahl der Pins ist vom Aufgabengebiet des Kont rollers
abhängig. Es darf festgehalten werden, dass auch die Rechenleistung mit der Anzahl der Pins steigt,
da bei vielen Pins auch mehr Aufgaben bewältigt werden müssen. Auch die Anzahl der Bits, die
gleichzeitig verarbeitet werden, steigt mit der Größe des Mikrocontrollers. Es gibt Baueinheiten mit
einer Busbreite von 4 Bit 64 Bit. Am weitesten verbreitet sind Cs mit 8 bis 16 Bit. 32 Bit Mikro-
computer sind meist in Geräten eingesetzt, die einen Farbdisplay ansteuern oder zum Datenaus-
tausch mit dem PC verbunden (SD Karten) werden. Für die meisten Anwendungen sind günstige 8-
Bit-Mikrocontroller ausreichend. [URL 1] [MFE, 2009]
W-Register
ALU
Ports Timer
Schnittstellen
EEPROM
Status
Register
FSR Register
Programmzähler
RAM
Register
Adressen
Multiplexer
Programm
speicher
Multiplexer
Befehlsregister
Stack
Ebenen
Abbildung 1: Allgemeines Blockdiagramm eines Mikrocontrollers [MFE, 2009]
2
2.1.2
Die Arithmetic Logic Unit ALU (Rechenwerk, Operationswerk)
Damit ein C überhaupt funktioniert, sind viele Funktionsblöcke nötig, die optional zusammenarbei-
ten müssen. Die Arithmetic Logic Unit ist dabei der wichtigste Bestandteil. Sie ist das Regelwerk des
Controllers. In dieser Einheit werden Addition und weitere logische Operationen durchgeführt. Damit
sie mit den richtigen Werten rechnen kann, müssen diese zum richtigen Zeitpunkt vom richtigen
Speicherort zur Verfügung gestellt werden. [MFE, 2009] [MT, 2009]
2.1.3
Der Programmspeicher
Zu Beginn muss der Mikrocontroller mit Daten versorgt werden. Der C versteht keine Programmier-
sprache wie Basic, C oder Assembler und muss daher mit rein binären Werten (also Nullen und Ein-
sen) beschrieben werden. Diese werden dann im Programmspeicher beginnend bei der Adresse
0x0000 abgelegt. Da der Speicher ein nicht flüchtiger Speicher ist, der die Daten auch nach dem Aus-
schalten behält, wird hier der Programmcode gespeichert. Läge man die Daten in den RAM-Speicher,
würde das Gerät nach dem Ausschalten nicht mehr funktionieren. Um nun Daten zu generieren, die
der PIC versteht, sind einige Schritte nötig. Theoretisch könnte man direkt den Programmcode in
Form von binären Werten schreiben und mit einem Programmiergerät in den Mikrocontroller laden.
Dieses Vorgehen wäre jedoch impraktikabel und viel zu aufwändig. Daher werden verschiedene Pro-
grammiersprachen zur Mikrocontroller Programmierung eingesetzt. Gängige sind C oder Assembler.
Beide Sprachen sind hardwarenah und können daher direkt mit den physikalisch vorhandenen Regis-
tern kommunizieren. Für größere Mikrocontroller wird fast ausschließlich C verwendet; bei kleineren
häufig Assembler, um die Hardware optimal auszunutzen. Für unser Projekt werden wir die C-
Programmierung einsetzen. [MFE, 2009] [ITG1, 2010] [MT, 2009]
2.1.4
Der Compiler und der Linker
Wie bereits erwähnt, wäre es viel zu umständlich, in Maschinensprache
2
zu programmieren. Daher
wird ein Programm, welches den C-Code oder den Assembler-Code enthält, in Maschinensprache
übersetzt. Man nennt dieses Tool Compiler. Er geht Schritt für Schritt durch den Code und interpre-
tiert die vom Entwickler programmierten Befehle. Dies geschieht häufig in mehreren Durchgängen.
Nach dem Kompilieren müssen die einzelnen Module mit einem weiteren Tool, dem Linker, verbun-
den werden. Dieser liefert den Maschinencode, welcher auf dem vorgesehenen Controller funktions-
fähig ist. Während des Übersetzungsvorgangs wird eine Datei mit der Endung ,,.hex" generiert, die
beschreibt, an welcher Stelle im Speicher die einzelnen Befehle stehen sollen. D ieses File kann an-
schließend mit einem Programmiergerät in den Mikrocontroller geladen werden. Dadurch gelangt
das Programm in den Programmspeicher. Durch einen internen oder externen Takt wird der Pro-
grammzähler schrittweise hochgezählt und führt so einen Befehl nach dem anderem aus. Die Befehle
werden dann im Befehlsregister verarbeitet und die Daten und RAM-Adressen werden über die in-
ternen Leitungen an das Rechenwerk (ALU) oder den RAM-Speicher weitergegeben. [MFE, 2009]
[ITG1, 2010] [MT, 2009] [ITH, 2005]
2.1.5
Die Datenverarbeitung in der ALU
Nachdem die Daten in der ALU (dem Rechenwerk) angekommen sind, können sie nun verarbeitet
werden. Dabei werden die Daten zunächst in das W-Register geladen und anschließend in das RAM-
File Register weitergeleitet. Die ALU kann nur einfache logische Operationen ausführen, daher sind
alle Befehle logisch verknüpft. Es ist möglich die Register durch UND(AND), ODER (OR) und XODER
2
Ist die einzige Sprache, die ein Prozessor wirklich versteht. Ausführbare Programme bestehen aus Maschinen-
code. Die Kombinationen der einzelnen Bits steuert die CPU.
3
(XOR) zu verknüpfen. Die Daten können also nur addiert und subtrahiert werden, eine Multiplikation
oder Division ist nicht möglich und muss durch die Kombination der Grundbefehle aufgebaut we r-
den. [MFE, 2009] [ITH, 2005]
2.1.6
Das Statusregister
Um den Status der einzelnen Befehle zu erhalten, markiert das Statusregister diese mit sogenannten
Statusflags (Status-Flaggen). Diese zeigen an, was genau bei einer Operation geschehen ist. Unter
weiteren handelt es sich dabei z.B. um das Carry-Flag (C), das Digit-Carry-Flag (DC) und das Zero-Flag
(Z). Das Carry-Flag zeigt einen Übertrag an, wenn beispielsweise nach einer Addition, das Ergebnis
nicht mehr mit 8 Bit dargestellt werden kann. Das Digit-Carry Flag zeigt einen Übertrag nach dem
vierten Bit an. Die Zero-Falg zeigt an ob, nach einer Operation das Ergebnis Null ist. [MFE, 2009] [MT,
2009]
2.1.7
Die Assemblerbefehle und Befehlsübersicht
Die meisten C sind RISC-Prozessoren. RISC steht für Reduce Instruction Set Computer und bedeutet
übersetzt ,,Computer mit reduzierten Befehlen". Das heißt, dass der Controller mit einem begrenzten
Befehlssatz auskommt. Das Gegenteil ist der CISC-Prozessor. CISC heißt ,,Complex Instruction Set
Computer". Er verfügt über einen komplexeren Befehlsumfang. Dabei werden mehrere Befehle zu
einem Befehl zusammengefasst. Der Vorteil von CISC-Prozessoren ist eine vereinfachte Programmie-
rung. Allerdings müssen dazu mehr Befehle erlernt werden und jeder Befehl hat je nach Umfang eine
unterschiedlich lange Ausführungsdauer von meist mehreren Befehlstakten. [MFE, 2009] [8051]
Der Mikrocontroller ,,C8051 F0200" von Silicon LABS ist ein 8-Bit-RISC-Prozessor der Harvard Archi-
tektur; sein entsprechender Befehlssatz kann dem ,,8051 Instruction Set"
3
entnommen werden. Wei-
tere theoretische Grundlagen finden sich z.B. in den Werken ,,Mikrocontroller für Einsteiger", ,,Mik-
roprozessortechnik" und ,,Die Mikrocontroller 8051, 8052 und 80C517" aus dem Literaturverzeichnis.
Die theoretischen Grundlagen zum zu unserem ,,C8051 F0200 Development Kit" sind unter
http://www.silabs.com/Support%20Documents/Software/8051_Instruction_Set. pdf
zu finden. In
diesem Dokument soll aufgrund der zunehmenden Komplexität und limitierten Umfang der SCA nicht
weiter darauf eingegangen werden. Vielmehr soll die Handhabung und das Verhalten des ,,C8051
F0200" von Silicon LABS bei Programmierung mit C beschrieben werden. [URL 2] [8051]
2.2
Der Stand der Mikrocontrollertechnik
Um den aktuellen Stand der Technik darzustellen, bietet sich die Recherche im Internet an. Einen
sehr guten Überblick und eine große Auswahl an Microcomputern bietet die Seite:
http://www.mikrocontroller.net
und
https://www.mikrocontroller.com
Hier findet sich eine Vielzahl
selbiger von 4Bit -64 Bit mit den dazugehörigen Datenblättern, Kaufpreisen und Lieferanten. Auch die
folgenden Internetseiten
http://elmicro.com/
und
http://www.silabs.com
bieten eine Vielzahl von
Produkten und Informationen zu diesem Thema.
Übungs- und Programmierbeispiele für den ,,8051" sind auf
http://vdf.ethz.ch
erhältlich.
Auf den Internetseiten von Pearl oder Conrad finden sich Lern- und Anwendungspakete zum Thema
Mikrocontrollertechnologie.
http://www.conrad.de/ce/
and
http://www.pearl.de/c.shtml
3
Vgl. URL 3: 8051 Instruction Set
4
3
Die Mikrocontrollerprogrammierung in der Praxis
3.1
Die benötigten Ressourcen
Für die Umsetzung der Aufgabe ist folgende Hardware und Software notwendig: Mikrocontroller
(C8051 F0200 Development Kit) mit dem dazugehörigen Treiber, USB-Debugger, Kabel und einen
Laptop oder PC (z.B. Asus Notebook N5 Series), auf welchem eine C-Programmiersoftware lauffähig
ist, sowie eine C-Programmiersoftware (z.B. Visual C++ 2010 Express). Die folgende Abbildung zeigt
das Blockdiagramm für den inneren Aufbau des Cip-51-Mikrocontrollers und C8051-F0200 Develop-
ment Kits). Um die Digitaluhr anzeigen zu können, muss eine kleine ,,Schaltung" aufgebaut werden.
Hierzu wird eine 7-Segmentanzeige (Hewlett Packard 5082-7740), 75-Widerstände, Breitbandkabel
mit Stecker und eine Steckbrett benötigt. Um den Aufbau umzusetzen, werden die typischen Elekt-
ronick-Werkzeuge wie Lötkolben, Seitenschneider usw. benötigt.
Abbildung 2: Blockdiagramm des CIP-51-Mikrocontrollers und C8051F0200 Development Kit.
3.2
Der allgemeine Versuchsaufbau
Der allgemeine Versuchsaufbau besteht lediglich darin, dass der Mikrocontroller über den USB De-
bugger mit dem Rechner verbunden wird. Nun muss für eine funktionierende Kommunikation zwi-
5
schen den beiden Geräten gesorgt werden. Dafür müssen diverse Treiber
4
installiert werden. Eine
leicht verständliche Beschreibung hierfür ist im Development Kit vorhanden. Dann wird die kosten-
lose Programmiersoftware ,,Visual C++ 2010 Express" installiert und gestartet. Diese kann man als 30
Tage Testversion von der Microsoft-Homepage herunterladen und nach Ablauf der 30 Tage für ein
Jahr online freischalten lassen. Um letzteres zu testen, wird ein neues Projekt (Name Test) angelegt,
welches auf einer ,,Win32-Konsolenanwendung
5
" basiert. Nach dem Speichern haben wir bereits ein
lauffähiges Programm, das wir in folgendem nach unseren Bedürfnissen und Aufgaben durch Pro-
grammierung charakterisieren können. Die erste Abbildung stellt den Versuchsaufbau dar. Die zweite
Abbildung zeigt eine Win32-Konsolenanwendung in ,,Visual C++ 2010 Express".
Abbildung 3: Der allgemeine Versuchsaufbau [Anhang 2]
Abbildung 4: Win32-Konsolenanwendung in ,,Visual C++ 2010 Express"
4
Die Silicon Laboratories Integrated Development Environment (IDE) ist die Entwicklungsumgebung. Die Keil
8051 Development Tools beinhalten den macro assembler, linker, evaluation `C' compiler.
5
Ist ein Computerprogramm ohne grafische Benutzeroberfläche, welches lediglich über Textkommandos ge-
steuert wird. (Graphical User Interface oder GUI)
6
3.2.1
Der Test des Versuchsaufbaus mit ,,Blinky stripped"
Um die reibungslose Kommunikation zwischen den fünf Komponenten (Rechner, C-Programm, Trei-
ber USB-Debugger und C) zu prüfen, wurde in die bereits installierte ,,Silicon Laboratories In-
tegrated Development Environment [IDE]" das mitgelieferte Beispielprojekt ,,Blinky" geöffnet. Ein auf
das Wesentliche reduzierter Programmcode ,,Blinky_stripped" findet sich im Anhang 3. Dieser lässt
die auf dem Target Board installierte grüne LED in einer bestimmten Frequenz blinken. Als erstes
muss das Programm auf den Chip übertragen werden und kann dann mit der ,,Play" Taste ausgeführt
werden. Die LED blinkt mit einer Frequenz von fünfmal pro Sekunde. Mit diesem Projekt werden
verschiedene Basisfunktionen des ,,C8051" getestet. Dies sind:
x disabling the watchdog timer (WDT),
x configuring the Port I/O crossbar,
x configuring a timer for an interrupt routine,
x initializing the system clock,
x configuring a GPIO port.
Nun kann man das USB-Kabel von dem Target Board abziehen und die LED blinkt weiter. Das bedeu-
tet, dass das Programm selbstständig auf dem C weiterläuft. Mit diesem Test und der lauffähigen
,,Win32-Konsolenanwendung" sind die erforderlichen Grundlagen zur Umsetzung des Projektes ge-
geben.
3.2.2
Weitere Tests und Änderung des Programmcodes mit ,,Blinky stripped"
Um sich mit dem Mikrokontroller und deren Verhalten vertraut zu machen, wurde das C-Programm
verändert. Unter dem Kommentar ,,// disabling the watchdog timer" wurde die Blinkfrequenz verän-
dert ,,Timer3_Init (SYSCLK / 12 / 10);". Für fünfmal blinken pro Sekunde steht die ,,10" (10/2=5) Um
die LED dreimal pro Sekunde blinken zu lassen kann die Zahl auf ,,6" (6/2=3) geändert werden. Da bei
sei erwähnt, dass man eine minimale Blinkfrequenz von ca. 1,5mal pro Sekunde einstellen ka nn, da
man sonst aus dem 16-Bit-Rahmen (2
16
= 65536 Werte) läuft. Die Spannung, welche die LED zum
Blinken bringt, kann über die Pins 1 und 7 von Port 1 auf dem Oszilloskop dargestellt werden. Die
folgenden Formeln beschreiben die Beziehung zwischen SysClock=2MHz
6
, Reloadvalue(RLV),
Takt=12, Interruptfrequenz(IF)=10Hz.
=
: 3.1
Es wird ersichtlich dass, je größer die Interruptfrequenz wird, desto kleiner wird der RLV. In unserem
Fall lautet die Rechnung:
=
2000000
12
10
= 16666,666
< 65536
Als nächstes folgt ein Beispiel mit 2-Hz-Interruptfrequenz, welche aus dem 16Bit Rahmen läuft und
daher mit dem 8051 nicht verarbeitet werden kann.
=
2000000
12
2
= 83333,333
> 65536
Die Spannung, welche die LED zum blinken bringt, kann über die Pins 1 und 7 von Port 1 auf dem
Oszilloskop dargestellt werden. Das nächste Foto zeigt dieses ,,Rechtecksignal" auf einem Digital Os-
zilloskop.
6
Eigentlich schwankend zwischen 1,6MHz und 2,4MHz.
7
Abbildung 5: Rechtecksignal an grüner LED vom Code "Blinky_stripped"
Auf Basis dieses Verhaltens soll die Uhr programmiert werden. Zunächst wird die Inkrementfrequenz
(f
int
), die sich daraus ergebende Inkrementzeit (T
int
) und die benötigte Reloadzeit (T
rel
) berechnet.
=
3.2
=
2000000
12
= 166666,66
=
3.3
=
1
166666,66
= 0,6 10
=
2 3.4
= 0,6 10 65536
= 0,3932 0,4
3.3
Die Programmierung der Uhr
Die eigentliche Uhrenfunktion ist ein C-Programm, welches auf den Mikrocontroller übertragen wird
und von dort aus die einzelnen Segmente der 7-Segmentanzeige ansteuert. In diesem Teil der SCA
wird die Inbetriebnahme der 7-Segmentanzeige und der Programmcode beschrieben. Abschließend
wird der Funktionstest dargestellt.
3.3.1
Das Anschließen der 7-Segmentanzeige
Zu Beginn muss die Pin-Belegung der Anzeige ermittelt werden. Dabei wurden die einzelnen Pins per
Diodentest mit einem Multimeter ,,abgefragt". Die Eigenspannung des Messgerätes ist ausreichend,
um die Dioden zum Leuchten zu bringen und diese ihrem Pin zuzuordnen. Dieser Test lieferte folgen-
des Ergebnis: die nächste Grafik zeigt an, welche Diode (Balken) mit welchem Pin angesteuert wer-
den kann. Die Tabelle zeigt, welche Dioden Leuchten müssen, um eine bestimmte Zahl anzuzeigen
8
(Binärcode) und das dazugehörige Bitmuster als Dezimalzahl. Zum Beispiel müssen, um die Zahl sie-
ben anzuzeigen, die Dioden an Pin 3,2,1 angesteuert werden. Dies entspricht dem Bitmuster 1+4+8.
Zahl
Balkennummer auf 7Segma.
(Binärcode)
Duale Aufsummierung
(Bitmuster)
Ergebnis:
Dezimal
10 3 2 1
7
9
8
4
0
1 1 1 1
1
1
0
0 1+2+4+8+16+32
63
1
0 1 1 0
0
0
0
0 2+4
6
2
1 0 1 1
0
1
1
0 1+4+8+32+64
109
3
1 1 1 1
0
0
1
0 1+2+4+8+64
79
4
0 1 1 0
1
0
1
0 2+4+16+64
86
5
1 1 0 1
1
0
1
0 1+2+8+16+64
91
6
1 1 0 1
1
1
1
1 1+2+8+16+32+64+128
251
7
0 1 1 1
0
0
0
0 2+4+8
14
8
1 1 1 1
1
1
1
0 1+2+4+8+16+32+64
127
9
1 1 1 1
1
0
1
1 1+2+4+8+16+64+128
223
Bit:
1 2 4 8 16 32 64 128
Abbildung 6: Bitmuster für gewünschte Zahlen & Pinzuordnung (Binärcode) der 7-Segmentanzeige.
Im nächsten Schritt wurde die 7-Segmentanzeige auf ein Steckbrett gelötet
7
und die einzelnen Pins
über einen 75-Vorwiderstand
8
mit einem Breitbandkabel verbunden. Dabei ist auf die entspre-
chende Farbe (Pin Belegung auf dem Board) zu achten.
9
Die genaue Pin-Definition findet sich in Ta-
7
Die Leiterbahn zwischen den Pins der Anzeige muss nach dem auflöten mittels einer Feile unterbrochen wer-
den, um die einzelnen Pins nicht kurzzuschließen.
8
An den roten LEDs der Anzeige fallen 1,5V ab. Um 1,5 abzubauen, werden bei 20mA 75 Vorwiderstände
benötigt. (1,5V/0,02A=75).
9
Auf der weißen Phase an Pin 9 liegen konstant 3,3V DC. Da diese nicht benötigt werden, wurde die Phase
,,weggebunden", um einen möglichen Kurzschluss zu vermeiden.
1
2
7
8
3
9
10
4
Pin 5&6 = Ground
9
belle 5 auf Seite 8 im Anhang 2. Das gleiche Vorgehen muss nun für die Anzeige der 10er-Sekunden-
Stelle wiederholt werden. Mit den beiden Anzeigen ist es möglich, das Hochzählen von 0 bis 19 Se-
kunden anzuzeigen. Das Foto soll die Pin-Belegung der Breitbandkabel verdeutlichen. Außerdem wird
ersichtlich, mit welchen Ports die Kabel auf dem Target Board verbunden werden. Später bei der
Beschreibung des Programmcodes wird deutlich, warum die Sekunden an Port 0 (P0) und die 10er-
Sekunden-Stelle an Port 1 (P1) ausgegeben werden. Steckt man eine weitere Anzeige an Port 2 (P2)
werden mit dem Programmcode in Anhang 4 die Minuten von 1-9 angezeigt. Insgesamt besitzt der
Controller 8051 10pin parallel Ports (0-7) mit je 3,3V Gleichstrom und digitalem Ground.
Abbildung 7: Fertiggestellte 7-Segmentanzeigeschaltung mit Verbindung zum Mikrocontroller
10
3.3.2
Der Programmcode
Als Grundlage für den benötigten Programmcode dient der oben erwähnte C-Code von
,,Blinky_stripped", welcher im Anhang 3 wiederzufinden ist. Der daraus entwickelte Programmcode
für die Uhr liegt im Anhang 4 und wird im Folgendem genauer beschrieben. Als erstes werden unter
// Includes
im Programmcode die Bibliothek und unser 8051-Chip als Zielobjekt eingebunden.
Dieser Befehl heißt ,,#include <c8051f020.h>". Mit den nächsten Zeilen wird definiert, dass zwei Ti-
mer benötigt werden.
sfr16 TMR3RL = 0x92;
sfr16 TMR3 = 0x94;.
Unter
// Global CONSTANTS
wird zunächst mit dem Befehl SYSCLOK die Abtastfrequenz auf 2 MHz
des internen Oszillators festgelegt.
Anschließend werden die ,,Charakter" für die Zeiteinheiten und
die Bitmuster in Dezimalzahlen für die anzuzeigenden Zahlen nach der Tabelle in Abbildung 6 defi-
niert.
#define
SYSCLK 2000000
// 2MHz for OSCICN.[1:0] = 00
// approximate SYSCLK frequency in Hz
char
oscmask = 0x00;
// OSCICN.[1:0] = 00 2MHz // 01 4MHz 10 8MHz 11 16MHz
char
wert_sec_10 = 0x00;
// 1/10 sec
char
wert_sec_1 = 0x00;
// 1 sec
char
wert_sec_6 = 0x00;
// 60 sec
char
wert_min_1 = 0x00;
// 1 -9 min
char
SSeg[10] = { 1+2+4+8+16+32,
//0
2+4,
//1
1+4+8+32+64,
//2
1+2+4+8+64,
//3
2+4+16+64,
//4
1+2+8+16+64,
//5
1+2+8+16+32+64+128,
//6
2+4+8,
//7
255 -128,
//8
1+2+4+8+16+64
//9
};
Unter
// Function PROTOTYPES
wird die Art des Rückgabewertes festgelegt. Also ist der Rückgabe-
wert ein ,,Charakter" oder ein ,,Integer". Im Falle ,,void" bedeutet es, dass Parameter vermieden
werden. Dieser Teil ändert sich nicht zum Code von ,,Blinky-stripped". Der entsprechende Programm-
code stellt sich wie folgt dar:
void
PORT_Init (
void
);
void
Timer3_Init (
int
counts);
void
Timer3_ISR (
void
);
//void OSCILLATOR_Init (void);
Die Definition der SysClock Daten findet sich im Programmcode unter
// MAIN Routine.
Auf Basis
des oben erklärten Verhaltes der ,,SysClock Funktion" wurde ,,Blinky-stripped" im Wesentlichen so
modifiziert dass, die SysClock alle 12 Takte (6s) einen Integer-Wert (PORT_Init) in den ,,Counter"
,,wirft". Das heißt, dass alle 6s der Counter um 1 hoch gezählt wird. Der Timer3_Reloadvalue (Re-
loadzeit: T
rel
=0,4s) macht den Counter dann einmal komplett leer. Und der ,,Interrupt" (10Hz) gibt
ein Bit-Signal aus. Dies wird mit einer While-Schleife realisiert.
void
main (
void
) {
// disable watchdog timer
WDTCN = 0xde;
11
WDTCN = 0xad;
// set internal oscillator frequency
OSCICN &= 0xfc;
OSCICN |= oscmask;
//OSCILLATOR_Init ();
PORT_Init ();
Timer3_Init ( SYSCLK / 12 / 10);
// Init Timer3 to generate interrupts
// at a 10Hz rate. for 2 MHz
EA = 1;
// enable global interrupts
while
(1) {
// spin forever
}
}
Asl nächstes muss die Definition von
// Timer3_Init
vorgenommen werden.
Diese weist keine
Unterschiede zu ,,Blinky-stripped" auf. Daher soll dieser lediglich dargestellt und nicht genauer be-
schrieben werden. Die Kommentare neben dem Programmcode sollen für die Beschreibung ausre i-
chen.
void
Timer3_Init (
int
counts)
{
TMR3CN = 0x00;
// Stop Timer3; Clear TF3;
// use SYSCLK/12 as timebase
TMR3RL = 0xffff-counts;
// Init reload values
TMR3 = 0xffff;
// set to reload immediately
EIE2 |= 0x01;
// enable Timer3 interrupts
TMR3CN |= 0x04;
// start Timer3
}
Die Port- und Registerdefinition mit
// PORT_Init
wurde lediglich um die Ports 0 und 2 erweitert.
Zudem wird definiert, wie die 8-Bitwerte an den Ports ausgegeben werden. Um die Eigenschaften der
Ports zu bestimmen, wurde das Datenblatt (User Guide Seite 173 Figure: 17.14 ,,Port1 Output Mode
Register") zu Hilfe genommen. Die folgende Abbildung zeigt diese Tabelle.
Abbildung 8: Eigenschaften von Port 0-7 aus dem Datenblatt.
In ihr heißt es z.B. für Port 1: "Output Mode Bits: 0=Open-Drain und 1= Push-Pull". Die PxMDOUT-
Register sind die Modusschalter für die einzelnen Aus- und Eingabebits eines Ports. Das bedeutet bei
0 wird mit einer externen Spannungsquelle gearbeitet und bei 1 die interne Spannung von 3,3V ver-
wendet. Da für unsere 7-Segmentanzeige 3,3V ausreichend sind, werden die benötigten Ports (0, 1,
2) auf ,,1" gesetzt. Diese ,,1" wird wie folgt eingegeben. Das Register hat 8 Bits und ist eine binär dar-
gestellte Zahl. Wenn alle 8 Bits auf 1 gesetzt sein sollen, muß man binär 1111 1111 eingeben. Dezi-
mal heißt das: 255 und Hexadezimal: FF (15*16 + 1*16). Im C-Code wird das mit ,,0xff" realisiert. So-
mit ergibt der folgende Programmteil:
12
Details
- Seiten
- Erscheinungsform
- Erstausgabe
- Erscheinungsjahr
- 2012
- ISBN (PDF)
- 9783958208261
- ISBN (Paperback)
- 9783958203266
- Dateigröße
- 22.1 MB
- Sprache
- Deutsch
- Institution / Hochschule
- bbw Hochschule
- Erscheinungsdatum
- 2015 (Februar)
- Note
- 1
- Schlagworte
- C++ Regelungstechnik Schaltungstechnik Mikrocontroller