Brauche Hilfe bei SHT11 CRC Berechnung

Gast #2733177
Hallo Leute,

Möchte bei einem SHT11 einen CRC Check einbauen.
Der verwendete Compiler ist Mikroe Mikrobasic Pro 5.6
Die CRC_Table ist vom APPnote übernommen worden.
Aber irgendwie klappt es nicht.

Habe nun folgenden Code:

sub Function Check_SHT_CRC(dim 
Commandbyte,Databyte1,Databyte2,CRC_FromSensor As Byte) As Boolean

    Dim CRC_calculation As Byte
    CRC_calculation = 0
    CRC_calculation = CRC_Table[Commandbyte]
    CRC_calculation = CRC_calculation Xor Databyte1
    CRC_calculation = CRC_Table[CRC_calculation]
    CRC_calculation = CRC_calculation Xor Databyte2
    CRC_calculation = CRC_Table[CRC_calculation]
    CRC_calculation =  CRC_calculation xor 255 'Reverse
    If CRC_calculation = CRC_FromSensor Then
       Check_SHT_CRC = True
    Else
        Check_SHT_CRC = False
    End If

End sub


Woran könnte es liegen?
Finde im Netz leider nur Beispiele in C.
(Bitte kein Krieg über den besseren Compiler)

mfG
Shtler
Gast
Kein Basic, aber so geht der ASlgorirthmus

[c]
unsigned char sbus_read(unsigned char ack,unsigned char reverse)
// reads a byte form the Sensibus and gives an acknowledge in case of 
"ack=1"
{
  unsigned char i, val;

  val=0;
  datadir(0);                        // DATA als Eingang zum Lesen
  i=(reverse?0x01:0x80);           // shift bit for masking
  while(i)
  {
    clk1();                        // clk for SENSI-BUS
    if(datain()) val|=i;       // read bit
    clk0();
    if(reverse) i<<=1; else i>>=1;
  }
  datadir(1);                        // DATA als Ausgang
  data(!ack);                     // in case of "ack==1" pull down 
DATA-Line
  clk1();                     // clk #9 for ack
  clk0();
  datadir(0);                        // DATA als Eingang zum Lesen
  return val;
}

unsigned char lut[] =
{
  0, 49, 98, 83, 196, 245, 166, 151, 185, 136, 219,
  234, 125, 76, 31, 46, 67, 114, 33, 16, 135,
  182, 229, 212, 250, 203, 152, 169, 62, 15,
  92, 109, 134, 183, 228, 213, 66, 115, 32,
  17, 63, 14, 93,108, 251, 202, 153, 168,
  197, 244, 167, 150, 1, 48, 99, 82, 124, 77,
  30, 47, 184, 137, 218, 235, 61, 12, 95,
  110, 249, 200, 155, 170, 132, 181, 230,
  215, 64, 113, 34, 19, 126, 79, 28, 45, 186,
  139, 216, 233, 199, 246, 165, 148, 3, 50,
  97, 80, 187, 138, 217, 232, 127, 78, 29,
  44, 2, 51, 96, 81, 198, 247, 164, 149, 248,
  201, 154, 171, 60, 13, 94, 111, 65, 112,
  35, 18, 133, 180, 231, 214, 122, 75, 24,
  41, 190, 143, 220, 237, 195, 242, 161, 144,
  7, 54, 101, 84, 57, 8, 91, 106, 253, 204,
  159, 174, 128, 177, 226, 211, 68, 117, 38,
  23, 252, 205, 158, 175, 56, 9, 90, 107, 69,
  116, 39, 22, 129, 176, 227, 210, 191, 142,
  221, 236, 123, 74, 25, 40, 6, 55, 100, 85,
  194, 243, 160, 145, 71, 118, 37, 20, 131,
  178, 225, 208, 254, 207, 156, 173, 58, 11,
  88, 105, 4, 53, 102, 87, 192, 241, 162,
  147, 189, 140, 223, 238, 121, 72, 27, 42,
  193, 240, 163, 146, 5, 52, 103, 86, 120,
  73, 26, 43, 188, 141, 222, 239, 130, 179,
  224, 209, 70, 119, 36, 21, 59, 10, 89, 104,
  255, 206, 157, 172
};

int sbus_measure(unsigned char command)
{
  int i,msb,lsb;
  unsigned char crc;

    if(sbus_send(command)) return -1;
  for ( i=0; i<655; i++ ) if ( !datain() ) break; // wait until sensor 
has finished the measurement
  if (datain()) return -1; // or timeout is reached
  msb = sbus_read(ACK,0); // read the first byte (MSB)
  lsb = sbus_read(ACK,0); // read the second byte (LSB)
  crc = sbus_read(noACK,1); // read checksum
  // 4 status register bits go into sent crc, but they are 0 if sensor 
is as we want it
  if(crc!=lut[lut[lut[command]^msb]^lsb]) return -1;  // crc check fails
  return (msb<<8)|lsb;
}
[/c)
Wichtig ist die 1 bei sbus_read, das kombiniert die Bits in anderer 
Reihenfolge (Bits rückwätrs) als bei den Messwerten.
Gast
Das ist dein Fehler:
CRC_calculation =  CRC_calculation xor 255 'Reverse

Der vom Sensor gelieferte CRC-Wert hat die Bits in umgekehrter 
Reihenfolge siehe MaWins Beitrag.
>Wichtig ist die 1 bei sbus_read, das kombiniert die Bits in anderer
>Reihenfolge (Bits rückwätrs) als bei den Messwerten.

Hab das am PC getestet
00000000 -     -     - Status
00000101 -     -     - Command
00000101 -   5 - 245
11110101 - 245
00001001 -     -     - DataByte1
11111100 - 252 - 255
11111111 - 255
00110001 -     -     - DataByte2
11001110 - 206 -  88
01011000 -  88 -     - Final CRC
10100111 -     -     - Wrong Reversed CRC (XOR 255)
11000111 -     -     - Wrong Reversed CRC (LUT)
00011010 -     -     - Sensor CRC value

Du musst also die Bits entweder beim Einlesen oder in der Berechnung 
reversieren.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.