Punerea în aplicare a protocolului de control modbus - un forum de micro-cip

Re: Punerea în aplicare a calculului valorii de control al protocolului Modbus

Există o descriere a generației de CRC

La transferul de 16 biți de control CRC în mesaj, octetul scăzut este transmis mai întâi, apoi mai în vârstă. De exemplu, în cazul în care CRC este 1241 hex.

Re: Punerea în aplicare a calculului valorii de control al protocolului Modbus

; 1.Zagruzka 16-biți registru CRC numărul FFFF.
MOVLW 0xFF; W <- 0xFF (DEC 255)
movwf CRC16_H; CRC16_H <- W
movwf CRC16_L; CRC16_L <- W

VXOD
; 1.1.Predustanovka Contor de cicluri pentru octetul de derulare 1
MOVLW 0x08; W <- 0x08 (DEC 8)
movwf Cycle_I; Cycle_I <- W(0x08)

; octet 2.XOR cu conținutul CRC. Rezultate în CRC.
MOVLW 0x00; W <- 0x00 (DEC 0)
xorwf CRC16_H, F; CRC16_H <- W(0x00) xor CRC16_H
MOVF Byte_X, W; W <- Byte_X
xorwf CRC16_L, F; CRC16_L <- W(Byte_X) xor CRC16_L

CRC_SDVIG
; 3.Sdvig CRC înregistrare dreapta (mai puțin semnificativ bit) de 1 bit,
; Senior umplere 0.
STATUS BCF, C; curățare pavilion cu „0“
RRF CRC16_H, F; CRC16_H <- (C>> CRC16_H >> 1 bit >> C)
RRF CRC16_L, F; CRC16_L <- (C>> CRC16_L >> 1 bit >> C)

; Condițiile 4.Proverka: dacă ml. „0“ biți, apoi du-te la pasul №5;
; dacă ml. bit "1", The A001 XOR CRC.
BTFSS CRC16_L, 0; dacă ml. bit = "0", atunci PC + 1 sau 2 + Pc
Goto CRC_PER5; PC + 1: salt la eticheta CRC_PER5
movlw 0xA0; PC + 2: W = 0xA0 (DEC 160)
xorwf CRC16_H, F; CRC16_H <- W(0xA0) xor CRC16_H
MOVLW 0x01; W = 0x01 (DEC 1)
xorwf CRC16_L, F; CRC16_L <- W(0x01) xor CRC16_L

CRC_PER5
; 5.Shagi №3 și №4 repetate de 8 ori.
decfsz Cycle_I, F; Cycle_I <- Cycle_I - 1. Если "0", то PC+2
Goto CRC_SDVIG; PC + 1: salt la eticheta CRC_SDVIG
; PC + 2: executarea ulterioară a programului

; 6.Shagi №2, №3, №4, №5 repetate pentru fiecare octet al mesajului.
Goto VXOD; Salt la eticheta VXOD

Multumesc tuturor celor care au răspuns.
Despre C și altele asemenea. Am nevoie de ea codul de asamblare. El nu este transformă foarte mari (prezentate) - complexitatea ei, eu nu văd. A fost scris de mine pe baza unui calcul CRC algoritm c A001 polinomial standard - preluate din caietul de sarcini Modbus.
Problema este că, dacă este sau nu calculul CRC ia octet CRC a mesajului primit.
De altfel calculatoare pe care le specificați este, de asemenea, neclar ce rezultatul emis - nu se potrivește cu suma de control calculată pe un controler cu un built-modbas.
Aș aprecia foarte mult dacă cineva pomoget ajusta fișierul meu asm pentru erori.

astfel încât poate un bug în asm?
Cu toate acestea, am văzut că polinoame sunt dispuse de la dreapta la stânga, iar celălalt de la stânga la dreapta.
În ceea ce privește CRC - numărare algoritm atunci când transmiterea și primirea la fel, nu? In timp ce CRC pentru a determina transmisia includ același calcul CRC în același CRC?

Re: Punerea în aplicare a calculului valorii de control al protocolului Modbus

Algoritmul pe care am găsit în limba rusă a fost o greșeală
lectură pentru a căuta ca rezultat totul a devenit clar și ușor de înțeles
4. (În cazul în care LSB a fost 0): Repetați Pasul 3 (o altă schimbare).
(În cazul în care LSB a fost 1): Exclusiv SAU CRC registrul cu valoarea polinomului 0xA001 (1010 0000 0000 0001).

Postul 4 transferat în mod corect.
4. (În cazul în care LSB a fost 0): Repetă Etapa 3 (deplasare)
(În cazul în care cel mai mic bit este 1): face ca registrul de operare XOR și CRC numărul polinomului A001 hex.

O dată a fost, prin urmare, este în registrul de transfer C.

Da, într-adevăr, este necesar să se verifice STATUS BTFSS, C

Totul a lucrat! Ura!

Un program de calcul CRC16 1 octet (Modbus, polinomul - A001) pe asm ia 20 de instrucțiuni. Acesta poate fi folosit ca o subrutină.