Forum: Mikrocontroller und Digitale Elektronik Temp. Sensor


von mark (Gast)


Lesenswert?

Hallo

Ich möchte hobbymässig den Sensor DS1621 auslesen.
Jedoch verstehe ich nicht wie dieser funktionieren soll. Auf Seite 4 ist 
beschrieben, dass er mittels einem Byte eine Auflösung von 1°C hat, bei 
2 Byte 0.5°.
Wie soll das gehen?
Es sind die Bytes zB 7D00 für +125°C angegeben dann erst 25°C wieder. 
..und das ist ja auf 1° genau und nicht 0.5 (2Byte)

Muss ich da interpolieren?

Wie komme ich dann auf meinen gemessenen Wert?
Was ist Count_Per_C und _Remain?

Ich verstehe leider nicht wie das funktionieren soll.
Vielen Dank für die Infos

von Volker K. (tobel)


Lesenswert?

mark schrieb:
> Auf Seite 4 ist
> beschrieben, dass er mittels einem Byte eine Auflösung ...

Hänge bitte den Text (das Datenblatt) an.
Dann können alle einfach nachlesen und eher verstehen was du meinst.

von Dirk B. (dirkb2)


Lesenswert?

Das sin 9 Bit Zweier-Komplement.

Im ersten Byte sind die (ganzen) Grad.

Als unsigned char ergibt das schon den richtigen Wert.

Im höchsten Bit vom zweiten Byte versteckt sich das halbe Grad.

von Michael B. (laberkopp)


Lesenswert?

mark schrieb:
> Ich verstehe leider nicht wie das funktionieren soll

Hmm, deutlich als auf Seite 4 im Datenblatt kann man es eigentlich nicht 
beschreiben, Figure 9 zeigt es sogar bit für bit.

Woran mangelt's, englisch, P.I.S.A. ? Zudem wird es den Auslesecode für 
die üblichen Microcontroller auch fertig im Netz geben, einfach einen 
aussuchen.

von mark (Gast)


Lesenswert?

hallo

ich habe nochmals alles durchgelesen (aufmerksam)

Nun möchte ich wissen, ob ich das auch alles richtig verstanden habe.

Also meine Slaveadresse, wenn ich A0,A1,A2 auf GND geschlossen habe (1 
Sensor) ist: 1001 000(R/W)
Also entweder 0x90 oder 0x91

Dann gibt es da das Control Register. Auf dieses kann ich zugreifen, 
wenn ich den AdressenBefehl als Read schicke (0xAC).
Dann kann ich diesen ändern und wieder mit dem AdressenBefehl als Write 
schreiben. Dann muss ich min. 10ms warten.
Ich habe da 2 Fragen dazu:
Um das DONE bit nach jedem Conversionsstart abzufragen, kann ich ja 
nicht einfach while(DoneBit==0) nutzen, da ja das Register stets 
abgefragt werden muss.
Muss ich das mit einer Schleife machen?
Ist das 1SHOT Bit anfangs defaultmässig auf 1SHOT oder muss ich den 
Sensor konfigurieren? Mehr muss ich ja wie es aussieht nicht 
konfigurieren als das 1Shot, wenn ich Tout nicht nutze.

Das Auslesen der Temperatur gibt mir immer 2 Byte zurück, wenn ich also 
nur das high Byte auswerte, habe ich gerade Temperaturwerte, sonst 0.5°C 
resolution.

Habe ich das so richtig verstanden?

von Dirk B. (dirkb2)


Lesenswert?

mark schrieb:
> Das Auslesen der Temperatur gibt mir immer 2 Byte zurück, wenn ich also
> nur das high Byte auswerte, habe ich gerade Temperaturwerte, sonst 0.5°C
> resolution.

Nein.
Das MSB (High Byte) liefert ganzzahlige Werte. (also auch 125, ..., 25, 
..., 2, 1, 0, -1, ..., -25, ..., -55)

von mark (Gast)


Lesenswert?

