hola.hace ya tiempo hize la anterior rutina pensando en la cantidad de memoria y no en la velocidad del pic.pero ahora que estoy con el 18F87k22
memoria me sobra.pero requiero mas velocidad.y aunque estoy trabajando a 64Mhz,quiero sacarle el maximo rendimiento al pic.
por eso pongo esta rutina pra el calculo del CRC con polinomio 0xA001 con tablas.
la trama a gestionar se pondria a partir de la direccion 0x600.los registros de proposito general en el banco 7.
el numero de bytes de la trama en N_BYTES.
el resultado sera hubicado en los registros CRCL y CRCH.
espero les sea de utilidad.
#define TABLA_CRCsH 0x5000 ;direccion apartir de donde se metera la tabla alta para el calculo del CRC y rutina de redondeo
#define TABLA_CRCsL 0x5200 ;direccion apartir de donde se metera la tabla alta para el calculo del CRC y rutina de redondeo
;************************************************************** CRC **************************************************
;Calculo del crc por el sistema de tabla.
CRC GENERAL_BANK ;banco de registros de trabajo 0x07 en este caso
setf TEMP_CRCH ;inicializa registros para la generacion del CRC
setf TEMP_CRCL ;inicializa registros para la generacion del CRC
decf N_BYTES,F ;resta uno al contador de rotaciones.
movlw 0X06 ;banco de recepcion de trama
movwf FSR1H ;selecciona el banco de la eeprom de programa.
clrf FSR1L ;inicializa direccionamiento indirecto
next_crc movff INDF1,CRCL ;lee el valor de la trama recibida y lo cargas en registro de CRC bajo
movff TEMP_CRCL,INDEX ;carga valor temporal de CRC alto en indice de tabla
movf CRCL,W ;carga en W el contenido del CRC bajo
xorwf INDEX,F ;hacer xor con CRCL y caga indice de tabla en INDEX
movff INDEX,TBLPTRL ;direcciona tabla
movlw HIGH TABLA_CRCsH;direccion alta de tabla
movwf TBLPTRH ;cargalo en registro
call CRC16 ;busca dato en la tabla alta
xorwf TEMP_CRCH,W ;operacion xor de W con el valor leido de la tabla
movwf TEMP_CRCL ;introduce el resultado en el registro temporal del CRC bajo
movff INDEX,TBLPTRL ;direcciona tabla
movlw HIGH TABLA_CRCsL;direccion baja de tabla
movwf TBLPTRH
call CRC16 ;busca dato en la tabla baja
movwf TEMP_CRCH ;inroduce dato seleccionado de la tabla en el registro temporal CRC alto
incf FSR1L,F ;incementa indice de ram
movf N_BYTES,W ;carga en w la cantidad de bytes que contiene la trama
cpfseq FSR1L
goto next_crc ;siguente byte a leer
movff TEMP_CRCH,CRCH ;actualiza registros
movff TEMP_CRCL,CRCL ;actualiza registros
return ;return
;<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< CRC16 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
CRC16 clrf WREG ;dato 0x00
xorwf TBLPTRL,w ;comprueba si el dato indexado es igual a 0x00
btfsc STATUS,Z ;si es asi,
goto TABLA_CRC16 ;salta a tabla para leer el primer valor "0"
bcf STATUS,C ;borra el carry
rlcf TBLPTRL,F ;multiplica por 2
bnc TABLA_CRC16 ;salta a tabla si el valor indexado esta en los primeros 256bytes.en caso contrario,
incf TBLPTRH ,f ;incrementa puntero alto de tabla
TABLA_CRC16 tblrd*+ ;incrementa puntero de tabla antes de su lectura
movf TABLAT,W ;carga el valor leido de la tabla en W
return
ORG TABLA_CRCsH ;0x5000
dt 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81
dt 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0
dt 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01
dt 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41
dt 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81
dt 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0
dt 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01
dt 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40
dt 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81
dt 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0
dt 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01
dt 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
dt 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81
dt 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0
dt 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01
dt 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41
dt 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81
dt 0x40
ORG TABLA_CRCsL ;0x5200
dt 0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4
dt 0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09
dt 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD
dt 0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3
dt 0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7
dt 0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A
dt 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE
dt 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26
dt 0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2
dt 0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F
dt 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB
dt 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5
dt 0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91
dt 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C
dt 0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88
dt 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C
dt 0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80
dt 0x40