Hallo Leute!
nachdem ich (wie beschrieben) gestern einen Sensor bestellt habe und ich
aber noch in meiner Bastelschublade einen solchen
DS18B20-Temperatursensor gefunden habe, so sitze ich seit gestern mit
diesem kleinen Sensor und einem ATmega8 vor einem Problem, da ich nicht
weiß wie ich weiterkomme.
Durch das tolle Tutorial bin ich auf die Seite
(http://chaokhun.kmitl.ac.th/~kswichit/avrthermo/avrthermo.html)
gekommen.
Der Sensor ist so angeschlossen wie es im Datenblatt steht. An den
ATmega8 habe ich ihn an den PC0 angeschlossen.
Mein Vorhaben ist, einfach die Temperatur in eine Variable zu schreiben.
Die weitere Verarbeitung (in meinem Falle wäre es die Übertragung per
UART an den PC) braucht mich vorerst nicht weiter zu interessieren.
Hier zum bisherigen Quellcode, den ich mir aus Ausschnitten des Forums
zusammengebastelt habe.
1 | #define F_CPU 16000000
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <util/delay.h>
|
5 | #include <stdlib.h>
|
6 | #include <string.h>
|
7 | #include <stdint.h>
|
8 |
|
9 |
|
10 | #define T_PORT PORTC
|
11 | #define T_DDR DDRC
|
12 | #define T_PIN PINC
|
13 | #define T_DQ PC0
|
14 |
|
15 | #define T_INPUT T_DDR&=~(1<<T_DQ)
|
16 | #define T_OUTPUT T_DDR|=(1<<T_DQ)
|
17 | #define T_LOW T_PORT&=~(1<<T_DQ)
|
18 | #define T_HIGH T_PORT|=(1<<T_DQ)
|
19 |
|
20 |
|
21 | inline unsigned char owReset()
|
22 | {
|
23 | uint8_t r = 0;
|
24 | T_OUTPUT; // Ausgang
|
25 | T_LOW; // setze Low
|
26 | _delay_us(480); // warte...
|
27 |
|
28 | T_INPUT; // Eingang
|
29 | _delay_us(70); // warte...
|
30 |
|
31 | r = (bit_is_clear(T_PIN, T_DQ) ? 1 : 0); // clear bit -> low setzen
|
32 |
|
33 | T_OUTPUT; // set Ausgang
|
34 | _delay_us(410);
|
35 | return(r);
|
36 | }
|
37 |
|
38 |
|
39 | inline void owWriteBit(uint8_t bit_value)
|
40 | {
|
41 |
|
42 | T_OUTPUT;
|
43 |
|
44 | if (bit_value) // ...dann schreibe 1
|
45 | {
|
46 | T_LOW;
|
47 | _delay_us(6);
|
48 | T_INPUT;
|
49 | _delay_us(64);
|
50 | }
|
51 | else // ...sonst schreibe 0
|
52 | {
|
53 | _delay_us(60);
|
54 | T_INPUT;
|
55 | _delay_us(10);
|
56 | }
|
57 |
|
58 | }
|
59 |
|
60 |
|
61 |
|
62 | void owWriteByte(unsigned char byte_value)
|
63 | {
|
64 | uint8_t i = 8;
|
65 |
|
66 | while(i--)
|
67 | {
|
68 | owWriteBit(byte_value & 0x01); // das rechts stehende Bit senden
|
69 | byte_value = byte_value >> 1; // um 1 Stelle nach rechts schieben
|
70 | }
|
71 | }
|
72 |
|
73 | inline uint8_t owReadBit(void)
|
74 | {
|
75 | uint8_t r=0;
|
76 |
|
77 | T_OUTPUT;
|
78 | T_LOW;
|
79 | _delay_us(6);
|
80 |
|
81 | T_INPUT;
|
82 | _delay_us(9);
|
83 |
|
84 | if (T_PIN&(1<<T_DQ))
|
85 | {
|
86 | r = 1;
|
87 | }
|
88 | _delay_us(55);
|
89 |
|
90 | return (r);
|
91 | }
|
92 |
|
93 | uint8_t owReadByte(void)
|
94 | {
|
95 | uint8_t i = 8;
|
96 | uint8_t data = 0;
|
97 | while(i > 0)
|
98 | {
|
99 | data = data >> 1; //schieben...
|
100 | if (owReadBit())
|
101 | {
|
102 | data = data | 0x80; // Bit 7 setzen
|
103 | }
|
104 | }
|
105 | return(data);
|
106 | }
|
107 |
|
108 |
|
109 |
|
110 |
|
111 | void main(void)
|
112 | {
|
113 |
|
114 | uint8_t i = 0;
|
115 | uint8_t tmp = 0;
|
116 | uint16_t T = 0;
|
117 | uint16_t T1 = 0;
|
118 |
|
119 | while(1)
|
120 | {
|
121 | owReset(); // Initialization...
|
122 | owWriteByte(0xCC); // ROM-SKIP -> Stop to sending out ROM code information
|
123 | owWriteByte(0x44); // set single temperature conversion: Following the conversion, the resulting thermal data is stored in the 2-byte temperature register in the scratchpad memory
|
124 |
|
125 | _delay_ms(1000);
|
126 |
|
127 | owWriteByte(0xCC);
|
128 | owWriteByte(0xBE); // reading scratchpad...DS18B20 transmits up to 9 data bytes to master
|
129 |
|
130 | char temperatur_databytes[9] = owReadByte(); //schreiben der empfangenen Daten in ein char-Array
|
131 | }
|
132 | }
|
Würde das Ganze soweit laufen?
Leider weiß ich aber bis dato nicht, wie ich den Sensor initialisiere
(also mit welcher Auflösung er arbeiten soll). Könnt ihr mir da helfen?
Vielen Dank und Gruß