PIC10F322 周波数カウンタ Part2
PIC10F322を用いた周波数カウンターPart2です。
全ての周波数帯でゲート時間を1秒としています。
TMR0のオーバーフローを検出してパルス数に加算する方式です。
スケール表示でなく、全桁表示します。
信号入力はRA2(T0CKI)直結、結果はRA0(TX)にてシリアル出力されます。
測定精度を上げるためPIC10F322は16MHzの外部クロックで作動させます。
ブートローダー下ではなく、スタンドアローンで作動します。
回路図はAN592準拠のものと同じです。
<計測誤差>

手持ちのクロックオシレーターを使用した計測結果です。
<ソースプログラム>
LIST P=PIC10F322
#INCLUDE <P10F322.inc>
__CONFIG _FOSC_EC & _BOREN_OFF & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _LVP_OFF & _LPBOR_OFF & _BORV_HI & _WRT_OFF
#DEFINE TX 0 ;RS-232C データ出力用ビット
#DEFINE RX 3 ;RS-232C データ入力用ビット
#DEFINE Direct ;RS-232C直結方式、コメントアウトで反転方式
;
;****************************************************************************************
;* *
;* 注意(重要) *
;* *
;* 本デモプログラムはパソコンで周波数を表示します。 、 *
;* *
;* 通信にTX=RA0,RX=RA3を使用します。信号入力はRA2(T0CKI)です。 *
;* *
;* RA1にはクリスタルオシレーター16MHzの出力を接続します。 *
;* *
;* ご使用にはTREATERMやハイパーターミナルなどのターミナルソフトが必要です。 *
;* 通信条件: ボーレート19200、8ビット、1ストップビット、ノーパリティ *
;* *
;****************************************************************************************
;
; ********************************************************************
; Define General Purpose Registers (64 bytes maximum; 40h-7fh)
; Bank 0 Only
; ********************************************************************
;
cn equ 0x40
rs equ 0x41
rxd equ 0x42
IRF equ 0x43
temp equ 0x44
FL equ 0x50
FM equ 0x51
FH equ 0x52
FU equ 0x53
BIN0 equ FL ;32bit bin
BIN1 equ FM
BIN2 equ FH
BIN3 equ FU
BCD0 equ 0x54 ;BCD
BCD1 equ 0x55
BCD2 equ 0x56
BCD3 equ 0x57
BCD4 equ 0x58
cnt equ 0x59 ; loop counter
btime equ 42h ;19200bps 16MHz時のウエイトタイム
;
;/////////////////////////////////////////////////////////////////
;
; プログラムコード
;
;/////////////////////////////////////////////////////////////////
ORG 0x0000
goto INIT
ORG 0x0004 ;割り込みベクター
BCF T2CON,TMR2ON ;TMR2=OFF 1サイクル
BCF INTCON,TMR0IF ;TMR0割り込みフラグクリア 1サイクル
BSF IRF,0 ;割り込み完了フラグセット 1サイクル
RETFIE ; 2サイクル
INIT
CLRF PORTA ;
CLRF LATA ;
CLRF ANSELA ;全てデジタルポートに設定
MOVLW B'11111110' ;RA0のみ出力に設定
MOVWF TRISA ;PA0:TX RA1:CLKIN RA2:T0CKI PA3:RX
MOVLW B'00110111' ;TMR0=T0CKI,Prescale=265,H->Lでインクリメント
MOVWF OPTION_REG ;
MOVLW B'0000000' ;TMR2=OFF,Prescale=1,Postscale=1
MOVWF T2CON ;
MOVLW 0xFF ;PR2=0xFF
MOVWF PR2 ;
BSF INTCON,GIE ;グローバル割り込みを許可
repeat
CLRF FU ;
CLRF FH ;
BSF OPTION_REG,T0CS ;TMR0=Counter MODE
CLRF TMR2 ;TMR2=0
BCF INTCON,TMR0IF ;TMR0割り込みフラグクリア
CLRF TMR0 ;
call delay1S ;wait for 1S
BCF OPTION_REG,T0CS ;TMR0=Timer MODE
MOVF TMR0,W ;W=TMR0
BSF T2CON,TMR2ON ;TMR2=ON
MOVWF FM ;FM=TMR0
BCF INTCON,TMR0IF ;TMR0割り込みフラグクリア
BSF INTCON,TMR0IE ;TMR0割り込み許可
CLRF IRF ;割り込み待ち
BTFSS IRF,0 ;
GOTO $-1 ;
BCF INTCON,TMR0IE ;TMR0割り込み禁止
COMF TMR2,W ;FL=/TMR2
MOVWF FL ;
MOVLW 0x04 ;割り込みレイテンシ+TMR0の作動遅れを補正
ADDWF FL,F
MOVWF 0x01
BTFSC STATUS,C
ADDWF FM,F
BTFSC STATUS,C
ADDWF FH,F
BTFSC STATUS,C
ADDWF FU,F
DISP
call bin2bcd ; convert to 32-bit binary to 10 bcd
SWAPF BCD4,W ;10桁表示
CALL H2B ;
MOVF BCD4,W ;
CALL H2B ;
SWAPF BCD3,W ;
CALL H2B ;
MOVF BCD3,W ;
CALL H2B ;
SWAPF BCD2,W ;
CALL H2B ;
MOVF BCD2,W ;
CALL H2B ;
SWAPF BCD1,W ;
CALL H2B ;
MOVF BCD1,W ;
CALL H2B ;
SWAPF BCD0,W ;
CALL H2B ;
MOVF BCD0,W ;
CALL H2B ;
MOVLW " " ; Hz
CALL rs1tx ;
MOVLW "H" ;
CALL rs1tx ;
MOVLW "z" ;
CALL rs1tx ;
MOVLW 0x0D ;改行
CALL rs1tx ;
MOVLW 0x0A ;
CALL rs1tx ;
goto repeat
;/////////////////////////////////////////////////////////////////
;
; サブルーチン
;
;/////////////////////////////////////////////////////////////////
;
delay1S
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
delay100ms
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
delay10ms
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
delay1ms
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
delay50us
movlw d'63' ;0.25 us
movwf temp ;0.25 us
BTFSS INTCON,TMR0IF ;TMR0IF=1? 0.25 us
GOTO TMIF00 ; 0.25 us(skip)
BCF INTCON,TMR0IF ;TMR0割り込みフラグクリア 0.25 us
INCF FU,F ;FU:FH=FU:FH+1 0.25 us
INCFSZ FH,F ; 0.25 us
DECF FU,F ; 0.25 us 0.25+0.25+0.25+0.25+0.25+0.25=1.5
TMIF01
decfsz temp,f ;0.25 us
goto $-1 ;0.5 us
return ;0.5 us total:0.25+0.25+1.5+(0.25+0.5)*63-0.25+0.5=49.5 us
TMIF00
NOP ;0.25 us
GOTO TMIF01 ;0.5 us 0.25+0.5+0.25+0.5=1.5
H2B ;BCDデータをASCIIコードに変換して印字
ANDLW 0x0F ;
IORLW 0x30 ;
GOTO rs1tx ;
;
;*****************************************************************************
; * bin2bcd *
; * *
; * Purpose: This subroutine converts a 32 bit binary number to a 10 digit *
; * BCD number. The input value taken from BIN(0 to 3) is *
; * preserved. The output is in BCD(0 to 4). Each byte holds => *
; * (hi_digit,lo_digit); most significant digits are in BCD4. *
; * This routine is a modified version of one described in *
; * MicroChip application note AN526. *
; * Input: The value in BIN0 ... BIN3 *
; * Output: The BCD number in BCD0 ... BCD4 *
;*****************************************************************************
bin2bcd
movlw .32 ; Set loop counter
movwf cnt ; to 32
clrf BCD0 ; Clear output
clrf BCD1 ;
clrf BCD2 ;
clrf BCD3 ;
clrf BCD4 ;
bin_loop
bcf STATUS,C ; Clear carry bit in STATUS
;
rlf BIN0,f ; Rotate left, 0 -> LS bit, MS bit -> Carry
rlf BIN1,f ; Rotate left, Carry->LS bit, MS bit->Carry
rlf BIN2,f ; Rotate left, Carry->LS bit, MS bit->Carry
rlf BIN3,f ; Rotate left, Carry->LS bit, MS bit->Carry
btfsc STATUS,C ; Is Carry clear?If so,skip next instruction
bsf BIN0,0 ; Carry is set so wrap and set bit0 in BIN0
;
rlf BCD0,f ; Rotate left, Carry->LS bit, MS bit->Carry
rlf BCD1,f ; Rotate left, Carry->LS bit, MS bit->Carry
rlf BCD2,f ; Rotate left, Carry->LS bit, MS bit->Carry
rlf BCD3,f ; Rotate left, Carry->LS bit, MS bit->Carry
rlf BCD4,f ; Rotate left, Carry->LS bit, MS bit->Carry
decf cnt,f ; Decrement loop count
btfss STATUS,Z ; Is loop count now zero?
goto adjust ; No, go to adjust
return ;
;
adjust
movlw BCD0 ; Get pointer to BCD0
movwf FSR ; Put pointer in FSR for indirect addressing
call adjbcd ;
incf FSR,f ; Move indirect addressing pointer to BCD1
call adjbcd ;
incf FSR,f ; Move indirect addressing pointer to BCD2
call adjbcd ;
incf FSR,f ; Move indirect addressing pointer to BCD3
call adjbcd ;
incf FSR,f ; Move indirect addressing pointer to BCD4
call adjbcd ;
goto bin_loop ; Back to main loop of bin2BCD
adjbcd
movlw 0x03 ; Add 3
addwf INDF,w ; to LS digit
movwf temp ; Save in temp
btfsc temp,3 ; Is LS digit + 3 > 7 (Bit 3 set)
movwf INDF ; Yes, save incremented value as LS digit
movlw 0x30 ; Add 3
addwf INDF,w ; to MS digit
movwf temp ; Save as temp
btfsc temp,7 ; Is MS digit + 3 > 7 (Bit 7 set)
movwf INDF ; Yes, save incremented value as MS digit
return
;
; ********************************************************************
;
; RS-232C 1文字送信
;
; 送信文字を w にセットして呼ぶ
;
; ********************************************************************
rs1tx
movwf rxd ;rxd=W
#ifdef Direct
bsf PORTA,TX
#else
bcf PORTA,TX
#endif
call bwait ;スタートビット 1ビット分待つ
movlw 8 ;送信ビット数
movwf cn
r1tx11
rrf rxd,f
#ifdef Direct
btfsc STATUS,C
#else
btfss STATUS,C
#endif
bcf PORTA,TX ;
#ifdef Direct
btfss STATUS,C
#else
btfsc STATUS,C
#endif
bsf PORTA,TX
call bwait ;1ビットのウエイト
decfsz cn,f ;8ビット送信したか?
goto r1tx11 ;
call ret00 ;6サイクルウエイト (call+goto+return)
#ifdef Direct
BCF PORTA,TX
#else
BSF PORTA,TX
#endif
bwait ;1ビットのウエイトを作る
call bwait2 ;0.5 us total:0.5+24.5+24.5=49.5us
bwait2 ;1/2ビットのウエイトを作る
movlw btime/2-2 ;0.25 us
movwf rs ;0.25 us
decfsz rs,f ;0.25 us
goto $-1 ;0.5 us
ret00
goto $+1 ;0.5 us
return ;0.5 us total:0.25+0.25+(0.25+0.5)*(33-2)-0.25+0.5+0.5=24.5us
end
<HEXファイル>
:020000040000FA
:020000000828CE
:0800080013110B114314090050
:10001000850187018801FE30860037308E00003070
:100020009300FF3092008B17D301D2018E169101FD
:100030000B11810150208E1201081315D1000B11F4
:100040008B16C301431C22288B121109D0000430E7
:10005000D00781000318D1070318D2070318D3076C
:100060008E20580E8B2058088B20570E8B20570857
:100070008B20560E8B2056088B20550E8B20550852
:100080008B20540E8B2054088B202030BC2048300D
:10009000BC207A30BC200D30BC200A30BC20142893
:1000A0005920592059205920592059205920592088
:1000B0005920622062206220622062206220622039
:1000C000622062206B206B206B206B206B206B20EA
:1000D0006B206B206B207E207E207E207E207E2069
:1000E0007E207E207E207E207E207E207E207E2020
:1000F0007E207E207E207E207E207E203F30C40019
:100100000B1D89280B11D30AD20FD303C40B8628E9
:100110000800000086280F393038BC282030D9006C
:10012000D401D501D601D701D8010310D00DD10DCE
:10013000D20DD30D03185014D40DD50DD60DD70DF7
:10014000D80DD903031DA528080054308400B12020
:10015000840AB120840AB120840AB120840AB12023
:10016000952803300007C400C41980003030000710
:10017000C400C41B80000800C2000514CB20083056
:10018000C000C20C03180510031C0514CB20C00BC3
:10019000C128D0200510CC201F30C100C10BCE28B3
:0401A000D12808005A
:02400E008138F7
:00000001FF
.
全ての周波数帯でゲート時間を1秒としています。
TMR0のオーバーフローを検出してパルス数に加算する方式です。
スケール表示でなく、全桁表示します。
信号入力はRA2(T0CKI)直結、結果はRA0(TX)にてシリアル出力されます。
測定精度を上げるためPIC10F322は16MHzの外部クロックで作動させます。
ブートローダー下ではなく、スタンドアローンで作動します。
回路図はAN592準拠のものと同じです。
<計測誤差>

