Оглавление

КОСВЕНАЯ АДРЕСАЦИЯ

ОПЕРАТОРЫ

СОЗДАЕМ АРХИВ, ЗАТЕМ СЧИТЫВАЕМ ИЗ НЕГО ДАННЫЕ

ТАБЛИЧНОЕ ЧТЕНИЕ

ПРИМЕР

ПАМЯТЬ ПРОГРАММ ПЕРЕХОДЫ

ПРЕРЫВАНИЯ

РАБОТА С ТАЙМЕРОМ

ФЛАГИ

КОМПИЛЯТОР

ПОЛУЧЕНИЕ ОДНОТИПНЫX СТРОК ПРИ КОМПИЛЯЦИИ

ИНТЕРЕСНЫЙ КОД

СМОТРИМ ЧТО ПИШЕТСЯ ИЗ ПУ1 В ПУ2

ПОДГЛЯДЫВАЕМ ЗА АДРЕСАМИ В ЕЕПРОМЕ

ВРЕМЯ ВЫПОЛНЕНИЯ КОМАНДЫ

МАТЕМАТИКА.

СЛОЖЕНИЕ

СЛОЖЕНИЕ ДВУБАЙТОГО С КОНСТАНТОЙ

СЛОЖЕНИЕ ДВУБАЙТОГО С WREG

ИНКРЕМЕНТАЦИЯ ДВУБАЙТНОГО ЧИСЛА

ИНКРЕМЕНТАЦИЯ ТРЕХБАЙТНОГО 24 + 1

16 + 16 работает с отрицательными

24 + 16

24 + 24 работает с отрицательными

32 + 16

32 + 32 (работает с отрицательными)

ВЫЧИТАНИЕ

ДEКРЕМЕНТАЦИЯ ДВУБАЙТНОГО ЧИСЛА

16 - 8

16 - 16

32 – 32

16 + 16 EEPROM (работает и с отрицательными)

РАЗНОЕ

ПЕРЕНОС 4 БАЙТНОЙ КОНСТАНТЫ В ЯЧЕЙКИ

ПРОВЕРКА ЧЕТЫРЕХ БАЙТ — ЕСТЬ ЛИ ХОТЯ БЫ В ОДНОМ — 1

МЕНЯЕМ

СРАВНЕНИЕ

USART

ПРИНИМАЕМ С КОМПЬЮТЕРА В USART БАЙТ И ОТПРАВЛЯЕМ ЕГО ОБРАТНО. БЕЗ ПРЕРЫВАНИЙ.

ПРИНИМАЕМ ДВА ДВУБАЙТНЫХ ЧИСЛА В USART, СКЛАДЫВАЕМ , ВОЗВРАЩАЕМ СУММУ В КОМП

ИСПОЛЬЗУЯ ПРЕРЫВАНИЯ ПРИНИМАЕМ БАЙТ В USART, И ОТСЫЛАЕМ ЕГО ОБРАТНО

ЭНЕРГОНЕЗАВИСИМАЯ ПАМЯТЬ

MPM

EEPROM

ОДНА ИЗ ФОРМ ЗАПИСИ

ЧТЕНИЕ БАЙТА ИЗ ЕЕПРОМА С ОДНОБАЙТНЫМ АДРЕСОМ

ЧТЕНИЕ БАЙТА ИЗ ЕЕПРОМА С ДВУБАЙТНЫМ АДРЕСОМ

ЧТЕНИЕ ДВУХ БАЙТ ИЗ ЕЕПРОМА С ДВУБАЙТНЫМ АДРЕСОМ

ЗАПИСЬ БАЙТА В ЕЕПРОМ С ОДНОБАЙТНЫМ АДРЕСОМ

ЗАПИСЬ БАЙТА В ЕЕПРОМ С ДВУБАЙТНЫМ АДРЕСОМ

ЗАПИСЬ ДВУХ БАЙТ В ЕЕПРОМ С ДВУБАЙТНЫМ АДРЕСОМ C ПРОВЕРКОЙ НА ПОВТОРЕНИЕ СОДЕРЖИМОГО И ЗАПИСЫВАЕМОГО

ПРОВЕРКА БИТА

