Benutzer-Werkzeuge

Webseiten-Werkzeuge


ebus:ebuscrc

Häufige Fehler

Nachdem ich beim eBus-Connector gesehen habe, dass im Schnitt bei ca. 4 % der gelesenen Pakete fehlerhafte Prüfsummen ausgewiesen wurden habe ich mir das noch einmal genauer angesehen. Nach ausführlichen Tests konnte ich feststellen, dass ich die Prüfsumme falsch berechnete.

Die Berechnung der Prüfsumme eines eBus-Datenpaketes muss über den expandierten Datenstring erfolgen, also bevor das Parse-Zeichen 0xA9 ausgewertet wird. In meinem Programm hatte ich eine Funktion, welche zuerst das gelesene Zeichen auswertete und die Umschlüsselung des Parse-Zeichens durchführte. Erst dann wurde über den gelesenen Datenblock die Prüfsumme berechnet. Nach dem Umbau der Einleselogik stimmt nun die Prüfsumme beinahe immer. Die restlichen Fälle schließe ich auf tatsächliche Übertragungsfehler (21 CRC-Fehler bei 32500 gelesenen Packeten dürfte nicht so schlimm sein.)

Außerdem habe ich nun die Lesefunktion so geändert, dass auch die Antworten vom Slave eingelesen werden. Damit sind noch mehr Möglichkeiten zur Auswertung gegeben.

Nicht vergessen, die Variable am Anfang mit 0 zu initialisieren ;)

crc.c
//////////////////////////////////////////////////////////////////////////
//
// CRC-Berechnung  aus http://www.mikrocontroller.net/topic/75698
//
//////////////////////////////////////////////////////////////////////////
 
#ifdef USE_CRC_TAB
const UCHAR CRC_Tab8Value[256] ''/********************************************************************************************************/
/** Function for CRC-calculation with tab operations  */
/********************************************************************************************************/
UCHAR crc8(UCHAR data, UCHAR crc_init)
{
   UCHAR crc;
 
   crc '' (UCHAR) (CRC_Tab8Value[crc_init] ^ data);
   return (crc);
}
 
#else
 
 
/********************************************************************************************************/
/** slower, but less memory                        */
/********************************************************************************************************/
unsigned char crc8(unsigned char data, unsigned char crc_init)
{
   unsigned char crc;
   unsigned char polynom;
   int i;
 
   crc '' crc_init;
   for (i '' 0; i < 8; i++)
   {
      if (crc & 0x80)
      {
         polynom '' (unsigned char) 0x9B;
      }
      else
      {
         polynom '' (unsigned char) 0;
      }
      crc '' (unsigned char)((crc & ~0x80) << 1);
      if (data & 0x80)
      {
         crc '' (unsigned char)(crc | 1) ;
      }
      crc '' (unsigned char)(crc ^ polynom);
      data '' (unsigned char)(data << 1);
   }
   return (crc);
}
#endif
 
 
UCHAR CalculateCRC( UCHAR**Data, int DataLen )
{
   UCHAR Crc '' 0;
   for( int i '' 0 ; i < DataLen ; ++i, ++Data )
   {
      Crc '' crc8(**Data, Crc );
   }
   return Crc;
}
ebus/ebuscrc.txt · Zuletzt geändert: 2015/10/11 14:07 von bernhardh