PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] CRC von Dallas 1 Wire?



der aller dümmste Anfänge
23.05.2011, 18:35
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.


#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;
}
Danke an alle die mein miststück von Code lesen und vll. den Fehler finden, und ja es ist eine Abwandlung von Wikipedia.

sternst
23.05.2011, 20:31
tmp=(tmp<<1)|((datastream[i/8]<<(i%8))&(1<<8));//TODO dies kontrollierenDiese 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?

der aller dümmste Anfänge
23.05.2011, 20:37
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)

sternst
23.05.2011, 21:56
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:

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;
}

der aller dümmste Anfänge
23.05.2011, 23:16
Ok, das ist eine super Idee, wird heute eingebaut. Meine version war nur hingepfuscht das gebe ich offen zu.
Danke!!

der aller dümmste Anfänge
24.05.2011, 06:51
Also ich hab jetzt mal ausprobiert und versucht zu lesen: ziemlich alles klar bis auf:


crc ^= 0x8c;

Warum 0x8C und nicht 0x99, da ja das 8., 5.,4 und 1. bit eine 1 sein soll?
Und es funkt bei mir nur mit 0x99 fehler bei mir im Code oder etwas anderes?
Danke nochmals für deine Lösung.

sternst
24.05.2011, 09:03
Warum 0x8C und nicht 0x99, da ja das 8., 5.,4 und 1. bit eine 1 sein soll?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:
crc ^= 0x18;
crc >>= 1;
crc |= 0x80;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.

der aller dümmste Anfänge
24.05.2011, 09:25
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?

sternst
24.05.2011, 09:28
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?Welcher "Einstiegspunkt"? Und was genau bedeutet "funktionieren bei mir nicht"?

der aller dümmste Anfänge
24.05.2011, 09:34
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.

sternst
24.05.2011, 09:39
naja funktionieren nicht heist, dass er meines erachtens Fehler detektiert wo keine sind zumindestens nicht auf dem 1. und 2. Byte.Hä? Du kannst mit dem CRC nur feststellen, ob der gesamte Block korrekt ist. Weder kannst du dir einzelne Bytes "rauspicken" und testen, noch kann man damit lokalisieren, in welchem Byte der Fehler sitzt.

der aller dümmste Anfänge
24.05.2011, 16:22
Nein, ich lasse alle 9 Byte überprüfen also die 8 Byte nutzdaten + CRC-Byte, ich meine nur dass ich bisher nur die ersten 2 Byte, also die Temperatur Daten, händisch auf plausibilität Geprüft habe, also so dass keine Großen sprünge da sind etc. Also schon immer alle 9 Byte von CRC überprüfen anders gehts ja net. (klar geworden was ich meine?)

sternst
24.05.2011, 16:35
(klar geworden was ich meine?)Ja.
Nur was soll ich jetzt mit dem "funktioniert nicht" anfangen? Wenn du weitere Hilfe willst, musst du schon mit konkreten Details rüberkommen. Angefangen mit der Info, um was für ein Bauteil es sich handelt, und ein konkretes Beispiel der ausgelesenen Daten wäre auch nicht schlecht.

der aller dümmste Anfänge
24.05.2011, 17:10
ok, ich hab den DS 18(s)20 von Dallas 2 Stück, Die Daten handelt sich um die Daten die ich lese sind folgende (aus dem datenblatt kopiert)


SCRATCHPAD
(POWER-UP STATE)
Byte 0 Temperature LSB (AAh)(85°C)
Byte 1 Temperature MSB (00h)
Byte 2 TH Register or User Byte 1*
Byte 3 TL Register or User Byte 2*
Byte 4 Reserved (FFh)
Byte 5 Reserved (FFh)
Byte 6 COUNT REMAIN (0Ch)
Byte 7 COUNT PER °C (10h)
Byte 8 CRC*

Die jage ich durch deine funktion blos das ich die konstante von 0x8C zu 0x99 Geändert habe, weil sie sonst immer(!!) einen Fehler erkannte (funktioniert nicht) -> das war meine Nachfrage.
Aber danke für deine Geduld

sternst
24.05.2011, 17:20
Die jage ich durch deine funktion blos das ich die konstante von 0x8C zu 0x99 Geändert habe, weil sie sonst immer(!!) einen Fehler erkannte (funktioniert nicht) -> das war meine Nachfrage.0x99 ist definitiv falsch.
Aber nochmal: wie soll ich den Fehler irgendwie nachvollziehen können, wenn du mir kein konkretes Beispiel ausgelesener Daten lieferst?

der aller dümmste Anfänge
24.05.2011, 17:28
Also hier ein dump von den Daten:


0x32 0x00 0x4b 0x46 0xff 0xff 0x0e 0x10 0xfa
Also so ungefähr 25 °C

sternst
24.05.2011, 17:51
Also hier ein dump von den Daten:
Wenn ich die durch meinen Code (also mit 0x8c) jage, kommt ein "korrekt" heraus.
Wie prüfst du denn überhaupt, ob "korrekt" oder "falsch"?

der aller dümmste Anfänge
24.05.2011, 18:44
Ich prüfe: wenn rückgabe wert =0 dann Korrekt wenn nicht dann flasch (ähm ich guck mal schnell ob ich das ! gesetzt habe) Nein habe ich nicht verdammt, es tut mir echt leid, das hätte/muss mir früher auffallen. Danke trotzdem jetzt blick ich auch das CRC, super danke!!

Also nochmal super danke, für deine Zeit!!!