![]() |
Praktikum MikrocontrollerperipherieProf. Jürgen Plate |
| Platz | Versuch | Schnittstelle | Rechner |
|---|---|---|---|
| Fenster 1 | 7-Segment-Multiplex | parallel 12 Bit | Arduino |
| Fenster 1 | GPS-Empfänger | seriell (9600) | Linux-PC |
| Fenster 2 | Ultraschall-Entf. | seriell (USB, 4800) | Linux-PC |
| Fenster 2 | Geigerzähler | parallel 1 Bit | Arduino |
| Fenster 3 | Kamera + Servos | seriell, TCP/IP | Arduino |
| Fenster 4 | RFID | seriell (9600), par. 3 Bit | Arduino |
| Fenster 5 | Temperaturregelung | analog, parallel 2 Bit | Arduino |
| Fenster 5 | 7-Segment-Multiplex | parallel 12 Bit | Arduino |
| Fenster 6 | Touch-Display | seriell (9600) | Linux-PC |
| Fenster 7 | Touch-Display | seriell (9600) | Linux-PC |
| Tür 1 | RFID | seriell (9600), par. 3 Bit | Arduino |
| Tür 2 | Grid-Eye | seriell (USB, 19200) | Linux-PC |
| Tür 2 | 7-Segment-Multiplex | parallel 12 Bit | Arduino |
| Tür 3 | Relaiskarte | parallel 7 Bit | Raspberry Pi |
| Tür 3 | I2C-Display | I2C | Raspberry Pi |
| Tür 4 | 3-Achsen-Beschleunig. | analog, parallel 4 Bit | Arduino |
| Tür 5 | Grid-Eye | seriell (USB,19200) | Linux-PC |
| Tür 5 | 7-Segment-Multiplex | parallel 12 Bit | Arduino |
| Tür 6 | RFID | seriell (9600), par. 3 Bit | Arduino |
Diese Aufgaben lösen Sie am jeweiligen Linux-PC um Labor E 204. Die Programmierung ist eins-zu-eins auf den Raspberry Pi übertragbar. Der PC hat lediglich den Vorteil, dass die serielle Schnittstelle mit V.24-Pegeln arbeitet. Der Raspberry Pi müsste erst mit einem Pegelwandler nachgerüstet werden. So dient der PC dient hier gewissermaßen als "RasPi-Simulator".
Ein Ultraschallsensor, bestehen aus Sender und Empfänger arbeitet wie ein Echolot: Der Sender schickt einen kurzen Burst aus und das Sensorsystem wartet auf das Echo. Ein mit Atmel ATmega bestücktes Mikrocontrollerboard steuert das Ultraschall-System an und liefert kontinuierlich über die USB-Schnittstelle (Pseudo-Seriellschnittstelle) jeweils die Laufzeit in Mikrosekunden als ASCII-String, der durch Carriage-Return und Linefeed abgeschlossen wird.
Einstellung der seriellen Schnittstelle:
Schreiben Sie ein Programm, das die Daten über die Schnittstelle einliest und
nach der Formel s = v * t in eine Entfernungsangabe umrechnet.
Dabei soll gelten:
v = Schallgeschwindigkeit (bei 20 Grad): 343.0 m/s
t = Laufzeit: Messwert in Mikrosekunden
Anmerkungen:
Grid-Eye ist ein Thermopile-Array-Sensor in SMD-Bauform von Panasonic. Der Sensor verfügt über 64 Thermopile-Elemente (PIR - Passive Infrared Array), die in einer 8 x 8-Matrix angeordnet sind. Damit lässt sich eine berührungslose Messung von Temperaturverteilungen realisieren. Die Thermopile-Sensoren des Grid-Eye können im Vergleich zu pyroelektrischen Sensoren auch statische Wärmestrahlung messen. Das Versuchssystem mit den Stone-Board liest den Sensor aus, rechnet sie auf die Temperatur in Celsiusgraden um und verschickt sie anschließend als 2-Byte ASCII-Hex-Wert seriell an die USB-Schnittstelle des PC, wo sie über eine pseudo-serielle Schnittstelle verarbeitet werden können (ttyUSB0).
Es werden jeweils acht Werte einer Sensorzeile als Folge zweistelliger Hexzahlen gesendet und mit einen Newline-Zeichen abgeschlossen. Nach jeweils acht Zeilen folgen zusätzlich zwei Newline-Zeichen. Es ergibt sich daher ein Block von ASCII-Zeichen wie in folgendem Beispiel (Newline ist durch ↵ repräsentiert):
181818191B1B1818↵ 181818191B1B1818↵ 1818181B1B191818↵ 1818181B1B119818↵ 18181B1B19191818↵ 18181B1B11919818↵ 1818181919191818↵ 1818181818181818↵ ↵ ↵Danach folgt der nächste Block usw.
Einstellung der seriellen Schnittstelle:
Schreiben Sie ein Programm, das die Daten über die Schnittstelle einliest und
als Matrix von ASCII-Zeichen, jeweils gefolgt von einem Leerzeichen darstellt.
Dabei soll gelten:
| Temperatur | Anzeige |
|---|---|
| < 24 | ' ' |
| 24 .. 26 | '.' |
| 27 .. 29 | '+' |
| 30 .. 32 | '*' |
| 33 .. 35 | '@' |
| > 35 | '#' |
. . . . + + . . ↵ . . . . + + . . ↵ . . . + + . . . ↵ . . . + + . . . ↵ . . + + . . . . ↵ . . + + . . . . ↵ . . . . . . . . ↵ . . . . . . . . ↵
Anmerkungen:
printf("\033[2J"); /* Dirty: clear screen */
printf("\033[1;1H"); /* Dirty: cursor home */
Das Global Positioning System (GPS), offiziell NAVSTAR GPS, ist ein globales Satellitennavigationssystem zur Positionsbestimmung. Es wurde seit den 1970er Jahren vom US-Verteidigungsministerium entwickelt. GPS ermöglicht seit Mitte 2000 auch zivilen Nutzern eine Genauigkeit von ca. 10 Metern. Die GPS-Satelliten strahlen codierte Radiosignale aus, die ständig ihre aktuelle Position und die genaue Uhrzeit liefern. Aus den Signallaufzeiten können GPS-Empfänger dann ihre eigene Position und Geschwindigkeit berechnen. Theoretisch reichen dazu die Signale von drei Satelliten aus. Da GPS-Empfänger keine Uhr besitzen, die genau genug ist, um die Laufzeiten der Signale korrekt zu messen, ist das Signal eines vierten Satelliten nötig, mit dem dann auch die genaue Zeit im Empfänger bestimmt werden kann.
Als Standardformat von GPS-Daten dient das RINEX-Format, eine Standard- und Formatdefinition, die einen freien Austausch von GPS-Rohdaten ermöglichen soll. Für den Austausch von GPS-Daten in Echtzeitanwendungen ist das RTCM-Format von Bedeutung. Alle Daten des GPS-Empfänger sind ASCII-Zeichen, die zeilenweise gesendet werden, mit einem "$" beginnen und durch Carriage Return (CR) und Linefeed(LF) abgeschlossen sind. Aufschluß über den Inhalt liefert das NMEA-0183-Referenzhandbuch. Von den verschiedenen Datensätzen interessieren uns nur zwei, die unten mit Beispiel und Beschreibung aufgelistet sind:


