Das folgende Beispiel dient nur zur Demonstration. Es zeigt eine mögliche Einbindung der im Abschnitt 6. Software beschriebenen Unterprogramme
Bei diesem Demonstrationsbeispiel misst der Sensor (IC1) zyklisch (ca. alle 10 Sekunden) die Feuchtigkeit
und die Temperatur und übergibt diese dem steuernden Mikrocontroller (IC2) vom Typ PIC16F628. Dieser berechnet
aus den vom Sensor empfangenen Daten die Temperatur und die relative Luftfeuchtigkeit. Diese Werte können nun
via RS232-Schnittstelle von einem PC angezeigt werden. Dazu ist ein Schnittstellentreiber (IC3) vom Typ MAX232
mit einigen Kondensatoren (C5 bis C9) notwendig.
Die Beschaltung des Sensors erfolgt gemäß 2. Hardware mit
einem Pull-Up-Widerstand (R1) für die DATA-Leitung und dem Stützkondensator C1.
Für die Takterzeugung dient eine Standardbeschaltung bestehend aus einem 4,096-MHz-Quarz (X1), zwei Kondensatoren (C3, C4) und einem Widerstand (R2).
Die Software zum Demonstrationsbeispiel befindet sich im Download- Bereich auf dieser Seite
Die Software besteht im Wesentlichen aus folgenden Programmteilen:
ISR:
Die ISR (interrupt InterruptRutine(void)) wird alle 64ms aufgerufen und besitzt "nur" die Aufgabe
eine 10-Sekunden Zeitbasis zu erzeugen, indem sie ein Botschaftsflags für das Hauptprogramm erzeugt. Damit eine
Zeit von einer Sekunde entsteht, muss die ISR 156-mal aufgerufen werden (156 x 64ms = 9984ms also ca. 10
Sekunde). Bei jedem ISR-Aufruf muss also ein Zählregister um 1 vermindert werden. Besitzt es danach den Wert 0,
so sind 10 Sekunde (genau 9,984 Sekunden) vergangen. Nun wird das Botschaftsflag FLAG10SEK im Register FLAGSISRHP
gesetzt, und das Zählregister muss mit dem Wert 156 neu geladen werden. Der Wert 156 wird hier durch die Konstante
KONSTISR10SEK ersetzt.
Die ISR wird, wie schon mehrmals erwähnt, alle 64ms aufgerufen Diese 64ms ergeben sich folgendermaßen: TMR0 wird mit dem Wert 0 geladen – es dauert also 256 Taktzyklen bis das Register wieder den Wert 0 besitzt, der Vorteiler (VT) besitzt hier ebenfalls den Wert 256 (vgl. Unterprogramm INIT, Abschnitt. 6.2. Initialisierung (Unterprogramm "INIT"))). Der Taktzyklus ergibt sich aus dem verwendeten Quarz (X1). Dieser ist bei der PIC-Familie wie folgt definiert:
4
-------------
Quarzfrequenz
Daraus ergibt sich folgender Zusammenhang:
4 x 256 x VT 4 x 256 x 16
ISRAUFRUF [µs] = ------------------- = ------------ = 64000
Quarzfrequenz [MHz] 4,096
Also ein ISR-Aufruf alle 64000µs, was gleichbedeutend mit 64ms ist.
Achtung:
Die ISR muss nach dem Kompelieren an einer ganz bestimmten Stelle im Programmspeicher des PIC-Mikrocontroller
stehen. Nämlich an der Adresse 0004h. Dies wird durch die Präprozessoranweisung #pragma origin 4 erreicht.
Hauptprogramm:
Das Hauptprogramm void main(void) befindet sich nach der Initialisierung (mit dem Unterprogramm void INIT(void)
und der Interrupt-Freigabe in einer Endlosschleife. Diese Schleife besitzt die Aufgabe ständig dass Botschaftsflag
(FLAG10SEK) abzufragen. Ist dieses Botschaftsflag gesetzt, so muss das Hauptprogramm zunächst eine
Feuchtigkeitsmessung und anschließend eine Temperaturmessung mit dem Unterprogramm char FEUCHTE_MESSUNG() gemäß
Abschnitt 6.3.7. durchführen. Waren beide Messungen
erfolgreich (fehler = 0), aus dem vom Sensor erhaltenen Daten die Temperatur und die Feuchtigkeit mit dem
Unterprogramm void FEUCHTE_LINEARISIERUNG(void) gemäß Abschnitt 6.3.8.
berechnen, bzw. linearisieren und kompensieren, und anschließend mit dem Unterprogramm void AUSGABE(void) am PC
ausgeben.
Bei einer fehlerhaften Messung (fehler ist ungleich 0) den Feuchtigkeitssensor mit dem Unterprogramm void
FEUCHTE_CONNECTIONRESET(void) gemäß Abschnitt 6.3.2.
neu initialisieren.
Das Botschaftsflag (FLAG10SEK) wird von der Interrupt Service Routine (ISR) alle 10 Sekunden (siehe oben).
Unterprogramm INIT:
Das Unterprogramm void INIT(void) dient zur Initialisierung des PIC-Mikrocontroller. Hier wird unter anderem
der Timer eingestellt. Weiters die RS-232-Schnittstelle für die Kommunikation mit dem PC, und das Zählregister
für den 10-Sekunden-Takt.
Unterprogramme AUSGABE, AUSGABEBCD und RS232_SENDE_ZEICHEN:
Das Unterprogramm void AUSGABE() dient zur Ausgabe der Temperatur und Luftfeuchtigkeit am PC. Dazu müssen
diese Werte in die so genannte BCD-Form gebracht werden. Diese Aufgabe übernimmt das Unterprogramm void
AUSGABEBCD(). Für das eigentliche Übertragen zum PC via RS232 ist das Unterprogramm void RS232_SENDE_ZEICHEN()
zuständig.
Weitere Anmerkungen:
Zur Demonstration wird das PC-Programm "HyperTerminal" verwendet. Dieses Programm sollte bei jedem modernen Windows-PC installiert sein und wird bei Windows XP wie folgt aufgerufen: Taste "Start" in der Taskleiste -> Alle Programme -> Zubehör -> Kommunikation -> HyperTerminal.
Nach dem Start von HyperTerminal müssen Sie zuerst eine neue Verbindung einrichten.
Dazu "Datei" -> "Neu" anklicken. Es öffnet sich folgendes Fenster:
Einen Namen für diese neue Verbindung eingeben: z.B. Feuchtesensor SHTxx. Optional kann ein Symbol ausgewählt werden.
Taste "OK"
Den seriellen Port auswählen. Z.B. COM2
Taste "OK"
Den ausgewählten COM-Port (hier COM2) nach obigen Bild konfigurieren
Taste "OK"
Wenn alles richtig eingestellt und angeschlossen wurde sollten innerhalb von 10 Sekunden die Temperatur und die Feuchtigkeit so wie in folgenden Bild erscheinen.