Dirk B. schrieb:
> mark schrieb:
>> Das Auslesen der Temperatur gibt mir immer 2 Byte zurück, wenn ich also
>> nur das high Byte auswerte, habe ich gerade Temperaturwerte, sonst 0.5°C
>> resolution.
>
> Nein.
> Das MSB (High Byte) liefert ganzzahlige Werte. (also auch 125, ..., 25,
> ..., 2, 1, 0, -1, ..., -25, ..., -55)

Hallo

Danke für die Erklärung. Das ist mir schon klar, aber ich meinte, wenn 
ich das LByte einfach weglassen würde, sprich nicht auswerte, habe ich 
einfach ganzzahlige Temperaturen (negativ, positiv).



Ich hätte übrigens mal eine Frage zu meiner stm32 uC i2c-Funktion.
Die Funktionen nehme ich an sind ja bei allen stms die gleichen.

Nun ich habe beispielweise
HAL_I2C_Master_Transmit(&hi2c1, TEMP_SENSOR_ADRESS_7_BIT << SHIFT, 
&txData, sizeof(txData), 10);
und
HAL_I2C_Master_Receive(&hi2c1, TEMP_SENSOR_ADRESS_7_BIT << SHIFT, 
&rxData, sizeof(rxData), 10);

Die Adressen, die ich beispielweise durchgeben müsste, wären 0x90 zum 
schreiben 0x91 zum Lesen. Jetzt aufgrund des Hinweises in der 
STM-Funktionsbib. muss dieses geshiftet werden und zwar nach rechts um 
1. Das ergäbe dann für die obigen beiden Fälle immer 0x48 egal ob ich 
schreiben möchte oder lesen. 0x48 ist dann ja quasi die 7Bit-Adresse vom 
TempSensor.
Jetzt shifte ich in der Funktion wieder nach links um 1, dann habe ich 
zwar die ursprüngliche Adresse, 0x90, und habe somit Platz für das LSB 
gemacht, aber schreibe so nur noch. Wo gebe ich nun explizit an, ob ich 
schreiben oder lesen möchte?

Ich möchte ja nicht immer schreiben.

von Dirk B. (dirkb2)


Lesenswert?

mark schrieb:
> Wo gebe ich nun explizit an, ob ich
> schreiben oder lesen möchte?

Das sollte die Lib  schon selber wissen, da das LSB das Schreiben/Lesen 
bestimmt.

von mark (Gast)


Lesenswert?

Dirk B. schrieb:
> mark schrieb:
>> Wo gebe ich nun explizit an, ob ich
>> schreiben oder lesen möchte?
>
> Das sollte die Lib  schon selber wissen, da das LSB das Schreiben/Lesen
> bestimmt.

Ja aber das heisst, dass ich dann doch die 8-bit adresse reischreiben 
muss als 2. Parameter und diesen aber wirklich nach rechts shiften muss, 
oder?

Also so:
wenn Address     0x90 definiert ist, muss es in der Fkt. doch heissen
Address >> 1

Weil wenn ich 0x48 als 7_Bit Adresse angebe und nach links shifte, 
bekomme ich  es ohne zusäzliche Angabe als Parameter nicht hin, zwischen 
lesen und schreiben zu wählen.

Denn
7_bit_Adresse     0x48
nach links geshiftet ergibt 0x90??
Also ist die richtige Lösung doch:
TEMP_SENSOR_ADRESS_READ                                          0x91
TEMP_SENSOR_ADRESS_WRITE                                         0x90
und damit
TEMP_SENSOR_ADRESS_READ >> 1 bzw. TEMP_SENSOR_ADRESS_WRITE >> 1
für das Lesen bzw. Schreiben

Richtig?

von Dirk B. (dirkb2)


Lesenswert?

mark schrieb:
> Weil wenn ich 0x48 als 7_Bit Adresse angebe und nach links shifte,
> bekomme ich  es ohne zusäzliche Angabe als Parameter nicht hin, zwischen
> lesen und schreiben zu wählen.

Du hast doch verschiedene Funktionen zum lesen und schreiben. Oder?

von mark (Gast)


Lesenswert?

ich habe nur diese hier, deshalb frage ich ja so blöd
1
/* IO operation functions  ****************************************************/
2
 /******* Blocking mode: Polling */
