たまりば

パソコン・インターネット パソコン・インターネット三鷹市 三鷹市

初代PIC解説
2015年09月22日 05:27

PICマイコンの歴史を追っていこうと思う。
以前ベースラインPICの注意点としてベースラインからミッドレンジでの差異を書いたが、今回はそのさらに前、PIC1650について。

PIC1650はまだMicrochipが分社化される前、GIにより作られたもので、「商業的に入手可能な最初のPIC」であるようだ。
CP1600という16bitマイコンの周辺インターフェース制御のために作られたそうだ。
そう、なんで8bitなのにPIC16なのかの謎がこれで解けた。

ネットで探すとデータシートが見つかるので現在のPICと比較してみたところ、これが現在でいうベースラインPICとほとんど同じと言っていい作りであった。初代から現在まで連続的に拡張を繰り返しているわけだ。それはアーキテクチャも変態になろうというものだ。
この頃はまだアーキテクチャが単純で整然としている。

具体的に見ていこう。

クロックは外部クロックと外部RCが使用でき、最大周波数は1MHz。
現在のPICはほとんどがRC発振器内蔵・発振子用の発振回路内蔵だがそのようなものはない。

コールスタックはベースラインと同じく2レベル。

レジスタは今でいうSFRを含め32本のみ。ページングなし。
今のようにアセンブラで指示するためのレジスタ名は付いていないようで、F0など数字で書かれている。
F0 (名前なし)
F1 Real Time Clock Counter Register
F2 Program Counter (PC)
F3 Status Word Register
F4 File Select Register (FSR)
F5 I/O Register A (RA)
F6 I/O Register B (RB)
F7 I/O Register C (RC)
F8 I/O Register D (RD)
これを見て分かるように、周辺機能と呼べるものはReal Time Clock Counterしか存在しない。

現在のPICで最も近いと思われるPIC16F5xと比較してみよう。
00 INDF
01 TMR0
02 PCL
03 STATUS
04 FSR
05 PORTA
06 PORTB
07 PORTC (16F57,59のみ)
08 PORTD (16F59のみ)
09 PORTE (16F59のみ)
普通にアクセスできるレジスタに関しては全く同じ構成であることが分かる。(後述するようにOPTION_REGとTRISxは無い)

ただし機能は異なるものもある。順に比較しよう。
・F0
今のINDFと同じ
・F1
リアルタイムクロックなどと大層な名前が付いているが今のTMR0の外部入力モードと同じ。
内部クロックのカウント機能は無い。ただしクロック出力ピン(現在のものと同じく1/4出力)はあるので外部でタイマー入力につなぐことで同じ動作が可能。
プリスケーラや入力エッジ選択機能も無い。
・F2
今のPCLと違い、書き込みのみで読み出し不可。
つまり現在のような「ADDWF PCL」でのジャンプは出来ないことになる。定数テーブルの読み出しが面倒である。
・F3
内容は、
1 1 1 1 PC9 Z DC C
PC9はPCの(0から数えた)9bit目、今でいうPA0相当。ただし将来のための予約bitで、PIC1650は512Wordしかないため未使用。
スリープ・WDT関係のフラグが無く、PA0相当の位置が違うが、内容は現在のSTATUSとかなり近い。
ただし今のSTATUSと違い、ビットセット/クリア命令でのみ書き込み可能。
今のSTATUSは、「C,DC,Zのうちいずれかのフラグに影響する命令を使うと、この3つ全てのフラグへの書き込みが無視された上で、命令の影響でフラグがセットされる」という複雑な仕様である。
・F4
今のFSRと同じ。未使用bitが「1」で読めるところも今と同じ。
・F5-F8
今のPORTxに相当するが、TRISxレジスタは無い。
しかしポートは入出力が可能ということになっている。説明を読むと、
1を書き込むと、Highになる
0を書き込むと、Lowになる
読むと、現在のピンの状態が読める
これだけ見るとただの出力ピンだが、このHighというのが出力電流100μAでしかない。そうか、この頃はCMOSじゃなかった。
つまり、実質的に、1でプルアップ・0でLowということなので、1を書き込んだ状態でプルアップ付き入力として使えるわけである。
説明を読むと、TTLデバイスの入力やオープンコレクタデバイスの出力につなげますよと書いてある。TTLの出力には繋げないのだろうか。

命令を並べてみると、整然としている。
000000 0 00000No OperationNOP
000000 1 fffffMove W to fMOVWF
000001 0 fffffClear WCLRW
000001 1 fffffClear f CLRF
000010 d fffffSubtract W from fSUBWF
000011 d fffffDecrement fDECF
000100 d fffffInclusive OR W and fIORWF
000101 d fffffAND W and fANDWF
000110 d fffffExclusive OR W and fXORWF
000111 d fffffAdd W and fADDWF
001000 d fffffMove fMOVF
001001 d fffffComplement fCOMF
001010 d fffffIncrement fINCF
001011 d fffffDecrement f, Skip if ZeroDECFSZ
001100 d fffffRotate Right fRRF
001101 d fffffRotate Left fRLF
001110 d fffffSwap halves fSWAPF
001111 d fffffIncrement f, Skip if ZeroINCFSZ

