/*--------------------------------------------*/
/*----------------header files----------------*/
/*--------------------------------------------*/
#include <REG51xD2.H>
#include "CRC16.h"

unsigned int CRC16 (unsigned char *puchMsg, unsigned int DataLen ) // predavane parametry - zprava, delka zpravy   	
{ 								  	
	unsigned int CRC = 0xFFFF;			// pocatecni hodnota CRC				
	unsigned char count_crc16 = 0;		// citac pro pocet znaku
	unsigned char N;					// pocet bitu
	unsigned int CRC16_POLY = 0xA001; 	// CRC polynom definovany protokolem modbus
 
	while(DataLen--){		  			// cyklus pres celou délku zprávy
  		CRC ^= *puchMsg++;				// CRC = CRC XOR aktualni znak
		N = 0;							// vynulování pocet bitu					
		for (N = 0; N < 8; N++){		// cykluje az do delky bytu (osmi bitu)
			CRC >>= 1;					// bitovy posun CRC o 1 doprava
			if (CY == 1)	 			// pokud je posunuty bit log. 1 nastavi se CY do log. 1 (podteceni)
		  		CRC ^= CRC16_POLY;		// kdyz je podminka splnena CRC = CRC XOR CRC polynom
		}
	}
	return (CRC) ; 						// funkce vraci hodnotu vypocitaneho CRC
}