ВЫСТАВЛЯЕМ/СБРАСЫВАЕМ БИТ ЧИТАЕМ БАЙТ ИЗ ЕЕПРОМА, МЕНЯЕМ В НЕМ БИТ, ЗАПИСЫВАЕМ ПРЕЖНИЙ БАЙТ С ИЗМЕНЕНИЯМИ ОБРАТНО

ЗАПИСЬ БАЙТА В ЗАРАНЕЕ НЕИЗВЕСНУЮ ОБЛАСТЬ ПАМЯТИ RAM

КОПИРОВАНИЕ ИЗ EEPROMa В EEPROM ОДНОГО БАЙТА



Что тут происходит.

Готовые к применению блоки на 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

КОМПИЛЯТОР

ПОЛУЧЕНИЕ ОДНОТИПНЫX СТРОК ПРИ КОМПИЛЯЦИИ

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

СМОТРИМ ЧТО ПИШЕТСЯ ИЗ ПУ1 В ПУ2

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

СЛОЖЕНИЕ ДВУБАЙТОГО С WREG

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

ИНКРЕМЕНТАЦИЯ ТРЕХБАЙТНОГО 24 + 1

banksel byte

incf byteL,F,B

btfsc STATUS, C, A

incf byteH,F,B

btfsc STATUS, C, A

incf byteU,F,B

16 + 16 работает с отрицательными

movf B0,W,A ; B1:B0 +A1:A0-> A1:A0

addwf A0,F,A

movf B1,W,A

addwfc A1,F,A

24 + 16

movf PRODL,W,A

addwf TBLPTRL,F,A

movf PRODH,W,A

addwfc TBLPTRH,F,A

btfsc STATUS, C, A

incf TBLPTRU,F,A

24 + 24 работает с отрицательными

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

32 + 16

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

32 + 32 (работает с отрицательными)

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

ВЫЧИТАНИЕ

ДEКРЕМЕНТАЦИЯ ДВУБАЙТНОГО ЧИСЛА

banksel byteL

decf byteL,F,B

btfss STATUS, C, A

decf byteH,F,B

16 - 8

bsf STATUS,0,A

subwf FSR1L,F,A

btfss STATUS,0,A

decf FSR1H,F,A

16 - 16

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

32 – 32

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

16 + 16 EEPROM (работает и с отрицательными)

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

РАЗНОЕ

ПЕРЕНОС 4 БАЙТНОЙ КОНСТАНТЫ В ЯЧЕЙКИ

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

ПРОВЕРКА ЧЕТЫРЕХ БАЙТ — ЕСТЬ ЛИ ХОТЯ БЫ В ОДНОМ — 1

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го



USART

ПРИНИМАЕМ С КОМПЬЮТЕРА В 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


;----начинаем

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

ПРИНИМАЕМ ДВА ДВУБАЙТНЫХ ЧИСЛА В USART, СКЛАДЫВАЕМ , ВОЗВРАЩАЕМ СУММУ В КОМП

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

ИСПОЛЬЗУЯ ПРЕРЫВАНИЯ ПРИНИМАЕМ БАЙТ В USART, И ОТСЫЛАЕМ ЕГО ОБРАТНО

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 ;используем макрос

----



-------сложение--------------

ЭНЕРГОНЕЗАВИСИМАЯ ПАМЯТЬ

MPM

Процедура 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

EEPROM

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

ЗАПИСЬ ДВУХ БАЙТ В ЕЕПРОМ С ДВУБАЙТНЫМ АДРЕСОМ C ПРОВЕРКОЙ НА ПОВТОРЕНИЕ СОДЕРЖИМОГО И ЗАПИСЫВАЕМОГО

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 ;пишем обратно байт в еепром но теперь бит говорит что разрешенные рп закончились

ЗАПИСЬ БАЙТА В ЗАРАНЕЕ НЕИЗВЕСНУЮ ОБЛАСТЬ ПАМЯТИ RAM

movlw high FLASH_BUFFER

movwf FSR0H

banksel tblptrLTochn

movff tblptrLTochn,FSR0L

movlw 0x77

movwf INDF0,0

КОПИРОВАНИЕ ИЗ EEPROMa В EEPROM ОДНОГО БАЙТА

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.