CRC Berechnung von Temp.Sensor DS18B20 Kategorie: Programmierung C (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; } | ||
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) |
Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum