#define F_CPU 16000000 // 1-Wire Befehls-Codes #define SKIP_ROM 0xCC #define CONVERT_T 0x44 #define READ_SCRATCHPAD 0xBE #define READ_ROM 0x33 #define MATCH_ROM 0x55 #define DS18B20_FAMILY_CODE 0x28 #define MAX_DEVICES 3 // Maximal erwatete Zahl von Busteilnehmern DS18B20 //Nachfolgend müssen noch zwei Bibliotheks-Dateien korrekt eingebunden werden (bitte Punkte passend ersetzen) #include #include #include // für abs() Funktion, falls benötigt #include // Muss sich im Arbeitsverzeichnis befinden!! #include // Muss sich im Arbeitsverzeichnis befinden!! // Deklaration der globalen Variablen (bitte Punkte passend ersetzen) int16_t temperature_10; // Sensortemperatur x 10 in 0,1°C Stufen uint8_t w1_devices_rom_codes[MAX_DEVICES][...]; // 2D-Array zur Aufnahme der Teilnehmer-ROM-Code-Daten uint8_t w1_devices; // Anzahl der am Bus gefundenen Teilnehmer int main(void) { // UART 0 Initialisieren (bitte Punkte passend ersetzen) uart_setup(UART_RX_DISABLE, UART_TX_ENABLE, 19200); // Empfangen deaktivieren, Senden aktivieren, // Baudrate ... Bit/s // 1-Wire-Schnittstelle initialisieren (bitte Punkte passend ersetzen) w1_setup(PORTC , 2); // Port und Portbit wählen gemäß Hardwarebeschreibung sei(); // Bibliotheksfunktionen nutzen Interrupts, daher // müssen Interrupts global freigeben werden printf("\r\n----------------------\r\n1 Wire Bus Thermometer\r\n----------------------\r\n\r\n"); if (w1_init() = 1) // Neue 1-Wire-Befehlsfolge initialisieren und nur { // falls Teilnehmer am Bus erkannt werden weitersenden // Teilnehmersuche für DS18B20 Temperatursensoren durchführen und Sensoranzahl ermitteln w1_devices = w1_search(0xF0, & w1_devices_rom_codes) ; // Zahl der gefundenen Temperatursensoren und deren jeweilige ROM-Codes als HEX-Zahlen per USART 0 senden ... // (bitte Punkte passend durch Programmsequenz ersetzen) ... ... ... } else // Falls keine Teilnehmer am 1-Wire-Bus gefunden wurden ... { printf("Keinen Busteilnehmer gefunden\r\n\r\n");// ... eine entsprechende Meldung über USART 0 senden } while (1) // Periodisch Temperaturwerte mit allen Temperatursensoren { // messen und als Textmeldung per USART 0 senden // Periodisch Temperaturwerte mit allen Temperatursensoren messen und als Textmeldung per USART 0 senden for () // (bitte Punkte passend ersetzen) { // Temperaturwert anfordern und auslesen temperature_10 = w1_read() ; // Sensornummer und Temperaturwert nur senden, wenn beim Auslesen kein Fehler aufgetreten ist, ... if (temperature_10 != 1) // (bitte Punkte passend ersetzen) { printf("Sensor %d: %+d,%d Grad Celsius\r\n",(i+1),(temperature_10 / 10),(temperature_10 % 10)) ; // (bitte Punkte passend ersetzen) } // ... im anderen Fall eine Fehlermeldung mit Angabe der Sensornummer senden else { printf("Die Eingabe ist falsch\r\n\r\n") ; // (bitte Punkte passend ersetzen) } // Das einfügen einer Pause (DELAY) ist nicht erforderlich, da ein Temperaturmessvorgang ca. 0,8 s dauert } } }