- fchao-Sinus-Wechselrichter AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 18

Thema: CRC von Dallas 1 Wire?

  1. #1
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.06.2005
    Alter
    34
    Beiträge
    203

    CRC von Dallas 1 Wire?

    Anzeige

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

    der aller dümmste Anfänger

    bitte bei schwerwiegenden Rechtschreibfehlern oder Unleserlichkeiten eine PN schreiben
    Danke

    http://www.openmoko.org/

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Code:
    tmp=(tmp<<1)|((datastream[i/8]<<(i%8))&(1<<8));//TODO dies kontrollieren
    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?
    MfG
    Stefan

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.06.2005
    Alter
    34
    Beiträge
    203
    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/

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    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

  5. #5
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.06.2005
    Alter
    34
    Beiträge
    203
    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/

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.06.2005
    Alter
    34
    Beiträge
    203
    Also ich hab jetzt mal ausprobiert und versucht zu lesen: ziemlich alles klar bis auf:
    Code:
     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.
    MfG

    der aller dümmste Anfänger

    bitte bei schwerwiegenden Rechtschreibfehlern oder Unleserlichkeiten eine PN schreiben
    Danke

    http://www.openmoko.org/

  7. #7
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von der aller dümmste Anfänge Beitrag anzeigen
    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:
    Code:
    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.
    MfG
    Stefan

  8. #8
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.06.2005
    Alter
    34
    Beiträge
    203
    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/

  9. #9
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von der aller dümmste Anfänge Beitrag anzeigen
    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"?
    MfG
    Stefan

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    02.06.2005
    Alter
    34
    Beiträge
    203
    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/

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. DALLAS Sensor
    Von H.Brill im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 6
    Letzter Beitrag: 11.04.2010, 08:09
  2. 2-wire 3-wire protokoll. Hilfe!
    Von schlaflos im Forum Assembler-Programmierung
    Antworten: 3
    Letzter Beitrag: 18.01.2008, 14:53
  3. 1-Draht Bus von Dallas mit 3 Temp Sensoren DS1820 ???
    Von Claus Mehrholz im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 24.10.2005, 16:46
  4. Dallas ds2401
    Von d.zimmermann im Forum Elektronik
    Antworten: 4
    Letzter Beitrag: 10.04.2005, 20:13
  5. Dallas DS 18S20 Temperatur Sensor an C-Control?
    Von saschakp im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 4
    Letzter Beitrag: 20.08.2004, 14:47

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen