Новичок
Регистрация: 01.09.2013
Сообщений: 16
Репутация: 11
|
Здравстуйте товарищи!
Необходимо сделать вычисление контрольной суммы CRC-8 на МК PIC на языке Ассемблер У меня есть описание алгоритма Формула полинома: x^8+x^5+x^4+1 Пример вычисления для MCS-51: Код:
DO_CRC: PUSH ACC ; сохраняем аккумулятор PUSH B ; сохраняем регистр В PUSH ACC ; сохраняем байт данных MOV B, #8 ; кол-во битов (счетчик циклов) CRC_LOOP: XRL A, CRC ; XOR с предыдущим значением контрольной суммы RRC A ; сдвиг вправо через флаг переноса MOV A, CRC ; берем последнее значение CRC JNC ZERO ; переход, если не было переноса XRL A, #18H ; обновляем значение CRC путем XOR с константой ZERO: RRC A ; снова сдвигаем CRC MOV CRC, A ; сохраняем новое значение CRC POP ACC ; восстанавливаем байт данных RR A ; циклически сдвигаем вправо PUSH ACC ; снова сохраняем значение DJNZ B, CRC_LOOP ; повторяем цикл 8 раз (для каждого бита) POP ACC ; очищаем стек POP B ; восстанавливаем прежние значения регистров из стека POP ACC RET ; завершение процедуры Может есть кто шарит в этом деле, и поможет с кодом под PIC? |
||
Оценка
|
Знаток
Регистрация: 06.01.2010
Адрес: Львов
Сообщений: 238
Репутация: 125
|
Во-первых, какой конкретно PIC будете использовать? Ибо есть некоторые отличия в системах команд контроллеров разных подсемейств. Во-вторых, посмотрите внимательно код - команды PUSH и POP используются здесь для двух целей:
1) сохранение значения регистров; 2) локальное сохранение исходного байта данных. Все эти сохранения нужно сделать во временные переменные, вот и всё. Кроме того, не обязательно сохранять все данные (например, нафига сохранять регистр В?) - тут всё зависит от реализации основного тела программы. В любом случае, решение Вашей задачи таково: сохранять данные не в стеке, а в переменных. И будет Вам счастье. |
||
Оценка
|
Новичок
Регистрация: 01.09.2013
Сообщений: 16
Репутация: 11
|
Мне уже помогли на другом форуме, вот решение проблемы
Код:
;=============================================================== crc_8: xorwf crc,f clrw btfsc crc,0 xorlw 0x5e btfsc crc,1 xorlw 0xbc btfsc crc,2 xorlw 0x61 btfsc crc,3 xorlw 0xc2 btfsc crc,4 xorlw 0x9d btfsc crc,5 xorlw 0x23 btfsc crc,6 xorlw 0x46 btfsc crc,7 xorlw 0x8c movwf crc return ;=============================================================== start: ; dallas example: clrf crc movlw 0x02 call crc_8 ; crc = 0xbc |
||
Оценка
|
Новичок
Регистрация: 14.05.2008
Сообщений: 10
Репутация: 14
|
посмотри тут http://invent-systems.narod.ru/CRC.htm
|
||
Оценка
|
Banned
Регистрация: 21.04.2012
Адрес: южнее Дуная
Сообщений: 4,316
Репутация: 419
|
.....прошло два месяца и две недели......а в ответ тишина....
.....прошло три месяца и три недели......а в ответ тишина.... .....прошло четире месяца и четире недели......а в ответ тишина....
Последний раз редактировалось hrpankov; 10.03.2014 в 16:55.
|
||
Оценка
|
Обратная связь РадиоЛоцман Вверх |