| |
1.2
|
Projekte realisieren
|
|
| |
1.2.5.1 |
Blinken einer LED im Takt von einer Sekunde -
ELI04 |
|
| |
|
Informationen, die dieser Seite hinzugefügt werden sollen, sind auf den
FTP-Server im Raum 1.13 dieser Webseite
hinzuzufügen. Bitte kurz Bescheid geben, damit der
aktuelle Stand in Internet geladen werden kann.
|
|
| |
 |
|
1. |
|
 |
Problemformulierung |

Nach Betätigung eines Tasters soll eine LED des LPC-Experimentierboards
im Takt von einer Sekunde anfangen zu blinken.
Nach einer weiteren Betätigung des gleichen Tasters soll die LED wieder
verlöschen.
|
|
|
| |
 |
|
2. |
|
 |
Problemlösung von Holger Ströher |
Lösungsbeschreibung
Da nur ein Taster verwendet werden soll, muss der jeweilige Zustand (LED blinkt/LED blinkt nicht) zwischengespeichert werden. Man verwendet dazu eine boolesche Variable vom Typ bit. Dieser Typ ist eine Erweiterung des C-Standards von der Fa. Keil, er belegt nur ein Bit im Datenspeicher des Prozessors.
Das Hauptprogramm besteht im wesentlichen aus einer Endlosschleife, in der dieses Bit ständig abgefragt wird. Ist es gesetzt, wird die LED angeschaltet, eine Warteschleife aufgerufen, die LED ausgeschaltet und wieder die Warteschleife aufgerufen.
Die Abfrage des Tasters erfolgt interruptgesteuert. Der Interrupt wird durch eine fallende Flanke an Pin 3 des Ports 1 ausgelöst. In der Interruptroutine wird nach einer kurzen Entprellzeit die Bitvariable invertiert.
Verwendung neuer Techniken
Definition von Konstanten
Im Quelltext wird von der Möglichkeit der Definierung von
Konstanten mit der Präprozessoranweisung
#define
Gebrauch gemacht.
#define SEKUNDE 184319 bedeutet, dass im Quelltext
jedes Vorkommen von
SEKUNDE durch
184319 ersetzt wird.
Dadurch kann der Quelltext leichter modifiziert werden.
In unserem Beispiel wird durch
SEKUNDE der Übergabewert
für die Warteschleife definiert. Möchte man aus irgendeinem Grund (z.B.
Verwendung eines schnelleren Prozessors) den Übergabewert verändern, braucht
man nur die Definition neu zu schreiben.
Mit bereits definierten Konstanten kann man auch rechnen:
Die Anweisung #define ENTPRELLZEIT SEKUNDE/100
definiert eine Konstante
ENTPRELLZEIT mit einem Hunderstel von
SEKUNDE (Ganzzahldivision).
Eine weitere Anwendung von Konstanten ist die Verbesserung der Lesbarkeit
des Quelltextes. Da die LED auf dem Board mit einem niedrigen Pegel
an- und mit einem hohen Pegel ausgeschaltet wird, schreibt man in den ersten
Zeilen wie folgt:
#define AUS 1
#define AN 0
und im eigentlichen Code:
sbLED = AUS;
//...
if( sbTaster == AN )
Invertierung einer Bitvariablen
Eine Bitvariable kann durch eine bitweise Negierung invertiert werden.
Dies geschieht mit dem unären Operator
~.
Der Einzeiler
btBlinken = ~btBlinken;
ist kürzer als
if( btBlinken == 0 )
{
btBlinken = 1;
}
else
{
btBlinken = 0;
}
Er erzeugt auch schnelleren Maschinencode, da ja die Verzweigung und der Vergleich entfallen.

zum Anzeigen der Lösung im pdf-Format auf die Grafik klicken
-
Lösung als StarOffice-Datei
Quelltext
Stand: 19.09.2005
|
|
|
| |
 |
|
3. |
|
 |
Problemlösung von Tobias Braun |
|
Lösungsbeschreibung
Wird der Taster gedrückt so fängt die LED an zu blinken. Bei einem zweiten Tastendruck soll die LED wieder aufhören zu blinken. Der Zustand der LED (Blinken oder nicht) wird über eine Hilfsvariable abgefragt. Bei erneutem Drücken der Taste wird der aktuelle Zustand der Hilfsvariable invertiert.
Verwendung neuer Techniken
Zur Abfrage des aktuellen Status wird eine Hilfsvariable verwendet.
zum Anzeigen der Lösung im pdf-Format auf die Grafik klicken
.gif)
- Lösung als StarOffice-Datei
Stand: 19.09.2005
|
|
|
| |
 |
|
4. |
|
 |
Problemlösung von Sandy Stillemunkes |
Lösungsbeschreibung
Zum Blinken im Sekundentakt wird eine Zählschleife eingesetzt.
Der Schalter wird realisiert über die Zustandsabfrage. Die Zustandsänderung erfolgt per Interrupt.

zum Anzeigen der Lösung im pdf-Format auf die Grafik klicken
- Lösung als StarOffice-Datei
Stand: 19.09.2005
|
|
|
| |
 |
|
5. |
|
 |
Problemlösung von Bastian Werner |
Lösungsbeschreibung
Das Blinken der LED wird über eine Zählschleife, das An-
und Ausschalten der Blink-Funktion über eine
"Merkervariable" und die Interruptfunktion realisiert.
Zum Abbruch des Programms wird der Befehl AUXR1 = 0x08; verwendet.

zum Anzeigen der Lösung im pdf-Format auf die Grafik klicken
-
Lösung als StarOffice-Datei
Quelltext
Stand: 19.09.2005
|
|
|
| |
 |
|
6. |
|
 |
Problemlösung von JB |
Lösungsbeschreibung
Das geforderte Blinken der LED wird mit Hilfe eines Zählers realisiert.
Wird der Taster das erste Mal betätigt, zählt der Zähler bis zu einem bestimmten Wert.
Ist der Wert erreicht, wird die LED eingeschaltet und der Zähler beginnt erneut zu zählen.
Beim abermaligen Erreichen des vorgegebenen Zählerendwertes wird die LED ausgeschaltet.
Dieser Vorgang wiederholt sich in einer Endlosschleife solange bis der Taster zum zweiten Mal betätigt wird.

zum Anzeigen der Lösung im pdf-Format auf die Grafik klicken
-
Lösung als StarOffice-Datei
Stand: 19.09.2005
|
|
|
| |
 |
|
7. |
|
 |
Problemlösung von |
|
|
| |
 |
|
8. |
|
 |
Beispiel
zur Unterprogrammtechnik |
| |
|
#include <reg932.h>
unsigned long ulZaehler;
unsigned long ulCounter;
void zaehler ( ulZaehler );
void main ( void )
{
zaehler ( 10000 );
zaehler ( 1000);
while ( 1 );
}
void zaehler ( ulZaehler )
{
for ( ulCounter=1; ulCounter <= ulZaehler; ulCounter++ )
{
;
}
} |
// Deklaration der Variablen ulZaehler
// Deklaration der Variablen ulCounter
// Funktionsprototyp, Deklaration der Funktion zaehler()
// "lange Wartezeit"
// "kurze Wartezeit"
// Endlosschleife, ansonsten wird der Programmspeicher
// immer weiter nach unten gelesen. Und da kann schon
// mal Datenmüll stehen!
// "tue nichts"
|
|
|
| |
|
|
|
| |
|
|
|
| |
|
| |
|
| |
|
Quellennachweis:
Grafik der "Lernbausteine" der Original-LEGO-Website
entnommen |
Datenblätter:
 |
|