Авторизация


...

Кто на сайте?

Сейчас 65 гостей и ни одного зарегистрированного пользователя на сайте

Статистика

-Посетители : 239
-Материалы : 214

ПП подсчета КС путем 16-битного дополнения суммы всех 16- битных слов.

Категория: 5. Программные приемы
Автор: nick14 Просмотров: 2785

 

 

Объем блока данных ограничивается только объемом памяти применяемого микроконтроллера. Если количество байт не четное , то последний байт добавляется самой программой и имеет нулевой значении , в результате блок данных всегда выравнивается 16 битным словом (два байта). В данной программе блок данных для подсчета располагается с адреса 0200H, который при необходимости можно изменить. Результат КС находится в регистрах  SUM_kont (L,H).

 



Cblock                   SUM_kontL              ; мл. байт КС             SUM_kontH              ; ст. байт КС             BaitL                  ; мл.  кол-во байт для подсчета КС             BaitH                  ; ст.  кол-во байт для подсчета КС             Temp_1                 ; временный регистр             Temp_2                 ; временный регистр             endc          ;*******************************************************************             org                  0 ;             goto             START ; ;---------------------------------------------------- START       movlw               .5 ; мл.  кол-во байт для подсчета КС             movwf            BaitL ;             movlw               .0 ; ст.  кол-во байт для подсчета КС             movwf            BaitH ;             call         TCP_k_sum ; считаем КС             nop                    ; результат в SUM_kont (L,H)             goto            START ;============================================================================================= ; ПП вычисление контрольной суммы ;============================================================================================= TCP_k_sum   clrf         SUM_kontH ; очистить регистр             clrf         SUM_kontL ; очистить регистр             lfsr       FSR0,0x0200 ; первый байт   в ОЗУ для подсчета             call         Prov_bain ; проверка четности байт             lfsr       FSR0,0x0200 ; первый байт   в ОЗУ для подсчета             call               D_2 ; делим на два  16 битный Bait (L,H)             tstfsz           BaitL ; = если "0" , то             bra               $+.4 ; следующую команду пропускаем =             incf             BaitL ; коррекция кол-ва байт для подсчета мл.             incf             BaitH ; коррекция кол-ва байт для подсчета ст.             movff     INDF0,Temp_1 ; копируем во временный регистр мл.байт             movf          POSTINC0 ; +1 ,следующий байт             movff     INDF0,Temp_2 ; копируем во временный регистр ст.байт             movf          Temp_1,0 ; значение регистра в W             addwfc       SUM_kontL ; складываем ст.байт с использованием флага переноса             movf          Temp_2,0 ; значение регистра в W             addwfc       SUM_kontH ; складываем мл.байт с использованием флага переноса             movlw               .0 ; = если был перенос             addwfc       SUM_kontL ; складываем со ст. байтом. =             movf          POSTINC0 ; +1, следующий байт             decfsz           BaitL ; уменьшаем мл.байт , 0 ?             bra              $-.26 ; нет , следующий байт             decfsz           BaitH ; уменьшаем ст.байт , 0 ?             bra              $-.30 ; нет , следующий байт             nop             comf         SUM_kontL ; инвертируем мл.байт(КС мл.байт)             comf         SUM_kontH ; инвертируем ст.байт(КС ст.байт)             return ;---------------------------------- Prov_bain   btfss          BaitL,0 ; проверяем , четный байт ?             return                 ; да , возврат             movf           BaitL,0 ; в W для сумму с адресом первого байта ,мл.             addwf            FSR0L ; адрес последнего байта подчета КС мл.             movf           BaitH,0 ; в W для сумму с адресом первого байта, ст.             addwfc           FSR0H ; адрес последнего байта подсчета КС ст.             clrf             INDF0 ; сбрасываем в "0"             movlw               .1 ; записываем "1" в W             addwf            BaitL ; увеличиваем значение мл.байта             movlw               .0 ; записываем "0" в W             addwfc           BaitH ; если был перенос увеличиваем значение ст.байта             return ;----------------------------------   D_2         rrcf             BaitL ; делим на два  16 битный Bait (L,H)             btfsc          BaitH,0 ;             bsf            BaitL,7 ;               rrcf             BaitH ;             bcf            BaitH,7 ;             return ;*********************************************************************************************              end

Скачать проект в Mplab 

Ссылка для скачивания доступна только авторизованным пользователям сайта !


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2018 © ChipMK.ru

ChipMk.ru Яндекс Метрика