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 Ernst H. - 27.02.2011 16:31)
Als Antwort auf Re: CRC Berechnung von Temp.Sensor DS18B20 von Joerg - 27.02.2011 7:44
Ich nutze:
C-Control Pro Mega128, 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;
> > }

>
> 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
Hallo Joerg!
Die Rechenzeit stört mich auch, habe 13ms gemessen das ist enorm.

Ich habe auch Tests wegen Leitungslänge gemacht - mit einen erstaunlichen Ergebnis:
bei ca 10m 4pol Kabel (für RJ12 Telefonstecker) kein crc Felher entdeckt.
bei ca 90m (ganze Spule dazwischengeschalten) nur jedes ca 20x ein Fehler.
Systembedingt habe ich die 5V direkt am Sensor mit 100 Ohm belastet, nach den 90m ist
dann die Versorgungsspannung nur mehr 3,8V  trotzdem nur geringe Probleme!.
Zu bemerken ist aber das das Kabel aufgespult und nicht verlegt ist. Angeschlossen ist der
Sensor nicht parisitär, also mit 5V Versorgung - aber ohne Pull Up Widerstände.
Am Oszi verbessert sich das Impulsverhalten mit 2x   2k2 Pull Up bringt aber nicht viel.
(die Pull up Wid. gerhören meiner Ansicht auf beiden Seiten - da einmal der Prozessor auf
Low zieht, dann der Sensor)
Bei ca 40m Cat 5 verlegten Netzwerkkabel sind die Fehler dann schon häufiger.


Ich wäre sehr dankbar wenn Du die Tabellenversion hier Posten würdest - diese 13ms Rechenzeit
passt mir nämlich nicht ins Konzept.

Vielen Dank!
Ernst H.



    Antwort schreiben


Antworten:

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)