楽天市場
[無料でホームページを作成] [通報・削除依頼]

PIC10F322 Ring-DDS

Ring DDS

PIC10F322のリングオシレーターを用いたDDSです。

NCOを固定デューティサイクル(FDC)モードで使用していますので、
上限周波数は2.5MHz程度(個体差あり)となります。


通信にTX=RA0,RX=RA3を使用します。発振出力はRA1(CWG1B)です。
RA2は参照入力でリングオシレーターの源クロック周波数を計測しています。
通常はRA1とRA2はショートさせた状態で使用します。

<回路図>

img_20130120-123317.jpg



<本プログラムで行っていること>

◎CLCでリングオシレーターを構成
◎NCOにCLC出力を入力、固定デューティ サイクル(FDC)モード、32分周
◎NCO出力はT0CKIと同ピンのため、NCO出力をCWGに入力してCWG1Bから出力
◎リングオシレーターの源発振周波数を計測
(計測方法はAN592に関する一考察を参照)
◎発振周波数を入力
◎リングオシレーターの源発振周波数と発振周波数から分周値を算出
◎算出した分周値からNCO1INCH:NCO1INCLを設定
◎分周出力


<設定例>
起動→1MHz出力→発振停止→発振再開

img_20130120-123354.jpg





<プログラムソース>

LIST P=PIC10F322
#INCLUDE <P10F322.inc>
__CONFIG _FOSC_INTOSC & _BOREN_OFF & _WDTE_OFF & _PWRTE_ON & _MCLRE_OFF & _CP_OFF & _LVP_OFF & _LPBOR_OFF & _BORV_HI & _WRT_OFF
;

; #DEFINE W_TBL ;ブートローダー本体を一緒にコンパイルする
;注意)W_TBLを定義するとTinybldで正しく書き込めません。
;PICKITなどを用いてブートローダー本体を書き込むときに定義する。
;
#DEFINE CWGB 1 ;発振出力(CWG1B)
#DEFINE TX 0 ;RS-232C データ出力用ポート、このテンプレートでは変更できません。
#DEFINE RX 3 ;RS-232C データ入力用ポート、このテンプレートでは変更できません。
#DEFINE Direct ;RS-232C直結方式、コメントアウトで反転方式

;****************************************************************************************
;* *
;* 注意(重要) *
;* *
;* 本デモプログラムはパソコンからコマンドを送出することで、 *
;* リングオシレーターの分周値(周波数)を変更することができます。 *
;* *
;* このソースで、(W_TBLを定義して)コンパイルすると作動するプログラムが作れます。 *
;* *
;* 通信にTX=RA0,RX=RA3を使用します。発振出力はRA1(CWG1B)です。 *
;* *
;* RA2は参照入力でリングオシレーターの源クロック周波数を計測しています。 *
;* *
;* 通常はRA1とRA2はショートさせた状態で使用します。 *
;* *
;* ご使用にはTREATERMやハイパーターミナルなどのターミナルソフトが必要です。 *
;* 通信条件: ボーレート9600、8ビット、1ストップビット、ノーパリティ *
;* *
;* *
;* コマンドは1桁の英小文字と小文字のHEX数値が入力可能です。 *
;* *
;* 大文字HEX数値やHEX数値以外の文字を入力しても無視されます。 *
;* *
;* sコマンドを入力すると、分周値(周波数)を変更します。 *
;* 次いで周波数を入力します。周波数は6桁のHEX数値、単位はHzです。 *
;* 周波数を途中まで入力して入力間違いに気づいた場合、'q'キーを入力すると *
;* 改行して、新たに周波数を入力することができます。 *
;* *
;* スペースキーを押すと発振出力のON/OFFを切り替えます。起動時はOFFになっています。 *
;* *
;* <コマンド入力例> 以下の例は発振周波数1MHzの設定例です。 *
;* *
;* *** PIC10F322 Ring-DDS V1.00 *** *
;* >Pulse OFF *
;* Select [s:Set_Freq spc:ON/OFF] ← 's'キーを入力 *
;* s ← 's'コマンド受け付けメッセージを表示 *
;* 0f4240 ← '0f4240'と入力 *
;* >Pulse ON ← 発振出力ONに変わります *
;* Select [s:Set_Freq spc:ON/OFF] ← 次のコマンド入力待ち *
;* *
;* 固定デューティサイクル(FDC)モードで出力していますので、 *
;* 上限周波数は2.5MHz程度(個体差あり)となります。 *
;* *
;****************************************************************************************

