Initialisierung – MSP430F5529
Vor ihrer ersten Nutzung müssen die verwendeten Hardwaremodule initialisiert und Kalibrationsdaten für die Drucksensoren geladen werden, außerdem wird ein Vektor mit Kontrollbytes entsprechend eines entwickelten Protokolls für die spätere Übertragung an den RPi vorbereitet, der nach einer Messungen mit Messwerten aktualisiert wird.

Initialisierung des Watchdogs
Der MSP430F5529 verfügt über einen Watchdog, das heißt einen Timer mit einer besonderen Aufgabe. Er wird automatisch gestartet und zählt kontinuierlich, bis er einen bestimmten Wert erreicht und ein Reset des Systems veranlasst. Dies soll eine Möglichkeit bieten, den Mikrocontroller bei Fehlfunktion neu zu starten. Um das periodische Auftreten von Resets zu verhindern bestehen zwei Möglichkeiten: Abschalten des Watchdogs oder regelmäßiges zurücksetzen des Zählers, so dass der Watchdog nie seinen Endwert erreicht. Solange der Zähler regelmäßig im Programmablauf zurückgesetzt wird, findet kein Reset statt. Der Watchdog wird bei jeder Messung mit Hilfe von WDTCNTCL (WatchDog Timer CouNT Clear) und dem Watchdog-Passwort zurückgesetzt. Das Passwort ist dabei ein bestimmtes Bitmuster, welches bei jedem Zugriff auf den Watchdog angegeben werden muss. Zugriffe auf den Watchdog ohne Passwortübergabe können genutzt werden, um manuell einen Reset des Systems auszulösen. Diese Möglichkeit wird genutzt, falls eine Fehlfunktion des verwendeten I2C-Bus festgestellt wird. Außerdem wird automatisch ein Reset ausgelöst, wenn vom Rpi für 15,6 Sekunden kein Messbefehl mehr erhalten wurde. Ein Reset des MSP430F5529 und damit ein Pegelwechsel an den Signalleitungen startet den Rpi, falls dieser ausgefallen sein sollte.
Initialisierung der Ports
Alle GPIO werden als Ausgang mit LOW Pegel gesetzt, um den Energieverbrauch zu minimieren.
Low Power Sleep – Energiesparendes Warten
Der Sleep Modus wird über einen Timer umgesetzt. Der Mikrocontroller geht in einen tiefen Schlafmodus, in dem die CPU und viele Taktquellen abgeschaltet sind und wird nach Ablauf des Timers wieder aufgeweckt. Initialisiert wird der Timer direkt beim Aufruf der sleep ( ) Funktion.
Quellcode - Sleep-Function
Hier wird die Taktquelle ausgewählt, das Zählregister zurückgesetzt, der Zählmodus bestimmt sowie die gewählte Dauer festgelegt. Anschließend geht das Gerät in den Ruhezustand und wird bei Ablauf des Timers über die Interrupt Routine wieder aufgeweckt.
Quellcode - Interrupt
UART – Universal Asynchronous Receive Transmit
UART ist ein serieller Übertragungsstandard. Der MSP430F5529 unterstützt bei Verwendung des Evaluation Boards die direkte UART Kommunikation mit einem PC über USB. Dazu wird vom Launchpad automatisch ein virtueller COM Port angelegt, über den die Daten dem Rechner zur Verfügung gestellt werden. Die maximale Baudrate dieser Methode liegt bei 9600.
Daten werden an den PC gesendet mit
void UART_SendDyn(char sendMe[], int varCount, …);
Die Funktion erwartet einen String, der mit den NULL-zeichen ‚\0‘ endet sowie eine beliebige Anzahl an Parametern, deren Anzahl durch varCount festgelegt wird. Enthält der String einige der Zeichenketten ‚%0‘ .. ‚%7‘, werden an der jeweiligen Stelle die zusätzlich übergebenen Parameter Nummer 0 bis Nummer 7 eingesetzt und der bearbeitete String über UART versendet. So würde der Aufruf
UART_SendDyn("N: %0; T: %1°C\0", 2, (long)count, (long)temperature);
z.B. den String „N: 1315; T: 17°C“ an den Rechner senden, welcher sich mit einem Programm wie PuTTY empfangen lässt.
I2C – Sensorik
Für die Kommunikation über I2C wurde eine Library geschrieben, die grundlegende Funktionen für die I2C Kommunikation bereit stellt. Dazu zählen das für die Sensorik genutzte Addressieren von Geräten sowie das Senden und Empfangen von Bytes im Master Modus. Die Bibliothek erlaubt die Verwendung von I2C ohne direkten Zugriff auf Register.
I2C – Raspberry Pi
Maßgeschneidert auf die Anwendung, enthält die I2C-Raspberry Bibliothek die Initialisierung des zweiten I2C Hardwaremoduls im Slave Modus. Anschließend kann der Raspberry den MSP430 adressieren und ihm mit Hilfe von Steuerbefehlen den Auftrag zur Messung oder Datenübertragung geben.
Si7021 – Sensor für relative Feuchte
Ein über I2C angebundener Sensor. In der Initialisierung wird festgelegt, mit welcher Auflösung der Sensor die Messungen durchführen soll. Zudem kann die interne Heizung aktiviert werden, welche den Energieverbrauch erhöht, aber die Regenerationszeit nach dem Auftreten hoher Feuchtigkeitslevel (z.B. in Wolken) verringert.
Quellcode - Initialisierung Luftfeuchtigkeitssensor
Über die Funktionen Si_MeasureHumidity () kann eine Messung ausgeführt werden. Bei jeder Feuchtemessung wird automatisch eine Temperaturmessung durchgeführt, anschließender Aufruf von Si_GetTempreatureOfLastMeasurement () liefert die gemessene Temperatur.
MS5803 – Sensor für absoluten Druck
Die Drucksensoren werden ebenfalls über I2C angebunden. Sie bieten die Möglichkeit, ein Bit der Adresse über den Pegel an einem Pin zu variieren, so dass ohne zusätzliche Mittel zwei Sensoren dieses Typs angebunden werden können. Das Setup der Sensoren ist ein wenig umfangreicher als das der Si7021. Es gibt keine Einstellmöglichkeiten wie beim Si7021 bezüglich der Auflösung oder eines internen Heizelements, stattdessen müssen Kalibrationsdaten aus dem Sensor ausgelesen und zur späteren Berechnung gespeichert werden.
Zur einfachen Verwaltung der Sensordaten wurde eine structure definiert, die alle nötigen Informationen erhält und folgenden Aufbau besitzt.
typedef struct sensor_properties sensor_properties;
struct sensor_properties
{ short SensorType; // sensor type (0 BMP, 1 MS5803)
short SensorAdress; // I2C Sensor Adress
long uP, uT, P, T, dT; // measurement and calculation results
unsigned int CalValues[8]; // data for calibration MS5803
};
Die Initialisierung eines neuen Sensors übernimmt die folgende Funktion.
Quellcode - Initialisierung Drucksensor
Damit kann ein Datenset für einen neuen Sensor erstellt und dieser initialisiert werden. Auf Wunsch werden direkt bei der Initialisierung die Kalibrationsdaten des Sensors ausgelesen und gespeichert Die Rückgabe liefert einen Pointer auf die erstellte Struktur und dient fortan als Handle für den Sensor, über den z.B. die Temperatur (Handle->T), der Druck (Handle->P), die Hardwareadresse (Handle->adress) oder die Kalibrationsdaten (Handle->CalValues[x]) abgerufen werden kann. Der Handle wird auch zur Übergabe an die Messfunktionen benötigt.
I2C – Geiger-Müller-Zählrohr und Spektrometer
Neben dem Si7021 und den MS5803 sind noch zwei Mikroprozessoren der Reihe MSP430G2553 an den I2C Bus angehängt, auf die später genauer eingegangen wird.
ADC – Analog-Digital-Wandler für O2 und UV Messung
Die O2-Sensoren sowie UV-Dioden sind analoge Sensoren und ihre Messergebnisse werden mit Hilfe eines ADC in digitale Signale umgewandelt. Der MSP430F5529 besitzt einen 12 Bit, 16 Kanal ADC. Das heißt, er verfügt über 16 verschiedene Eingänge, die dem ADV zugeführt werden. Dazu zählen u.A. das Messen der Betriebsspannung oder eines internen Temperatursensors. Einige der Kanäle sind mit GPIOs verbunden, so dass sich Analog Werte über diese Einlesen lassen. Ein Sequenz-Modus des ADC misst automatisch eine Sequenz von Eingängen durch, deren Zuordnung sich frei wählen lässt. Auf diese Weise werden vier GPIOs des Mikrocontrollers durchgemessen (zwei O2-Sensoren und zwei UV-Dioden), bei Erreichen des vierten Sequenzelementes wird die Messung gestoppt und die Messergebnisse in einem externen Array gespeichert.
Quellcode - Einrichtung des ADC
Die obige Funktion richtet den ADC für die sequenzielle Messung ein und stellt die Referenzspannung auf 2,5 V, welche intern generiert wird.
Quellcode - Start der Messung
Die Messsequenz wird automatisch vom ADC Hardwaremodul durchgeführt. Ein Interrupt, der bei Erreichen des 4. Kanals ausgelöst wird, beendet die Messung und speichert die Messwerte an einer Zieladresse sowie den darauf folgenden Speicheradressen, welche mit dem obigen Funktionsaufruf festgelegt wurden.
OneWire
Bedarf keiner Initialisierung, da für die OneWire Protokolle keine Hardwareunterstützung verfügbar ist und die Kommunikation in Software mit Hilfe von GPIO umgesetzt wurde.