Hi Henrik.

How did you declare MB_i variable? Byte or Word?

Also instead of this:

Code:
MB_CRC = 65535
MB_k = MB_Buffer_Ptr - 3                   ' Find out where in the array to stop.
FOR MB_i = 0 to MB_k                       ' Iterate thru the frame, stop before the last two bytes which are the actual CRC.
    MB_CRC = MB_CRC ^ MB_Buffer[MB_i]      ' Bitwise EXOR the current low byte of the CRC "value" with the byte in the buffer
 
    For MB_j = 0 to 7                      ' Cycle thru the low byte of the CRC value                      
        If MB_CRC.Bit0 THEN                ' If the LSB is set
            MB_CRC = MB_CRC >> 1           ' We shift CRC on bit to the right....
            MB_CRC = $A001 ^ MB_CRC        ' and EXOR it with out polynomial for MODBUS CRC-16 ($A001)
        ELSE
            MB_CRC = MB_CRC >> 1           ' If the LSB is not set we simply shift CRC one bit to the right.
        ENDIF
    Next                                   ' Next bit in the byte
NEXT                                       ' Next byte in the frame
RETURN
try this one:

Code:
MB_CRC = 65535
MB_k = MB_Buffer_Ptr - 3                   ' Find out where in the array to stop.
FOR MB_i = 0 to MB_k                       ' Iterate thru the frame, stop before the last two bytes which are the actual CRC.
    MB_CRC = MB_CRC ^ MB_Buffer[MB_i]      ' Bitwise EXOR the current low byte of the CRC "value" with the byte in the buffer
 
    For MB_j = 0 to 7                      ' Cycle thru the low byte of the CRC value                      
        MB_CRC = MB_CRC >> 1
        If MB_CRC.Bit0 THEN  MB_CRC = $A001 ^ MB_CRC               ' If the LSB is set
                               ' and EXOR it with out polynomial for MODBUS CRC-16 ($A001)
    Next                                   ' Next bit in the byte
NEXT                                       ' Next byte in the frame
RETURN
Ioannis