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
was für ein CRC soll das denn sein, geben tut es viele: http://regregex.bbcmicro.net/crc-catalogue.htm#crc.cat.xmodem was die eigentlich berechnung angeht(Punkt 18): http://www.ross.net/crc/download/crc_v3.txt wo liegt eigentlich dein problem? SRP16 und FsumFrontEnd sind sehr nützlich tools wenn man checken will ob der eigene crc algoritmus richtig funzt.
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.
@MaWin Der Code müsste "der selbe" sein wie der meinige. Schon 10 Sensoren probiert (Plausible Werte.Erprobter Code),nur die CRC Prüfung geht in die Hose :-( Habe mal das Manual für die CRC Berechnung angehängt. Was mache ich nur falsch?
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.
@: Das wars. Hatte einen Denkfehler. Dachte ich müsste die Bits negieren. Dankeschön :-D
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.