;
; ********************************************************************
; Define General Purpose Registers (64 bytes maximum; 40h-7fh)
; Bank 0 Only
; ********************************************************************
;
;変数
cn EQU 0x40 ;ワークレジスタ
rs EQU 0x41 ;データ受信フラグ(LSB=0:受信 LSB=1:未受信)
rxd EQU 0x42 ;送受信データ Wレジスタと同じ値が入る

;割り算で使用
nratorH EQU 0x43 ;
nratorM EQU 0x44 ;
nratorL EQU 0x45 ;
denomH EQU 0x46 ;
denomM EQU 0x47 ;
denomL EQU 0x48 ;
remainH EQU 0x49 ;
remainM EQU 0x4A ;
remainL EQU 0x4B ;
shiftH EQU 0x4C ;
shiftM EQU 0x4D ;
shiftL EQU 0x4E ;
BCount EQU 0x4F ;

TEMP EQU 0x50 ;ワークレジスタ、WAITで使用
IRF EQU 0x51 ;割り込み完了フラグ
WORK EQU 0x52 ;ワークレジスタ
TMH EQU 0x53 ;TMR0の値(High)
TML EQU 0x54 ;Prescalerの値(Low)

UU EQU 0x55 ;ring発振周波数/256(Hz)格納
HH EQU 0x56
LL EQU 0x57

SU equ denomH ;発振周波数格納(Hz)
SH equ denomM ;
SL equ denomL

;ブートローダー中の予約変数、サブルーチン領域

;bwait equ 0x01E8 ;100usのウエイト(CALL文込み)
;bwait2 equ 0x01E9 ; 50usのウエイト(CALL文込み)
;rs1tx equ 0x01D9 ;1文字送信サブルーチン
;rs1rx equ 0x01C3 ;1文字受信サブルーチン
;rs1rxc equ 0x01D5 ;1文字受信サブルーチン(データ到着を待たない )
;r1rx11 equ 0x01C5 ;1文字受信サブルーチン(スタートビット検出済み)
rd equ 0x01EE ;フラッシュプログラムメモリー読み出し
;wr_e equ 0x01F3 ;フラッシュプログラムメモリーブロック消去(16ワード)
;wr_w equ 0x01F5 ;フラッシュプログラムメモリー書き込み

;cn equ NCO1ACCU ;ワークレジスタ
;rs equ NCO1ACCH ;データ受信フラグ(LSB=0:受信 LSB=1:未受信)
;rxd equ NCO1ACCL ;送受信データ wレジスタと同じ値が入る

;btime equ 53h ;9600bps 10MHz時のウエイトタイム
btime equ 42h ;9600bps 8MHz時のウエイトタイム
;btime equ 1fh ;9600bps 4MHz時のウエイトタイム
;btime equ 28h ;19200bps 10MHz時のウエイトタイム
;btime equ 0eh ;19200bps 4MHz時のウエイトタイム

;
;********************************************************************************
;* *
;* 注意(重要) *
;* *
;* Tinybldwinで書き込むとき、コンパイルしたHEXファイルの内容と *
;* 異なるコードで書き込まれます。 *
;* *
;* 異なるコードで書き込まれる領域 *
;* *
;* Ox0000~Ox0002の3ワード *
;* *
;* この領域はブートローダーへのジャンプコードに置換されます。 *
;* 元のコードはブートローダーの出口Ox017c~Ox17eの3ワードに移動します。 *
;* *
;* Ox017c~Ox17fの4ワード *
;* *
;* Ox17fにはOx0003と同じコードが書き込まれます *
;* 正常な動作を行うためには、の領域にユーザープログラムへのジャンプを *
;* 記述する必要があり、すなわちOx0000~Ox0003の4ワードのどこかに *
;* ユーザープログラムへのジャンプを記述する必要があります。 *
;* *
;********************************************************************************
;
;/////////////////////////////////////////////////////////////////
;
; プログラムコード
;
;/////////////////////////////////////////////////////////////////
;
ORG 0x0000

#ifdef W_TBL
movlw 0x01 ;TeraTermでも書き込むため
movwf PCLATH ;この4行は変更不可
goto TINYBLD ;
nop ;
#else
nop ;0x0000以下4行は初期化用のレジスタ処理や
nop ;ビット操作などに使用することができます。
nop ;(このテンプレートではnopで埋めています。)
goto INIT ;4行中のどこかに。ユーザープログラムへの
;ジャンプを記述する必要があります。
#endif

