Autor: Lars Heinrichs

Banner

 

Sensorik – Hardware

Zur Messwertaufnahme und -aufbereitung werden ein MSP430F5529 sowie zwei MSP430G2553 von Texas Instruments verwendet, deren Firmware selbst geschrieben wurde. Die kleineren MSP430G2553 Controller übernehmen Unteraufgaben und verwalten das Spektrometer sowie das Geiger-Müller-Zählrohr, während der stärkere und großzügiger ausgestatte MSP430F5529 das Herzstück der Sensorik bildet. Neben der Aufnahme aller Messwerte kommuniziert er mit einem Raspberry Pi (nachfolgend RPi), welcher die Daten in Datenbanken speichert und zur Bodenstation sendet. Informationen zum Rpi sowie zur Datenkommunikation finden sich in einem separaten Artikel unter RPi - Hardware. Der gesamte Aufbau der Sensorik ist im nachfolgenden Bild dargestellt:

 

MeachnischerAufbau

 

Eine detaillierte Übersicht der einzelnen Sensoren sowie deren Platzierung an der Sonde ist in den jeweiligen Artikeln zu finden. Hier wird genauer auf die Mikrocontroller der MSP430 Serie eingegangen. Detaillierte Übersichten zu allen geschriebenen Bibliotheken werden in Kürze auf pointer-horror.de zur Verfügung gestellt.

 

Texas Instruments MSP430 Serie

Von TI als Ultra-Low-Power Mikrocontroller beworben, ist diese Reihe auf niedrigen Energieverbrauch optimiert und mit verschiedensten Energiesparmodi ausgestattet. Sie eignet sich besonders in Batterie betriebenen oder anderen Anwendungen mit limitierter Energieversorgung. Die Peripherie unterscheidet sich je nach Unterfamilie und umfasst u.a. Hardwareunterstützung für Kommunikationsprotokolle wie I2C, SPI oder UART, integrierte AD-Wandler von 10 bis 24 Bit, Direct Memory Access, verschiedene 16-Bit Timer inklusive Watchdog, kapazitive Touch-IO, Komparatoren, ein System zur Tatkerzeugung, Hardware Multiplikator und Real-Time Clock features. Der verwendete MSP430F5529 bietet alle genannten Funktionen und einen 12 Bit AD-Wandler, die MSP430G2553 bieten einen verkleinerten Funktionsumfang und werden hauptsächlich für die Datenübertragung mit Hilfe der in Hardware integrierten Schnittstellen genutzt. Für mehr Informationen siehe http://www.ti.com/lsds/ti/microcontrollers_16-bit_32-bit/msp/overview.page

 

Aufbau der Firmware - MSP430F5529

Der MSP430F5529 bildet die Schnittstelle zwischen dem Rpi und den einzelnen Sensoren. Er nimmt Messdaten auf und bereitet diese zur Übertragung an den Rpi sowie die Bodenstation vor. Die Firmware des MSP430F5529 ist in C geschrieben und in mehrere Abschnitte unterteilt, wie in der nachfolgenden Abbildung dargestellt:

FirmwareOverview

Den Großteil der Zeit befindet sich der Mikrocontroller in einem Energiesparmodus, in welchem die CPU mitsamt einiger peripherer Baugruppen ausgeschaltet ist. Dieser Modus wird nur verlassen, wenn der RPi einen entsprechenden Steuerbefehl an den MSP430F5529 sendet und entweder die Übertragung von Daten oder eine neue Messung anfordert. Ein Watchdog Timer führt einen Reset durch, falls über einen längeren Zeitraum kein Steuerbefehl mehr erhalten wurde.

 

 

Verwendete Protokolle und Schnittstellen

Wie in der Abb. im Abschnitt Sensorik-Hardware dargestellt, kommuniziert der MSP430F5529 mit einer Reihe anderer Geräte. Um Informationen zwischen diesen auszutauschen werden verschiedene Protokolle verwendet. 

 

I2C (Inter Integrated Curcuit)

Synchroner (= Takt gesteuerter) halbduplex Schnittstellenstandard zur Kommunikation von ICs, üblicherweise innerhalb eines einzelnen Gerätes. I2C (auch IIC oder I²C genannt) nutzt je eine Takt- sowie Datenleitung und benötigt darüber hinaus keine weiteren Leitungen. Jeder Busteilnehmer erhält eine 7-Bit-Adresse, die üblicherweise in Hardware vorgegeben ist und sich teilweise über das Pinning der Geräte in den Least Significant Bits ändern lässt. Adressen müssen eindeutig sein, solange auf zusätzliche Leitungen zur Aktivierung/Deaktivierung von Geräten verzichtet werden soll.

 

