CRC_16



Come funzione la routine? 

Questa routine implementa la divisione modulo due per un polinomio di n bit e CRC a 16bit. 
Tutte le quantità a 16 bit  possono essere viste come l’insieme di due byte di cui uno rappresenta la parte MSB (_H) e uno la parte LSB (_L):  

BYTE = (BYTE_H, BYTE_L); variabile d’ingresso della routine

CRC = ( CRC_H , CRC_L); variabile d’uscita della routine

POL = (POL_H,POL_L); definizione polinomio 

L’algoritmo si sviluppa nel seguente modo. 

1)      Si settano al valore INISET tutti i bit del CRC (CRC_H,CRC_L)

2)      S’inizia il loop di NBIT

3)      Si spostano a sinistra tutti i bit del CRC caricando su HEAD_CRC il bit MSB di CRC

La routine usata è SHIFT che agisce su CRC_H,CRC_L indirizzati mediante FSR

4)      Si spostano a sinistra tutti i bit del dato caricando su HEAD_BYTE il bit MSB di BYTE

La routine usata è SHIFT che agisce su BYTE_H, e BYTE_L indirizzati mediante FSR

5)      Si esegue  HEAD_CRC  xor  HEAD_BYTE

Se il risultato è pari a 1 allora si genera il nuovo CRC facendo la xor di CRC con POL

e si ritorna al  punto 3

Se il risultato è pari a zero si ritorna al punto 3   

Per la semplificazione della routine e per ottimizzare il numero di linee di programma si è scelto di usare l’indirizzamento indiretto mediante il registro FSR . Ovvero la singola variabile può essere modificata/letta mettendo sul registro FSR l’indirizzo che essa occupa nella RAM e agendo su INDF che rappresenta proprio la variabile indirizzata. In tal modo è stato possibile usare la routine SHIFT per la variabile BYTE e CRC agendo solo sugli indirizzi di RAM che sono definiti nella sezione “DEFINIZIONE VARIABILI”.  Importante è mantenere la sequenza nella definizione delle variabili ovvero: CRC_H, CRC_L, BYTE_H, BYTE_L. Ciò vuol affermare che è possibile cambiare l’indirizzo fissato per CRC_H ma le altre variabili devono seguirlo nella definizione come nella sequenza. Questo perché all’interno della routine fissato l’indirizzo di CRC_H si accede a CRC_L, BYTE_H e BYTE_L sommando a FSR rispettivamente 1, 2 e 3.

Quindi 

FSR=0x20      INDF=CRC_H

FSR+1             INDF=CRC_L

FSR+2             INDF=BYTE_H

FSR+3             INDF=BYTE_L