; 以下にユーザープログラムを記述する。(0x0004~0x017B)
;
ORG 0x0004 ;割り込みベクター

BCF T2CON,TMR2ON ;TMR2=OFF
BCF INTCON,TMR0IF ;TMR0割り込みフラグクリア
BSF IRF,0 ;割り込み完了フラグセット
RETFIE

; ********************************************************************
; データ領域
; ********************************************************************

MES000 ;オープニング
DW '*'*0x80+'*' ;*** PIC10F322 Ring-DDS V1.00 ***
DW '*'*0x80+' ' ;
DW ' '*0x80+'P' ;
DW 'I'*0x80+'C' ;
DW '1'*0x80+'0' ;
DW 'F'*0x80+'3' ;
DW '2'*0x80+'2' ;
DW ' '*0x80+'R' ;
DW 'i'*0x80+'n' ;
DW 'g'*0x80+'-' ;
DW 'D'*0x80+'D' ;
DW 'S'*0x80+' ' ;
DW 'V'*0x80+'1' ;
DW '.'*0x80+'0' ;
DW '0'*0x80+' ' ;
DW ' '*0x80+'*' ;
DW '*'*0x80+'*' ;
MESCRLF
DW 0x0d*0x80+0x0A ;
DW 0 ;

MES001 ;コマンド選択
DW 'S'*0x80+'e' ;Select [s:Set_Freq spc:ON/OFF]
DW 'l'*0x80+'e' ;
DW 'c'*0x80+'t' ;
DW ' '*0x80+'[' ;
DW 's'*0x80+':' ;
DW 'S'*0x80+'e' ;
DW 't'*0x80+'_' ;
DW 'F'*0x80+'r' ;
DW 'e'*0x80+'q' ;
DW ' '*0x80+'s' ;
DW 'p'*0x80+'c' ;
DW ':'*0x80+'O' ;
DW 'N'*0x80+'/' ;
DW 'O'*0x80+'F' ;
DW 'F'*0x80+']' ;
DW 0x0d*0x80+0x0A ;
DW 0 ;

MES002 ;
DW '>'*0x80+'P' ;>Pulse OFF
DW 'u'*0x80+'l' ;
DW 's'*0x80+'e' ;
DW ' '*0x80+'O' ;
DW 'F'*0x80+'F' ;
DW 0x0d*0x80+0x0A ;
DW 0 ;

MES003 ;
DW '>'*0x80+'P' ;>Pulse ON
DW 'u'*0x80+'l' ;
DW 's'*0x80+'e' ;
DW ' '*0x80+'O' ;
DW 'N'*0x80+0x0d ;
DW 0x0A*0x80+0 ;

; ********************************************************************
; メインプログラム
; ********************************************************************

INIT ;初期化
; CLRF PORTA ;
; CLRF LATA ;
; CLRF ANSELA ;全てデジタルポートに設定(ブートローダーで設定済み)
MOVLW B'11111110' ;RA0のみ出力に設定
MOVWF TRISA ;PA0:TX RA1:CWG1B RA2:T0CKI PA3:RX

MOVLW B'00100111' ;TMR0=T0CKI,Prescale=265
MOVWF OPTION_REG ;

MOVLW B'0000000' ;TMR2=OFF,Prescale=1,Postscale=1
MOVWF T2CON ;
MOVLW 0xFF ;PR2=0xFF
MOVWF PR2 ;

BSF INTCON,GIE ;グローバル割り込みを許可

MOVLW MES000 ;開始メッセージ出力
CALL PUT2 ;*** PIC10F322 Ring-DDS V1.00 ***

START
; ********************************************************************
; CLC設定:リングオシレーターを構成、ピン出力なし
; ********************************************************************

CLRF CLC1GLS0
movlw H'08'
movwf CLC1GLS1
CLRF CLC1GLS2
CLRF CLC1GLS3
CLRF CLC1SEL0
CLRF CLC1SEL1
movlw H'81'
movwf CLC1POL
movlw H'80'
movwf CLC1CON

; **********************************************************************
; NCO設定:CLC出力を入力、ピン出力なし(T0CKIと同ピンのため)
; **********************************************************************

;分周設定 ;固定デューティ サイクル(FDC)モード
movlw 0x80 ;分周の初期値=32 NCO1INCH:NCO1INCL=0x8000
movwf NCO1INCH ;NCOのPIN出力を許可しない
clrf NCO1INCL