Die ASCII-Strings werden über die serielle Schnittstelle am den PC gesendet. Die Einstellung der seriellen Schnittstelle ist:
Schreiben Sie ein C-Programm, das aus dem Datenstrom vom GPS-Empfänger die GGA- und RMC-Zeilen extrahiert und auf dem Bildschirm ausgibt.
Erweitern Sie das C-Programm dahingehend, dass die Position, also die geographische Breite (latitude, Nord/Süd), die gegraphische Länge (longitude; Ost/West) und die Höhe (altitude) sowie die Uhrzeit in vom Menschen lesbaren Format (z.B. Stunde, Minute, Sekunde, ...) ausgegeben werden. Die Umrechnung von UTC in eine Zeitangabe aus Datum und Uhrzeit ist weiter unten beschrieben. Die Angabe von Breite und Länge erfogt in Grad (dd), Minuten (mm) und Minutenbruchteilen (mmmm). Die Umrechnung der Minutenbruchteile in Sekunden ist ganz einfach:
Sekunden = Minutenbruchteile * 60 Beispiel: GPS-Angabe (nautisch) 3723.2475 → 37° 23', Minutenbruchteil: 0.2475 Sekunden = 0.2475 * 60 = 14.85 → 37° 23' 14.85"Das Gradsymbol ° ist grundsätzlich eindeutig. Für Minuten, Sekunden und das Dezimaltrennzeichen werden in der Praxis folgende Symbole verwendet:
Programmiert werden soll die Ansteuerung eines Farbgrafik-LCD mit Touchscreen (EA-KIT 129-6) über die serielle Schnittstelle. Gefordert ist ein Entwurf des Bildschirm-Layouts (128 x 64 Pixel) und die Ausgabe unter Verwendung der oben aufgeführten Programm-Bibliothek display_funct:
26.10.2015 09:50:55 RX: 12226 MB, TX: 578 MB, AK: 67 LD: 0.09, 0.05, 0.01 /dev/sda1 34%Sorgen Sie im Programm dafür, dass die Informationen im 30-Sekunden-Abstand aktualisiert werden (Endlosschleife, sleep-Kommando).
Die Einstellung der seriellen Schnittstelle ist:
Nach manchen Grafik-Befehlen (z. B. Schriftart ändern, Button zeichnen) muss gewartet werden, damit das Display die folgenden Befehle korrekt ausführt (Auch mit Hardware-Handshake).
netstat -i Kernel-Schnittstellentabelle Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg eth0 1500 0 1286226046 0 0 0 606976358 0 0 0 BMRU lo 16436 0 24596559 0 0 0 24596559 0 0 0 LRUSie müssen die Zeile für eth0 herausschneiden (grep) und dann die Felder RX-OK und TX-OK in Shell-Variablen speichern. Das kann mit einer Kommando-Pipe der Form
VARIABLE=$(netstat -i | grep 'eth0' | awk '{print $FELDNUMMER}')
erreicht werden. Für RX ist das 4. Feld und für TX ist das 8. Feld zuständig.
Kürzen Sie die Werte auf Megabyte, indem Sie durch 1048576 (= 220) dividieren
(Programm bc: echo $X/$Y | bc).
Nun ermitteln Sie noch die Zahl der gerade aktuellen Verbindungen nach dem gleichen Muster:
AK=$(netstat -tu | wc -l)Von diesem Wert muss noch wegen der beiden Kopfzeilen 2 subtrahiert werden. Nun können die drei Werte ausgegeben werden.
uptime 09:42:11 up 244 days, 20:07, 3 users, load average: 0.09, 0.05, 0.01Schneiden Sie mittels sed alles einschließlich "load average:" weg und geben Sie nur die Lastinfo aus. br />
df Dateisystem 1K-Blöcke Benutzt Verfügbar Ben% Eingehängt auf /dev/sda1 67947448 21653428 42842460 34% / tmpfs 1947648 0 1947648 0% /lib/init/rw udev 1943200 104 1943096 1% /dev tmpfs 1947648 0 1947648 0% /dev/shmIdentifizieren Sie die Zeile, die sich auf die Festplatte bezieht (im Beispiel /dev/sda1) und extrahieren Sie diese mit Hilfe des grep-Kommandos. Schneiden Sie mittels awk '{print $1 " " $5}' den Namen der Platte und die Prozentangabe heraus.
Routinen für das serielle Touch-Terminal:
Da es sich um sehr viele, meist einzeilige Befehle handelt, bitte das Headerfile
studieren. Diese Bibliothek ist noch sehr sehr Alpha!
Headerfile display_funct.h
C-Quelle display_funct.c
Die Lesestation besteht aus einem 125-kHz-RFID-Empfänger, der seriell am Arduino angeschlossen
ist und einer Anzeigeplatine mit drei LEDs, die an den digitalen Pins 8, 9 und 10 des Arduino hängt.
Der RFID-Empfänger dient dem kontaktlosen Auslesen von so genannten Transponderkarten
(HF-Tags bzw. Read-Only-Transponderkarten). Die Aufbereitung der von der Transponderkarte
gelesenen Daten wird von einem Mikrocontroller übernommen und über die RS232-Schnittstelle an
den Arduino gesendet. Der RFID-Empfänger besitzt ein LC-Display auf dem die Daten sofort
angezeigt werden.
Nach dem Anlegen der Betriebsspannung erscheint der Text "RFID-Modul with U2270B" im Display.
LED 1 und LED 2 werden kurz eingeschalten und nach ca. zwei Sekunden wieder ausgeschalten.
Im Display erscheint der Text "check ...". Wird nun eine Transponderkarte in den Empfangsbereich
der Spule gehalten und vom Empfänger erkannt, zeigt dies die LED 1 an. Im Display wird der Text
"send..." und der 10-stellige Ident-Code der gelesenen Transponderkarte eine Sekunde lang angezeigt und
über die RS232-Schnittstelle mit 9600 Baud (8N1) ausgegeben. Dies erfolgt, solange sich die Karte
im Empfangsbereich befindet. Andernfalls wird LED 1 wieder umgeschalten und der Text "check ..."
im Display angezeigt.
Der Versuch besteht aus einem Geigerzählerbausatz von Vellemann und einen Optokoppler-Interface für die Parallelschnittstelle (die Arbeitsweise eines Geigerzählers wird in der Vorlesung besprochen). Der folgende Auszug der Schaltung zeigt die relevanten Teile:
Links im Bild sehen Sie eine Teilschaltung des Geigerzählers. An den einen Eingang von IC1 gelangt der sehr kurze Impuls vom Zählrohr, der mittels C14 und R12 verlängert wird. Dieses RC-Glied sowie IC1 und IC2 bilden eine monostabile Kippschaltung, an deren Ausgang ein genügend langer Impuls entsteht. Zwischen dem Kollektor von T3 und Masse war ursprünglich ein Piezo-Signalgeber geschaltet, der durch die grau umrandete neue Schaltung ersetzt wurde. Bei jedem Impuls des Geigerzählers schaltet T3 durch und die Anzeige-LED sowie die LED des Optokopplers leuchten auf. Der Ausgang des Optokopplers zieht darauf hin den Port 8 des Arduino auf Low-Potential. Für die einwandfreie Funktion muss der Kollektorwiderstand des Phototransistors auf High-Potential gezogen werden, was man durch Verbinden mit den 5 V des Arduino erreicht. Der Masseanschluss GND des Arduino verbunden. Damit kann durch kontinuierliche Abfrage des Port 8 der Zählimpuls erkannt werden.
Für erste Tests liegt ein ca. 50 Jahre alter, extrem geschmackvoller Teller bereit, dessen Glasur aus Uranoxid den Geigerzähler "tickern" lässt.
Neben der absoluten Zahl der detektierten Impulse soll nun die Zählrate berechnet werden. Erweitern Sie das Programm so, dass jede Minute die Anzahl der Impulse/Minute errechnet und diesen Wert zusammen mit der absoluten Zahl der Impulse über die Serielle Schnittstelle ausgegeben wird. Berücksichtigen Sie auch den Fall, dass der Absolutzähler überläuft.
Ziel des Versuchs ist die Realisierung einer per Multiplex betriebenen Anzeige. Hintergrundinfo finden Sie in der Dokumentation der achtstelligen 7-Segmentanzeige. In der Regel wird der Arduino zur Ansteuerung eingesetzt.
Die Netzwerkkamera ist auf einer servogesteuerten Mechanik zum Drehen und Neigen der Kamera montiert ("Pan" and "Tilt"). Die Servo-Ansteuerung erfolgt über den Arduino mit der entsprechenden Bibliothek. Das Kamerabild kann über den Web-Browser (Stream und Snapshot) abgerufen werden:
Schreiben Sie unter Verwendung der o. a. Arduino-Bibliothek ein Programm, das zwei Modi kennt. Im ersten Modus erfolgt die Steuerung der Kamera über vier Tasten für das Neigen ([T1] und [T2]) und Drehen ([T3] und [T4]).
Beim zweiten Modus handelt es sich um einen sogenannten Scan-Modus, der den Raum durch ständiges Drehen und Schwenken der Kamera überwacht. Vom einen in den anderen Modus soll jederzeit per Tastendruck auf [T5] gewechselt werden können.
Die Tasten sind an den Digitalports 3, 4, 5, 6, und 7 angeschlossen und schalten gegen Masse. Da dieser Fall recht häufiger auftritt, wurden im AtMega hierfür passende interne Pullup-Widerstände (ca. 20 kΩ) integriert, die sich bei Bedarf aktivieren lassen:
pinMode(pin, INPUT); // Anschluss als Eingang definieren digitalWrite(pin, HIGH); // Pullup-Widerstand aktivierenErmitteln Sie zunächst durch ein Testprogramm, welche Taste an welchem Port angeschlossen ist.
Für die Servos sind die Ports 8, 9, 10 und 11 vorgesehen. Da nur zwei Servos benötigt werden, verwenden Sie die Ports 8 und 9.
Es soll die Lage eines "Flugzeugmodells" anhand eines Beschleunigungssensors über das das analoge Interface bestimmt werden. Der Sensor ADXL 335 liefert eine der Beschleunigung proportionale Spannung die per Programm ausgewertet werden soll.
Über das analoge Interface soll eine Temperaturregelung realisiert werden. Über Analogeingang A0 kann der Temperaturwert (PT1000-Interface, siehe Skript) eingelesen werden. Das Interface liefert eine Spannung die einem Zehntel der Temperatur entspricht (z. B. für 24,5° → 2,54 V) Über den Digitalausgang 8 kann ein Heizwiderstand sowie eine rote LED ein- und ausgeschaltet werden und über den Digitalausgang 9 auf die gleiche Art und Weise ein Lüfter und eine blaue LED.
Zum Testen kann das Heizen und Kühlen auch über die beiden Tasten am Interface-Board aktiviert werden. Damit lassen sich dann auch die Reglereigenschaften schnell testen. Zur Kontrolle ist auch noch ein herkömmliches Digitalthermometer angeschlossen.
Schreiben Sie ein Programm, das per Dreipunktregler (Heizen, Kühlen, nichts tun) den Testkörper (Kühlkörper) auf einer bestimmten Temperatur hält. Die aktuelle Temperatur und der Status des Reglers sollen auf dem PC-Bildschirm angezeigt werden. Ist es sinnvoll, einen komplexeren Regelalgorithmus zu verwenden?
Die Relaiskarte besitzt sieben Ausgänge (siehe Schaltplan unten, der auch die Zuordnung zu den GPIO_Ports zeigt). Realisieren Sie eine Schaltuhr mit sieben Funktionen. Die Schaltzeitpunkte sollen von einer Steuerdatei eingelesen werden, wobei jede Zeile einen Schaltzeitpunkt enhält. Die Zeilen haben folgendes Format:
Jahr Monat Tag Stunde Minute Sekunde SchaltzustandDer Schaltzustand wird in Form einer 7-stelligen Biärzahl angegeben, z. B. 0010001 → Relais 1 und 5 an, alle anderen aus.
Der Raspberry Pi mit der Relaiskarte hat den Namen sedna.da.private.hm.edu und die IP-Adresse 10.27.210.233. Er ist per SSH vom Linux-PC aus erreichbar (User: pi, Passwort: raspberry). C-Compiler etc. ist installiert.Im Home-Directory des Users pi befindet sich auch die Basisbibliothek für den GPIO-Zugriff. Compiliert wird auf der Kommandozeile (s. o.), als Editor können Sie den vi (= vim) oder den nano verwenden.
Hinweis zur Programmierung: Beim Einlesen der Schaltzeitpunkte sollen die
Datumsangaben in die UNIX-Epoche (Sekunden seit dem 1.1.1970, 0 Uhr) umrechnen.
Man erhält dann für jede Zeitangabe einen 32-Bit-Wert, der monoton steigend ist
und spart sich jegliche weitere Umrechnerei. Die so konvertierten Schaltzeitpunkte
werden sortiert in einem Array gespeichert (Grenzen prüfen).
Zum Ermitteln der aktuellen Zeit als Unix-Epoche und zum Umrechnen von Datum
und Uhrzeit werden folgende Standardfunktionen angeboten:
#include <time.h>
time_t time(time_t *ptr);
time() returns the time as the number of seconds since the Epoch,
1970-01-01 00:00:00 +0000 (UTC). If ptr is non-NULL, the return value
is also stored in the memory pointed to by ptr.
On success, the value of time in seconds since the Epoch is returned.
On error, ((time_t) -1) is returned.
time_t mktime(struct tm *timeptr);
timeptr is the pointer to a time_t value representing a calendar
time broken down into its components. Below is the detail of timeptr
structure
struct tm {
int tm_sec; /* seconds, range 0 to 59 */
int tm_min; /* minutes, range 0 to 59 */
int tm_hour; /* hours, range 0 to 23 */
int tm_mday; /* day of the month, range 1 to 31 */
int tm_mon; /* month, range 0 to 11 */
int tm_year; /* The number of years since 1900 */
int tm_wday; /* day of the week, range 0 to 6 */
int tm_yday; /* day in the year, range 0 to 365 */
int tm_isdst; /* daylight saving time */
};
On success, the function returns a time_t value corresponding to the calendar
time passed as argument.
On error, ((time_t) -1) is returned.
Das folgende Beispiel verdeutlicht die Anwendung:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main ()
{
time_t epoc; /* 32-Bit-Zahl */
struct tm info; /* Datum/Uhrzeit */
char buffer[80]; /* Ausgabepuffer */
info.tm_year = 2013 - 1900; /* Jahr - 1900 */
info.tm_mon = 11 - 1; /* Monat geht von 0 - 11! */
info.tm_mday = 4;
info.tm_hour = 9;
info.tm_min = 15;
info.tm_sec = 1;
info.tm_isdst = -1; /* Differenz zu GMT */
printf("Test mit 4.10.2015, 9:15:01:\n");
/* Inhalt von info in String umwandeln (fuer Ausgabe) */
epoc = mktime(&info);
if( epoc == -1 )
printf("Error: unable to make time using mktime\n");
else
{
printf("Aus epoc berechnet: %s",ctime(&epoc));
strftime(buffer, sizeof(buffer), "%c", &info );
printf("Aus dem info-Record: %s\n",buffer);
}
printf("Nun dasselbe mit 'now': ");
epoc = time(NULL);
printf("%s\n",ctime(&epoc));
return(0);
}
Programmiert werden soll die Ansteuerung eines Text-LCD über die I2C-Schnittstelle. Die Ausgabe gestaltet sich ähnlich wie bei dem Versuch Farbgrafik-Touchscreen als Statusdisplay:
26.10.2015 09:50:55 12226 / 578 / 67 0.09, 0.05, 0.01 /dev/sda1 34%Sorgen Sie im Programm dafür, dass die Informationen im 30-Sekunden-Abstand aktualisiert werden (Endlosschleife, sleep-Kommando).
Hinweise zum Einsatz des Displays finden Sie unter /skripten/hardware/RasPi/Projekt-LCD
Technische Daten:Interface: I2C I2C Address: 0x3F Pin Definition: GND, VCC, SDA, SCL Back lit (Blue with White char color) Supply voltage: 3,3 - 5 V
Der Compiler gcc wird auf der Kommandozeile oder im Makefile aufgerufen (siehe unten). Als Editor können entweder shellbasierte Programme (vi etc.) oder der bildschirmorientierte Editor (gedit) verwendet werden. Wer lieger eine integrierte Oberfläche hat, kann Geany verwenden (gelbes Teekannensymbol auf dem Desktop).
Beachten Sie, dass bei allen Programmen die Warnungen eingeschaltet werden sollen. Ein Programm namens "oops" wird mit folgender Befehlszeile übersetzt:
gcc -Wall -o oops oops.c
Zum Erzeugen der Binärdateien, die aus mehreren Quelldateien bestehen, könnte man ein Makefile anlegen. Man kann dann durch das Kommando make das Compilieren und Linken automatisch erledigen. Unter der Annahme, dass Ihre C-Quelle main.c heisst und Sie die Bibliothek oops verwenden wollen, könnte ein einfaches Makefile folgendermaßen aussehen:
all: main main: main.c oops → gcc -Wall -o main oops.o main.c oops: oops.c oops.h → gcc -Wall -c oops.c clean: → rm -f oops.o mainBeachten Sie, dass make bei den Einrückungen (oben durch " → " markiert) unbedingt Tabulatorzeichen und keine Leerzeichen benötigt. Normalerweise reicht es aber, einfach alle Quelldateien beim gcc-Aufruf anzugeben:
gcc -Wall -o main main.c oops.c
Die Wartezeit bei Blink(), Print() im Scrollmodus bei der Siebensegment-Aufgabe und Wartezeiten bei den anderen Aufgaben (Geigerzähler) können über die Funktion nanosleep() gesteuert werden:
struct timespec ts; ... ts.tv_sec = 0; ts.tv_nsec = ???; ... nanosleep (&ts, NULL);Bei Werten im Sekundenbereich kann sleep() verwendet werden. Weitergehende Infos bietet das Kapitel Prozesse und Signale des Programmierskripts. Dort erfahren Sie ggf. auch mehr zur Prozesskommunikation.
Bei Multitasking-Betriebssystemen wie Unix oder Linux, aber auch Windows, ist es immer angeraten, kuzte "Schlafpausen" einzubauen, das sonst die Programme eine überproportional hohe Prozessorlast aufnehmen. Werden Wartezeiten mit den o. g. Funktionen realisiert, ermöglicht das dem Scheduler, auch mal andere Programme "ranzulassen". Siehe dazu:
Für alle Programme genügen in der Regel die folgenden Headerfiles:
#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <string.h> #include <fcntl.h> #include <termio.h> #include <termios.h>
Übrigens: Die Linux-Manualpages bieten auch Infos zu jeder Bibliotheksfunktion von C. Einfach man funktionsname eingeben.
Alle Programme sind nicht nur hier auf www.netzmafia.de abrufbar, sondern auch auf den Praktikums-PCs im Verzeichnis /global zu finden. Bitte die Kommentierung im jeweiligen Headerfile beachten und ggf. die I/O-Adressen anpassen.
int echo_on(void); /* Tastaturecho einschalten */
int echo_off(void); /* Tastaturecho ausschalten */
int getch(void); /* Taste einlesen (ohne anschl. Enter, ohne Echo) */
int getch_nw(void) /* Taste einlesen (ohne Warten, ohne Echo) */
/* gibt -1 zurueck, wenn kein Zeichen gelesen wurde */
Headerfile prakt.h (inkl. Quellen)
void SetRTS(int fd); /* Setzt RTS auf ON */
void ResetRTS(int fd); /* Setzt RTS auf OFF */
void SetDTR(int fd); /* Setzt DTR auf ON */
void ResetDTR(int fd); /* Setzt DTR auf OFF */
void ClearSerPins(int fd); /* Setzt alle Pins der Schnittstelle auf OFF */
int GetRI(int fd); /* Gibt 1 zurueck, wenn RI gesetzt ist, sonst 0 */
int GetCD(int fd); /* Gibt 1 zurueck, wenn CD gesetzt ist, sonst 0 */
int GetDSR(int fd); /* Gibt 1 zurueck, wenn DSR gesetzt ist, sonst 0 */
int GetCTS(int fd); /* Gibt 1 zurueck, wenn CTS gesetzt ist, sonst 0 */
int GetSerStat(int fd); /* Gibt den kompletten seriellenStatus zurueck *
* ggf. RTS und DTR ausblenden: *
* currstat &= ~(TIOCM_DTR | TOICM_RTS) */
Headerfile serpin.h