3
HAL_StatusTypeDef HAL_I2C_Master_Transmit(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
4
HAL_StatusTypeDef HAL_I2C_Master_Receive(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t Timeout);
5
HAL_StatusTypeDef HAL_I2C_Slave_Transmit(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
6
HAL_StatusTypeDef HAL_I2C_Slave_Receive(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t Timeout);
7
HAL_StatusTypeDef HAL_I2C_Mem_Write(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
8
HAL_StatusTypeDef HAL_I2C_Mem_Read(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size, uint32_t Timeout);
9
HAL_StatusTypeDef HAL_I2C_IsDeviceReady(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint32_t Trials, uint32_t Timeout);
10
11
 /******* Non-Blocking mode: Interrupt */
12
HAL_StatusTypeDef HAL_I2C_Master_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
13
HAL_StatusTypeDef HAL_I2C_Master_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
14
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
15
HAL_StatusTypeDef HAL_I2C_Slave_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
16
HAL_StatusTypeDef HAL_I2C_Mem_Write_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
17
HAL_StatusTypeDef HAL_I2C_Mem_Read_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
18
19
HAL_StatusTypeDef HAL_I2C_Master_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
20
HAL_StatusTypeDef HAL_I2C_Master_Sequential_Receive_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
21
HAL_StatusTypeDef HAL_I2C_Slave_Sequential_Transmit_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
22
HAL_StatusTypeDef HAL_I2C_Slave_Sequential_Receive_IT(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size, uint32_t XferOptions);
23
HAL_StatusTypeDef HAL_I2C_EnableListen_IT(I2C_HandleTypeDef *hi2c);
24
HAL_StatusTypeDef HAL_I2C_DisableListen_IT(I2C_HandleTypeDef *hi2c);
25
HAL_StatusTypeDef HAL_I2C_Master_Abort_IT(I2C_HandleTypeDef *hi2c, uint16_t DevAddress);
26
27
 /******* Non-Blocking mode: DMA */
28
HAL_StatusTypeDef HAL_I2C_Master_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
29
HAL_StatusTypeDef HAL_I2C_Master_Receive_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint8_t *pData, uint16_t Size);
30
HAL_StatusTypeDef HAL_I2C_Slave_Transmit_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
31
HAL_StatusTypeDef HAL_I2C_Slave_Receive_DMA(I2C_HandleTypeDef *hi2c, uint8_t *pData, uint16_t Size);
32
HAL_StatusTypeDef HAL_I2C_Mem_Write_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
33
HAL_StatusTypeDef HAL_I2C_Mem_Read_DMA(I2C_HandleTypeDef *hi2c, uint16_t DevAddress, uint16_t MemAddress, uint16_t MemAddSize, uint8_t *pData, uint16_t Size);
34
/**

von mark (Gast)


Lesenswert?

und das ist die Beschreibung zu einer der Funktionen
1
/**
2
  * @brief  Transmits in master mode an amount of data in blocking mode.
3
  * @param  hi2c Pointer to a I2C_HandleTypeDef structure that contains
4
  *                the configuration information for the specified I2C.
5
  * @param  DevAddress Target device address: The device 7 bits address value
6
  *         in datasheet must be shift at right before call interface
7
  * @param  pData Pointer to data buffer
8
  * @param  Size Amount of data to be sent
9
  * @param  Timeout Timeout duration
10
  * @retval HAL status
11
  */

von Dirk B. (dirkb2)


Lesenswert?

Wenn du anderer Quellen googelst steht da:

Du musst die 7-Bit Adresse aus dem Datenblatt durch Links-Schieben auf 
8-Bit erweitern.

von mark (Gast)


Lesenswert?

genau das verstehe ich eben nicht, wie soll das denn gehen?
die 7-bit Adresse ist in beiden Fällen 0x48

0x90 und 0x91 nach rechts geschoben ergibt ja 0x48 (beide mal)

wenn ich jetzt die 0x48 habe und lesen möchte, weiss ich jetzt nicht wie 
das das Programm nun wissen soll, ob ich lesen oder schreiben möchte.
So wie ich das verstehe wie du sagst

0x48 << 1 ergibt 0x90 also schreiben. IMMER!!!

Wir sind da in einem Forum wo es sicher stm32 Programmierer gibt.
Kennt sich denn hier niemand aus, der das schnell sagen kann oder wie?
Sonst kann ich ja gleich in ein Flohmarktforum gehen.

von mark (Gast)


Lesenswert?

übrigens aus welchem Datenblatt??

Die ist bei mir soweit ich weiss fixiert.
1001 für den Sensor, die sind fix
und A0,A1 und A2 sind bei mir GND
1001 000
da bleibt ja nicht mehr viel übrig, dass man noch in irgend ein 
Datenblatt schauen müsste, was die als 7-bit Adresse wollen.. hallo..?
Ich muss das machen/angeben, was der Sensor will..

von H.Joachim S. (crazyhorse)


Lesenswert?

Das alte Drama bei I2C.
Entweder direkt 8bit-Adresse (beinhaltet dann schon Lesen oder 
Schreiben), oder eben 7bit-Adresse, die dann geschoben wird und falls 
nötig mit dem read-bit ergänzt wird.
Logischer ist eigentlich die 7bit-Adresse, weil die tatsächlich den 
Baustein adressiert. Ich nehme inzwischen aber durchweg die 
8bit-Adressierung.

von mark (Gast)


Lesenswert?

H.Joachim S. schrieb:
> Das alte Drama bei I2C.
> Entweder direkt 8bit-Adresse (beinhaltet dann schon Lesen oder
> Schreiben), oder eben 7bit-Adresse, die dann geschoben wird und falls
> nötig mit dem read-bit ergänzt wird.
> Logischer ist eigentlich die 7bit-Adresse, weil die tatsächlich den
> Baustein adressiert. Ich nehme inzwischen aber durchweg die
> 8bit-Adressierung.

ok, ich frag jetzt noch mal genau nach.
was gibst du nun konkret ein als Deviceaddress?

0x90 >> 1 für schreiben
oder 0x91 >> 1 für lesen?

oder direkt die Adressen 0x90 oder 0x91 als Deviceaddress?
Ich nehme an nicht das letztere, weil die Fkt. ja voraussetzt dass man 
schiebt..

bitte um Beispiel

von Dirk B. (dirkb2)


Lesenswert?

mark schrieb:
> 0x48 << 1 ergibt 0x90 also schreiben. IMMER!!!

Wie schon geschrieben, die etnsprechende Funktion weiß, das beim LSB 
eine 0 oder eine 1 hin gehört.

mark schrieb:
> übrigens aus welchem Datenblatt??

Zu deinem Sensor.
Es gibt noch andere I2C-Device. Die haben andere Adressen.

von mark (Gast)


Lesenswert?

Dirk B. schrieb:
> mark schrieb:
>> 0x48 << 1 ergibt 0x90 also schreiben. IMMER!!!
>
> Wie schon geschrieben, die etnsprechende Funktion weiß, das beim LSB
> eine 0 oder eine 1 hin gehört.
>
> mark schrieb:
>> übrigens aus welchem Datenblatt??
>
> Zu deinem Sensor.
> Es gibt noch andere I2C-Device. Die haben andere Adressen.

kann ich mir nicht vorstellen, dass das funktioniert so..

aber ok, DeviceAddress zur Uebergabe an die Funktion, 2. Parameter oben 
von der Transmitfunktion gebe ich dann ein -->

DeviceAddress => (0x48 << 1)

also so?

Ok, du bist ja Programmierer. Dann mal die Frage anders herum gestellt:
Wenn du das programmieren müsstest, wie würdest du durch ein geschicktes 
Programm herausfinden, welchen Wunsch ich bei der Ausführung der 
I2C_Transmit  Funktion habe. Habe ich den Wunsch zu Lesen oder zu 
Schreiben??

Ich denke, du hast eine 50/50 Chance es zu erraten.

von Dirk B. (dirkb2)


Lesenswert?

Fürs lesen hast du die Funktion I2C_Receive

von Wolfgang (Gast)


Lesenswert?

mark schrieb:
> ok, ich frag jetzt noch mal genau nach.
> was gibst du nun konkret ein als Deviceaddress?
>
> 0x90 >> 1 für schreiben
> oder 0x91 >> 1 für lesen?
>
> oder direkt die Adressen 0x90 oder 0x91 als Deviceaddress?
> Ich nehme an nicht das letztere, weil die Fkt. ja voraussetzt dass man
> schiebt..

Die Zahl der Möglichkeiten ist an einer Hand abzählbar. Warum probierst 
du die nicht der Reihe nach durch und guckst dabei, wann dein Baustein 
mit einem ACK anwortet und wann in den I2C-Daten auf dem Bus das 
richtige Bitmuster auftaucht. Das geht schneller, als hier 9h auf den 
Thread zu schielen.

von mark (Gast)


Lesenswert?

Wolfgang schrieb:
> mark schrieb:
>> ok, ich frag jetzt noch mal genau nach.
>> was gibst du nun konkret ein als Deviceaddress?
>>
>> 0x90 >> 1 für schreiben
>> oder 0x91 >> 1 für lesen?
>>
>> oder direkt die Adressen 0x90 oder 0x91 als Deviceaddress?
>> Ich nehme an nicht das letztere, weil die Fkt. ja voraussetzt dass man
>> schiebt..
>
> Die Zahl der Möglichkeiten ist an einer Hand abzählbar. Warum probierst
> du die nicht der Reihe nach durch und guckst dabei, wann dein Baustein
> mit einem ACK anwortet und wann in den I2C-Daten auf dem Bus das
> richtige Bitmuster auftaucht. Das geht schneller, als hier 9h auf den
> Thread zu schielen.

Weil ich durch Fragen am schnellsten lerne, vor allem bin ich ja 
nebenbei am Programmieren.
Aber du hast recht mit dem Probieren. Um das aber tun zu können, 
bräuchte ich ein Oszilloskop mit Decoderfunktion, was ich leider nicht 
habe.
Und den Oszi, den ich bestellt habe ist aufgrund häufiger Bestellung vor 
der Weihnachtszeit bis zum Jänner 18 verzögert.

Darum muss ich bis dahin noch auf die Threads, wie du so schön sagst, 
schielen.

von mark (Gast)


Lesenswert?

Dirk B. schrieb:
> Fürs lesen hast du die Funktion I2C_Receive

Das hilft mir schon weiter. Jetzt ist es klar.

Manchmal sehe ich den Wald vor lauter Bäume nicht mehr... ohh mann

von Manfred (Gast)


Lesenswert?

mark schrieb:
> Weil ich durch Fragen am schnellsten lerne, vor allem bin ich ja
> nebenbei am Programmieren.

Ich lerne nicht "durch Fragen", sondern dadurch, dass ich eigenständig 
teste.

von Dirk B. (dirkb2)


Lesenswert?

mark schrieb:
> Dirk B. schrieb:
>> Fürs lesen hast du die Funktion I2C_Receive
>
> Das hilft mir schon weiter. Jetzt ist es klar.
>
> Manchmal sehe ich den Wald vor lauter Bäume nicht mehr... ohh mann

Beitrag "Re: Temp. Sensor"

von S. R. (svenska)


Lesenswert?

Verschiedene Bibliotheken nutzen verschiedene Ansätze.

Manche wollen die 7 Bit-Adresse und shiften selbst, andere wollen die 
geshiftete 8 Bit-Adresse, und wieder andere wollen die vollständige 8 
Bit-Adresse (mit korrektem R/W-Bit) haben. Die Zahl der Möglichkeiten 
ist aber begrenzt.

Wenn dein Sensor antwortet, dann hast du die richtige Wahl getroffen. Ob 
er antwortet, kannst du den Statusbits entnehmen (da steht drin, ob ein 
ACK eingetroffen ist).

von mark (Gast)


Lesenswert?

hallo

ich hätte eine Frage zur Programmierung mit dem STM32F302
Ich habe diese Fkt. geschrieben und es gibt mir die richtige Temperatur 
heraus.
1
t_ByteArray readTemperature()
2
{  
3
  txDataBuf[0] = READ_TEMPERATURE;
4
  uint8_t resultBuf[2];
5
  t_ByteArray tempBytes;
6
7
  HAL_I2C_Master_Transmit(&hi2c1, TEMP_SENSOR_ADRESS_8_BIT, txDataBuf, 1, 10);    // Shift is necessary because of i2C function description 
8
  HAL_I2C_Master_Receive(&hi2c1, TEMP_SENSOR_ADRESS_8_BIT, resultBuf, sizeof(resultBuf), 10);     // Shift is necessary because of i2C function description 
9
10
  tempBytes.HByte = (int8_t)resultBuf[0];
11
  tempBytes.LByte = resultBuf[1];
12
  
13
  return tempBytes;
14
}



Gedacht hätte ich aber, dass lediglich die Receive fkt. brauchen würde, 
da ich ja die Temperatur lesen möchte.
Sie müsste also so aussehen. Es kommt aber die falsche Temperatur 
heraus. Warum?
Hier ist das Datenblatt. 
https://datasheets.maximintegrated.com/en/ds/DS1621.pdf
1
t_ByteArray readTemperature()
2
{  
3
4
  uint8_t resultBuf[4];
5
  resultBuf[0] = READ_TEMPERATURE;
6
        resultBuf[1] = SensorAddress;
7
  t_ByteArray tempBytes;
8
9
  HAL_I2C_Master_Receive(&hi2c1, TEMP_SENSOR_ADRESS_8_BIT, resultBuf, sizeof(resultBuf), 10);     // Shift is necessary because of i2C function description 
10
11
  tempBytes.HByte = (int8_t)resultBuf[0];
12
  tempBytes.LByte = resultBuf[1];
13
  
14
  return tempBytes;
15
}

von Pete K. (pete77)


Lesenswert?

mark schrieb:
> Gedacht hätte ich aber, dass lediglich die Receive fkt. brauchen würde,
> da ich ja die Temperatur lesen möchte.
> Sie müsste also so aussehen. Es kommt aber die falsche Temperatur
> heraus. Warum?

Schau mal auf Seite 4 im Datenblatt den zweitletzten Absatz.

von mark (Gast)


Lesenswert?

Pete K. schrieb:
> mark schrieb:
>> Gedacht hätte ich aber, dass lediglich die Receive fkt. brauchen würde,
>> da ich ja die Temperatur lesen möchte.
>> Sie müsste also so aussehen. Es kommt aber die falsche Temperatur
>> heraus. Warum?
>
> Schau mal auf Seite 4 im Datenblatt den zweitletzten Absatz.

The DS1621 always powers up in a low power idle state, and the Start 
Convert T command must be used
to initiate conversions.

Ja das mache ich ja, es findet im main noch vor dem auslesen der 
Temperatur statt:
1
  WriteCommand(START_CONVERT_T,NONE);
2
  temp = getTemperature();

von Wolfgang (Gast)


Lesenswert?

mark schrieb:
> Um das aber tun zu können, bräuchte ich ein Oszilloskop mit
> Decoderfunktion, was ich leider nicht habe.

Das Dekodieren geht im Einzelfall ach mal von Hand. Du willst ja nicht 
eine stundenlange Datenverbindung nach irgendwelchen komischen 
Bitmustern durchsuchen.

Und ein Oszi für diese Aufgabe ist nur wirklich etwas übertrieben.
Ein kleine Logikanalysator, der das kann, kostet 5€ - falls du einen PC 
hast ;-)
https://www.ebay.de/itm/201541710029

von mark (Gast)


Lesenswert?

Wolfgang schrieb:
> mark schrieb:
>> Um das aber tun zu können, bräuchte ich ein Oszilloskop mit
>> Decoderfunktion, was ich leider nicht habe.
>
> Das Dekodieren geht im Einzelfall ach mal von Hand. Du willst ja nicht
> eine stundenlange Datenverbindung nach irgendwelchen komischen
> Bitmustern durchsuchen.
>
> Und ein Oszi für diese Aufgabe ist nur wirklich etwas übertrieben.
> Ein kleine Logikanalysator, der das kann, kostet 5€ - falls du einen PC
> hast ;-)
> Ebay-Artikel Nr. 201541710029

super, danke ;)

habs übrigens hinbekommen.
Die obere Variante stimmt. :) Ich muss beim lesen auch einen 
schreibprozess zuvor ausführen. Das ist mir komplett entgangen..

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.