;N1CKS=LC1OUT
MOVLW b'00000011'
MOVWF NCO1CLK

;N1EN=1,N1OE=0,N1POL=0,N1PFM=0
movlw b'10000000'
movwf NCO1CON

; **********************************************************************
; CWG設定:NCO出力をスルー、ピン出力(CWG1B)
; **********************************************************************

;TRIS=input ;NCOの出力をCWG1Bにそのまま出力
; bsf TRISA,CWGB

; clr G1EN
bcf CWG1CON0,G1EN

CLRF CWG1DBR
CLRF CWG1DBF

;G1ASDCLC1=0,GxASDFLT=0
bcf CWG1CON2,1
bcf CWG1CON2,0
clrf CWG1CON1

;set G1ASE, clr G1ARSEN
bsf CWG1CON2,G1ASE
bcf CWG1CON2,G1ARSEN

;G1IS=10
bsf CWG1CON1,1

;G1CS0=1,G1POLA=0,G1POLB=0,G1OEB=1,G1OEA=0,set G1EN
MOVLW B'11000001'
MOVWF CWG1CON0

;TRIS=output
bcf TRISA,CWGB

;clr G1ASE
bcf CWG1CON2,G1ASE

; **********************************************************************
; リングオシレーターの源発振周波数を計測
;
; FDCモード、分周値32、ゲート時間25msのカウンタ値をNとすると
;
; f(ring)=N*10*256(Hz)
;
; **********************************************************************

MOVLW 0x0A ;加算回数=10
MOVWF WORK ;UU:HH:LL=0
CLRF UU
CLRF HH
CLRF LL

SUMLOOP
BSF OPTION_REG,T0CS ;TMR0=Counter MODE
CLRF TMR2 ;TMR2=0
BCF INTCON,TMR0IF ;TMR0割り込みフラグクリア
BSF INTCON,TMR0IE ;TMR0割り込み許可

CLRF TMR0
call W25ms ;25ms Wait
BCF OPTION_REG,T0CS ;TMR0=Timer MODE
MOVF TMR0,W ;W=TMR0
BSF T2CON,TMR2ON ;TMR2=ON

MOVWF TMH ;TMH=TMR0
CLRF IRF ;割り込み待ち
BTFSS IRF,0 ;
GOTO $-1 ;
BCF INTCON,TMR0IE ;TMR0割り込み禁止
COMF TMR2,W ;TML=/TMR2
MOVWF TML ;

MOVLW 0x04 ;補正値
ADDWF TML,F ;
BTFSC STATUS,C ;
INCF TMH,F ;

MOVF TML,W ;UU:HH:LL=UU:HH:LL+TMH:TML
ADDWF LL,F
BTFSC STATUS,C
INCF HH,F
MOVF TMH,W
ADDWF HH,F
BTFSC STATUS,C
INCF UU,F

DECFSZ WORK,F
GOTO SUMLOOP

BCF CWG1CON0,G1OEB ;発振停止

; **********************************************************************
; コマンド入力
; **********************************************************************

MOVLW MES002 ;発振停止の表示
CALL PUT2 ;>Pulse OFF
LPLPM
MOVLW MES001 ;コマンド選択メッセージ出力
CALL PUT2 ;Select [s:Set_Freq spc:ON/OFF]
LPLP ;コマンド検出ループ
CALL rs1rx ;1文字受信

MOVLW 's' ;
SUBWF rxd,W ;W=rxd-W
BTFSC STATUS,Z ;W=/"s"?
GOTO SETREG ;W="s"

MOVLW ' ' ;
SUBWF rxd,W ;W=rxd-W
BTFSS STATUS,Z ;W=" "?
GOTO LPLP ;W=/" "なら再受信

; ********************************************************************
;
; スペースキーの処理:出力のON/OFFをトグル
;
; ********************************************************************
TOGGLE
MOVLW B'01000000' ;toggle G1OEB
XORWF CWG1CON0,F ;
BTFSC CWG1CON0,G1OEB ;
GOTO P_ON
P_OFF
MOVLW MES002
CALL PUT2
GOTO LPLPM
P_ON
MOVLW MES003
CALL PUT2
GOTO LPLPM

