最終更新 : 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 命令 ;(別のプログラムでは違う命令数)