Читайте комментарии в исправленном коде и обратите внимание на форматирование текста, включая отступы от края:
Код: Выделить всё
; файл p16f716.inc должен быть включен в проект
#include "p16f716.inc"
; CONFIG
; __config 0x3FB9
__CONFIG _FOSC_XT & _WDTE_OFF & _PWRTE_OFF & _BOREN_OFF & _BODENV_40 & _CP_OFF
;=== определения переменных в перемещаемом режиме
; только так в MPLABX их можно будет увидеть
; в окнах Watch/Variables
; udata_shr - означает, что переменные будут размещены
; в области видимости всех банков
; udata - размещение с начала ОЗУ
; udata 0x2A - размещение в ОЗУ с адреса 0x2A
; res 1 - размер переменной в байтах
udata_shr
d1 res 1
d2 res 1
Reg1 res 1
w_temp res 1
stat_temp res 1
;=== это эпичная галиматья ===
;=== в стиле приснопамятного =
;=== мистера Корабельникова ==
; cblock
; d1
; d2
; endc
;Reg1 equ 0010
;intcon equ 0b
;status equ 03
;w_temp equ 0e
;stat_temp equ 0f
;w equ 0
;f equ 1
;==========
; директива ORG НЕ должна быть расположена с начала строки
ORG 0
goto start ; имя метки должно совпадать с точностью до регистра
; если специально не включен режим нечувствительности к регистру
; это касается и всех имен регистров из файла p16f716.inc
ORG 0x04
goto int
; метки кода должны быть с начала строки
; и желательно с двоеточием, чтобы в редакторе
;выделялись цветом
int:
movwf w_temp
movf STATUS,w
movwf stat_temp
; Delay = 0.005 seconds
; Clock frequency = 4 MHz
; Actual delay = 0.005 seconds = 5000 cycles
; Error = 0 %
;4998 cycles
movlw 0xE7
movwf d1
movlw 0x04
movwf d2
Delay_0:
decfsz d1, f
goto $+2
decfsz d2, f
goto Delay_0
;2 cycles
goto $+1
bcf PORTB,RB4;включить сим
bcf INTCON,INTF;сброс флага прерывания по int
movf stat_temp,w
movwf STATUS
swapf w_temp,f
swapf w_temp,w
retfie;возврат из прерывания
start:
clrf STATUS
clrf PORTA;очистить содержимое регистра порт А
clrf PORTB;очистить содержимое регистра порт Б
bsf STATUS,RP0;перейти в банк 1
movlw b'00001';запись в аккумулятор 5бит
movwf TRISA;копировать из акк в регистр A
movlw .255;запись в аккумулятор 8бит
movwf TRISB;копировать из акк в регистр Б
movlw .192
movwf OPTION_REG;включаем подтяжку портов Б+прерывания по переднему фронту
bcf STATUS,RP0;возврат в банк 0
bsf PORTA,RA2;устанавливаем 1 в порт RA2
movlw .144;закладка константы 144 в регистр w
movwf INTCON;копир 144(10010000) из регистра w в регистр intcon(разрешение прерываний)
main:
bsf PORTB,RB4;отключить сим
goto main
END
Добавлено after 17 minutes 55 seconds:
По поводу алгоритма для решения целевой задачи.
Нужно по максимуму использовать периферийные модули (таймеры и прочие интерфейсы), которые позволят сделать сам код асинхронным от формирования диаграммы работы схемы.
Рекомендую для повышения читабельности кода использовать единые правила имен для меток, переменных, констант. Регистры специального назначения определены в хедере .inc и выделяются редактором цветом (по умолчанию - голубым, но можно изменить в настройках).
Я, например, все переменный называю со строчной (маленькой) буквы, а все метки - с прописной (большой).
При этом многословные имена пишу слитно, но каждое слово начинаю с прописной, не считая первой буквы.
Так метки будут выглядеть как:
Код: Выделить всё
MainCalculate:
PollingRS485:
CalcCRC8:
;и т.д.
Переменные:
Код: Выделить всё
ptrArrayRS485 res 1
arrayRS485 res 128 ; это массив 128 байт
counterRequest res 1
accumFIR res 4 ; это переменная 32 разряда (4 байта)
; обращение к переменным более 1 байта можно вести по имени:
; accumFIR+0 или accumFIR - младший байт 32-разрядной переменной
; accumFIR+1
; accumFIR+2
; accumFIR+3 - старший байт 32-разрядной переменной
;и т.д.
Константы в коде нужно всегда стараться именовать и выносить в начало, чтобы потом не искать их по тексту, особенно если они применяются в нескольких местах:
Имя констант я обычно пишу прописными, разделяя слова подчеркиваниями:
Код: Выделить всё
DEF_FREQ_MAIN_MODE equ .200
SERIAL_NUMBER equ .15
Значения констант нужно использовать в том виде, в котором они удобны для восприятия, а не рандомно.
То есть при установке значений спецрегистров побитно нужно использовать бинарный формат b'10010000', а не десятичный .144. Если речь идет о маске, то либо хекс (0xF3), либо бинарный b'11110011' формат. А если это значение частоты или множитель, то десятичный.
Добавлено after 28 minutes 56 seconds:
Перед обращением к регистру специального назначения удобно применять макрос banksel <имя регистра>:
Код: Выделить всё
movlw <значение>
banksel OPTION_REG
movwf OPTION_REG
movlw <значение>
banksel PIE1
movwf PIE1
тогда не нужно постоянно узнавать в даташите о размещении этого регистра по банкам. Ассемблер это сделает за вас.
Кстати, при этом исчезнут и варнинги о банках.