|
|||
CRC_16 |
|||
|
|||
Come funzione la routine? Questa routine implementa la divisione modulo due per un
polinomio di n bit e CRC a 16bit. 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 |
|
||
|
|||
|
|||
|