CRC generator pro DS18B20 na x51

Marek Pavlu pavlu@HWserver.cz
Pondělí Únor 20 09:25:12 CET 2006


Zdravim, 

Ja si na to v BC3.0 před nekolika lety udelal jako tridu v C++, ale  prosim,
nepeskujte:), to jsem zacinal s C/C++ :). 
Staci volat funkci(metodu) CRC8_DS::TestCRC a dat ji pointer na pocatek dat,
za funkcnost s jinym Dallasem nerucim, chce to upravit...

TestCRC, ale minimalne je tam videt, jak se pracuje s tim polynomem StepCRC
a jak se mu posilaji data bit po bitu... 

V C se daji ty privatni promenne vyresit jako static promenne danych
funkci... 

Pokud to chcete v asm, tak něco na toto tema bylo v knize "Periferie
mikrokontroleru"  nebo tak nejak.... 


/*********************************************************************/ 
/*********   Gener tor CRC                     ***********************/ 
/*********   Algoritmus - DALLAS SemiCon       ***********************/ 
/*********************************************************************/ 

        #define true  1 
        #define false 0 

        //#include "dosys/gsbit.cpp" 
        //Poskytuje funkci 
        // GBit(data,bit) 
        // dataout = SBit(data, pozice, stav) 


        class CRC8_DS 
        { 
                private: 
                        unsigned char CRC,X4,X5,Poly,Aku; 
                        void StepCRC(unsigned char DataIn); 
                public: 
                         CRC8_DS(void); 
                        ~CRC8_DS(void); 
                        unsigned char TestCRC(const unsigned char* PtrChip);

        }; 

        CRC8_DS::CRC8_DS(void) 
        { 
        } 


        CRC8_DS::~CRC8_DS(void) 
        { 
        } 


        void CRC8_DS::StepCRC(unsigned char DataIn) 
        { 
                Aku= GBit(CRC,7); 
                Aku^=DataIn; 
                Poly=Aku; 

                Aku=GBit(CRC,4); 
                Aku^=Poly; 
                X5=Aku; 

                Aku=GBit(CRC,3); 
                Aku^=Poly; 
                X4=Aku; 

                unsigned char n=6; 

                while(1) 
                { 
                        CRC=SBit(CRC,n+1,GBit(CRC,n)); 
                        if(n==0) 
                                break; 
                        else 
                                n--; 
                } 

                CRC=SBit(CRC,5,X5); 
                CRC=SBit(CRC,4,X4); 
                CRC=SBit(CRC,0,Poly); 
        } 

        unsigned char CRC8_DS::TestCRC(const unsigned char* PtrChip) 
        { 
                CRC=0; 
                unsigned char m,n; 
                for(m=0;m<=6;m++) 
                        for(n=0;n<=7;n++) 
                                this->StepCRC(GBit(PtrChip[m],n)); 

                for(m=0;m<4;m++) 
                { 
                        n=GBit(CRC,7-m); 
                        CRC=SBit(CRC,7-m,GBit(CRC,m)); 
                        CRC=SBit(CRC,m,n); 
                } 


                if(CRC==PtrChip[7]) 
                        return true; 
                else 
                        return false; 
        } 




S pozdravem, 
                Marek Pavlu 

//  -----Original Message----- 
//  From: hw-list-bounces@list.hw.cz [mailto:hw-list-bounces@list.hw.cz] On 
//  Behalf Of Martin Zaruba 
//  Sent: Monday, February 20, 2006 7:37 AM 
//  To: HW-news 
//  Subject: CRC generator pro DS18B20 na x51 
//  
//  Nemate nekdo v programu CRC generator pro DS18B20 na x51? Priznavam, ze 
//  mi 
//  princip generovani CRC neni uplne jasny. 
//  
//  Martin Záruba 
//  
//  
//  _______________________________________________ 
//  HW-list mailing list  -  sponsored by www.HW.cz 
//  Hw-list@list.hw.cz 
//  http://list.hw.cz/mailman/listinfo/hw-list 



  _____  

avast! Antivirus <http://www.avast.com>  : Odchozi zprava cista. 


Virova databaze (VPS): 0607-2, 16.02.2006
Testovano: 20.2.2006 9:25:12
avast! - copyright (c) 2000-2003 ALWIL Software.






Další informace o konferenci Hw-list