; ********************************************************************
;
; 発振周波数の設定
;
; ********************************************************************
SETREG
MOVLW "s" ;Command-s
CALL rs1tx ;
GCU0
CALL CRLF ;コマンドパラメータ入力
MOVLW SU ;FSR=SU
MOVWF FSR ;
GCU
CALL rs1rx ;1文字目受信
MOVLW "q" ;"q"ならばGCUへジャンプ
SUBWF rxd,W ;
BTFSC STATUS,Z ;
GOTO GCU0 ;
CALL CHKHEX ;文字はHEX値か
BTFSC rxd,7 ;
GOTO GCU ;rxd=/NUM
MOVWF WORK ;WORK=W
MOVF rxd,W ;受信文字を出力
CALL rs1tx ;
GCL
CALL rs1rx ;2文字目受信
MOVLW "q" ;"q"ならばGCUへジャンプ
SUBWF rxd,W ;
BTFSC STATUS,Z ;
GOTO GCU0 ;
CALL CHKHEX ;文字はHEX値か
BTFSC rxd,7 ;
GOTO GCL ;rxd=/NUM
SWAPF WORK,F ;
ADDWF WORK,W ;
MOVWF INDF ;
MOVF rxd,W ;受信文字を出力
CALL rs1tx ;

BTFSC FSR,3 ;FSR=0x48?
GOTO $+3 ;
INCF FSR,F ;FSR=FSR+1
GOTO GCU ;

CALL CRLF ;改行

; ********************************************************************
;
; 分周値=UU:HH:LL/SU:SH:SL
;
; SU:SH:SL=設定周波数(Hz)
; UU:HH:LL=リングオシレーターの源発振周波数/256(Hz)
;
; ********************************************************************

CPYFRQ ;nratorH:nratorM:nratorL=UU:HH:LL
MOVF LL,W
MOVWF nratorL
MOVF HH,W
MOVWF nratorM
MOVF UU,W
MOVWF nratorH

SHIFT4
MOVLW 0x04 ;
MOVWF WORK ;
SHIFT
BCF STATUS,C
RLF nratorL,F
RLF nratorM,F
RLF nratorH,F

BCF STATUS,C
RRF SU,F
RRF SH,F
RRF SL,F

DECFSZ WORK,F
GOTO SHIFT

CALL divizn ;nratorH:nratorM:nratorL=nratorH:nratorM:nratorL/denomH:denomM:denomL

; ********************************************************************
;
; 分周レジスタNCO1INCH:NCO1INCLの設定
;
; NCO1INCH:NCO1INCL=(0x100000/分周値)*2
;
; ********************************************************************

movf nratorH,W ;NCOの分周値を算出
movwf denomH
movf nratorM,W
movwf denomM
movf nratorL,W
movwf denomL

MOVLW 0x20 ;nratorH:nratorM:nratorL=0x100000*2
MOVWF nratorH ;
CLRF nratorM ;
CLRF nratorL ;

CALL divizn ;nratorH:nratorM:nratorL=nratorH:nratorM:nratorL/denomH:denomM:denomL

movf nratorM,W ;NCOの分周値をNCO1INCにセット
movwf NCO1INCH
movf nratorL,W
movwf NCO1INCL

BSF CWG1CON0,G1OEB ;>Puls ON
GOTO P_ON ;

;///////////////////////////////////////////////////////////////////////////////
; サブルーチン
;///////////////////////////////////////////////////////////////////////////////

CHKHEX ;受信データがHEX値か否かをチェック
MOVLW "f"+1 ;W="g"
SUBWF rxd,W ;W=rxd-W
BTFSC STATUS,C ;W<"g"?
GOTO NOTHEX ;W>="g"
;
MOVLW "a" ;W=
SUBWF rxd,W ;W=rxd-W [0x41_0x46] -> [0_6]
BTFSS STATUS,C ;W>=0?
GOTO $+3 ;W<0
ADDLW 0x0A ;W=[0_6] -> [10_15]
RETURN ;HEX値ならWレジスタに値をセットして帰る
;
MOVLW "9"+1 ;W=":"
SUBWF rxd,W ;W=rxd-W
BTFSC STATUS,C ;W<":"?
GOTO NOTHEX ;W>=":"
;
MOVLW "0" ;W=0x30
SUBWF rxd,W ;W=rxd-W [0x30_0x39] -> [0_9]
BTFSC STATUS,C ;W<0?
RETURN ;HEX値ならWレジスタに値をセットして帰る
NOTHEX ;HEX値以外なら
BSF rxd,7 ;rxdのビット7をセットして帰る
RETURN ;

