Hallo,
ich möchte gerne die vom Sensor bereitgestellten Prüfsummen zum
Validieren der Daten nutzen. Dazu implementierte ich den CRC
Algorithmus, der in dieser PDF erklärt wird:
http://www.sensirion.com/en/pdf/product_information/CRC_Calculation_Humidity_Sensor_E.pdf
Hier ein Ausschnitt der PDF, der die Vorgehensweise der byteweisen
Berechnung mittels einer LUT beschreibt:
============
2.4 Bytewise
With this implementation the CRC data is stored in a 256 byte lookup
table.
Perform the following operations:
1. Initialize the CRC register with the value of the lower nibble of the
value of the status register (reversed (s0s1s2s3‘0000)). (default
‘00000000’ = 0)
2. XOR each (transmitted and received) byte with the previous CRC value.
The result is the new byte that you need to calculate the CRC value
from.
3. Use this value as the index to the table to obtain the new CRC value.
4. Repeat from 2.) until you have passed all bytes through the process.
5. The last byte retrieved from the table is the final CRC value.
6. The CRC value retrieved from the SHTxx must be reversed (bit 0 = bit
7, bit 1=bit 6 … bit 7 = bit 0) and can then be compared to the final
CRC value.
=============
Zum Umdrehen der Bitreihenfolge nutze ich ebenso eine LUT.
Nur leider funktioniert das ganze nicht. Es wird seltsamerweise immer
der Wert 160 ausgelesen. Dies kann aber normal nicht sein, da die
gleiche Leseroutine wie beim Auslesen der Temperatur genutzt wird. Diese
liest aber die Temperatur und Feuchte korrekt aus.
Vielleicht habe ich prinzipiell etas nicht verstanden oder übersehe
dauernd etwas.
Hier mal ein paar Codeausschnitte, der Rest ist in der angehängten
Datei.
Die Funktion SendeTextUART sendet Statusmeldungen über die serielle
Schnittstelle.
Dane schonmal im Voraus für die Hilfe.
Gruß
Bernhard N.
====================
Messung und Berechnung des CRC:
1
voidMessungAusfuehren(Messwerte*myMesswerte){
2
3
uint8_tFehler=0;
4
uint8_t*pChecksumme=0;
5
uint8_tCRC=0;
6
uint8_tCRC_IV=0b00000000;// Hinweis: Dieser Initialisierungsvektor (IV) muss dem
7
// Statusregisterinhalt mit umgedrehter Bitfolge entsprechen!
8
// Also beim Registerinhalt 00000001 muss der IV 10000000 sein.
9
// Standartwert des Registers ist 00000000.
10
11
12
// Wiederhole die Messung bis keine Fehler aufgetreten sind
Kannst du genug Datentelegramme mitschneiden, um einen Software-SHT75 zu
implementieren? Das würde IMHO die Anzahl der Leute erhöhen, die das
Problem angehen können, ohne dass sie einen SHT75 haben müssen.