Im Ruhezustand sind die Takt- und Datenleitung über Pullup-Widerstände auf einen High-Pegel gezogen. Angeschlossene Geräte können den Pegel runter ziehen oder die Leitung freigeben, bei vollständiger Freigabe wird die Leitung durch den Pullup wieder auf High gezogen. Bei Start der Kommunikation wird zunächst die Datenleitung, gefolgt von der Taktleitung, vom Master herunter gezogen, anschließend wird die 7-Bit-Adresse gesendet und ein weiteres Bit angehängt, welches festlegt, ob der Master lesen oder schreiben möchte. Damit lassen sich bis zu 127 (abzüglich einiger reservierter Adressen) Busteilnehmer über nur zwei Leitungen anbinden. All dies wird vom entsprechenden Hardwaremodul MSP430 automatisch erledigt.

Nach dem Startsignal folgen 8-Bit Worte sowie ein sogenannter ACKnowledge oder Not ACKnowledge (NACK). ACK bedeutet dabei, dass der Buspartner den Erhalt des letzten Bytes bestätigt. So kann z.B. der Master ein Startsignal mitsamt Adresse und Lese-/Schreibbit verschicken und die Leitung dann für ein weiteres Bit freigeben. Falls ein Gerät auf dem Bus mit der angegebenen Adresse existiert, zieht dieses die Leitung auf Low und bestätigt (ACK) damit seine Anwesenheit. Wird die Leitung nicht von einem Busteilnehmer heruntergezogen, dann zieht der Pullup Widerstand die Leitung auf High und es wird kein ACK generiert, der Master interpretiert dies als NACK. Im falle eines NACK wird die Kommunikation beendet, ansonsten können Daten übertragen werden.

I2C

Die dargestelte Aufnahme zeigt beispielhaft das Programm der Logic Analyzer von Saleae, mit welchem die Kommunikation eines MSP430G2553 mit einem BMP085 Drucksensor aufgezeichnet wurde. Zu sehen ist die Adressierung des Sensors (Adresse 0x77) zunächst im Schreibmodus (0x77 mit angehängtem Write Bit = 0xEE = 238) sowie etwas später das Adressieren zum Lesen (0x77 mit Read Bit = 239) mit anschließender Übertragung der Kalibrationsdaten.

Der MSP430F5529 verfügt über zwei I2C Hardware Module, von denen je eins für die Kommunikation mit der Sensorik und dem RPi verwendet wird. Mehr Informationen zu I2C sowie Dokumentationen und Code Beispiele sowie Erklärungen der selbst geschriebenen Library können in Kürze auf pointer-horror.de gefunden werden.

 

OneWire

Halbduplex Schnittstellenstandard der Firma Dallas Semiconductor (heute Maxim Integrated). Benötigt lediglich eine Leitung zur Datenübertragung und arbeitet anstelle eines Taktes mit Zeitfenstern. Ein Pullup hält wie beim I2C die Leitung auf High, die Busteilnehmer können sie zur Kommunikation auf Low ziehen. Ebenfalls ähnlich zu I2C besitzt jedes OneWire Modul eine Hardwareadresse, die ab Werk fest vorgegeben ist, allerdings sind die Adressen einzigartig und haben eine Länge von 64 Bit. Die Adressen der Sensoren müssen vor ihrer Verwendung zunächst bestimmt werden, sollte sich neben dem Mikrocontroller mehr als ein Gerät auf dem Bus befinden.

Die Kommunikation wird eingeleitet mit einem Reset Befehl, für den der Master die Taktleitung für mindestens 480µs auf low zieht und diese anschließend wieder frei gibt. Falls sich ein Teilnehmer auf dem Bus befindet, zieht dieser die Leitung nach 15-60 us auf low und bestätigt sein Anweseheit, bevor er nach etwa 200µs die Busleitung wieder frei gibt.

OneWire

Eine Bit Übertragung wird durch runter ziehen der Leitung für etwa 20µs initiiert, anschließend wird die Leitung für 60-80µs auf den gewünschte Wert gezogen, gefolgt von einem 20µs langen High und anschließender Freigabe der Leitung. Mehr Informationen zur OneWire Library finden sich in Kürze auf pointer-horror.de.

 

UART