CRLF ;改行
MOVLW MESCRLF
PUT2 ;2文字出力
MOVWF PMADRL
CLRF PMADRH
LOOP_P
CALL rd
RLF PMDATL,W
RLF PMDATH,W
ANDLW B'01111111'
skpnz
RETURN
CALL rs1tx
MOVF PMDATL,W
ANDLW B'01111111'
skpnz
RETURN
CALL rs1tx
INCF PMADRL,F
GOTO LOOP_P

W800ms ;Wait 800ms(78.125kHz)
call W400ms ;
W400ms ;Wait 400ms(156.25kHz)
call W200ms ;
W200ms ;Wait 200ms(312.5kHz)
call W100ms ;
W100ms ;Wait 100ms(625kHz)
call W50ms ;
W50ms ;Wait 50ms(1.25MHz)
call W25ms ;
W25ms ;Wait 25ms(2.5MHz)
call W12500 ;
W12500 ;Wait 12500us(5MHz)
call W6250 ;
W6250 ;Wait 6250us
movlw d'61' ;0.5
movwf TEMP ;0.5
call bwait ;100
decfsz TEMP,F ;0.5
goto $-2 ;1
call bwait2 ;50
call ret00 ;1(goto)+1(goto)+1(return)
call ret00 ;1(goto)+1(goto)+1(return)
return ;1 total:0.5+0.5+(100+0.5+1)*61-0.5+50+3+3+1=6249us

; ********************************************************************
;
; RS-232C 1文字受信
;
; 受信文字は w に返る
;
; rs1rx :1文字受信するまで戻らない
; rs1rxc :受信成功のとき、rsのLSB=0 w有効
; :受信失敗のとき、rsのLSB=1 w無効

; ********************************************************************
rs1rx
#ifdef Direct
btfss PORTA,RX
#else
btfsc PORTA,RX
#endif
goto rs1rx ;STARTビットを検出するまで待つ
r1rx11
call bwait2 ;1/2ビット分待つ
movlw 8 ;受信ビット数
movwf cn
r1rx12
call bwait ;1ビット分待つ

#ifdef Direct
btfsc PORTA,RX
#else
btfss PORTA,RX
#endif

bcf STATUS,C ;

#ifdef Direct
btfss PORTA,RX
#else
btfsc PORTA,RX
#endif

bsf STATUS,C ;
rrf rxd,f
decfsz cn,f ;8ビット受信したか?
goto r1rx12 ;cn=0になるまでループ
call bwait2 ;1/2ビット分待つ
r1rx15
#ifdef Direct
btfsc PORTA,RX
#else
btfss PORTA,RX
#endif
goto r1rx15 ;ストップビットを待つ
movf rxd,w ;return in w
return

rs1rxc
bsf rs,0 ;rsのLSBをセット
;スタートビットをチェック
#ifdef Direct
btfss PORTA,RX
#else
btfsc PORTA,RX
#endif

return ;スタートビット未検出
goto r1rx11 ;スタートビット検出 飛び先でrsはクリアされる

; ********************************************************************
;
; 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 ; 1 us total:1+49+49=99us

bwait2 ;1/2ビットのウエイトを作る
movlw btime/2-2 ;0.5 us
movwf rs ;0.5 us
decfsz rs,f ;0.5 us
goto $-1 ; 1 us
ret00
goto $+1 ; 1 us
return ; 1 us total:0.5+0.5+(0.5+1)*(33-2)-0.5+1+1=49 us

; ********************************************************************
; 24bit/24bit
; ********************************************************************
; ------------------------------------------
; SUBROUTINE - 24 BIT DIVISION
; numerator: nratorH nratorM nratorL
; denominator: denomH denomM denomL
;
; result: nratorH nratorM nratorL
; remainder: remainH remainM remainL
;
divizn
movlw .24
movwf BCount
movf nratorH,w
movwf shiftH
movf nratorM,w
movwf shiftM
movf nratorL,w
movwf shiftL
clrf nratorH
clrf nratorM
clrf nratorL
;
clrf remainH
clrf remainM
clrf remainL
dloop
bcf STATUS,C
rlf shiftL,f
rlf shiftM,f
rlf shiftH,f
rlf remainL,f
rlf remainM,f
rlf remainH,f
movf denomH,w
subwf remainH,w
btfss STATUS,Z
goto nochk
;
movf denomM,w
subwf remainM,w
btfss STATUS,Z
goto nochk
;
movf denomL,w
subwf remainL,w
nochk
btfss STATUS,C
goto nogo
;
movf denomL,w
subwf remainL,f
btfss STATUS,C
decf remainM,f
movf remainM,w
xorlw 0xff
btfsc STATUS,Z
decf remainH,f
movf denomM,w
subwf remainM,f
btfss STATUS,C
decf remainH,f
movf denomH,w
subwf remainH,f
bsf STATUS,C
nogo:
rlf nratorL,f
rlf nratorM,f
rlf nratorH,f
decfsz BCount,f
goto dloop
Return

