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

CRC Berechnung von Temp.Sensor DS18B20 Kategorie: Programmierung C (von Ernst H. - 26.02.2011 22:01)
Ich nutze:
CC-Pro 128 Application Board, Pro-Bot128
// 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;
}


    Antwort schreiben


Antworten:

Re: CRC Berechnung von Temp.Sensor DS18B20 (von Joerg - 27.02.2011 7:44)
    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)