|
|||||||||||||
CRC_16 |
|||||||||||||
|
|||||||||||||
|
|||||||||||||
Routine per il calcolo del CRC (Cyclic Redundancy Check) con micro Microchip . Essa permette di calcolare il CRC a 16 bit per una parola dato di 8/16 bit. Il polinomio generatore può essere cambiato e si può scegliere tra quelli standard commentando/s-commentando alcune righe nel file sorgente. La routine utilizza l'indirizzamento indiretto ( mediante i registri FSR e INDF) che permette di ottimizzarla. Inoltre viene fornito una semplice routine per testare la routine del CRC (TEST_CRC.ASM) utilizzando il simulatore presente nel programma MPASM. CRC (Cyclic
Redundancy Check) La tecnica di rivelazione degli errori di trasmissione si avvale di due metodi :
Nell’ambito della ridondanza di
blocco, utilizzata prevalentemente nella trasmissione sincrona di
gruppi di caratteri, particolare importanza riveste la modalità di
rivelazione detta CRC (Cyclic Redundancy Check).
Consideriamo una parola di n bit che vogliamo
trasmettere ( bn-1,….bo). Fissiamo un polinomio generatore g(x) con grado
g £ n-1. Alla stringa (
bn-1,….bo) cui corrisponde il Polinomio b(x), sarà
aggiunto un blocco di g bits che sono i coefficienti del polinomio
resto derivante dalla divisione del polinomio g(x) scelto b(x)
ovvero r(x). Il primo passo consiste nell’aggiungere g bit zero in coda al
blocco da trasmettere. In termini di polinomio vuol dire moltiplicare b(x)
per x^g p(x)= x^g * b(x) quindi p(x) può essere scritto in funzione di g(x) dove q(x) e r(x) sono il quoziente e il resto della divisione tra p(x) e g(x).
p(x)=q(x)*g(x)+r(x) La stringa che trasmetteremo è l’unione tra il blocco (
bn-1,….bo) e il blocco di g bit ( rg-1, r0). Il che equivale a
sostituire in p(x) i g bit a zero introdotti all’inizio. In
termini di matematica binaria corrisponde alla funzione xor
quindi si trasmetterà la stringa corrispondente al polinomio:
m(x) = p(x)+r(x) = q(x)*g(x)+r(x) +r(x) =
q(x)*g(x) essendo r(x) +r(x) = 0 ovvero in aritmetica binaria la somma ( xor )di due quantità uguali è zero. Quindi la stringa trasmessa m(x) è perfettamente divisibile per g(x). Questo significa che il ricevente, dividendo m(x) per g( x) che conosce, dovrà avere un resto nullo se non ci sono errori. I successo di questo tipo di codice è legato alla sua efficienza ma anche alla semplicità con cui è possibile implementarlo a livello hardware. Infatti bastano solo porte logiche EX-OR (exclusive OR) e registri a scorrimento (shift register ) |
|
||||||||||||
|
|||||||||||||
|
|||||||||||||
|