TODOPIC
Microcontroladores PIC => Lenguaje Basic para microcontroladores PIC => Mensaje iniciado por: hexmotion en 30 de Diciembre de 2005, 16:18:00
-
Hol mis panas;
necesito ayuda con un codigo, se trata de convertir una rutina de C a pbp, la rutina calcula el CRC de un string la de C si funciona, pero mi conversion aun no
esta es la de C
codigo c
#define uint16_T unsigned int
uint16_t crc16(uint16_t crc,uint8_t *ptr, int lenght)
{
auto uint16_t i;
while (lenght--)
{
crc = crc^(uint16_t)*ptr++;
for(i=0;i<8;i++)
{
if(crc & 0x0001)
crc=(crc>>1)^0x8408;
else
crc>>=1;
}
}
return crc;
}
y este es pbp
for k=0 to lenght
crc = crc ^ ptr_data[k] << 8
FOR j = 0 TO 7
IF (crc & $0001) THEN
crc = (crc >> 1) ^ $8408
ELSE
crc = (crc >> 1)
ENDIF
NEXT j
next k
RETURN
Como podran ver segun yo son iguales, pero me dan resultados diferentes....
por ejemplo para el string hola la de C me da $2806 y pbp $6e6e
-
No se si esto es lo que buscas:
" ------------CRC_CCITT-------------------------------------
TEMP VAR BYTE " TEMP BYTE
J VAR BYTE " FOR NEXT LOOP
CRC VAR WORD " CRC WORD
DAT1 VAR BYTE " BYTES TO CHECK CRC ON
DAT2 VAR BYTE
DAT3 VAR BYTE
DAT4 VAR BYTE
DAT5 VAR BYTE " CRC HIGH BYTE FOR PACKET
DAT6 VAR BYTE " CRC LOW BYTE FOR PACKET
CRCPOLY CON $1021 " CRC-CCITT POLYNOMINAL
"-------------------------------------------------------------
START:
SERIN2 PORTB.0,16468,[DAT1,DAT2,DAT3,DAT4,DAT5,DAT6] "RCV DATA PACKET
GOSUB CHECK_CRC " CHECK CRC ON RCV PACKET
IF CRC <> 0 Then START " IF CRC BAD THEN START
"YOUR PROGRAM HERE
" SUBROUTINE FOR CHECKING CRC IN RCV BYTES
CHECK_CRC:
CRC = 0
TEMP = DAT1
GOSUB CALC_CRC
TEMP = DAT2
GOSUB CALC_CRC
TEMP = DAT3
GOSUB CALC_CRC
TEMP = DAT4
GOSUB CALC_CRC
TEMP = DAT5
GOSUB CALC_CRC
TEMP = DAT6
GOSUB CALC_CRC
RETURN
" SUBROUTINE FOR CALCULATION CRC IN VAR TEMP
CALC_CRC:
CRC = TEMP * 256 ^ CRC
FOR J = 0 to 7
IF CRC.15 = 0 THEN SHIFT
CRC = CRC * 2 ^ CRCPOLY
GOTO NXT
SHIFT: CRC = CRC * 2
NXT: NEXT
RETURN
END
Saludos,
Ricky