Forum: Compiler & IDEs Simples DS18B20 abfragen


von Das SensenOhr (Gast)


Lesenswert?

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ß

von Karl H. (kbuchegg)


Lesenswert?

Das SensenOhr schrieb:


> Würde das Ganze soweit laufen?

Du hast den Sensor vor dir liegen - du hast einen AVR vor dir.
Kable ihn ran und lass dein Programm laufen.

Oder erwartest du jetzt wirklich, dass sich hier jemand hinsetzt und 2 
Seiten Code analysiert und 2 Stunden Arbeitszeit investiert bis er alle 
Feinheiten herausgearbeitet hat, für etwas was du in 2 Minuten alleine 
feststellen kannst?

> Leider weiß ich aber bis dato nicht, wie ich den Sensor initialisiere

gar nicht.
Der braucht nix. Du legst Spannung drauf,m schickst ihm das Kommando 
'eine Messung durchführen' und holst dir das Ergebnis ab. Alles andere 
ist fix eingestellt und von dir nicht zu beeinflussen.

von Das SensenOhr (Gast)


Lesenswert?

>gar nicht.
>Der braucht nix. Du legst Spannung drauf,m schickst ihm das Kommando
>'eine Messung durchführen' und holst dir das Ergebnis ab. Alles andere
>ist fix eingestellt und von dir nicht zu beeinflussen.

Hi,

danke für die schnelle Antwort.
Laut Datenblatt steht da aber, dass man das Register beeinflussen kann 
um die Auflösung einzustellen (Seite 8, 
http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf)


Die Frage ist nun, ob ich mit meiner owWriteByte-Funktion das 
Config-Register so beschreiben kann wie es im Datenblatt steht:

>WRITE SCRATCHPAD [4Eh]
>This command allows the master to write 3 bytes of data to the DS18B20’s 
>scratchpad. The first data byte is written into the TH register (byte 2 of >the 
scratchpad), the second byte is written into the TL register (byte 3), >and the 
third byte is written into the configuration register (byte 4). >Data must be 
transmitted least significant bit first. All three bytes MUST >be written before 
the master issues a reset, or the data may be corrupted...
1
void main(void)
2
{
3
4
  uint8_t i = 0;
5
  uint8_t tmp = 0;
6
  uint16_t T = 0;
7
  uint16_t T1 = 0;
8
  
9
10
owWriteByte(0x4E);   // Command: "WRITE SCRATCHPAD"
11
owWriteByte(0x00);   // Byte 0: Wert für TH-Register
12
owWriteByte(0x00);   // Byte 1: Wert für TL-Register
13
owWriteByte(0x3F);   // Byte 2: beschreibt 10bit-Auflösung (siehe Fig8 Datasheet) 
14
  while(1)
15
  {
16
    owReset();          // Initialization...
17
    owWriteByte(0xCC);      // ROM-SKIP -> Stop to sending out ROM code information
18
    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
19
20
    _delay_ms(1000);
21
22
    owWriteByte(0xCC);
23
    owWriteByte(0xBE);      // reading scratchpad...DS18B20 transmits up to 9 data bytes to master
24
25
    char temperatur_databytes[9] = owReadByte(); //schreiben der empfangenen Daten in ein char-Array
26
  }
27
}

von Karl H. (kbuchegg)


Lesenswert?

Das SensenOhr schrieb:
>>gar nicht.
>>Der braucht nix. Du legst Spannung drauf,m schickst ihm das Kommando
>>'eine Messung durchführen' und holst dir das Ergebnis ab. Alles andere
>>ist fix eingestellt und von dir nicht zu beeinflussen.
>
> Hi,
>
> danke für die schnelle Antwort.
> Laut Datenblatt steht da aber, dass man das Register beeinflussen kann
> um die Auflösung einzustellen (Seite 8,
> http://datasheets.maximintegrated.com/en/ds/DS18B20.pdf)

OK. Das wusste ich nicht.
Tatsache ist aber auch, dass da ein sinnvoller Wert eingetragen ist und 
du erst mal nichts machen musst.


> Die Frage ist nun, ob ich mit meiner owWriteByte-Funktion das
> Config-Register so beschreiben kann wie es im Datenblatt steht:

Vorschlag: Bring den Sensor erst mal so zum laufen. Wenn du deine erste 
gemessene Temperatur in Händen hältst, ist es immer noch früh genug sich 
den Kopf darüber zu zerbrechen, ob du die Default-Konfiguration 
zugunsten von etwas anderem aufgibst.

Absolvier erst mal die Pflicht, ehe du zur Kür übergehst.
Und für die Pflicht reicht es, den DS messen zu lassen und sich das 
Ergebnis abzuholen. In 99% aller Fälle reicht das dann auch schon.

von Marco P. (Firma: keine) (marcopolo)


Lesenswert?

Du kannst doch mit dem Byte4 = ConfigurationRegister im Scratchpad die 
Messgenauigkeit des Sensors einstellen. Default sind die aber schon auf 
12bit Genauigkeit eingestellt. Also bei allen meinen letzten B-Sensoren 
war das so.

Ich vergess immer den 4.7k Pull-Up anzuschließen, vielleicht ist das ja 
auch dein Problem.

Zum "debuggen" macht sich der uart super. Bring den mal zum Laufen, bau 
dein Programm da mit rein und probier es dann Schritt für Schritt aus, 
dann bewegst du dich nicht komplett im Blindflug.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.