;///////////////////////////////////////////////////////////////////////////////
;
; Ox017Cはブートローダーの出口、
; ここにコードを記述しても、ブートローダーで書き込むときに上書きされます。
;
ORG 0x017C

#ifdef W_TBL
nop ;Tinybldwinを用いた書き込みを
nop ;行わない場合、
nop ;ユーザープログラムが記述されていない
goto INIT ;場合を考慮し、再びブートローダーにジャンプ
;ユーザープログラムが記述されているときは
;ジャンプ先を変更してください。
#endif
;
;///////////////////////////////////////////////////////////////////////////////
;
; ブートローダー本体
; [クロック8MHz(内部)、ボーレート9600、8ビット、1ストップビット、ノーパリティ]
;
; 以下のブートローダーのデータは TX=PORTA,0 RX=PORTA,3 とした場合のものです。
; TXおよびRXのポート割り付けを変更した場合にはブートローダーをコンパイルしなおす
; 必要があります。
;
; 詳細は以下のページをごらんください。
;  PIC10F322用Tinybld  http://www3.hp-ez.com/hp/bequest333/page8
; 続PIC10F322用Tinybld http://www3.hp-ez.com/hp/bequest333/page10
;
;///////////////////////////////////////////////////////////////////////////////
;
ORG 0x0180
TINYBLD

#ifdef W_TBL
#ifdef Direct

DW 0x0188,0x1006,0x21B1,0x3CC1,0x1D03,0x29C0,0x3039,0x21D9
DW 0x304B,0x21D9,0x0191,0x21B1,0x00A1,0x21B1,0x00A0,0x21B1
DW 0x0098,0x0095,0x3040,0x0084,0x21B1,0x0080,0x0A84,0x0B95
DW 0x2994,0x21B1,0x1D03,0x29AE,0x3040,0x0084,0x0800,0x0A84
DW 0x00A2,0x0800,0x0A84,0x00A3,0x0820,0x390F,0x1903,0x21F3
DW 0x21F5,0x0AA0,0x0398,0x0B98,0x299E,0x2988,0x304E,0x21D9
DW 0x298A,0x3005,0x00A9,0x01A8,0x01A7,0x1D85,0x29BA,0x21C5
DW 0x0791,0x0008,0x0BA7,0x29B5,0x0BA8,0x29B4,0x0BA9,0x29B3
DW 0x018A,0x01A7,0x297C,0x1D85,0x29C3,0x21E9,0x3008,0x00A9
DW 0x21E8,0x1985,0x1003,0x1D85,0x1403,0x0CA7,0x0BA9,0x29C8
DW 0x21E9,0x1985,0x29D1,0x0827,0x0008,0x1428,0x1D85,0x0008
DW 0x29C5,0x00A7,0x1405,0x21E8,0x3008,0x00A9,0x0CA7,0x1803
DW 0x1005,0x1C03,0x1405,0x21E8,0x0BA9,0x29DE,0x21ED,0x1005
DW 0x21E9,0x301F,0x00A8,0x0BA8,0x29EB,0x29D4,0x3001,0x00A4
DW 0x0000,0x0000,0x0008,0x3014,0x29F6,0x3004,0x00A4,0x3055
DW 0x00A5,0x30AA,0x00A5,0x14A4,0x0000,0x0000,0x01A4,0x0008

#else

