Прилагането на протокола за контролна Modbus - форум на микрочип

Re: Изпълнение на изчисляването на размера на контрол на протокола Modbus

Има описание на генерирането на КРС

При прехвърляне на 16-битов CRC контролна в съобщението, ниското байт се предава на първо място, а след това по-възрастен. Например, ако КРС е 1241 шестнадесетичен.

Re: Изпълнение на изчисляването на размера на контрол на протокола Modbus

; 1.Zagruzka 16-битов CRC регистър номер FFFF.
movlw 0xFF; W <- 0xFF (DEC 255)
movwf CRC16_H; CRC16_H <- W
movwf CRC16_L; CRC16_L <- W

VXOD
; 1.1.Predustanovka брояч цикъл за превъртане 1 байт
movlw 0x08; W <- 0x08 (DEC 8)
movwf Cycle_I; Cycle_I <- W(0x08)

; 2.XOR байт със съдържанието на КРС. Резултати в КРС.
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 регистрирате надясно (най-маловажния бит) от 1 бит,
; Старши запълване 0.
BCF СТАТУС, C; почистване флаг с "0"
RRF CRC16_H, F; CRC16_H <- (C>> CRC16_H >> 1 бит >> С)
RRF CRC16_L, F; CRC16_L <- (C>> CRC16_L >> 1 бит >> С)

; 4.Proverka условия: ако мл. "0" малко, след това преминете към стъпка №5;
; ако мл. малко "1", XOR A001 КРС.
btfss CRC16_L, 0; ако мл. битов = "0", а след това PC + 1 или 2 + Pc
Иди CRC_PER5; PC + 1: преход към етикет 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 и №4 повтарят 8 пъти.
decfsz Cycle_I, F; Cycle_I <- Cycle_I - 1. Если "0", то PC+2
Иди CRC_SDVIG; PC + 1: преход към етикет CRC_SDVIG
; PC + 2: по-нататъшното изпълнение на програмата

; 6.Shagi №2, №3, №4, №5 повтаря за всеки байт на съобщението.
Иди VXOD; Направо към етикет VXOD

Благодаря на всички, които са отговорили.
За С, и други подобни. Имам нужда от него кода за сглобяване. Той не е много големи завои (представени) - сложността на това, аз не виждам. Тя е написана от мен на базата на стандартен изчисление CRC алгоритъм в полином A001 - взет от спецификацията Modbus.
Въпросът е, че независимо дали изчисляването на КРС да вземе байт CRC на полученото съобщение.
Между другото калкулатори, които сте посочили не е ясно какво издаденото резултат - не съответства на контролна сума, изчислена на контролер с вграден modbas.
Бих високо ценим, ако някой pomoget нагодя ASM файл за грешки.

така може да е бъг в ASM?
Все пак, аз съм виждал, че полиномите са изложени от дясно на ляво, а другият от ляво на дясно.
По отношение на КРС - преброяване алгоритъм при предаване и приемане на едно и също, нали? Докато КРС за определяне на предаването се включат същите CRC изчисляването по същия КРС?

Re: Изпълнение на изчисляването на размера на контрол на протокола Modbus

Алгоритъмът, че намерих в руския беше грешка
четене за търсене доведе всичко стана ясно и разбираемо
4. (Ако LSB е 0): Повторете стъпка 3 (друг смяна).
(Ако LSB беше 1): Изключителен ИЛИ КРС се регистрират в полином стойност 0xA001 (1010 0000 0000 0001).

Позиция 4 правилно прехвърлени.
4. (Ако LSB е 0): повтаря Стъпка 3 (смяна)
(Ако най-ниската бит е 1): прави регистър операция XOR и CRC полином номер A001 шестнадесетичен.

Време е следователно е в прехвърляне регистър С

Да, разбира се, че е необходимо да се провери btfss СТАТУС, C

Всичко работеше! Ура!

Програма за изчисляване на CRC16 1 байт (Modbus, полином - A001) на ASM отнема 20 инструкция. Може да се използва като подпрограма.