Вс сен 02, 2018 06:22:11
Вс сен 02, 2018 06:56:18
Вс сен 02, 2018 07:06:27
Вс сен 02, 2018 13:45:44
Вс сен 02, 2018 14:48:26
Вс сен 02, 2018 16:46:52
Вс сен 02, 2018 17:13:22
Вс сен 02, 2018 17:37:51
Вс сен 02, 2018 17:38:49
Пн сен 03, 2018 15:48:34
Вт окт 30, 2018 07:45:28
Все способы портят WREG, так что это не считается за особенность.
1. Самый надёжный способ, но нет изохронности.
; Если веток мало (дзен около 5-7, зависит от контроля границ) или сохранять PCLAT не хочется - то быстрее/удобнее работает тупой перебор:
; без порчи защёлок вычисляемым переходом и без необходимости контролировать номер ветки:
movf Case_Num,W,ACCESS ;
bz Case_0 ;
dcfsnz WREG,W,ACCESS
bra Case_1 ;
dcfsnz WREG,W,ACCESS
bra Case_2 ;
dcfsnz WREG,W,ACCESS
bra Case_3 ;
; Если номер > 3 то выполняется 4 ветка
; dcfsnz WREG,W,ACCESS
2. Макрос GoToWreg - остатки моей попытки просто складывать 24 бита адреса
GoToWreg macro TempBuff,Adr1 ; Использует Tmp 1 байт
; Переход на количество команд - смещение из WREG
; Команды располагаются непосредственно за макросом
; 20/03/2017 пробую укоротить максимально, Вроде 10 команд если 1 сдвиг
local BeginJumpBlock;
movwf TempBuff,Adr1; Спасаем РабРег
movlf High(BeginJumpBlock),PCLATH,ACCESS ; ПОРТИТ РАБРЕГ
bcf _C ; Чистим входной перенос
rlcf TempBuff,W,Adr1 ; Удваиваем номер байта для вычисляемого перехода
addlw Low(BeginJumpBlock) ; смещение в РабРеге,
btfsc _C ; Перенос был при сложении ?
incf PCLATH,F,ACCESS ; прибавляю 1 к среднему байту
clrf PCLATU,ACCESS ; Верхний - всегда =0
movwf PCL,ACCESS ; Заполняем PCLAT
BeginJumpBlock
endm
3. Макрос BraReg ; 8 команд, но BRA шагает лишь на 2^10 команд
BraReg macro RegPoint,Adr1 ; смещение номера БРА - в регистре
; Смещение - не изменяется
; Переход на количество команд - смещение из Регистра
; Команды располагаются непосредственно за макросом
local BeginJumpBlock;,Continue,Continue1 ;
movlf High(BeginJumpBlock),PCLATH,ACCESS ; ПОРТИТ РАБРЕГ
bcf _C ; Чистим входной перенос
rlcf RegPoint,W,Adr1 ; Удваиваем номер байта для вычисляемого перехода
addlw Low(BeginJumpBlock) ; смещение в РабРеге,
btfsc _C ; Перенос был при сложении ?
incf PCLATH,F,ACCESS ; прибавляю 1 к среднему байту
clrf PCLATU,ACCESS ; Верхний - всегда =0
movwf PCL,ACCESS ; Заполняем PCLAT
BeginJumpBlock
endm
4. Интересная сабпрога какого-то американца, примерно 6+4 циклов команд
; K8LH RE: PIC18F4331: COMPUTED GOTO!• Thursday, August 17, 2006 8:22 AM (permalink)
;http://www.microchip.com/forums/m182713.aspx javascript:void(showMsgNum(182838))
; Вариант вычисляемых переходов через саб прогу - быть могет удобен ?
; Две точки входа у одной сабпроги - в зависимости от используемых команд перехода.
CaseGoTo: ;; Смещение - WREG
bcf _C ; автор не чистил входной перенос - Чистка переноса на входе для пары сдвигов
rlncf WREG,F,ACCESS ; первый сдвиг
CaseBra: ; Второй вход - единственный сдвиг
rlncf WREG,F,ACCESS ;
bcf WREG,0,ACCESS ; чистка младшего бита для одного сдвига
addwf TOSL,f,ACCESS ; младший
movlw 0x0 ; авторская метка/фишка вместо традиционного CLRF WREG чистим
addwfc TOSH,f,ACCESS ; средний
;addwfc TOSU,f,ACCESS; старший for > 64-kbyte memory
return; Адрес возврата суммирован со смещением из WREG
; CLRF PCLATH
; CLRF PCLATU
RLNCF temp_code,W ; СДВИГ, УМНОЖАЮ НА 2
ORG 0X600
ADDWF PCL,F ; по лично мне здесь ошибка - используются PCLATH и PCLATU но в них неизвестные значения
; которые при сбросе могут быть любыми
BRA CODE_0
BRA CODE_1
BRA CODE_2
BRA CODE_3
BRA CODE_4
BRA CODE_5
BRA CODE_6
BRA CODE_7
Вт окт 30, 2018 10:41:17
Ср окт 31, 2018 10:02:49
Ср окт 31, 2018 11:16:45
Ср окт 31, 2018 12:09:40
Ср окт 31, 2018 12:30:29
Ср окт 31, 2018 14:03:40
Ср окт 31, 2018 16:28:09
Ср окт 31, 2018 16:57:31
Ср окт 31, 2018 17:44:55