手持ちのクロックオシレーターを使用した計測結果です。
<ソースプログラム>
LIST P=PIC10F322
#INCLUDE <P10F322.inc>
__CONFIG _FOSC_EC & _BOREN_OFF & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _LVP_OFF & _LPBOR_OFF & _BORV_HI & _WRT_OFF
#DEFINE TX 0 ;RS-232C データ出力用ビット
#DEFINE RX 3 ;RS-232C データ入力用ビット
#DEFINE Direct ;RS-232C直結方式、コメントアウトで反転方式
;
;****************************************************************************************
;* *
;* 注意(重要) *
;* *
;* 本デモプログラムはパソコンで周波数を表示します。 、 *
;* *
;* 通信にTX=RA0,RX=RA3を使用します。信号入力はRA2(T0CKI)です。 *
;* *
;* RA1にはクリスタルオシレーター16MHzの出力を接続します。 *
;* *
;* ご使用にはTREATERMやハイパーターミナルなどのターミナルソフトが必要です。 *
;* 通信条件: ボーレート19200、8ビット、1ストップビット、ノーパリティ *
;* *
;****************************************************************************************
;
; ********************************************************************
; Define General Purpose Registers (64 bytes maximum; 40h-7fh)
; Bank 0 Only
; ********************************************************************
;
cn equ 0x40
rs equ 0x41
rxd equ 0x42
IRF equ 0x43
temp equ 0x44
FL equ 0x50
FM equ 0x51
FH equ 0x52
FU equ 0x53
BIN0 equ FL ;32bit bin
BIN1 equ FM
BIN2 equ FH
BIN3 equ FU
BCD0 equ 0x54 ;BCD
BCD1 equ 0x55
BCD2 equ 0x56
BCD3 equ 0x57
BCD4 equ 0x58
cnt equ 0x59 ; loop counter
btime equ 42h ;19200bps 16MHz時のウエイトタイム
;
;/////////////////////////////////////////////////////////////////
;
; プログラムコード
;
;/////////////////////////////////////////////////////////////////
ORG 0x0000
goto INIT
ORG 0x0004 ;割り込みベクター
BCF T2CON,TMR2ON ;TMR2=OFF 1サイクル
BCF INTCON,TMR0IF ;TMR0割り込みフラグクリア 1サイクル
BSF IRF,0 ;割り込み完了フラグセット 1サイクル
RETFIE ; 2サイクル
INIT
CLRF PORTA ;
CLRF LATA ;
CLRF ANSELA ;全てデジタルポートに設定
MOVLW B'11111110' ;RA0のみ出力に設定
MOVWF TRISA ;PA0:TX RA1:CLKIN RA2:T0CKI PA3:RX
MOVLW B'00110111' ;TMR0=T0CKI,Prescale=265,H->Lでインクリメント
MOVWF OPTION_REG ;
MOVLW B'0000000' ;TMR2=OFF,Prescale=1,Postscale=1
MOVWF T2CON ;
MOVLW 0xFF ;PR2=0xFF
MOVWF PR2 ;
BSF INTCON,GIE ;グローバル割り込みを許可
repeat
CLRF FU ;
CLRF FH ;
BSF OPTION_REG,T0CS ;TMR0=Counter MODE
CLRF TMR2 ;TMR2=0
BCF INTCON,TMR0IF ;TMR0割り込みフラグクリア
CLRF TMR0 ;
call delay1S ;wait for 1S
BCF OPTION_REG,T0CS ;TMR0=Timer MODE
MOVF TMR0,W ;W=TMR0
BSF T2CON,TMR2ON ;TMR2=ON
MOVWF FM ;FM=TMR0
BCF INTCON,TMR0IF ;TMR0割り込みフラグクリア
BSF INTCON,TMR0IE ;TMR0割り込み許可
CLRF IRF ;割り込み待ち
BTFSS IRF,0 ;
GOTO $-1 ;
BCF INTCON,TMR0IE ;TMR0割り込み禁止
COMF TMR2,W ;FL=/TMR2
MOVWF FL ;
MOVLW 0x04 ;割り込みレイテンシ+TMR0の作動遅れを補正
ADDWF FL,F
MOVWF 0x01
BTFSC STATUS,C
ADDWF FM,F
BTFSC STATUS,C
ADDWF FH,F
BTFSC STATUS,C
ADDWF FU,F
DISP
call bin2bcd ; convert to 32-bit binary to 10 bcd
SWAPF BCD4,W ;10桁表示
CALL H2B ;
MOVF BCD4,W ;
CALL H2B ;
SWAPF BCD3,W ;
CALL H2B ;
MOVF BCD3,W ;
CALL H2B ;
SWAPF BCD2,W ;
CALL H2B ;
MOVF BCD2,W ;
CALL H2B ;
SWAPF BCD1,W ;
CALL H2B ;
MOVF BCD1,W ;
CALL H2B ;
SWAPF BCD0,W ;
CALL H2B ;
MOVF BCD0,W ;
CALL H2B ;
MOVLW " " ; Hz
CALL rs1tx ;
MOVLW "H" ;
CALL rs1tx ;
MOVLW "z" ;
CALL rs1tx ;
MOVLW 0x0D ;改行
CALL rs1tx ;
MOVLW 0x0A ;
CALL rs1tx ;
goto repeat
;/////////////////////////////////////////////////////////////////
;
; サブルーチン
;
;/////////////////////////////////////////////////////////////////
;
delay1S
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
call delay100ms ;+100000 us
delay100ms
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
call delay10ms ;+10000 us
delay10ms
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
call delay1ms ;+1000 us
delay1ms
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
call delay50us ;+50 us
delay50us
movlw d'63' ;0.25 us
movwf temp ;0.25 us
BTFSS INTCON,TMR0IF ;TMR0IF=1? 0.25 us
GOTO TMIF00 ; 0.25 us(skip)
BCF INTCON,TMR0IF ;TMR0割り込みフラグクリア 0.25 us
INCF FU,F ;FU:FH=FU:FH+1 0.25 us
INCFSZ FH,F ; 0.25 us
DECF FU,F ; 0.25 us 0.25+0.25+0.25+0.25+0.25+0.25=1.5
TMIF01
decfsz temp,f ;0.25 us
goto $-1 ;0.5 us
return ;0.5 us total:0.25+0.25+1.5+(0.25+0.5)*63-0.25+0.5=49.5 us
TMIF00
NOP ;0.25 us
GOTO TMIF01 ;0.5 us 0.25+0.5+0.25+0.5=1.5
H2B ;BCDデータをASCIIコードに変換して印字
ANDLW 0x0F ;
IORLW 0x30 ;
GOTO rs1tx ;
;
;*****************************************************************************
; * bin2bcd *
; * *
; * Purpose: This subroutine converts a 32 bit binary number to a 10 digit *
; * BCD number. The input value taken from BIN(0 to 3) is *
; * preserved. The output is in BCD(0 to 4). Each byte holds => *
; * (hi_digit,lo_digit); most significant digits are in BCD4. *
; * This routine is a modified version of one described in *
; * MicroChip application note AN526. *
; * Input: The value in BIN0 ... BIN3 *
; * Output: The BCD number in BCD0 ... BCD4 *
;*****************************************************************************
bin2bcd
movlw .32 ; Set loop counter
movwf cnt ; to 32
clrf BCD0 ; Clear output
clrf BCD1 ;
clrf BCD2 ;
clrf BCD3 ;
clrf BCD4 ;
bin_loop
bcf STATUS,C ; Clear carry bit in STATUS
;
rlf BIN0,f ; Rotate left, 0 -> LS bit, MS bit -> Carry
rlf BIN1,f ; Rotate left, Carry->LS bit, MS bit->Carry
rlf BIN2,f ; Rotate left, Carry->LS bit, MS bit->Carry
rlf BIN3,f ; Rotate left, Carry->LS bit, MS bit->Carry
btfsc STATUS,C ; Is Carry clear?If so,skip next instruction
bsf BIN0,0 ; Carry is set so wrap and set bit0 in BIN0
;
rlf BCD0,f ; Rotate left, Carry->LS bit, MS bit->Carry
rlf BCD1,f ; Rotate left, Carry->LS bit, MS bit->Carry
rlf BCD2,f ; Rotate left, Carry->LS bit, MS bit->Carry
rlf BCD3,f ; Rotate left, Carry->LS bit, MS bit->Carry
rlf BCD4,f ; Rotate left, Carry->LS bit, MS bit->Carry
decf cnt,f ; Decrement loop count
btfss STATUS,Z ; Is loop count now zero?
goto adjust ; No, go to adjust
return ;
;
adjust
movlw BCD0 ; Get pointer to BCD0
movwf FSR ; Put pointer in FSR for indirect addressing
call adjbcd ;
incf FSR,f ; Move indirect addressing pointer to BCD1
call adjbcd ;
incf FSR,f ; Move indirect addressing pointer to BCD2
call adjbcd ;
incf FSR,f ; Move indirect addressing pointer to BCD3
call adjbcd ;
incf FSR,f ; Move indirect addressing pointer to BCD4
call adjbcd ;
goto bin_loop ; Back to main loop of bin2BCD
adjbcd
movlw 0x03 ; Add 3
addwf INDF,w ; to LS digit
movwf temp ; Save in temp
btfsc temp,3 ; Is LS digit + 3 > 7 (Bit 3 set)
movwf INDF ; Yes, save incremented value as LS digit
movlw 0x30 ; Add 3
addwf INDF,w ; to MS digit
movwf temp ; Save as temp
btfsc temp,7 ; Is MS digit + 3 > 7 (Bit 7 set)
movwf INDF ; Yes, save incremented value as MS digit
return
;
; ********************************************************************
;
; RS-232C 1文字送信
;
; 送信文字を w にセットして呼ぶ
;
; ********************************************************************
rs1tx
movwf rxd ;rxd=W
#ifdef Direct
bsf PORTA,TX
#else
bcf PORTA,TX
#endif
call bwait ;スタートビット 1ビット分待つ
movlw 8 ;送信ビット数
movwf cn
r1tx11
rrf rxd,f
#ifdef Direct
btfsc STATUS,C
#else
btfss STATUS,C
#endif
bcf PORTA,TX ;
#ifdef Direct
btfss STATUS,C
#else
btfsc STATUS,C
#endif
bsf PORTA,TX
call bwait ;1ビットのウエイト
decfsz cn,f ;8ビット送信したか?
goto r1tx11 ;
call ret00 ;6サイクルウエイト (call+goto+return)
#ifdef Direct
BCF PORTA,TX
#else
BSF PORTA,TX
#endif
bwait ;1ビットのウエイトを作る
call bwait2 ;0.5 us total:0.5+24.5+24.5=49.5us
bwait2 ;1/2ビットのウエイトを作る
movlw btime/2-2 ;0.25 us
movwf rs ;0.25 us
decfsz rs,f ;0.25 us
goto $-1 ;0.5 us
ret00
goto $+1 ;0.5 us
return ;0.5 us total:0.25+0.25+(0.25+0.5)*(33-2)-0.25+0.5+0.5=24.5us
end
<HEXファイル>
:020000040000FA
:020000000828CE
:0800080013110B114314090050
:10001000850187018801FE30860037308E00003070
:100020009300FF3092008B17D301D2018E169101FD
:100030000B11810150208E1201081315D1000B11F4
:100040008B16C301431C22288B121109D0000430E7
:10005000D00781000318D1070318D2070318D3076C
:100060008E20580E8B2058088B20570E8B20570857
:100070008B20560E8B2056088B20550E8B20550852
:100080008B20540E8B2054088B202030BC2048300D
:10009000BC207A30BC200D30BC200A30BC20142893
:1000A0005920592059205920592059205920592088
:1000B0005920622062206220622062206220622039
:1000C000622062206B206B206B206B206B206B20EA
:1000D0006B206B206B207E207E207E207E207E2069
:1000E0007E207E207E207E207E207E207E207E2020
:1000F0007E207E207E207E207E207E203F30C40019
:100100000B1D89280B11D30AD20FD303C40B8628E9
:100110000800000086280F393038BC282030D9006C
:10012000D401D501D601D701D8010310D00DD10DCE
:10013000D20DD30D03185014D40DD50DD60DD70DF7
:10014000D80DD903031DA528080054308400B12020
:10015000840AB120840AB120840AB120840AB12023
:10016000952803300007C400C41980003030000710
:10017000C400C41B80000800C2000514CB20083056
:10018000C000C20C03180510031C0514CB20C00BC3
:10019000C128D0200510CC201F30C100C10BCE28B3
:0401A000D12808005A
:02400E008138F7
:00000001FF
.
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT
- ご質問などはこちらからどうぞ
- ページ更新情報
- 最近嬉しかったこと
- 1kワードのTINYBASIC STM32L010F4
- やってくれたな!!店長よ
- 東大版TINYBASIC (STM32)
- 1kワードのTINYBASIC STM32版 その2
- 1kワードのTINYBASIC STM32版 その1
- 1kワードのTINYBASIC その8
- 1kワードのTINYBASIC その7
- 1kワードのTINYBASIC その6
- 1kワードのTINYBASIC その5
- 1kワードのTINYBASIC その4
- 1kワードのTINYBASIC その3
- 1kワードのTINYBASIC その2
- 1kワードのTINYBASIC その1
- 電大版TINYBASIC for PIC ミニマムお試し版5
- 電大版TINYBASIC for PIC ミニマムお試し版4
- 電大版TINYBASIC for PIC ミニマムお試し版3
- 電大版TINYBASIC for PIC ミニマムお試し版2
- 電大版TINYBASIC for PIC ミニマムお試し版
- PICで電大版TINYBASIC 実装編その5
- PICで電大版TINYBASIC 実装編その4
- PICで電大版TINYBASIC 実装編その3
- PICで電大版TINYBASIC 実装編その2
- PICで電大版TINYBASIC 実装編その1
- PICで電大版TINYBASIC 準備編その2
- PICで電大版TINYBASIC 準備編その1
- PIC18F24K42をPICKIT2で焼くTIPS その2
- PIC18F24K42をPICKIT2で焼くTIPS
- PIC16F18313ブートローダー書き込み器の製作
- PIC16F18857をPICKIT2で焼くその2
- PIC16F18857をPICKIT2で焼く
- PIC16F18313をPICKIT2で焼くその2
- PIC16F18313をPICKIT2で焼く
- PIC16F5XX USBIO
- HVT-BT200の予約制御
- 再考 PIC16F57 USBIO
- PIC16F5X USBIO
- 続12 8ピンPICでUSB PIC16F18313 HID-シリアルアダプター
- ucontrol.com.arに接続できない
- 続続 LPC1114 USBブートローダー
- 続PIC10F200 電子サイコロ
- PIC10F200 電子サイコロ
- LPC1114 8ch簡易ロジックアナライザー USB版
- 続 LPC1114 USBブートローダー
- LPC1114 8ch簡易ロジックアナライザー
- LPC1114 USBブートローダー
- LPC1114でUSB
- 続LPC810でUSB
- LPC810でUSB
- USB_NCO
- USB出力の周波数カウンター
- HIDアダプターについてのまとめ その2
- HIDアダプターについてのまとめ
- 極小ブートローダー まとめ
- 極小ブートローダー ATTiny 其の2
- 極小ブートローダー PIC10F322 其の6
- 極小ブートローダー PIC10F322 其の5
- 極小ブートローダー PIC10F322 其の4
- 極小ブートローダー PIC10F322 其の3
- 極小ブートローダー ATTiny13A
- 極小ブートローダー PIC10F322 其の2
- 極小ブートローダー PIC10F322
- 続11 8ピンPICでUSB PIC16F57_USBIO (その3)
- 続10 8ピンPICでUSB PIC16F505_USBIO (その2)
- 続9 8ピンPICでUSB PIC16F57_USBIO (その2)
- 続8 8ピンPICでUSB PIC16F505_USBIO
- 続7 8ピンPICでUSB PIC16F57_USBIO
- 続6 8ピンPICでUSB PIC16F570_USBIO
- 続5 8ピンPICでUSB PIC12F615_USBIO
- 続4 8ピンPICでUSB 16FUSBの改良版
- 続続続8ピンPICでUSB -30MHz+ソフトシリアル-
- 続続8ピンPICでUSB -16FUSBを30MHzで動かす-
- 続8ピンPICでUSB -ターミナルソフトからの操作-
- 8ピンPICでUSB -16FUSBの移植-
- 番外 MSP430 タイニーブートローダー
- 番外 C8051 タイニーブートローダー
- 続続続 Tiny AVR/PIC Bootloader+
- 続続 Tiny AVR/PIC Bootloader+
- 続 Tiny AVR/PIC Bootloader+
- Tiny AVR/PIC Bootloader+
- 番外 続ATTINY13A OSCCAL の簡易校正
- 番外 ATTINY13A OSCCAL の簡易校正
- 番外 続ATTINY13A ソフトシリアル
- 番外 ATTINY13A ソフトシリアル
- 番外 続Arduinoからタイニーブートローダーを使用する
- 番外 Arduinoからタイニーブートローダーを使用する
- 番外 LPC1114FN28/102 アセンブラサンプル
- 番外 LPC810 タイニーブートローダーの自己書き換え
- 番外 LPC810 EEPROM エミュレーション
- 番外 LPC810 タイニーブートローダー
- 番外 LPC810でアセンブラ
- 続続続PIC10F322 ソフトシリアル一考察
- 続続PIC10F322 ソフトシリアル一考察
- 続PIC10F322 ソフトシリアル一考察
- PIC10F322 ソフトシリアル一考察
- 84ワードのPICブートローダー
- 続PIC10F322 Ring-DDS
- Tinybldの自己更新プログラム
- プログラム領域をROMのように使う
- PIC10F322 256ビットプログラム発振器
- PIC18F EEPROM エミュレーション Jタイプ
- PIC18F EEPROM エミュレーション
- PIC16F EEPROM エミュレーション
- PIC10F322専用 周波数カウンター
- PIC18F Jタイプ ブートローダー
- PICの制約を取り除く
- 番外 ATTINY2313A用ブートローダー
- 続番外 ATTINY13A用ブートローダー
- 番外 ATTINY13A用ブートローダー
- 続PIC10F322 フラッシュメモリの操作
- PIC10F322 フラッシュメモリの操作
- PIC10F322 PIC_WAIT
- ビット列の並び替え その2
- ビット列の並び替え その1
- 故障した温水便座を使えるようにする
- PIC10F322 RA3を出力ポートとして使用
- PIC10F322 周波数カウンタ Part2
- PIC10F322 AN592準拠 周波数カウンタ
- PIC10F322 Ring-DDS
- microchipのAN592に関する一考察
- PIC10F322 3-ch リモコンライン切り替え器
- PIC10F322 4-SW リモコン送信器
- PIC10F322 二相発振器
- PIC_DELAY
- 続PIC_WAIT
- PIC_WAIT