hola MGLSOFT !!!
Te cuento que hice un programilla en C y assembler, .... el resultado no es muy satisfactorio, ya que para valores de datos "1,2,3,4,5,6,7,8,9"
me devuelve crc_H = 0xB1 y crc_L = 64 en vez de 0xB1 y 0x29 respectivamente...
Aqui te cuelgo el código por si ves algo raro, lo unico que queria señalar es que yo roto el registro crc a la izquierda y no a la derecha y compruebo el bit mas significativo, o sea bit 7 del crc_H ! ya que en los datos, el bit mas significativo se encuentra a la izquierda, te pido por favor si este razonamiento es el correcto o estoy cometiendo un error.
Muchisimas gracias a vos y a cualquiera que quiera ayudar en esta consulta ! saludossss !!!
#include "D:\Medidor_Agua\CRC_Prueba\CRC16.h"
#BYTE STATUS = 0X03
byte DATA[]={'1','2','3','4','5','6','7','8','9'};
byte i,j;
byte crc_H,crc_L;
byte cnt = 9;
void Ini_Port(void)
{
set_tris_a(0);
set_tris_b(0x0);
output_a(0);
output_b(0);
}
void Ini_Var(void)
{
}
void main()
{
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
setup_timer_1(T1_DISABLED);
setup_timer_2(T2_DISABLED,0,1);
setup_comparator(NC_NC_NC_NC);
setup_vref(FALSE);
//Setup_Oscillator parameter not selected from Intr Oscillotar Config tab
// TODO: USER CODE!!
Ini_Port();
crc_L = 0xff;
crc_H = 0xff;
for (i = 0; i < cnt; i++) // cnt = number of protocol bytes without CRC
{
crc_L ^= DATA;
for (j = 0; j < 8; j++)
{
if ((crc_H & 0x80) == 0x80)
{
#asm
bcf STATUS,0 //borro carry
rlf crc_L,F
rlf crc_H,F
movlw 0x10
xorwf crc_H,F
movlw 0x21
xorwf crc_L,F
#endasm
}
else{
#asm
bcf STATUS,0 //borro carry
rlf crc_L,F
rlf crc_H,F
#endasm
}
}
}
}