UART ist ein asynchroner (bedeutet ohne Taktsignal arbeitender), vollduplex Übertragungsstandard, mit einer Leitung pro Übertragungsrichtung. Es gibt keine Adressen wie bei den anderen verwendeten Standards. Für den Aufbau einer direkten Verbindung zweier Teilnehmer ist UART gut geeignet, bei mehreren Teilnehmern muss die Auswahl des Kommunikationspartners manuell über andere Wege erfolgen. UART wird nur zum Debugging für Übertragung von Daten an einen Rechner verwendet, weshalb der Standard nicht weiter beschrieben wird. Für Funktionsbeschreibungen der verwendeten Funktionen siehe pointer-horror.de.

 

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.

FirmwareInit

 

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 wid der Timer direkt beim Aufruf der sleep ( ) Funktion

void sleep(unsigned int time)
{	TA0CTL = MC_0; 		// Stop timer
	TA0CCTL0 = CCIE; 		// enable CCR0 interrupt (IF on reaching TA0CCR0)
	TA0EX0 = 7;			// Set divider to 8 -> 32000 / 8 = 4000 1/s = 1/4 ms
	TA0CTL |= TASSEL_1 | TACLR | MC_1; 	// select ACLK, reset timer counter, set to count-up mode
	TA0CCR0 = time; 				// set CCR0
	__bis_SR_register(LPM3_bits + GIE);     // LPM3, Interrupts enable
}

 

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.

#if defined(__TI_COMPILER_VERSION__) || defined(__IAR_SYSTEMS_ICC__)
#pragma vector=TIMER0_A0_VECTOR
__interrupt void TIMER0_A0_ISR(void)
#elif defined(__GNUC__)
void __attribute__ ((interrupt(TIMER0_A0_VECTOR))) TIMER0_A0_ISR (void)
#else
#error Compiler not supported!
#endif
{
	TA0CTL = MC_0;	// Stop timer
	__bic_SR_register_on_exit(LPM3_bits); 	// Exit low power mode
}

 

 

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.

 

void Si_Setup(){
	I2C0_SetSlaveAdress(SI_ADRESS);	// 0x40
	I2C0_WriteRegister(SI_WRITE_USER, SI_11RH_11T + SI_HEATENA);// 0xE6, 0x81 + 0x04
}

Ü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

sensor_properties *newPressureSensor(short SensorAdress, short calibrate)
{	sensor_properties *temp;
	temp = malloc(sizeof(sensor_properties));// reserve memory
	if (temp == NULL) {return NULL;}	// not enough ram available, exit
	temp->SensorAdress = SensorAdress;	// store sensor adress
	temp->SensorType = SensorType;		// store sensor type (unused, might be useful if you add multiple sensors)
	if (calibrate){
		I2C0_SetSlaveAdress(SensorAdress);
		MS_Calibration(temp);	// calibrate the sensor
		sleep(100);
	}
	return temp;	// sensor has been added and calibrated, exit
}

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.

 

 

ADCAnalog-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.

void ADC12_Setup()
{	P6SEL |= BIT0 + BIT1 + BIT2 + BIT3;         // pass control over P6.0..6.3 to ADC
	REFCTL0 &= ~REFMSTR;                      	// Übergebe REFMSTR Optionen an ADC12_A ref Register
	// ADC12 enable, set sampling time, activate refrence generator, use 2.5V reference voltage
	ADC12CTL0 = ADC12MSC + ADC12ON + ADC12SHT0_2 + ADC12REFON + ADC12REF2_5V;
	// single sequence mode / ACLK clock source / Divide clock by 4 / Sample and hold source: ADC12SC bit
	ADC12CTL1 = ADC12CONSEQ_3 + ADC12DIV_3 + ADC12SHP;
	// Set up reference voltages and inputs for each channel
	ADC12MCTL0 = ADC12SREF_1 + ADC12INCH_0;   	// Reference voltages Vr+=Vref+ and Vr-=AVss, channel A0 (P6.0)
	ADC12MCTL1 = ADC12SREF_1 + ADC12INCH_1;   	// Reference voltages Vr+=Vref+ and Vr-=AVss, channel A1 (P6.1)
	ADC12MCTL2 = ADC12SREF_1 + ADC12INCH_2;   	// Reference voltages Vr+=Vref+ and Vr-=AVss, channel A2 (P6.2)
	ADC12MCTL3 = ADC12SREF_1 + ADC12INCH_3 + ADC12EOS;   // Reference voltages Vr+=Vref+ and Vr-=AVss, channel A3 (P6.3), End of sequence
	ADC12IE = 0x08; // Interrupts for A3 (signals end of sequence)
}

Die obige Funktion richtet den ADC für die sequenzielle Messung ein und stellt die referenzspannung auf 2.5V, welche intern generiert werden. Eine Messung wird eingeleitet über den Aufruf von