0100 bbb fffffBit Clear fBCF
0101 bbb fffffBit Set fBSF
0110 bbb fffffBit Test f, Skip if ClearBTFSC
0111 bbb fffffBit Test f, Skip if SetBTFSS

1000 kkkkkkkkReturnRET (ビットパターンは原文ママ; 後述)
1000 kkkkkkkkReturn and place Literal in WRETLW
1001 kkkkkkkkCall subroutineCALL
101x kkkkkkkkGo To addressGOTO
1100 kkkkkkkkMove Literal to WMOVLW
1101 kkkkkkkkInclusive OR Literal and WIORLW
1110 kkkkkkkkAND Literal and WANDLW
1111 kkkkkkkkExclusive OR Literal and WXORLW
000000000000 No OperationNOP
0000001fffffMove W to fMOVWF
0000010fffffClear WCLRW
0000011fffffClear f CLRF
000010dfffffSubtract W from fSUBWF
000011dfffffDecrement fDECF
000100dfffffInclusive OR W and fIORWF
000101dfffffAND W and fANDWF
000110dfffffExclusive OR W and fXORWF
000111dfffffAdd W and fADDWF
001000dfffffMove fMOVF
001001dfffffComplement fCOMF
001010dfffffIncrement fINCF
001011dfffffDecrement f, Skip if ZeroDECFSZ
001100dfffffRotate Right fRRF
001101dfffffRotate Left fRLF
001110dfffffSwap halves fSWAPF
001111dfffffIncrement f, Skip if ZeroINCFSZ
0100bbbfffffBit Clear fBCF
0101bbbfffffBit Set fBSF
0110bbbfffffBit Test f, Skip if ClearBTFSC
0111bbbfffffBit Test f, Skip if SetBTFSS
1000kkkkkkkkReturnRET (ビットパターンは原文ママ; 後述)
1000kkkkkkkkReturn and place Literal in W RETLW
1001kkkkkkkkCall subroutineCALL
101xkkkkkkkkGo To addressGOTO
1100kkkkkkkkMove Literal to WMOVLW
1101kkkkkkkkInclusive OR Literal and WIORLW
1110kkkkkkkkAND Literal and WANDLW
1111kkkkkkkkExclusive OR Literal and WXORLW
現在のベースラインPICの33命令と比べ、無い命令がTRIS, OPTION, SLEEP, CLRWDTの4つ。
TRISは先述。
OPTIONは、設定するほどオプションが無い。
NMOSなのでクロックを止めたところで電力は減らないのでスリープという概念が無い。(という理解でいいのかな…)
ウォッチドッグタイマは無い。
その他の命令はベースラインと同一である。
GOTOの9bit目が「x」と表記されているが、説明を見るとページ切り替えということで、動作はベースラインと同じで表記が異なるだけのようだ。たぶんリテラルを8bitに合わせたかったのだろう。
RET命令が表に載っているがなぜかビットパターンはRETLW命令と同じである。説明を見ると「0→W, RAR→PC」とあり(RAR = Return Address Register)、たぶん誤植で本来は「1000 00000000」と書きたかったのだろう。
現在もベースラインでRETURN命令は「RETLW 0」のエイリアスとなっているのでそれと同じことである。

なおベースラインでの追加4命令+隠し命令HALTのビットパターンを見ると、後から隙間に追加したことがよく分かる。
0000 0000 0001 HALT
0000 0000 0010 OPTION
0000 0000 0011 SLEEP
0000 0000 0100 CLRWDT
0000 0000 0101 TRIS PORTA

0000 0000 1001 TRIS PORTE
ついでにEnhancedベースラインの追加命令も並べておこう。こちらは空き領域の上から攻めてきているようだ。
0000 0001 1111 RETFIE
0000 0001 1110 RETURN
0000 0001 0kkk MOVLB

  • 同じカテゴリー(マイコン)の記事画像
    ポケットプリンタ制御
    I2C液晶が動かない理由が分かった
    ゲームボーイの吸い出し機を作った (後編)
    ARMマイコンはじめました。
    SDカードから1セクタ読み取るまでの手順解説
    PICで浮動小数点ウェイトルーチン
    同じカテゴリー(マイコン)の記事
     PIC16のDhrystone MIPSを測ろうとしてみた (2020-04-29 02:23)
     ポケットプリンタ制御 (2018-12-22 17:40)
     I2C液晶が動かない理由が分かった (2017-01-31 01:54)
     ゲームボーイの吸い出し機を作った (後編) (2017-01-16 22:44)
     ARMマイコンはじめました。 (2016-05-28 14:43)
     SDカードから1セクタ読み取るまでの手順解説 (2015-10-05 01:09)
    Post time : 2015年09月22日 05:27│Comments(0)マイコン
    URL欄を実験的に消してる間に廃止されてしまいました。まあいいか。
     
    <ご注意>
    書き込まれた内容は公開され、ブログの持ち主だけが削除できます。
    削除
    初代PIC解説
      コメント(0)