マイクロコントローラ つかいませんか
〜AVR,PIC,H8 などと付き合うための ABC〜

最終更新 : 2005/5/26

このページは,望月が勉強中のことを備忘録として記載するものです。
ほかの参考になりにくいかもしれませんが,ご容赦ください。

◆AVR & PIC My Lib AVR 8-Bit RISC ; 秋月 秋月 試用記 ipi 若松通商 WestField ; Nの電子講座 食す えるむ ; GCC BASIC ; PIC MicroChip 趣味の電子工作(PIC-Fun)

★★★PIC 覚書
14bit命令の PIC の基本アーキテクチャは,プログラムメモリ 2KWord + データメモリ 128Byte + EEPROM
W レジスタ + データメモリ 128Byte (1 Bank)と解釈しても良いし,
レジスタ 128Byte (1 Bank)と解釈しても良い。
データメモリが直接実行できる命令は,
2項演算: MOV, ADD, SUB, AND, OR, XOR ; 単項演算: COM, DEC, INC, ; ローテーション: RL, RR
クロックは最高で 20MHz。4 クロックで 1 命令を実行。
★プログラムの流れを変える命令は,BTFSC と BTFSS。条件次第で命令一つをスキップする。
GOTO と CALL は 0 〜 2047 の直接指定
2KWを超える PIC では GOTO と CALL の際に PCLATH を上位ビットとする(PCLATH 無使用は 2KW のみ有効)
★データメモリは 128Byte ある。
バンク切換により,データメモリの最初の 112Byte は切替えられる。
0x00 〜 0x0b (11 Byte) I/O 空間(特殊レジスタ空間)
バンク切換しても,データメモリの最後の 16Byte は切り替えられない。ここはパラメタ引渡し等に使える。
バンクは最大で4つである。(最大で約 500Byte)
バンク切換は,STATUS (0x03番地) の 第6,第5 bit で指定する。
インデックス指定によって 0x5a 番地にアクセスしたいなら,次の手順を踏む:
(1)FSR (0x04番地) に,0x5a を格納する
(2)INDF(0x00番地) をアクセスすることにより,0x5a 番地のデータをアクセスできる。
なお,STATUS の 第7bit と FSR 第7bit は INDF 使用時のバンク指定に使われる。
スタックはハードウエアであり 8 段である。

★★★高機能 PIC 覚書
17C75X は 16bit 命令である。プログラムメモリ 64KWord + データメモリ 256Byte×4Bank + EEPROM
★プログラムの流れを変える命令は,BTFSC と BTFSS。条件次第で命令一つをスキップする。
これ以外にも,比較命令等にスキップを組み合わすことが可能になった。
GOTO と CALL は 0 〜 8192 (13bit) の直接指定。
PCLATH の使用により,上位の 3bit も変化させることができる。
★データメモリは 256Byte あり,バンク基本的に 4Bank ある。
256 Byte は次の4種類に分けられる:
0x00 〜 0x0f (16 Byte) I/O 空間(特殊レジスタ空間)。Bank に依らず常に同じ。
0x10 〜 0x17 (8 Byte) I/O 空間。ここだけ 8 つの Bank に分けられる。
0x18 〜 0x1f (8 Byte) 特殊レジスタ 2 Byte + 汎用レジスタ 6 Byte。Bank に依らず常に同じ。
0x10 〜 0xff (224 Byte) 汎用レジスタ空間。4 つの Bank に分けられる。
バンク切換は,BSR (Bank Select Register : 0x0f 番地) による。
相対指定が強化され,INDF0 + FSR0 に加えて,INDF1 + FSR1 も使用できる。
ALUSTA (0x04 番地) は,フラグ 4 bit と,FS0〜FS3 から成る。
FS0 〜 FS3 の指定により,INDF のアクセスの際に FSR の値を 1 だけ増減することも可能。
INDF による指定でアクセスできるのは現在の Bank 内のみである。これは 14bit PIC と異なる。
TLWR, TLWT という命令と,TBLPTR H/L (TaBLe PoinTer Register High/Low) の使用により, プログラムメモリの内容をアクセスできる。
スタックはハードウエアであり 16 段ある。