void ADC12_Read4(unsigned int *storage)
{	storageArray = storage;
	        // enable conversion
	ADC12CTL0 |= ADC12ENC;
	ADC12CTL0 |= ADC12SC;			// start conversion
	while(ADC12CTL1 & ADC12BUSY){
		sleep(1);				// Wait for sequence to be finished
	}
}

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.

 

MSP430F5529 Messsequenz

Einleiten der Messsequenz

Nach dem Einschalten und einmaligem Durchlaufen der einzelnen Programmabschnitte (Initialisierung, Messung, Messwertaufbereitung) befindet sich der MSP430F5529 im Energiesparmodus und ist größtenteils deaktiviert. Er verbleibt in diesem Modus, bis entweder der Rpi einen Steuerbefehl sendet, oder – sollte dieser ein Mal ausfallen – 15,6 Sekunden vergangen sind und der Watchdog einen Systemreset auslöst. Eine Messsequenz wird eingeleitet, indem der Rpi über einen entsprechenden Befehl den Auftrag dazu gibt. Neben der Veranlassung einer Messung kann der Rpi einen Datensatzes vom MSP über I2C auslesen.

FirmwareMessungRPi

Der MSP430F5529 speichert dabei immer nur die aktuellen Messwerte, welche nach Übertragung zum RPi dort in Datenbanken abgelegt werden. Entsprechend werden zunächst die aktuelle gespeicherten Messwerte ausgelesen und anschließend wird eine Messung gestartet, die läuft während der Rpi sich um andere Aufgaben kümmert. Sobald die Messung vollständig durchgeführt wurde, geht der MSP in den Ruhezustand und wartet auf das nächste Auslesen der Messergebnisse.

Ablauf der Messsequenz

Innerhalb der Messsequenz werden verschiedene digitale sowie analoge Sensoren abgefragt. Die einfachste Form der Messdatenerfassung ist dabei das Einlesen der Analogen Spannungen von O2-Sensoren und UV-Dioden. Entsprechend der in der Initialisierung vorgenommenen Konfiguration wird eine Messung über 4 Kanäle des ADC durchgeführt, an denen die vier Sensoren angeschlossen sind. Für die Messwerte des O2-Sensors wird zudem der Sauerstoffgehalt in 0,1% ermittelt (Ergebnis gilt bei Normaldruck).

FirmwareMessungADC

Die DS1820 werden über das OneWire Protokoll angesprochen und über Befehle gesteuert. Im OneWire Protokoll wird vor jeder Kommunikation ein Reset durchgeführt, gefolgt von einem Adressbefehl und ggf. einer Adresse sowie einem Steuerbefehl.

FirmwareMessungOneWire

Zur Initialisierung der Messung ist keine Kommunikation von Seiten der Sensoren notwendig, der Bus wird wird ausschließlich vom Master kontrolliert. Dadurch können die Adressen übersprungen und alle Sensoren auf ein Mal angesprochen werden. 0x44 weist alle Sensoren an, eine Temperaturmessung durchzuführen. Nach kurzer Wartezeit können die Sensoren einzeln adressiert* und ihr Messergebnis abgefragt werden. Überspringen der Adresse ist hier nicht mehr möglich, da sonst alle Sensoren zeitgleich Antworten schicken würden. Mithilfe der ausgelesenen Werte kann für jeden Temperatursensor die Temperatur in 0,5°C berechnet werden.

*Die Adressen der einzelnen Sensoren wurden vorher bestimmt, indem nur ein einzelner Sensor angeschlossen wurde. Über SKIP_ROM und READ_ROM wurden die 8 Byte der Adresse ausgelesen und fest im Programm hinterlegt. Es besteht die Möglichkeit, Adressen aller auf einem Bus befindlichen Teilnehmer automatisch auszulesen, allerdings ist dann die Zuordnung Adresse<>Sensor nicht ohne weiteres möglich.
 

Die restlichen Sensoren sind auf dem I2C-Bus anzutreffen. Sie werden über ihre Hardwareadresse angesprochen. Die Sequenzen zur Aufnahme von Messungen unterscheiden sich für jeden Sensortyp und sind in der nachfolgenden Grafik dargestellt.

FirmwareMessungI2C

 

Beispielprogramm: Ansprechen der Sensoren sowie Senden der Daten an einen PC

Ein Minimalbeispiel für die wiederholte Messung des Druckes und der Feuchte sowie der Temperatur über die OneWire und I2C Sensoren und das Senden der Messergebnisse an einen PC etwa ein Mal pro Sekunde sähe unter Verwendung der programmierten Bibliotheken wie folgt aus:

