ı2c crc hesap

Başlatan mustafa_cmbz, 12 Ekim 2020, 01:16:17

mustafa_cmbz

Merhabalar..

i2c ile aldığım crc yi hesaplamak istiyorum.Daha önce @OG hocam uyarmıştı bende elimdeki diğer crc sample kodları ile yapacağımı söylemiştim fakat şuan uğraştığım nem sensörü için pek uygulanabilir durmuyor yada ben mantığını tam oturtamadım.

Hem mantığı tam kavramak hemde olayı çözmek istiyorum.

unsigned short crc16(unsigned char *ptr, unsigned char len)
{
 unsigned short crc=0xFFFF;
unsigned char i;
 while(len--)
 {
 crc ^=*ptr++;
 for(i=0;i<8;i++)
 {
 if(crc & 0x01)
{
 crc>>=1;
crc^=0xA001;
 }else
{
 crc>>=1;
 }
 }
 }
return crc;
}

kullandığım sensörün datasheetinde c dili için crc örneği var fakat sanırım bunu protona çeviremedim.

 
CRC_HESAP:
    
    crc=$FFFF        
    crc=crc^CRC_GELEN
    For BIT_SAYAC=0 To 8
    If crc.Bit0 = 1 Then               
    crc=$A001^(crc>>1)
    Else
    crc=crc>>1
    EndIf
    Next BIT_SAYAC
    'Next bytecount
   
    Return

forumda bi protoncu ben kaldım sanırım :P

ete

Proton kullanmıyorum ama klavuza bakınca aşağıdaki gibi yapılacağını gördüm.
CRC_HESAP:      
    crc=$FFFF        
    crc=crc ^ CRC_GELEN
    For BIT_SAYAC=0 To 7
      IF (GETBIT CRC,BIT_SAYAC)=1 THEN             
    crc=$A001^(crc>>1)
    Else
    crc=crc>>1
    EndIf
    Next BIT_SAYAC
CRC_GELEN şayet byte cinsinden bir değişken ise neden 16 bitlik bir sayı ile XOR yapılıyor orasını anlamadım.
$A001 nerden çıktı onuda anlamadım ama anladığım şu,
CRC ye önce $FFFF değeri veriliyor. Ardından CRC_GELEN ile XOR yapılarak  8 bitlik kısmına CRC_GELEN yerleştiriliyor. Sonra CRC nin her bir biti tek tek kontrol edilerek;
BIT=1 ise crc=$A001^(crc>>1) ,işemi
BIT=0 ise CRC=CRC>>1 işlemi yapılıyor.
Dediğim gibi BIT=1 ise ne yapılıyor $A001 den dolayı pek anlamadım. Ama BIT=0 ise CRC değeri 2 ye bölünüyor
Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

JOKERAS

C örneğindeki Fonksiyon argümanının biri döngü sayısını belirleyen len.
Senin Proton Kodunda len kadar döngü varmı?