1 | #define F_CPU 16000000
|
2 |
|
3 | // 1-Wire Befehls-Codes
|
4 | #define SKIP_ROM 0xCC
|
5 | #define CONVERT_T 0x44
|
6 | #define READ_SCRATCHPAD 0xBE
|
7 | #define READ_ROM 0x33
|
8 | #define MATCH_ROM 0x55
|
9 |
|
10 | #define DS18B20_FAMILY_CODE 0x28
|
11 |
|
12 | #define MAX_DEVICES 3 // Maximal erwatete Zahl von Busteilnehmern DS18B20
|
13 |
|
14 | //Nachfolgend müssen noch zwei Bibliotheks-Dateien korrekt eingebunden werden (bitte Punkte passend ersetzen)
|
15 | #include <avr/io.h>
|
16 | #include <util/delay.h>
|
17 | #include <stdlib.h> // für abs() Funktion, falls benötigt
|
18 | #include <wire1.h> // Muss sich im Arbeitsverzeichnis befinden!!
|
19 | #include <uart.h> // Muss sich im Arbeitsverzeichnis befinden!!
|
20 |
|
21 | // Deklaration der globalen Variablen (bitte Punkte passend ersetzen)
|
22 | int16_t temperature_10; // Sensortemperatur x 10 in 0,1°C Stufen
|
23 | uint8_t w1_devices_rom_codes[MAX_DEVICES][...]; // 2D-Array zur Aufnahme der Teilnehmer-ROM-Code-Daten
|
24 | uint8_t w1_devices; // Anzahl der am Bus gefundenen Teilnehmer
|
25 |
|
26 | int main(void)
|
27 | {
|
28 | // UART 0 Initialisieren (bitte Punkte passend ersetzen)
|
29 | uart_setup(UART_RX_DISABLE, UART_TX_ENABLE, 19200); // Empfangen deaktivieren, Senden aktivieren,
|
30 | // Baudrate ... Bit/s
|
31 |
|
32 | // 1-Wire-Schnittstelle initialisieren (bitte Punkte passend ersetzen)
|
33 | w1_setup(PORTC , 2); // Port und Portbit wählen gemäß Hardwarebeschreibung
|
34 |
|
35 | sei(); // Bibliotheksfunktionen nutzen Interrupts, daher
|
36 | // müssen Interrupts global freigeben werden
|
37 |
|
38 | printf("\r\n----------------------\r\n1 Wire Bus Thermometer\r\n----------------------\r\n\r\n");
|
39 |
|
40 | if (w1_init() = 1) // Neue 1-Wire-Befehlsfolge initialisieren und nur
|
41 | { // falls Teilnehmer am Bus erkannt werden weitersenden
|
42 | // Teilnehmersuche für DS18B20 Temperatursensoren durchführen und Sensoranzahl ermitteln
|
43 | w1_devices = w1_search(0xF0, & w1_devices_rom_codes) ;
|
44 |
|
45 | // Zahl der gefundenen Temperatursensoren und deren jeweilige ROM-Codes als HEX-Zahlen per USART 0 senden
|
46 | ... // (bitte Punkte passend durch Programmsequenz ersetzen)
|
47 | ...
|
48 | ...
|
49 |
|
50 | ...
|
51 | }
|
52 | else // Falls keine Teilnehmer am 1-Wire-Bus gefunden wurden ...
|
53 | {
|
54 | printf("Keinen Busteilnehmer gefunden\r\n\r\n");// ... eine entsprechende Meldung über USART 0 senden
|
55 | }
|
56 |
|
57 | while (1) // Periodisch Temperaturwerte mit allen Temperatursensoren
|
58 | { // messen und als Textmeldung per USART 0 senden
|
59 | // Periodisch Temperaturwerte mit allen Temperatursensoren messen und als Textmeldung per USART 0 senden
|
60 | for () // (bitte Punkte passend ersetzen)
|
61 | {
|
62 | // Temperaturwert anfordern und auslesen
|
63 | temperature_10 = w1_read() ;
|
64 |
|
65 | // Sensornummer und Temperaturwert nur senden, wenn beim Auslesen kein Fehler aufgetreten ist, ...
|
66 | if (temperature_10 != 1) // (bitte Punkte passend ersetzen)
|
67 | {
|
68 | printf("Sensor %d: %+d,%d Grad Celsius\r\n",(i+1),(temperature_10 / 10),(temperature_10 % 10)) ; // (bitte Punkte passend ersetzen)
|
69 | }
|
70 | // ... im anderen Fall eine Fehlermeldung mit Angabe der Sensornummer senden
|
71 | else
|
72 | {
|
73 | printf("Die Eingabe ist falsch\r\n\r\n") ; // (bitte Punkte passend ersetzen)
|
74 | }
|
75 | // Das einfügen einer Pause (DELAY) ist nicht erforderlich, da ein Temperaturmessvorgang ca. 0,8 s dauert
|
76 | }
|
77 | }
|
78 | }
|