#include <I2C_UCB0.h>
#include <MS5803clean.h>
#include <sleep.h>
#include <UARTusb.h>
#include <Si7021.h>
#include <DS1820own.h>
int Si_Temperature, OW_temperature[4], temp;
unsigned int Si_Humidity;
sensor_properties *P_sensor;
static unsigned long long OW_Adresses[4] = {0x10C1F9B3010800C2, 0x104CE0B3010800ED, 0x1056D7B3010800AC, 0x10D9FAB301080076};
void main(void) {
	WDTCTL = WDTPW + WDTHOLD;
	I2C0_Init(1, 0);
	UART_Setup_PC(9600);		// setup UCA1 Interface for USB Uart comunication, 9600 Baud
	P_sensor = newPressureSensor(MS5803_ADRESS_B, 1);
	Si_Setup();
	while(1) {
		MS_Measure(P_Sensor);
		Si_Humidity = Si_MeasureHumidity();
		Si_Temperature = Si_GetTemperatureOfLastMeasurement();
		DS1820_ReadTemperatureMulti(PIN3, 4, (unsigned int*)OW_temperature, (unsigned char*) OW_Adresses);
		temp = (Si_Temperature + P_sensor->T + 50 * (OW_temperature[0] + OW_temperature[1] + OW_temperature[2] + OW_temperature[3])) / 6;
    	
		UART_SendDyn("T: %0°C; P: %1Pa; F: %2%\0", 3, (long)temp/100, (long)P_Sensor->P, (long)Si_Humidity);
		sleep(4000);
	}
}

 

 
Spektrometer und Geiger-Müller-Zählrohr, MSP430G2553

Das Spektrometer und das Geiger-Müller-Zählrohr verfügen jeweils über einen MSP430G2553. Bei beiden 'Sensoren' übernimmt der jeweilige Mikrocontroller die gleiche Aufgabe: Das Zählen von Impulsen. Warum das so ist, lässt sich im Artikel zum Spektrometer bzw. Geiger-Müller-Zählrohr nachlesen. Der Zählvorgang ist Interrupt gesteuert, bei einem Wechsel von High auf Low an einem GPIO wird ein interner Zähler inkrementiert. Der Zählvorgang muss möglichst frei von Unterbrechungen sein, damit alle Pegelwechsel erfasst werden. Letzteres ist der Grund, weshalb die Funktionalitäten nicht direkt auf dem Haupt-MSP430 untergebracht wurden: OneWire sowie die Datenkommunikation mit dem RPi haben erhöhte Priorität und dürfen nicht unterbrochen werden, so dass die Impulszählungen für die entsprechenden Zeiträume deaktiviert werden müssten. Zudem liegt die Dauer der Spektrometer Messung im Bereich von mehreren 10 Sekunden und übersteigt damit die Dauer eines vom RPi vorgegebenen Messintervalls.

 

Als grobes Ablaufdiagramm dargestellt, unterscheidet sich die Firmware des Spektrometers kaum von der des MSP430F5529. Der Datenaustausch mit dem Geiger-Müller-Zählrohr ist identisch zum Spektrometer, der Mess- und Programmablauf unterscheidet sich jedoch.

 

G2553

 

Spektrometer

Das Spektrometer verfügt über einen Photosensor, der die gemessene Helligkeit in Impulse umwandelt. Zur Messung wird der Sensor über eine Messstrecke innerhalb eines lichtundurchlässigen,  innen verspiegelten Gehäuses, von LEDs unterschiedlicher Wellenlänge beleuchtet. Diese werden bei der Messung der Reihe nach für definierte Zeiträume mit Hilfe eines Multiplexers durchgeschaltet und für jede LED die vom Photosensor ausgegebenen Impulse gezählt und gespeichert. Anschließend legt sich die CPU schlafen und kann vom zentralen MSP430F5529 durch Ansprechen über I2C aufgeweckt und die Daten ausgelesen werden. nach dem Ende der Kommunikation wird eine neue Messung gestartet.

 

Geiger-Müller-Zähler

Der Zählrohr-Mikrocontroller arbeitet eigenständig und wird nicht von dem zentralen Mikrocontroller gesteuert. Er zählt kontinuierlich Klicks, die von dem Zählrohr und der entsprechenden Elektronik generiert werden. Zusätzlich zu der Messung läuft ein Timer mit, der nach jedem kompletten Durchlauf die innerhalb des Durchlaufs gezählten Klicks in einem Vektor speichert und dann den Zählstand sowie den Timer zurücksetzt. Wird der Mikrocontroller über I2C angesprochen, antwortet er mit den gezählten Impulsen innerhalb der letzten Minute.