Код: Выделить всё
; 001xxxxx
rrf Rx,f ; 0001xxxx
swapf Rx,w ; хххх0001
andlw b'00000111' : W=xxxxx001
movwf OPTIONКстати, ещё "когтисто" забыли. Колючелапо - это не визуальный признак))
Код: Выделить всё
; 001xxxxx
rrf Rx,f ; 0001xxxx
swapf Rx,w ; хххх0001
andlw b'00000111' : W=xxxxx001
movwf OPTIONКод: Выделить всё
; Вычисление Rtmp2 >^2, веса бита, следующего за старшим единичным, 7bit=128->256 ... 3bit=8->16 ... 0bit=1->2
<------>movlw<->9h<----><------>; кол-во циклов сдвига * 2
<------>movwf<->Rtmp1
srchHbit: decf<>Rtmp1,F
<------>rlf<--->Rtmp2,F
<------>btfss<->STATUS,C
<------>goto<-->srchHbit
<------>clrw<--><------><------>; Rtmp1 = вес старшего знач бита * 2, иначе вес следующего за старшим знач бита
wght2nmb: addlw>1
<------>decf<-->Rtmp1,F
<------>btfss<->STATUS,C
<------>goto<-->wght2nmb
<------>movwf<->pTMRon<><------>; W = OPTION:00000:PS[2:0]Код: Выделить всё
ip1
movlw 07h
movwf reg
;
ip1.it1
btfsc val,7
goto ip1.rez
rlf val,f
decfsz reg,f
goto ip1.it1
;
ip1.rez
movf reg,w
movwf OPTION_REG
Код: Выделить всё
PS<2:0>: Prescaler Rate Select bits Bit Value TMR0
000 1:2
001 1:4
010 1:8
011 1:16
100 1:32
101 1:64
110 1:128
111 1:256Код: Выделить всё
;******************************************************************************
; This file is a basic code template for object module code *
; generation on the PIC12F629. This file contains the *
; basic code building blocks to build upon. *
; *
; Refer to the MPASM User's Guide for additional information on *
; features of the assembler and linker (Document DS33014). *
; *
; Refer to the respective PIC data sheet for additional *
; information on the instruction set. *
; *
;******************************************************************************
; *
; Filename: xxx.asm *
; Date: *
; File Version: *
; *
; Author: *
; Company: *
; *
; *
;******************************************************************************
; *
; Files required: P12F629.INC *
; *
; *
; *
;******************************************************************************
; *
; Notes: *
; *
;******************************************************************************
;------------------------------------------------------------------------------
; PROCESSOR DECLARATION
;------------------------------------------------------------------------------
LIST P=12F629 ; list directive to define processor
#INCLUDE <P12F629.INC> ; processor specific variable definitions
;------------------------------------------------------------------------------
;
; CONFIGURATION WORD SETUP
;
; The 'CONFIG' directive is used to embed the configuration word within the
; .asm file. The lables following the directive are located in the respective
; .inc file. See the data sheet for additional information on configuration
; word settings.
;
;------------------------------------------------------------------------------
__CONFIG _CP_OFF & _CPD_OFF & _BODEN_OFF & _MCLRE_ON & _WDT_OFF & _PWRTE_ON & _INTRC_OSC_NOCLKOUT
;------------------------------------------------------------------------------
; VARIABLE DEFINITIONS
;------------------------------------------------------------------------------
; example of using Shared Uninitialized Data Section
INT_VAR UDATA_SHR 0x20
W_TEMP RES 1 ; variable used for context saving
STATUS_TEMP RES 1 ; variable used for context saving
tmp0 RES 1 ; блок временных регистров
datas RES 1 ; данные к обработке
reg_mask RES 1 ; скользящая маска
;------------------------------------------------------------------------------
; определение констант
start_mask equ 0x80 ; 10000000 двоичное (1 в старшем бите)
;------------------------------------------------------------------------------
; EEPROM INITIALIZATION
;
; The 12F629 has 128 bytes of non-volatile EEPROM, starting at address 0x2100
;
;------------------------------------------------------------------------------
DATAEE CODE 0x2100
DE "MCHP" ; Place 'M' 'C' 'H' 'P' at address 0,1,2,3
;------------------------------------------------------------------------------
; OSCILLATOR CALIBRATION VALUE
;------------------------------------------------------------------------------
OSC CODE 0x03FF
; Internal RC calibration value is placed at location 0x3FF by Microchip as
; a 0xADDLW K instruction, where the K is a literal value to be loaded into
; the OSCCAL register.
;------------------------------------------------------------------------------
; RESET VECTOR
;------------------------------------------------------------------------------
RESET_VECTOR CODE 0x0000 ; processor reset vector
GOTO START ; go to beginning of program
;------------------------------------------------------------------------------
; INTERRUPT SERVICE ROUTINE
;------------------------------------------------------------------------------
INT_VECTOR CODE 0x0004 ; interrupt vector location
MOVWF W_TEMP ; save off current W register contents
MOVF STATUS,w ; move status register into W register
MOVWF STATUS_TEMP ; save off contents of STATUS register
; isr code can go here or be located as a call subroutine elsewhere
MOVF STATUS_TEMP,w ; retrieve copy of STATUS register
MOVWF STATUS ; restore pre-isr STATUS register contents
SWAPF W_TEMP,f
SWAPF W_TEMP,w ; restore pre-isr W register contents
RETFIE ; return from interrupt
;------------------------------------------------------------------------------
; MAIN PROGRAM
;------------------------------------------------------------------------------
MAIN_PROG CODE
START
;------------------------------------------------------------------------------
; OSCCAL RESTORE (not required if internal OSC is not used)
;------------------------------------------------------------------------------
; -------------- закрыто на время теста --------------
; errorlevel -302
; BSF STATUS,RP0 ; set file register bank to 1
; CALL 0x3FF ; retrieve factory calibration value
; MOVWF OSCCAL ; update register with factory cal value
; BCF STATUS,RP0 ; set file register bank to 0
; errorlevel +302
;------------------------------------------------------------------------------
; PLACE USER PROGRAM HERE
;------------------------------------------------------------------------------
new_test
movlw 0x56 ; исходные данные для анализа
rep_test
movwf datas ; загружены в datas
movlw start_mask ; стартовая маска анализатора
movwf reg_mask ; загружена в reg_mask
step1
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 7
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 6/
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 6
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 5/
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 5
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 4/
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 4
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 3/
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 3
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 2/
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 2
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 1/
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 1
goto step2 ; jnz переходим к второму анализатору
rrf reg_mask,f ; jz продолжаем /сдвиг маски в бит 0/
; анализ младшего значащего бита на первой ступени лишен смысла так как
; за ним нет больше бит для второй ступени анализа
goto error_test ; обработчик ошибки
step2
rrf reg_mask,f ; сдвиг маски в следующий бит 6 или 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 6 или 0
goto test_ends ; jnz выход с результатом в start_mask
movf reg_mask,f ; (TSTF) анализ на маску не равную 0
btfsc STATUS,Z
goto error_test ; обработчик ошибки
rrf reg_mask,f ; сдвиг маски в следующий бит 5 или 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 5 или 0
goto test_ends ; jnz выход с результатом в start_mask
movf reg_mask,f ; (TSTF) анализ на маску не равную 0
btfsc STATUS,Z
goto error_test ; обработчик ошибки
rrf reg_mask,f ; сдвиг маски в следующий бит 4 или 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 4 или 0
goto test_ends ; jnz выход с результатом в start_mask
movf reg_mask,f ; (TSTF) анализ на маску не равную 0
btfsc STATUS,Z
goto error_test ; обработчик ошибки
rrf reg_mask,f ; сдвиг маски в следующий бит 3 или 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 3 или 0
goto test_ends ; jnz выход с результатом в start_mask
movf reg_mask,f ; (TSTF) анализ на маску не равную 0
btfsc STATUS,Z
goto error_test ; обработчик ошибки
rrf reg_mask,f ; сдвиг маски в следующий бит 2 или 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 2 или 0
goto test_ends ; jnz выход с результатом в start_mask
movf reg_mask,f ; (TSTF) анализ на маску не равную 0
btfsc STATUS,Z
goto error_test ; обработчик ошибки
rrf reg_mask,f ; сдвиг маски в следующий бит 1 или 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 1 или 0
goto test_ends ; jnz выход с результатом в start_mask
movf reg_mask,f ; (TSTF) анализ на маску не равную 0
btfsc STATUS,Z
goto error_test ; обработчик ошибки
rrf reg_mask,f ; сдвиг маски в следующий бит 0
movf datas,w
andwf reg_mask,w
btfss STATUS,Z ; контроль результата теста бита 0
goto test_ends ; jnz выход с результатом в start_mask
;movf reg_mask,f ; (TSTF) анализ на маску не равную 0
;btfsc STATUS,Z
error_test ; обработчик ошибки
nop
goto $ ; аварийный останов (желательно с разбором ошибок)
test_ends ; завершение программы в start_mask результат
nop ; для тест прогона в дебаггере - тут при останове
nop ; вводим в W новое значение данных
nop
goto rep_test
END ; directive 'end of program'