Picproje Elektronik Sitesi

DERLEYİCİLER => Diğer Derleyiciler => Konuyu başlatan: uardal - 25 Temmuz 2017, 15:11:59

Başlık: arduino crc
Gönderen: uardal - 25 Temmuz 2017, 15:11:59
Merhaba

Aşağıda pic için protonda kullandığım bir crc kodu var ve bunu arduino için çevirmeye çalıştım fakat doğru değerleri alamadım. Konuyla ilgili arkadaşlar yardımcı olabilirlerse çok sevinirim.
proton kod 'u

crc__16:
crc = $FFFF  'seed value as per modbus
i = 0
j = 0
Repeat
    crc = crc ^ buffer[i] 
    Repeat
    If crc.0 = 1 Then
      crc = $A001^ (crc >> 1) 'xor to polynomial 0xA001 as per modbus rtu protocol
          Else
            crc = crc >> 1
        EndIf
     Inc j
    Until j > 7
  Inc i
Until i > length
       

crc16[0] = crc Mod 256  'CRC16 low byte
crc16[1] = crc / 256  'CRC16 high byte
Return



Arduino kod'u

void crc__16(){
crc = 0xFFFF ; //seed value as per modbus
z = 0;
j = 0;
do
{
    crc = crc ^ bufferc[z] ;
   do
   {
  bool k=0;
  k=bitRead(crc,0);
    if (k == 1){
        crc = 0xA001  ^ (crc >> 1); //xor to polynomial 0xA001 as per modbus rtu protocol
    }
          else
          {
            crc = crc >> 1;
   
    }
     j++;
   }while (j > 7);
  z++;
}while (z >lenght);
                     

crc16[0] = crc % 256;  //CRC16 low byte
crc16[1] = crc / 256 ; //CRC16 high byte
}
Başlık: Ynt: arduino crc
Gönderen: Cemre. - 25 Temmuz 2017, 15:18:10
while (z >lenght);
Başlık: Ynt: arduino crc
Gönderen: uardal - 25 Temmuz 2017, 15:21:27
Anlayamadım Cemre bey fark nerede acaba?
Başlık: Ynt: arduino crc
Gönderen: Cemre. - 25 Temmuz 2017, 21:16:30
Hocam kusura bakmayın, mesaj yarım gitmiş, internet kötüydü.

while (z<lenght); doğrusu küçüktür olmalı sanıyorum. Başka hata varsa da ben fark edemedim.


CRC_Status_Typedef MODBUS_CRC_Calculate(uint8_t *pData, uint8_t Length, uint8_t *pCRC)
{
uint8_t i;
uint16_t Calc_CRC = 0xFFFF;

if (Length < 1)
{
return CRC_Error;
}

while (Length--)
{
Calc_CRC ^= (uint16_t) (*pData++);
for (i = 0; i < 8; i++)
{
if (Calc_CRC & 0x01)
{
Calc_CRC = (Calc_CRC >> 1) ^ (0xA001);
}
else
{
Calc_CRC = (Calc_CRC >> 1);
}
}
}

*pCRC = (uint8_t) (Calc_CRC & 0x00FF);
pCRC++;
*pCRC = (uint8_t) ((Calc_CRC & 0xFF00) >> 8);
return CRC_OK;
}


Benim kullandığım ve çalışan kod.
Başlık: Ynt: arduino crc
Gönderen: uardal - 25 Temmuz 2017, 21:26:59
Ustteki proton kodunda > kullanilmis ve calisiyor bende ondan cevirdim. Pic ve ardino haberlesecegi icin ayni sonucu almam gerekiyor. Yarin sizin kodlarida inceleyip bir bakayim. Tesekkur ederim.
Başlık: Ynt: arduino crc
Gönderen: ByTEK - 26 Temmuz 2017, 01:03:06
Defalarca karsilastirdim ama fark göremedim. Sadece değişken isimleri farkli. Çözerseniz nedenini merak ettim. Elde ettiğiniz değerler nasıldır ?



Başlık: Ynt: arduino crc
Gönderen: uardal - 26 Temmuz 2017, 12:43:06
Sercan bey girdi değerlerini değiştirmeme rağmen hep benzer rakamlar alıyorum.  Cemre beyin kod unu deneyeceğim ama arduinoda çokta iyi sayılmam, en baştaki satırı nasıl tanımlicam anlayamadım. derlerken hata veriyor.

CRC_Status_Typedef MODBUS_CRC_Calculate(uint8_t *pData, uint8_t Length, uint8_t *pCRC)

hata mesajı:

exit status 1
'CRC_Status_Typedef' does not name a type

Başlık: Ynt: arduino crc
Gönderen: Cemre. - 26 Temmuz 2017, 12:47:47
Alıntı yapılan: uardal - 26 Temmuz 2017, 12:43:06
Sercan bey girdi değerlerini değiştirmeme rağmen hep benzer rakamlar alıyorum.  Cemre beyin kod unu deneyeceğim ama arduinoda çokta iyi sayılmam, en baştaki satırı nasıl tanımlicam anlayamadım. derlerken hata veriyor.

CRC_Status_Typedef MODBUS_CRC_Calculate(uint8_t *pData, uint8_t Length, uint8_t *pCRC)

hata mesajı:

exit status 1
'CRC_Status_Typedef' does not name a type

> işareti UNTIL ile kullanılmış. Siz do while döngüsüne > yazarsanız döngüye sadece bir kez girer ve biter.