Diese Zeile macht für mich schon mal gar keinen Sinn. Mit tmp als uint8_t macht die Zeile nichts weiter als "tmp <<= 1;". Was sollte die Zeile denn eigentlich machen?Code:tmp=(tmp<<1)|((datastream[i/8]<<(i%8))&(1<<8));//TODO dies kontrollieren
Hallo,wider nach etlichen jahren nur mitlesen:
ich hab ein problem, bei mir funktioniert die selbstgeschreibene CRC funktion nicht.
Ich poste mal den Code und bitte mal den Code zu überlesen, ich find einfach den fehler nicht.
Danke an alle die mein miststück von Code lesen und vll. den Fehler finden, und ja es ist eine Abwandlung von Wikipedia.Code:#define CRC8POLY 0x99 //die CRC funktion von oneWire vll. wird es ausgelagert. uint8_t oneWireCrc(uint8_t *datastream , uint8_t Anzahlbytes) { uint8_t i,crc8=0,tmp=datastream[0]; for (i = 0; i < (Anzahlbytes*8); ++i) { if (((crc8 & 0x80) ? 1 : 0) != (tmp&0x01))//TODO dieses kontrollieren crc8 = (crc8 << 1) ^ CRC8POLY; else crc8 <<= 1; tmp=(tmp<<1)|((datastream[i/8]<<(i%8))&(1<<8));//TODO dies kontrollieren } return tmp; }
MfG
der aller dümmste Anfänger
bitte bei schwerwiegenden Rechtschreibfehlern oder Unleserlichkeiten eine PN schreiben
Danke
http://www.openmoko.org/
Diese Zeile macht für mich schon mal gar keinen Sinn. Mit tmp als uint8_t macht die Zeile nichts weiter als "tmp <<= 1;". Was sollte die Zeile denn eigentlich machen?Code:tmp=(tmp<<1)|((datastream[i/8]<<(i%8))&(1<<8));//TODO dies kontrollieren
MfG
Stefan
also ich denke es sollte auf das LSB von TMP das MSB von dem n. Byte von dem Array "datastream" das um i%8 verschoben ist legen. (aber ganz ehrlich ich verstehe selber das CRC nicht ganz)
MfG
der aller dümmste Anfänger
bitte bei schwerwiegenden Rechtschreibfehlern oder Unleserlichkeiten eine PN schreiben
Danke
http://www.openmoko.org/
Ok, ich habe mal die Maxim App-Note zum 1-Wire CRC (http://www.maxim-ic.com/app-notes/index.mvp/id/27) überflogen. Und bevor ich nun deinen Code zerpflücke, mache ich einfach mal einen Alternativvorschlag:
Code:uint8_t doCRC8 (uint8_t data, uint8_t crc) { for (uint8_t i = 0; i < 8; i++) { uint8_t fb = (crc ^ data) & 0x01; crc >>= 1; if (fb) crc ^= 0x8c; data >>= 1; } return crc; } uint8_t blockCRC (uint8_t *data, uint8_t size) { uint8_t crc = 0; for (uint8_t i = 0; i < size; i++) crc = doCRC8(data[i],crc); return crc; }
MfG
Stefan
Ok, das ist eine super Idee, wird heute eingebaut. Meine version war nur hingepfuscht das gebe ich offen zu.
Danke!!
MfG
der aller dümmste Anfänger
bitte bei schwerwiegenden Rechtschreibfehlern oder Unleserlichkeiten eine PN schreiben
Danke
http://www.openmoko.org/
Also ich hab jetzt mal ausprobiert und versucht zu lesen: ziemlich alles klar bis auf:
Warum 0x8C und nicht 0x99, da ja das 8., 5.,4 und 1. bit eine 1 sein soll?Code:crc ^= 0x8c;
Und es funkt bei mir nur mit 0x99 fehler bei mir im Code oder etwas anderes?
Danke nochmals für deine Lösung.
MfG
der aller dümmste Anfänger
bitte bei schwerwiegenden Rechtschreibfehlern oder Unleserlichkeiten eine PN schreiben
Danke
http://www.openmoko.org/
Schau dir in der verlinkten App-Note das Ersatzschaltbild (Figure 2) an. Es sind die Bits 3 und 4, also 0x18. Auch zu erkennen am ASM-Beispielcode (XRL A,#18H ;update the CRC value). Warum bei mir dann 0x8c? Nun, der eigentliche Ablauf wäre:Da ich das Verschieben vorgezogen habe, muss natürlich auch das 0x18 nach rechts verschoben werden, also 0x0c. Des weiteren kann man dann auch gleich das Setzen des höchsten Bits mit ins XOR rein nehmen, also 0x8c.Code:crc ^= 0x18; crc >>= 1; crc |= 0x80;
MfG
Stefan
Also, irgendwie sitzt ich grad auf dem Schlauch, deine Ausführungen stimmen aber funktionieren bei mir nicht.
Wie gesagt ich sitz grad auf dem schlauch, wo ist überhaupt der Einstiegspunkt?
MfG
der aller dümmste Anfänger
bitte bei schwerwiegenden Rechtschreibfehlern oder Unleserlichkeiten eine PN schreiben
Danke
http://www.openmoko.org/
Ich meine wo der ASM code von dallas angefangen wird.Und "funktionieren nicht" heißt, dass er meines erachtens Fehler detektiert wo keine sind, zumindestens nicht auf dem 1. und 2. Byte.
MfG
der aller dümmste Anfänger
bitte bei schwerwiegenden Rechtschreibfehlern oder Unleserlichkeiten eine PN schreiben
Danke
http://www.openmoko.org/
Lesezeichen