TAP-pic Tips

   tips

いくつかの役立ちそうな情報をまとめてみました。


●制御レジスタでよく使うもの
●アセンブラの擬似命令
●Aki-PICpgmの設定


●制御レジスタでよく使うもの

制御レジスタの種類と機能をまとめると。。。

アドレス

名称

機能

03h,83h

STATUS
ステータスレジスタ

ビット

略号

機能

0

C
CARRY/BORROWビット、加算では繰り上がりでC=1、減算では繰り下がりなしでC=1

1

DC
DIGIT CARRY/BORROWピット、加減算で下位4ビットで桁上げが生じた場合DC=1

2

Z
ゼロビット、ゼロフラグは0のときZ=1

3

PD
パワーダウンビット

4

TO
タイムアウトビット

5
6

RP0
RP1
バンク切り替え
RP1,RP0 = 0 , 0 : Page0 (00h〜7fh)
RP1,RP0 = 0 , 1 : Page1 (80h〜FFh)
RP1,RP0 = 1 , 0 : Page2 (100h〜17Fh)
RP1,RP0 = 1 , 1 : Page3 (180h〜1FFh)
16F84は2ページしかないので常に0にしておく

7

IRP
間接アドレッシング時のバンクセレクトビット
16F84は常に0で使用
○注意事項
(1)SUBLW,SUBWFはくり下がりなしでC=1となる、Z80系とは逆。またf-w=destでありこれもZ80と逆。
(2)INCF,DECFはZフラグのみに作用しCフラグには作用しない。
(3)RLF,RRFのローテートはCフラグもあわせて回転する。
(4)移動命令でMOVFのみZフラグに作用する。

81h

OPTION
オプションレジスタ

ビット

略号

機能

0
1
2

PS0
PS1
PS2
タイマー、カウンタのプリスケーラ

PS2

PS1

PS0

分周比

0

0

0

2

0

0

1

4

0

1

0

8

0

1

1

16

1

0

0

32

1

0

1

64

1

1

0

128

1

1

1

256
最大で10M時に256x256x0.4μsec = 約26msec

3

PSA
プリスケーラ割り当て設定
0 : TMR0
1 : WDT
どちらか一方にしかプリスケーラは使えない

4

T0SE
TMR0信号の外部入力時のエッジ
0 : RA4の立ち上がりでインクリメント
1 : RA4の立ち下がりでインクリメント

5

T0CS
TMR0信号のソース
0 : 命令サイクルの内部クロック (FOSC/4)
1 : RA4ピンのエッジ (50MHzまでいける)

6

INTEDG
RB0/INT割り込みのエッジ
0 : RB0/INTの立下りで割り込み
1 : RB0/INTの立上りで割り込み

7

RBPU
ポートBのプルアップ
0 : プルアップする
1 : プルアップしない

0Bh,8Bh

INTCON
割り込み制御・管理レジスタ、フラグは1で発生告知、許可は1で許可する。

ビット

略号

機能

0

RBIF
RB<7:4>のピン状態が変化したときの割り込みフラグ

1

INTF
RB0/INTピン割り込みフラグ

2

T0IF
TMR0オーバーフロー割り込みフラグ

3

RBIE
RB<7:4>のピン状態変化割り込みを許可する

4

INTE
RB0/INTピン割り込みを許可する

5
T0IE TMR0オーバーフロー割り込みを許可する

6

EEIE
EEPROM書き込み終了割り込み許可する

7

GIE
割り込みそのものの許可
○注意事項
割り込み処理後は割り込み告知(判定)フラグをクリアしないと割り込みルーチンだけでループするので注意。

85h
86h

TRISA
TRISB
IOポートの入出力設定
0 : 出力
1 : 入力

05h
06h

PORTA
PORTB
書けば出力、読めば入力、ただしビット書き込みは外部インピーダンスに注意

00h,80h
04h,84h

INDF
FSR
ポインタ処理用のレジスタ
FSRでアドレスを指定してINDFでアクセス

01h

TMR0
8ビットのタイマ/カウンタ

02h,82h

PCL
プログラムカウンタの下位8bit

0Ah,8Ah

PCLATH
プログラムカウンタの上位4bit、PCL書き込み時<4:0>が、CALL,GOTO時<4:3>が参照される


●アセンブラの擬似命令(ただしc2cとの併用不可)

○数値の表現方法
10進数 D'100'
16進数 H'9h' または 0AFH (頭に0をつけて終わりにHをつける)
2進数 B'00111001'
ASCIIコード 'C' または A'C'

○条件ジャンプ
BZ Label ; Z = 1 ならジャンプ
BNZ Label ; Z = 0 ならジャンプ
BC Label ; C = 1 ならジャンプ
BNC Label ; C = 0 ならジャンプ

○ジャンプ命令
GOTO $-1 ; ひとつ前の命令に戻る。ラベルを使わずにジャンプできる。
GOTO $+3 ; 3つあとなど。

○RAMアクセス
DATA RES 10 などというかたちでメモリを確保したとき
MOVWF DATA+2 という方法でアクセスできる。

○テーブル処理
ADDWF PCL,F
DT 00h,01h,02h,・・・・
W=0で00h,W=1で01hをリターンする。DTはRETLWと同じ。
同様にテーブルジャンプもできる。

○メモリから変数領域を確保する(リロケータブルへの展開)
[<Label>] RES <mem_unit>
たとえば
count1 RES 1
word_data RES 2
といった感じ。

○リロケータブル化のための命令
>[<name>] CODE [<address>] (コードセクションの宣言)
コードセクションaddressは割り込みなど特定番地指定が必要なときに使う。
最後はENDで終わる。

>UDATA [<address>] (変数エリアの宣言)
UDATA
data1 RES 1
data2 RES 2

>GLOBAL(外部へラベルをアクセスできるようにする)
GLOBAL data1,data2,code1

>EXTERN(外部のラベルをアクセス可能にする)
EXTERN data1,data1,code1

・プログラムの雛型

○初期設定
PROCESSOR PIC16F84
LIST P=PIC16F84
INCLUDE "P16F84.INC"

○データセクション
UDATA
data1 RES 1
data2 RES 2
GLOBAL data2
EXTERN code1

○コードセクション
RESET CODE 00H
GOTO MAIN
INTERRUPT CODE 04H
GOTO INTRPT
MAIN
CLRW
・・・・
END


●Aki-PICpgmの設定

○設定の項目

Fosc : オシレータの種類
WDT : ウォッチドッグタイマーの設定
CP : コードプロテクト
~PWRTE : パワーONリセットをかけるかどうか(BOD−ONで自動的にONになる)。内部の別系統のCRオシレータで72msのディレイ後にリセットがかかる。
BOD : ブラウンアウトリセット(4V以下でリセットがかかる)
LVP : ローパワープログラミング(RB3を使うことになる)
WRT : フラッシュメモリをプログラムから変更できるようにする
DEBUG : インサーキットデバッグを可能にする(RB6とRB7を使う)
CPD : データEEPメモリのプロテクト

○毎回設定するのは面倒

P16F877.incの最後に以下の行を追加

__CONFIG _CP_OFF & _WDT_OFF & _BODEN_ON & _PWRTE_ON & _HS_OSC & _WRT_ENABLE_ON & _LVP_OFF & _DEBUG_OFF & _CPD_OFF


return to previous page.