Оглавление
СОЗДАЕМ АРХИВ, ЗАТЕМ СЧИТЫВАЕМ ИЗ НЕГО ДАННЫЕ
ПОЛУЧЕНИЕ ОДНОТИПНЫX СТРОК ПРИ КОМПИЛЯЦИИ
СМОТРИМ ЧТО ПИШЕТСЯ ИЗ ПУ1 В ПУ2
ПОДГЛЯДЫВАЕМ ЗА АДРЕСАМИ В ЕЕПРОМЕ
СЛОЖЕНИЕ ДВУБАЙТОГО С КОНСТАНТОЙ
ИНКРЕМЕНТАЦИЯ ДВУБАЙТНОГО ЧИСЛА
ИНКРЕМЕНТАЦИЯ ТРЕХБАЙТНОГО 24 + 1
16 + 16 работает с отрицательными
24 + 24 работает с отрицательными
32 + 32 (работает с отрицательными)
ДEКРЕМЕНТАЦИЯ ДВУБАЙТНОГО ЧИСЛА
16 + 16 EEPROM (работает и с отрицательными)
ПЕРЕНОС 4 БАЙТНОЙ КОНСТАНТЫ В ЯЧЕЙКИ
ПРОВЕРКА ЧЕТЫРЕХ БАЙТ — ЕСТЬ ЛИ ХОТЯ БЫ В ОДНОМ — 1
ПРИНИМАЕМ С КОМПЬЮТЕРА В USART БАЙТ И ОТПРАВЛЯЕМ ЕГО ОБРАТНО. БЕЗ ПРЕРЫВАНИЙ.
ПРИНИМАЕМ ДВА ДВУБАЙТНЫХ ЧИСЛА В USART, СКЛАДЫВАЕМ , ВОЗВРАЩАЕМ СУММУ В КОМП
ИСПОЛЬЗУЯ ПРЕРЫВАНИЯ ПРИНИМАЕМ БАЙТ В USART, И ОТСЫЛАЕМ ЕГО ОБРАТНО
ЧТЕНИЕ БАЙТА ИЗ ЕЕПРОМА С ОДНОБАЙТНЫМ АДРЕСОМ
ЧТЕНИЕ БАЙТА ИЗ ЕЕПРОМА С ДВУБАЙТНЫМ АДРЕСОМ
ЧТЕНИЕ ДВУХ БАЙТ ИЗ ЕЕПРОМА С ДВУБАЙТНЫМ АДРЕСОМ
ЗАПИСЬ БАЙТА В ЕЕПРОМ С ОДНОБАЙТНЫМ АДРЕСОМ
ЗАПИСЬ БАЙТА В ЕЕПРОМ С ДВУБАЙТНЫМ АДРЕСОМ
ЗАПИСЬ ДВУХ БАЙТ В ЕЕПРОМ С ДВУБАЙТНЫМ АДРЕСОМ C ПРОВЕРКОЙ НА ПОВТОРЕНИЕ СОДЕРЖИМОГО И ЗАПИСЫВАЕМОГО
Что тут происходит.
Готовые к применению блоки на PicASM для PIC18F.
Для меня самые полезные шаблоны били в разделе математика, использовал по многу раз в день.
Примеры предоставляются как есть, по скольку тема PicASM умерла для меня много лет назад, однако вероятность что кто-то копается в этом старом субстанции еще есть, готовые примеры реально смогут упростить жизнь. Расчитанно на слегка подготовленного пользователя или нагуглите там при необходимости)
lfsr 0, nameCallRam - передвинуть указатель на нужную ячейку RAM
INDF0 - хранит значение ячейки с адресом в FSR0. Значение FSR0 не менянтся
POSTINC0 - хранит значение ячейки с адресом в FSR0. При использовании происходит FSR0 + 1 после чтения значения ячейки.
PREINC0 - хранит значение ячейки с адресом в FSR0. При использовании происходит FSR0 + 1 до чтения значения ячейки
POSTDEC0 — хранит значение ячейки с адресом в FSR0. При использовании происходит FSR0 - 1 после чтения значения ячейки.
PLUSW0 — значение в регистре WREG используется как смещение к FSR0. После косвенной адресации значение FSR0 и WREG не меняется.
CREATE_ARRAY:
lfsr 0, 0x100 ;поместили 100 в fsr0
loop:
movlw 0x55
movwf POSTINC0,0 ; помещаем 0x55 в ячейку с адресом указаным в FSR0
;clrf POSTINC0, A ; обнуляем р POSTINC0 который используется для обращения к FSR0
movlw 0x08
cpfseq FSR0L, A ;сравнить FSR0L младший байт в р FSR0 с 0x08 и выйти из цикла если равны
bra loop
COPY_ARRAY:
lfsr 0, 0x100 ;поместили 100 в fsr0
lfsr 1, 0x150 ;поместили 100 в fsr0
loop2:
movf POSTINC0,W,0 ;вытягиваем из FSR0 который указывает в начале на 0x100 в раб.рег.
movwf POSTINC1,0 ; помещаем содержимое раб.рег. в ячейку с адресом указаным в FSR1 (в начале 0x150)
;инкрементируем FSR1 на 1
movlw 0x08
cpfseq FSR0L, A ;сравнить FSR0L младший байт в р FSR0 с 0x08 и выйти из цикла если равны
bra loop2
END
ОПЕРАТОРЫ
TABLAT - в этом регистре находится 1байт памяти программ, указываем на него с помощью TBLPTRU:H:L
tblrd *+ - читаем из памяти программ один байт в TABLAT, после этого указатель смещается на следующий байт
tblrd +* - читаем из памяти программ один байт в TABLAT, перед этим указатель смещается на следующий байт
tblrd * - читаем из памяти программ один байт в TABLAT, без смещения
tblrd *- - читаем из памяти программ один байт в TABLAT, после этого указатель смещается назад на предыдущий байт
;читаем из памяти программ один байт в tempG0, при этом указатель смещается на следующий байт
arg set nameTable
movlw upper arg
movwf TBLPTRU,A
errorlevel -311
movlw high arg
errorlevel +311
movwf TBLPTRH,A
movlw low arg
movwf TBLPTRL,A
tblrd *+
movff TABLAT,tempG0
;читаем без послеующего смещения
tblrd *
movff TABLAT,tG0
ОПЕРАТОРЫ
TOSU:H:L — отображают состояние вершины стека указаного в SRKPTR
PCU,PCH,PCL – счетчик команд (указатель на команду в памяти программ которую процессор будет сейчас выполнять)
PCLATU,PCLATH — регистры для обращение я к PCU,PCH. напрямую делать нельзя.
PCL – при записи в этот регистр происходит запись значений из PCLATU,PCLATH в счетчик команд — переход на нужное местов програме
при чтении из PCL происходит чтение из PCU,PCH в PCLATU,PCLATH — узнаем текущее место в программе
не искользовать fsr2
;инициализируем таймер
T0CON_WORK equ (1 << TMR0ON) + (0 << T08BIT) + (0 << T0CS) + (0 << T0SE) + (1 << PSA) + (0 << T0PS2) + (0 << T0PS1) +(0 << T0PS0)
;T0CON,TMR0ON,A=1 ;разрешаем работу раймера
;T0CON,T08BIT,A=0 ;т. работает в режиме 16 разрядного таймера счетчика
;T0CON,T0CS,A=0 ;тактовый сигнал будет от внутреннего источника
;T0CON,T0SE,A=1 ;активный фронт - задний на выводе TOCKI
;T0CON,PSA,A=0 ;работает c предделителем
;0 << T0PS2) + (0 << T0PS1) +(0 << T0PS0) ; частота работы предделителя
;Инициализация прерываний
INTCON_WORK equ (0 << GIE) + (0 << PEIE) + (0 << TMR0IE) + (0 << INT0IE) + (0 << RBIE) + (0 << TMR0IF) + (0 << INT0IF) + (0 << RBIF)
;INTCON, GIE, A=1 ;разршили основные прерывания вообще
;INTCON,PEIE,A=1 ;разрешили перефирийные прерывания
;INTCON,TMR0IE,A=1 ;разрешили прерывания по переполнению таймера TMR0
;INTCON,INT0IE,A=1 ;разрешили внешние прерывания INT0
;INTCON,RBIE,A=1 ;разрешили прерывания по измениению уровня с игнала на входах PORTB
;INTCON,TMR0IF,A=0 ;флаг переполнения таймера - таймер не переполнен
;INTCON,INT0IE,A=1 ;флаг внешнего прерывания INT0 – выполнено условие внешнего прерывания
;INTCON,RBIF,A=1 ;зафиксировано измениение сигнала на входах PORTB
i =0
madr = 1952
while (madr <= 1952+988);1064)
DW_MPM pulse#v(i)D_MADR, madr, 01, 0x00
madr += 76
i += 1
endw
btfss TEMPAL,2,0
OTKL_IDLE_YELLOW
btfsc TEMPAL,2,0
call Routine_VKL_IDLE_YELLOW
аналогичен такому коду – выигрыш в одну строчку
btfss TEMPAL,2,0
bra $+8
call Routine_VKL_IDLE_YELLOW
bra $+4
OTKL_IDLE_YELLOW
WR_RAM_DW:
rcall Get_CRC8_rgsdv_0_4
banksel rgsdv
cpfseq rgsdv+5,B
bra I2C_otvet
- арес ячеки куда пишется fsr0l fsr0h
rcall Adr_RAM
bcf INTCON,GIE,0
movff rgsdv+3,POSTINC0 - содержимое того что пишется
movff rgsdv+4,INDF0 - содержимое того что пишется
bsf INTCON,GIE,0
bra I2C_otvet
movff TOSL,tempG0
movff TOSH,tempG1
movff TOSU,tempG2
movlw 0x4C
cpfseq EEADR, A
bra $+10
movlw 0x08
cpfseq EEMADRH, A
bra $+4
nop
bsf TEMPAL,0,0 - защита должна сработать
6720
частота 20 Мгц
nop 0,2 мкСек
5000 nop выполняются 1 мили сек
5 nop – 1uS
Слежение за значением 2-х байтной RAM ячейки. Точка останова когда равна/не равна нашей константе.
;!!!test
TestTwoByteEqu:
arg set 475
movlw high arg
movff WREG,tmp1
movlw low arg
movff WREG,tmp0
banksel tmp0
movff ram_param_idx_h,WREG
cpfseq tmp1,1
bra TwoByteNoEqu
movff ram_param_idx_l,WREG
cpfseq tmp0,1
bra TwoByteNoEqu
bra TwoByteEqu
TwoByteNoEqu:
nop
bra TestTwoByteEquEnd
TwoByteEqu:
nop
TestTwoByteEquEnd:
;!!!test
movlw 0x02
banksel pulseMadrTempH
addwf pulseMadrTempL,F,B
btfsc STATUS, C, A
incf pulseMadrTempH,F,B
banksel pulseMadrTempH
addwf pulseMadrTempL,F,B
btfsc STATUS, C, A
incf pulseMadrTempH,F,B
banksel byte
incf byteL,F,B
btfsc STATUS, C, A
incf byteH,F,B
banksel byte
incf byteL,F,B
btfsc STATUS, C, A
incf byteH,F,B
btfsc STATUS, C, A
incf byteU,F,B
movf B0,W,A ; B1:B0 +A1:A0-> A1:A0
addwf A0,F,A
movf B1,W,A
addwfc A1,F,A
movf PRODL,W,A
addwf TBLPTRL,F,A
movf PRODH,W,A
addwfc TBLPTRH,F,A
btfsc STATUS, C, A
incf TBLPTRU,F,A
movf B0,W,A ; B2:B1:B0 +A2:A1:A0-> A2:A1:A0
addwf A0,F,A
movf B1,W,A
addwfc A1,F,A
movf B2,W,A
addwfc A2,F,A
banksel QmetrBVRM_in_V_L
movf A0,W,A
addwf QmetrBVRM_in_V_L,F,B
movf A1,W,A
addwfc QmetrBVRM_in_V_H,F,B
btfsc STATUS, C, A
incf QmetrBVRM_in_V_U,F,B
btfsc STATUS, C, A
incf QmetrBVRM_in_V_UU,F,B
movf BARGB0,W,A ;B3:B2:B1:B0 + tG3:tG2:tG1:tG0 -> tG3:tG2:tG1:tG0
addwf tempG0,F,A
movf BARGB1,W,A
addwfc tempG1,F,A
movf BARGB2,W,A
addwfc tempG2,F,A
movf BARGB3,W,A
addwfc tempG3,F,A
banksel byteL
decf byteL,F,B
btfss STATUS, C, A
decf byteH,F,B
bsf STATUS,0,A
subwf FSR1L,F,A
btfss STATUS,0,A
decf FSR1H,F,A
bcf STATUS,C,A
movf B0, W, A ;A1:A0 - B1:B0 -> А1:А0
subwf A0, F, A
movf B1, W, A
subwfb A1, F, A
bsf STATUS,C,A ;A3:A2:A1:A0 - B3:B2:B1:B0 -> B3:B2:B1:B0
movf AARGB0,W,A
subfwb BARGB0,F,A
movf AARGB1,W,A
subfwb BARGB1,F,A
movf AARGB2,W,A
subfwb BARGB2,F,A
movf AARGB3,W,A
subfwb BARGB3,F,A
arg set UST_rng2Blt1_MADR
movlw high arg
movwf EEMADRH, A
movlw low arg
call EEPROM_Read_3ff, 0
movwf A5, A
movlw low arg+1
call EEPROM_Read_3ff, 0
movwf B0, A
arg set UST_dltRngBlt1_MADR
movlw high arg
movwf EEMADRH, A
movlw low arg
call EEPROM_Read_3ff, 0
movwf B2, A
movlw low arg+1
call EEPROM_Read_3ff, 0
movwf B1, A
movf B2,W,A ; B1:B2 +B0:A5-> B0:A5
addwf A5,F,A
movf B1,W,A
addwfc B0,F,A
arg set 600*144
movlw (arg >> 24)
movwf A3,A
movlw upper arg
movwf A2,A
errorlevel -311
movlw high arg
errorlevel +311
movwf A1,A
movlw low arg
movwf A0,A
и
arg set 600*144
movlw (arg >> 24)
movff WREG,actEnergy2HMwH
movlw upper arg
movff WREG,actEnergy2HMwL
errorlevel -311
movlw high arg
errorlevel +311
movff WREG,actEnergy2HKwH
movlw low arg
movff WREG,actEnergy2HKwL
movlw 0x00
iorwf BARGB0,W,A
iorwf BARGB1,W,A
iorwf BARGB2,W,A
iorwf BARGB3,W,A
tstfsz WREG,A ;WREG =0 во всех байтах 0
movf A0,W,A
movff A1,A0
movwf A1,A
movff byte1L,A1
movff byte1H,A0
movff byte2L,A5
movff byte2H,B0
call D_cmp ; сравнить A0:A1 и B0:A5: c=0 -> A0:A1 > B0:A5 c=1 -> A0:A1 =< B0:A5
btfss STATUS,C,0 ; c=1 -> 1ый операнд =< 2го
movlw 3686400*4/9600/64-1
movwf SPBRG1, A
bcf TXSTA1,BRGH,A ;выбираем скорость передачи - сбрасываем бит BRGH в TXSTA
bcf TXSTA1,SYNC,A ;выбираем асинхронный режим - сброс бита SYNC в 0
bcf RCSTA1,RX9,A ;если передача 9 разр - RX9 в 1
bsf RCSTA1,SPEN,A ;установка бита SPEN в 1
bsf RCSTA1,CREN,A ;разрешаем прием CREN в 1
;----начинаем
label_rec:
clrwdt
btfss PIR1,RC1IF ;ожидать установки бита RCIF - перепрыгиваем если 1
bra label_rec
movf RCREG1, W, A ;считать 8 бит данных из RCREG
;-----------------------------------передача данных USART-----------------------------------
bcf TXSTA1,TX9,A ;если передача 9 разр - RX9 в 1 - у нас 8 передается
bsf TXSTA1,TXEN,A ;разрешаем передачу - TXEN в 1
;?если передача 9 разрядная 9-ый бит данных в TX9D
;------начинаем
movwf TXREG1,A ;начинаем передавать данные - пишем в р TXREG
main:
clrwdt
bra label_rec
END
i equ 0x01
one_one equ 0x10
one_thoo equ 0x11
thoo_one equ 0x12
thoo_thoo equ 0x13
org 0x00
goto _main_init
org 0x08
retfie 1
_main_init:
movlw 4 ;определяет количество итераций цикла
movwf i,A
lfsr 0, 0x10 ;поместили 100 в fsr0 - с этого адреса начнется массив принятых данных
;----------------------------------прием данных USART------------------------------
;----настраиваем
movlw 3686400*4/9600/64-1
movwf SPBRG1, A
bcf TXSTA1,BRGH,A ;выбираем скорость передачи - сбрасываем бит BRGH в TXSTA
bcf TXSTA1,SYNC,A ;выбираем асинхронный режим - сброс бита SYNC в 0
bcf RCSTA1,RX9,A ;если передача 9 разр - RX9 в 1
bsf RCSTA1,SPEN,A ;установка бита SPEN в 1
bsf RCSTA1,CREN,A ;разрешаем прием CREN в 1
;----начинаем принимать
four_recurrence:
label_rec:
clrwdt
btfss PIR1,RC1IF ;ожидать установки бита RCIF - перепрыгиваем если 1
bra label_rec
movf RCREG1, W, A ;считать 8 бит данных из RCREG
movwf POSTINC0,A ; помесим эти биты в ячейку с адресом FSR0
decfsz i,F,A ;пока не отыграем 4 раза
bra four_recurrence
;---считаем
; bcf 0x014,0,A ;сбросим бит в третьем разряде
clrf 0x014, A
movf one_one, W, A
addwf thoo_one, F, A
movf one_thoo, W, A
addwfc thoo_thoo, F, A
bc add_3 ;если перенос был надо третий байт увеличить на 1
bra dalshe ;если переноса не было просто идем дальше
add_3:
movlw 1
movwf 0x014, A
; bsf 0x014,0,A
dalshe:
; banksel one_one
; movf one_one, W, B
; addwf thoo_one, F, B
; movf one_thoo, W, B
; addwfc thoo_thoo, F, B
;;-----------------------------------передача данных USART-----------------------------------
;----подстраиваем
bcf TXSTA1,TX9,A ;если передача 9 разр - RX9 в 1 - у нас 8 передается
bsf TXSTA1,TXEN,A ;разрешаем передачу - TXEN в 1
;?если передача 9 разрядная 9-ый бит данных в TX9D
;;------начинаем
movf thoo_one,w,A
movwf TXREG1,A ;начинаем передавать данные - пишем в р TXREG
nop
jdem1:
btfss PIR1,TXIF,A
bra jdem1
movf thoo_thoo,w,A
movwf TXREG1,A
nop
jdem2:
btfss PIR1,TXIF,A
bra jdem2
movf 0x014, w,A
movwf TXREG1,A
nop
jdem3:
btfss TXSTA1,TRMT,A
bra jdem3
main:
clrwdt
bra label_rec
END
bra main
int: org 8 ;обозначаем место в памяти где будет находится обработчик прерываний
btfsc PIR1,RCIF,0 ; если 0 в бите RCIF не выполняем обработку прерывания
bra RECEIVE ; переход на обработку прерывания от SCI приёмника
no_receive:
btfsc PIR1,TXIF,0 ; если 0 в бите TXIF не выполняем обработку
bra SEND ; переход на обработку прерывания от SCI передатчика
no_send:
retfie 1 ;возвращаемся
RECEIVE: ;обрабатывем прием битов
movf RCREG1, W, A ;считать 8 бит данных из RCREG
movwf my_b,A
movlw 1
movwf Temp1,A ;запоминаем что был принят байт
bra no_receive
SEND: ;обрабатываем посылку битов
movlw 0
cpfsgt Temp1,A ;если байт принят байт (Temp1) то и нечего отсылать
bra no_send
movf my_b,WREG,A ;помещяем в WREG то что приняли
movwf TXREG1,A ;начинаем передавать данные - пишем в р TXREG
movlw 0
movwf Temp1,A ;после нажной передачи обнуляем флаг
bra no_send
main:
Temp1 equ 0x01 ;флаг готовности к отсылке
my_b equ 0x02 ;
movlw 0
movwf Temp1,A ;обнуляем
;i equ 0x01
;----настраиваем usart
movlw 3686400*4/9600/64-1
movwf SPBRG1, A
bcf TXSTA1,BRGH,A ;выбираем скорость передачи - сбрасываем бит BRGH в TXSTA
bcf TXSTA1,SYNC,A ;выбираем асинхронный режим - сброс бита SYNC в 0
bcf RCSTA1,RX9,A ;если передача 9 разр - RX9 в 1
bsf RCSTA1,SPEN,A ;установка бита SPEN в 1
bsf RCSTA1,CREN,A ;разрешаем прием CREN в 1
bsf TXSTA1,TXEN,A ;разрешаем передачу - TXEN в 1
bsf PIE1,TXIE,A ;разрешаем прерыватия от передатчика usart
bsf PIE1,RCIE,A ;разреаем прер. от приемника usart
;-------настраиваем прерывания--------
bcf RCON,IPEN,A ;запретили приоритетную систему
bsf INTCON,PEIE,A ;разрешили перефирийные прерывания
bsf INTCON, GIE, A
main1:
; movlw 1;
; addwf i,f,A ;для интереса считаем итерации
clrwdt;
bra main1
END
-------табличные переходы------------
movf PCL, W, A ;положили значение PCH,PCU в PCLATH,PCLATU -текущую метк
movf kk,W,A ;
addwf PCL, F, A ;теперь переходим на kk вперед
rcall smena_poluper_red_01 ;если kk равно 0x01 перескакиваем выполняем smena_poluper_red_01
rcall smena_poluper_yeloo_02 ;если kk равно 0x02 перескакиваем выполняем smena_poluper_yeloo_02
bra nothing_work
bra nothing_work
bra nothing_work
bra nothing_work
bra nothing_work
bra nothing_work
rcall read_polup_red ;если kk равно 0x11 перескакиваем выполняем read_polup_red
rcall read_polup_yeloo ;если kk равно 0x12 перескакиваем выполняем read_polup_yeloo
----
--------макросы--------------
my_macro macro DH, DL ;создаем макрос
movlw DH
movwf TMR0H,A
movlw DL
movwf TMR0L,A ;***задаем начальное положение таймера
endm
my_macro 0xF1, 0x99 ;используем макрос
----
-------сложение--------------
Процедура prog_MPM: обрабатывающая строчки типа
DW_MPM pauseGnuUst_ADR, 0x6C0, 10, n ;уставка паузы после нажатия кнопки пуск
работает так
- - -
число n сравнивает с TROUGH_VERSION equ X (та величина что находится в еще не прошитом контроллере, после презаписи всех ячеек в мпм по нижеприведенным правилам, TROUGH_VERSION меняется на ту что несет в себе прошивка)
1) если X > n Уставка «старая»,т.е. Текущая версия программы больше чем указанный для уставки номер версии, то уставка НЕ пере пишется на 10 при перепрошивке через УПИ
2) если X = n Уставка «старая»,т.е. Текущая версия программы равна указанной для уставки номер версии, то уставка НЕ пере пишется на 10 при перепрошивке через УПИ
3) если X < n Уставка «новая»,т.е. Текущая версия программы меньше чем указанный для уставки номер версии, то уставка ПЕРЕПИШЕТСЯ на 10 при перепрошивке через УПИ.
Для байтов еепром хранящих битовые параметры при прошивке через упи
Битовая маска 1 — всегда перепрошивать новое 0 — всегда оставлять прежним
Порядок добавления новой уставки в MPM.
…
softwVersion1MADR 520 0017
softwVersion1MADR 522 0018
softwVersion1MADR 524 00D0
softwVersion1MADR 526 0010
softwVersion1MADR 528 0014
softwVersion1MADR 52A 0015
softwVersion1MADR 52C 0016
softwVersion1MADR 52E 552F
softwVersion1MADR 530 0016
softwVersion1MADR 532 0016
indSofVerMADR 0x534 0B04
indSofVerAbsMADR 0x535 0000
DW_EEPROM D_T_Last_Start_1_ADR, 0x022, 75, 0x00
значение последнего атрибута
0 — уставка никогда не пере прошьется (не заменится значением 75) с помощью UPI
0xFF – уставка будет перепрашиваться каждую прошивку UPI
arg set FC_Start_Mode_ADR
movlw high arg
movwf EEMADRH, A
movlw low arg
movwf EEADR, A
movff A0, EEDATA
call EEPROM_Write_3ff_check, 0
считается во WREG и EEDATA
movlw addr_MADR
call EEPROM_Read_3ff
movff EEDATA,byte
считается во WREG и EEDATA
arg set PKFlags3_ADR
movlw high arg
movwf EEMADRH,0
movlw low arg
call EEPROM_Read_3ff
movff EEDATA,byte или movff WREG,byte или movwf A0, A
обычная ячейка
EEPROM_READ_3FF addr_MADR
movff WREG,byte_L
быстрый доступ
EEPROM_READ_3FF addr_MADR
movwf byte_L, A
arg set addr_MADR
movlw high arg
movwf EEMADRH, A
movlw low arg
call EEPROM_Read_3ff, 0
movwf A0, A или movff WREG,A0
movlw low arg+1
call EEPROM_Read_3ff, 0
movwf A1, A или movff WREG,A1
EEPROM_WREAD_3FF addr_MADR
movff WREG,byteL
movff EEDATA,byteH
второй способ (оптимальный)
arg set addr_MADR
movlw high arg
movwf EEMADRH, A
movlw low arg
call EEPROM_wRead_3ff, 0
movff WREG, byte_L
movff EEDATA,byte_H
финальный
EEPROM_WREAD_3FF addr_MADR
movff WREG, byte_L
movff EEDATA,byte_H
или при byte_L в быстром доступе
EEPROM_WREAD_3FF addr_MADR
movwf byte_L,A
movff EEDATA,byte_H
arg set FC_Start_Mode_ADR
movlw high arg
movwf EEMADRH, A
movlw low arg
movwf EEADR, A
movff A0,EEDATA
call EEPROM_Write_3ff_check, 0
movff byte,EEDATA
clrf EEDATA,0
movlw 0x01
movwf EEDATA,0
movlw high addr_MADR
movwf EEMADRH,0
movlw low addr_MADR
movwf EEADR,0
call EEPROM_Write_3ff_check
arg set anyAdr
movlw high arg
movwf EEMADRH, A
movlw low arg
movwf EEADR, A
movff byte0, EEDATA
call EEPROM_Write_3ff_check, 0
incf EEADR, F, A
movff byte1, EEDATA
call EEPROM_Write_3ff_check, 0
arg set PKFlags3_ADR
movlw high arg
movwf EEMADRH,0
movlw low arg
call EEPROM_Read_3ff
btfsc EEDATA,bite,A
bra metka
arg set ERR_F4_ADR
movlw high arg
movwf EEMADRH,0
movlw low arg
call EEPROM_Read_3ff
bsf EEDATA,maxCntRuchPusk_Err,A
call EEPROM_Write_3ff_check ;пишем обратно байт в еепром но теперь бит говорит что разрешенные рп закончились
movlw high FLASH_BUFFER
movwf FSR0H
banksel tblptrLTochn
movff tblptrLTochn,FSR0L
movlw 0x77
movwf INDF0,0
arg set PKFlags3_ADR
movlw high arg
movwf EEMADRH,0
movlw low arg
call EEPROM_Read_3ff
arg set FC_Start_Mode_ADR
movlw high arg
movwf EEMADRH, A
movlw low arg
movwf EEADR, A
call EEPROM_Write_3ff_check, 0
v1.