Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: CRC Berechnung von Temp.Sensor DS18B20 Kategorie: Programmierung C (von Joerg - 27.02.2011 7:44)
Als Antwort auf CRC Berechnung von Temp.Sensor DS18B20 von Ernst H. - 26.02.2011 22:01

> // Beispielprogramm um den DS18S20 Temperatur Sensor von Dallas Maxim zu lesen
> // mit Berechnung der  CRC Prüfsumme  -  bei Fehler extra Zeile
> char Text[40];
> int ret,Heiz,i,Secure;
> int temp, Heiztemp;
> byte rom_code[8];
> byte scratch_pad[9];      //'9ehemals
> byte Serienschutz[8];
> char Fehler;
> byte CRC_Wert;
> #define One_Wire_Port  35   //'e3,   hier das Port für den Sensor
>
>
>
>
> void main(void)
> {
>  do
>    {
>     ret = OneWire_Reset(One_Wire_Port);
>     if (ret == 0)
>         {
>         Text= "Kein Sensor gefunden";
>         Msg_WriteText(Text);
>         goto Ende;
>         }
>     // Ã?ndern der Konfiguration (Default 12 Bit) nun 9 Bit
>     // OneWire_Write(0xcc)   ' ROM überspringen Kommando
>     OneWire_Write(0x4e);   // Master issues Write Scratchpad command
>     OneWire_Write(0x7F);   // Master sends three data bytes to scratchpad ..TH
>     OneWire_Write(0xFF);   // sicherheitshalber niedrigste Temp in Tl  .....TL
>     // OneWire_Write(0b00011111) // für 9 Bit     und config Bitanzahl ..9-12
>     // OneWire_Write(0b00111111) // für 10 Bit
>     // OneWire_Write(0b01011111) // für 11 Bit
>     OneWire_Write(0b01111111); // für 12 Bit
>     ret = OneWire_Reset(One_Wire_Port); // #define One_Wire_Po
>     if (ret == 0)
>         {
>         Text= "Kein Sensor gefunden";
>         Msg_WriteText(Text);
>         goto Ende;
>         }
>     OneWire_Write(0xcc);   //' ROM überspringen Kommando
>     OneWire_Write(0x44);   //' starte Temperatur Messung Kommando
>
>     AbsDelay(1000);
>
>     OneWire_Reset(One_Wire_Port);   //   ' PortA.7
>     OneWire_Write(0xcc);   //' ROM überspringen Kommando
>     OneWire_Write(0xbe);   //' lese scratch_pad Kommando
>     for (i=0; i<9; i++)        //' komplettes scratchpad lesen
>         {
>         scratch_pad[i]= OneWire_Read();
>         Msg_WriteText(" " );
>         Msg_WriteWord(i );
>         Msg_WriteText(":=" );
>         Msg_WriteHex(scratch_pad[i]);
>         }
>         //'SCRATCHPAD (Power-up State)
>         //'byte 0 Temperature LSB (50h)
>         //'byte 1 Temperature MSB (05h) EEPROM
>         //'byte 2 TH Register or User Byte 1* TH Register or User Byte 1
>         //'byte 3 TL Register or User Byte 2* TL Register or User Byte 2
>         //'byte 4 Configuration Register* Configuration Register
>         //'byte 5 Reserved (FFh)
>         //'byte 6 Reserved (0Ch)
>         //'byte 7 Reserved (10h)
>         //'byte 8 CRC*
>     Msg_WriteText(" crc=" );
>     CRC_Wert=CRC_8();
>     Msg_WriteHex(CRC_Wert);     //Berechnete CRC ausgeben
>     Fehler = CRC_Wert - scratch_pad[8];
>     if (Fehler == 0) Msg_WriteText(" ok" );
>     else
>       {
>         Msg_WriteChar(13);
>         Msg_WriteText(" Fehler=" );
>         Msg_WriteInt(Fehler);
>       }
>     Msg_WriteChar(13);
>     Text = "Temperatur: ";
>     Msg_WriteText(Text);
>     temp = scratch_pad[1] * 256 + scratch_pad[0];
>     Msg_WriteFloat(temp /16.0);       //'hier das Komma wichtig .. für 12Bit
>                                      //'mit DS1822
>     Msg_WriteChar(99);
>     Msg_WriteText(" Dez=" );
>     Msg_WriteWord(scratch_pad[0] );
>     Msg_WriteChar(13);
>
>   }
>   while(1);
>
>     Ende:   // Label Ende
>
> }
>
>
>
> byte CRC_8(void)
> {
>     int Schleifen_count;
>     byte Pruf_Byte, CRC, Bit_Count, Wert_Bit;
>     CRC = 0;
>     for (Schleifen_count = 0; Schleifen_count < 8; Schleifen_count++)
>     {                      // die 8 Byte werden berechnet (0-7)
>         Bit_Count = 8;
>         Pruf_Byte = scratch_pad[Schleifen_count];
>         do
>         {                 // jedes Bit wird extra hinzuberechnet
>             Wert_Bit = (CRC ^ Pruf_Byte) & 0x01;
>             if ( Wert_Bit == 0x01 ) CRC = CRC ^ 0X18; // 0X18= X^8+X^5+X^4+X^0
>             CRC = 0x7F & (CRC >> 1);
>             if ( Wert_Bit == 0x01 ) CRC = CRC | 0x80;
>             Bit_Count--;
>             Pruf_Byte = Pruf_Byte >> 1;
>         } while (Bit_Count > 0);
>     }
>     return CRC;
> }


Hallo,

ich hatte auch erst diese Variante realisiert. Sie braucht nur sehr viel Rechenzeit.
Ich habe mich dann für die Tabellenversion entschieden.
Da ich die Tabelle mit 'flash'  abgelegt habe, benötigt sie auch kein Ram.

Grü�e Joerg


    Antwort schreiben


Antworten:

Re: CRC Berechnung von Temp.Sensor DS18B20 (von Ernst H. - 27.02.2011 16:31)
    Re: CRC Berechnung von Temp.Sensor DS18B20 (von Joerg - 27.02.2011 17:56)
        Re: CRC Berechnung von Temp.Sensor DS18B20 (von Ernst H. - 27.02.2011 19:10)