DW 0x0188,0x1006,0x21B1,0x3CC1,0x1D03,0x29C0,0x3039,0x21D9
DW 0x304B,0x21D9,0x0191,0x21B1,0x00A1,0x21B1,0x00A0,0x21B1
DW 0x0098,0x0095,0x3040,0x0084,0x21B1,0x0080,0x0A84,0x0B95
DW 0x2994,0x21B1,0x1D03,0x29AE,0x3040,0x0084,0x0800,0x0A84
DW 0x00A2,0x0800,0x0A84,0x00A3,0x0820,0x390F,0x1903,0x21F3
DW 0x21F5,0x0AA0,0x0398,0x0B98,0x299E,0x2988,0x304E,0x21D9
DW 0x298A,0x3005,0x00A9,0x01A8,0x01A7,0x1985,0x29BA,0x21C5
DW 0x0791,0x0008,0x0BA7,0x29B5,0x0BA8,0x29B4,0x0BA9,0x29B3
DW 0x018A,0x01A7,0x297C,0x1985,0x29C3,0x21E9,0x3008,0x00A9
DW 0x21E8,0x1D85,0x1003,0x1985,0x1403,0x0CA7,0x0BA9,0x29C8
DW 0x21E9,0x1D85,0x29D1,0x0827,0x0008,0x1428,0x1985,0x0008
DW 0x29C5,0x00A7,0x1005,0x21E8,0x3008,0x00A9,0x0CA7,0x1C03
DW 0x1005,0x1803,0x1405,0x21E8,0x0BA9,0x29DE,0x21ED,0x1405
DW 0x21E9,0x301F,0x00A8,0x0BA8,0x29EB,0x29D4,0x3001,0x00A4
DW 0x0000,0x0000,0x0008,0x3014,0x29F6,0x3004,0x00A4,0x3055
DW 0x00A5,0x30AA,0x00A5,0x14A4,0x0000,0x0000,0x01A4,0x0008

#endif
#endif
;
;
END


<HEXファイル>

:020000040000FA
:10000000000000000000392813110B1151140900E1
:100010002A1520155010C324B0183323321952105A
:10002000EE34AD334422A029312B301720182A108A
:100030002A158A060000E5296536F4315B10BA39C5
:10004000E5295F3A7223F132731063384F1D2F2771
:10005000C6275D238A060000501FEC3AE5394F1091
:1000600046238A060000501FEC3AE5394F100D2751
:100070000005FE30860027308E0000309300FF30F0
:1000800092008B170830F920B5010830B600B7018F
:10009000B801B201B3018130B4008030B1008030CA
:1000A000AB00AA010330AE008030AD00B913BC0133
:1000B000BD01BB103B10BA01BB173B13BA14C130D2
:1000C000B9008610BB130A30D200D501D601D70182
:1000D0008E1691010B118B1681010E218E120108D3
:1000E0001315D300D101511C73288B121109D400B0
:1000F0000430D4070318D30A5408D7070318D60AC4
:100100005308D6070318D50AD20B682839132C30A8
:10011000F9201B30F92019217330420203199E285F
:1001200020304202031D8B284030B906391B9B2822
:100130002C30F92089283330F920892873302F2179
:10014000F820463084001921713042020319A0289A
:10015000E420C21BA328D20042082F2119217130AC
:1001600042020319A028E420C21BAE28D20E520777
:10017000800042082F218419BF28840AA328F82070
:100180005708C5005608C4005508C3000430D20003
:100190000310C50DC40DC30D0310C60CC70CC80C4D
:1001A000D20BC82845214308C6004408C7004508AB
:1001B000C8002030C300C401C50145214408AB007C
:1001C0004508AA0039179B28673042020318F62811
:1001D00061304202031CEE280A3E08003A30420217
:1001E0000318F6283030420203180800C21708002E
:1001F0001930A000A101EE21220D230D7F39031932
:1002000008002F2122087F39031908002F21A00A96
:10021000FB280A210B210C210D210E210F21102179
:100220003D30D0003E21D00B12293F2143214321F4
:100230000800851D19293F210830C0003E2185197D
:100240000310851D0314C20CC00B1E293F21851904
:100250002729420808004114851D08001B29C200F7
:1002600005143E210830C000C20C03180510031C01
:1002700005143E21C00B3429432105103F211F30B6
:10028000C100C10B4129442908001830CF004308A0
:10029000CC004408CD004508CE00C301C401C5010F
:1002A000C901CA01CB010310CE0DCD0DCC0DCB0D74
:1002B000CA0DC90D46084902031D642947084A02B0
:1002C000031D642948084B02031C75294808CB020A
:1002D000031CCA034A08FF3A0319C9034708CA02A4
:1002E000031CC9034608C9020314C50DC40DC30D80
:0602F000CF0B53290800AA
:02400E008038F8
:00000001FF
















































































.