★★★低価格 PIC 覚書
12bit命令の PIC の基本アーキテクチャは,プログラムメモリ 512Word + データメモリ 32Byte
W レジスタ + データメモリ 32Byte (1 Bank)と解釈しても良いし,
レジスタ 32Byte (1 Bank)と解釈しても良い。
0x00 〜 0x06 (7 Byte) I/O 空間(特殊レジスタ空間)
FSR,INDFも含まれる。
スタックはハードウエアであり 2 段である。

★★★AVR 覚書
基本アーキテクチャは,プログラムメモリ 4KWord + データメモリ 64KByte + EEPROM
RISCアーキテクチャである。レジスタは 8Bit × 32 本 と多数。レジスタ間は殆どの演算が可能。
データメモリはメモリ機能のみで,LD と ST のみ可能。
2項演算: MOV, ADD, ADC, SUB, SBC, CP, AND, OR, EOR (ソースとデスティネーションは32×32通り)
ただし,ADD-immidiate, EOR-immidiate は存在しない。immidiate と組み合わせるレジスタは16本のみ。
; 単項演算: COM, NEG, DEC, INC, CLR, SET, TST ; ローテーション: LSL, LSR, ROL, ROR, ASR クロックは最高で 8MHz。1 クロックで 1 命令を実行。
★プログラムの流れを変える命令は,BR??。条件次第で PC 相対の -64 〜 +63 までジャンプする。
同命令の SBRC, SBRS, SBIC, SBIS は,条件次第で命令一つをスキップする。
RJMP と RCALL は PC 相対の -2048 〜 +2047 まで。
IJMP と ICALL は Z レジスタ間接なので,16 bit 指定が可能。(Z レジスタについては後述)
★データメモリの大きさは製品に依るが 64KByte まで同じアーキテクチャで使用できる。
バンク切換は存在しない。
最初の 32Byte は,レジスタとも呼ばれ,r0 〜 r31 として四則演算をはじめ殆どの命令でアクセスできる。
続く 64Byte (0x20 〜 0x5f)は,I/O 空間である。
レジスタとI/O空間は全て直接指定できる命令がある。
SRAM 空間は 0x0060 〜 0xffff である。(通常の CPU では単に RAM と呼ぶところ)
16Bitのインデックスレジスタは X,Y,Z の3個ある。(Xはr27+r26, Yはr29+r28, Zはr31+r30(上位+下位))
メモリ空間のあらゆる場所はインデックスレジスタ間接の LD, ST 命令でアクセスできる。
従って,(SRAM だけでなく)レジスタも I/O 空間もインデックスレジスタで指定できる。
LDS, STS はデータメモリ空間を絶対指定でアクセスする命令である。
Z レジスタ間接で,プログラムメモリ空間中のデータを読み出すことも可能。
スタックレジスタは別に用意される。スタック空間は SRAM に指定する。メモリが許す限りサブルーチンを呼べる
★EEPROM は I/O 空間中の EEAR (EEprom Adress Register) と EEDR (EEprom Data Register) で操作する。
EEROM 空間の大きさによっては,EEARH と EEARL を使用することもある。 ★★AT12S1200は,AVRの中でもコンパクトな特別バージョンである。
クロックは最高で 12MHz。1 クロックで 1 命令を実行。
レジスタとI/O空間は存在するが,SRAMは存在しない。
レジスタとI/O空間は全て直接指定できる命令がある。従って,LDS, STS は存在しないし不要である。
インデックスレジスタは Z の1個だけであり,サイズも 8bit である。(Zはr30)
従って,インデックスレジスタ間接の転送命令も大幅に消滅。
同じく,Z レジスタ間接の IJMP も ICALL も存在しない。
Z レジスタ間接指定は,レジスタ空間(0 〜 31)のみ指定できる。
スタックは別に用意される。スタック空間は 3 段なので,サブルーチンと割り込みと合わせて 3 層まで。
望月が,◎ 複数個持っている ○ 持っている △ 持っていない
◎ AT90S1200 = 20pin, 1K ProgramMem., No SRAM, 64 EEPROM, \300
△ AT90S2313 = 20pin, 2K ProgramMem., 128 SRAM, 128 EEPROM, \400, UART, PWM 
◎ AT90S4414 = 40pin, 4K ProgramMem., 256 SRAM, 256 EEPROM, \700, UART, PWM, SPI, 外部SRAM可
△ AT90S4433 = 28pin, 4K ProgramMem., 128 SRAM, 256 EEPROM, \900, UART, PWM, SPI
○ AT90S8515 = 40pin, 8K ProgramMem., 512 SRAM, 512 EEPROM, \1100, UART, PWM, SPI, 外部SRAM可
○ AT90S8535 = 40pin, 8K ProgramMem., 512 SRAM, 512 EEPROM, \1200, UART, PWM, SPI, 外部SRAM可, ADC

プログラムの例:
「8 個の 16 bit 整数は, この 8 回の計測値とする。 8 個の平均を求めると共に, 新しい入力に備えてそれらを Shift させる。」 
AVR AT1200

;	r1(High),r0(Low) = new data 
;	r3,r2	= last data 
;	... 
;	r15,r14	= the oldest data
;	r17,r16	= sum
;	r19,r18	= HeIKiN
;	r21,r20	= temp
j10:
	clr	r30
	clr	r17
	clr	r16
;以上 3 clk
j20:	;
	ld	r20,Z	(2clk)
	inc	r30
	ld	r21,Z	(2clk)
	inc	r30
	add	r16,r20
	adc	r17,r21
	cpi	r30,0x10
	brne	j20	(2clk)
;以上 87 clk (11 * 8回 -1)
	lsr	r17
	ror	r16
	lsr	r17
	ror	r16
	lsr	r17
	ror	r16
	mov	r19,r17
	mov	r18,r16
;以上 8 clk
	ldi	r30,12
j50:
	ld	r20,Z	(2 clk)
	inc	r30
	ld	r21,Z	(2 clk)
	inc	r30
	st	Z,r20	(2 clk)
	inc	r30
	st	Z,r21	(2 clk)
	subi	r30,5
	brpl	j50	(2 clk)
	clr	r0
	clr	r1
;以上 100 clk (1 + 14 * 7回 - 1 + 2)
;(ループにしないなら,16 clk)
;(1200以外なら XとYを使い約 110 clk)
;総合計 198 clk 
;(別のプログラムでは違うclk数)


 14bit PIC
;	65(High),64(Low) = new data
;	67,66	= last data
;	...
;	79,78	= the oldest data
;	33,32	= sum or work
;	35,34	= HeIKiN
;	36	= counter
j10:
	clrf	33
	clrf	34
	movlw	64
	movwf	FSR,(f格納)
	movlw	8
	movwf	36,(f格納)
;以上 6 命令
j20: 
	movf	IND,(W格納)
	addwf	32,(f格納)
	btfsc	C = 0 なら次命令をスキップ
	incf	33,(f格納)
	incf	FSR,(f格納)
	movf	IND,(W格納)
	addwf	33,(f格納)
	decf	36,(f格納)
	btfsc	Z = 0 なら次命令をスキップ
	goto	j20
;以上 80 命令 (10 * 8回)
	bcf	C をクリアする
	rrf	33,(f格納)
	rrf	32,(f格納)
	bcf	C をクリアする
	rrf	33,(f格納)
	rrf	32,(f格納)
	bcf	C をクリアする
	rrf	33,(f格納)
	rrf	32,(f格納)
	movwf	32,(W格納)
	movwf	34,(f格納)
	movwf	33,(W格納)
	movwf	35,(f格納)
;以上 13 命令
	movlw	76
	movwf	FSR,(f格納)
	movlw	7
	movwf	36,(f格納)
j50:
	movf	IND,(W格納)
	incf	FSR,(f格納)
	incf	FSR,(f格納)
	movwf	IND
	decf	FSR,(f格納)
	movf	IND,(W格納)
	incf	FSR,(f格納)
	incf	FSR,(f格納)
	movwf	IND
	movlw	-5
	addwf	FSR,(f格納)
	decf	36,(f格納)
	btfsc	Z = 0 なら次命令をスキップ
	goto	j30
	clrf	64
	clrf	65
;以上 111 命令 (4 + 15 * 7回 + 2)
;(ループにしないなら,30 命令)
;(16bit PIC なら,IND0とIND1等を使い 約 45 命令)
;総合計 210 命令
;(別のプログラムでは違う命令数)