ATMEL社のAVRマイコンシリーズは、Flash EEPROM内蔵の1チップRISCアーキテクチャマイコンです。ここではその中でも一番ROM容量の少ないAT90S1200を取り上げます。なお、とりあえず使うには必要ないと思われる省電力モード設定、ウォッチドッグタイマ等の説明は割愛します。AT90S1200の主な特徴は以下の通りです。2.構成
・1K bytes Flash EEPROM(プログラム用)
これだけの機能が20ピンパッケージに収まっているので、非常に使いやすいマイコンになっています。現在1チップマイコンでは、Microchip社のPICが有名ですが、AVRの方が内部レジスタ等の扱いが簡単ですし、比較的安価なのでおすすめです。なお、ピン接続は下の通りです。
・64 bytes EEPROM(データ用)
・32本の8bit汎用レジスタ
・15ポートのパラレルI/O
・1チャネルのタイマー・カウンター
・最高12MHz動作
・RCオシレータ内蔵(1MHz)
・アナログコンパレータ内蔵
・電源は2.7〜6.0V
2−1.レジスタ3.パラレルI/OポートAT90S1200には32本の8ビットレジスタがあり、それぞれにR0〜R31という名前が付いています。ただし一部の命令(SBCI,SUBI,CPI,ANDI,ORI,LDI)はR16〜31まででしか使用できないようなので、普通にレジスタを使用する場合にはR16から使い始めた方がいいようです。またR30は間接アドレシングモード(後述)では特別にポインタとして使用されます。
2−2.アドレシングモード
レジスタ直接(1レジスタ) 1つのレジスタを直接指定して操作します レジスタ間接 R30で示されるレジスタに対して操作します レジスタ直接(2レジスタ) 2つのレジスタ間で操作します I/O直接 1つのレジスタとI/O間で操作します 相対ジャンプ RJMP・RCALL命令でのジャンプで使用されます。
2−3.I/Oアドレス空間I/Oアドレス空間は、$00〜$3Fまでの64バイトです。とくに注意すべきなのは、ステータスレジスタ(Z80でいうFレジスタ)がI/O空間($3F)に存在する点です。そのためこれにアクセスするにはIN/OUT命令を使わなければなりません。また、SBI,CBI,SBIS,SBICの各命令は、$00〜$1Fまででしか使用できません。各アドレスの詳細については出てきたときに説明します。
2−4.システムクロックAT90S1200では内蔵のRCオシレータ(1MHz)をシステムクロックに使用することが出来ます。しかし、秋月のAVRプログラマが採用しているようなシリアルプログラミングでは、この内蔵オシレータの有効・無効を選択出来ません。そのため、AT90S1200には2つのバージョンがあります。
AT90S1200 内蔵オシレータは初期状態では無効 AT90S1200A 内蔵オシレータは初期状態で有効
しかし、こちらで私が公開している書き換え回路を使用すれば、書き換えることができます。
内蔵オシレータを使用せず、クリスタルを接続する場合は、XTAL1とXTAL2間に接続すればOKです。
2−5.RESETRESET端子は負論理なので、0のときリセットがかかります。またパワーオンリセット回路を内蔵していますし、内部で端子がプルアップされているので、リセットボタンを使用しない場合には、端子をオープンのままにしておいてもかまいません。これはかなり便利です。
AT90S1200のI/Oポートには、8ポートのポートBと、7ポートのポートDの2つがあります。ただし、他の機能との兼用ピンが何本かあるので、必ず15ポートすべてを使用できるというわけではありません。それでは各ポートを順に見ていきましょう。4.割り込み
3−1.ポートBポートBは8ビットの双方向ポートです。電流は20mAまで流し出すことが可能で、入力として使用した場合、内部でプルアップすることもできます。
Bポートに関係するI/Oは次の3つです。
名称 略称 I/Oアドレス 内容 データレジスタ PORTB $18 各ビット毎に、出力設定時は出力したいデータ、入力設定時はプルアップの有無(1でプルアップあり) データディレクションレジスタ DDRB $17 各ビット毎に0で入力に、1で出力に設定 インプットピンアドレス PINB $16 入力設定時にポートのデータをここから読み出す
ポートBを使用するにはまずDDRBを設定し、入力の場合はその後PORTBを指定すればOKです。
なお、ポートBの何本かのポートは、別の用途にも使用されます。
ポート端子 他の用途 PB0 AIN0(アナログコンパレータ正入力) PB1 AIN1(アナログコンパレータ負入力) PB5 MOSI(シリアルプログラミング用データ入力) PB6 MISO(シリアルプログラミング用データ出力) PB7 SCK(シリアルプログラミング用クロック入力)
3−2.ポートDポートDは7ビットの双方向ポートです。ポートBと同じく電流は20mAまで流し出すことが可能で、入力として使用した場合、内部でプルアップすることもできます。
Dポートに関係するI/Oは次の3つです。
名称 略称 I/Oアドレス 内容 データレジスタ PORTD $12 各ビット毎に、出力設定時は出力したいデータ、入力設定時はプルアップの有無(1でプルアップあり) データディレクションレジスタ DDRD $11 各ビット毎に0で入力に、1で出力に設定 インプットピンアドレス PIND $10 入力設定時にポートのデータをここから読み出す
使い方はポートBと同じです。
ポートDの何本かのポートも、別の用途に使用されます。
ポート端子 他の用途 PD2 INT0(外部割り込み端子) PD4 T0(タイマー・カウンタ外部クロック入力)
割り込み要因は4種類あります。5.タイマー・カウンタ
ベクタNo プログラムアドレス 割り込み要因 1 $000 リセット 2 $001 外部割り込み 3 $002 タイマー・カウンタオーバーフロー 4 $003 アナログコンパレータ
ですから、$000にはRJMP命令を置いて、$004以降にプログラム本体を置く必要があります(割り込みを全く使用しないのなら別ですが)。
割り込みに関係するI/Oは以下の通りです。
名称 略称 I/Oアドレス 内容 一般割り込みマスクレジスタ GIMSK $3B bit6(INT0)が1の時、外部割り込み端子(INT0)が有効 タイマー・カウンタ割り込みマスクレジスタ TIMSK $39 bit1(TOIE0)が1の時、タイマー・カウンタオーバーフロー割り込みが有効 タイマー・カウンタ割り込みフラグレジスタ TIFR $38 タイマー・カウンタオーバーフロー割り込みがかかったとき、bit1(TOV0)が1になる(このレジスタはリードオンリー) MCUコントロールレジスタ MCUCR $35 bit5,4は省電力モード設定なので割愛(0を書き込むこと)。bit1(ISC01)、bit0(ISC00)は外部割り込み端子(INT0)の設定。下の表を参照のこと
ISC01 ISC00 外部割り込み発生条件 0 0 INT0端子が0の時、割り込み発生 0 1 予約済み(この設定はしないこと) 1 0 INT0端子の立ち下がりで割り込み発生 1 1 INT0端子の立ち上がりで割り込み発生
まとめると、割り込み設定の手順は以下のようになります。
外部割り込みを使用する場合
・CLI命令で割り込みを無効に
・MCUCRで外部割り込み発生条件の設定
・GIMSKのbit6を1に
・SEI命令で割り込みを有効に
タイマー・カウンタ割り込みを使用する場合
・CLI命令で割り込みを無効に
・TCCR0、TCNT0(後述)の設定
・TIMSKのbit1を1に
・SEI命令で割り込みを有効に
AT90S1200には1チャネルのタイマー・カウンタ回路があります。クロック入力にはシステムクロックの他に外部入力を使用することもできます。割り込みの項で出てきた以外の、タイマー・カウンタに関係するI/Oは以下の通りです。6.内蔵EEPROM
名称 略称 I/Oアドレス 内容 タイマー・カウンタ0コントロールレジスタ TCCR0 $33 bit3(CS02)、bit2(CS01)、bit1(CS00)で入力クロックの設定。下の表を参照 タイマー・カウンタ0 TCNT0 $32 カウンター初期値の設定。説明は後述
CS02 CS01 CS00 入力クロック設定 0 0 0 タイマー・カウンタはストップ 0 0 1 システムクロックをそのまま入力 0 1 0 システムクロック / 8 0 1 1 システムクロック / 64 1 0 0 システムクロック / 256 1 0 1 システムクロック / 1024 1 1 0 外部クロック入力(T0)の立ち下がり 1 1 1 外部クロック入力(T0)の立ち上がり
タイマー・カウンタ回路は、初期値がTCNT0のアップカウンタとして動作します。割り込みが発生するのはカウンタがオーバーフローしたときです。カウンタは8ビットなので、255(0xff)を越えるとオーバーフローします。そのため、例えば1/80にするときは、256-80=176(0xb0)をTCNT0に設定すればOKです。最大値はもちろん、0x00を設定したときの1/256です。
例えば、内部クロックをカウンター入力として、できるだけ割り込み発生の周期を長くしたいならば、まずTCCR0で1024分周に設定し、次にTCNT0に0x00を設定すれば、
1,000,000(Hz) ÷ 1024 ÷ 256 ≒ 3.8(Hz)
になります。もう少し長い時間にしたいならば、割り込み毎に、あるレジスタの数字を減らしていき、0になったときに別の処理をさせる、というような工夫が必要になります。
AT90S1200はプログラム用のFlash EEPROMの他に、データ用のEEPROMを64バイト内蔵しています。データ用EEPROMへのデータ書き込みは、プログラム書き込み時/実行時、どちらでも可能です。EEPROMアクセスに関係するI/Oレジスタは次の3つです。7.アナログコンパレータ
名称 略称 I/Oアドレス 内容 EEPROMアドレスレジスタ EEAR $1E 読み書きするEEPROMのアドレスを下位6ビットで指定 EEPROMデータレジスタ EEDR $1D EEPROM書き込み時はここに書き込み、読み込み時はここから読み出す EEPROMコントロールレジスタ EECR $1C EEPROM書き込み時はbit1(EEWE)を1に、読み込み時はbit0(EERE)を1にする
読み出し/書き込みの手順は以下のようになります。
読み出し時
なお、EEWE、EEREは書き込み/読み出しが終わると自動的に0になります。また、EEPROMの書き込みには最大4mS程度の時間がかかるので、データを書き込む場合には、必ずEEWEが0であることを確かめてからにしなければなりません。
・EEARでアドレスを指定
・EECRのbit0(EERE)を1に
・EEDRからデータを読み出す
書き込み時
・EEARでアドレスを指定
・EEDRにデータを書き込む
・EECRのbit1(EEWE)を1に
・続けて書き込む場合には、EEWEが0になるまで待つ
また、読み出し/書き込み、いずれの場合にも実行後は2クロックの間CPUの実行が停止します。
アナログコンパレータは、12ピン(AIN0)、13ピン(AIN1)を使用し、AIN0の電圧がAIN1より高ければ1が、逆ならば0が出力されます。そしてその出力の変化で割り込みを発生させることができます。AIN0、AIN1に加える電圧は0(V)〜Vcc(V)までだと思われます(曖昧な書き方ですいません。PDFに詳しく書かれていないので)。アナログコンパレータに関係するI/Oレジスタはアナログコンパレータコントロール/ステータスレジスタ(ACSR/$08)のみです。ACSRの各ビットの内容は次の通りです。8.命令一覧
bit 略称 内容 7 ACD Analog Comparator Disable。1にするとコンパレータへの電源供給停止(Disable状態) 6 予約済み(Reserved) 5 ACO Analog Comparator Output。コンパレータの出力が直結されている。読み出し専用 4 ACI Analog Comparator Interrupt flag。コンパレータ割り込みが発生してから、割り込みプログラムが実行されるまで1になる 3 ACIE Analog Comparator Interrupt Enable。1にするとコンパレータ割り込みが有効になる 2 予約済み(Reserved) 1 ACIS1 Analog Comparator Interrupt mode Select1。割り込み条件設定。下を参照 0 ACIS0 Analog Comparator Interrupt mode Select0。割り込み条件設定。下を参照
ACIS1 ACIS0 コンパレータ割り込み発生条件 0 0 コンパレータ出力が変わる毎に割り込み発生 0 1 予約済み(この設定はしないこと) 1 0 コンパレータ出力の立ち下がりで割り込み発生 1 1 コンパレータ出力の立ち上がりで割り込み発生
なお、ACIS1、ACIS0を変更する場合には、不必要な割り込みが発生するのを防ぐため、必ずACIEを0にして、割り込みを無効にしておかなければなりません。
アナログコンパレータ割り込みの流れは以下の通りです。
・ポートBのbit1、bit0を入力に設定
・ACIEを0に
・ACIS1、ACIS0で割り込み発生条件の設定
・ACIEを1に
記号の解説Rr…読み出し・転送元レジスタ。R0〜R31で指定。
Rd…書き込み・転送先レジスタ。R0〜R31で指定。ただしSBCI,SUBI,CPI,ANDI,ORI,LDIではR16〜R31で指定。
K…定数。0〜255(10進数)、0x00〜0xFF(16進数)、$00〜$FF(同じく16進数)、0b00000000 〜0b11111111(2進数)で指定。
k…相対ジャンプ命令の際の相対アドレス指定。-2048〜2047。
P…I/Oポート指定。$00〜$3F。
b…レジスタ・ポートのビット指定。0〜7で指定。0が最下位ビット、7が最上位ビット。
s…ステータスレジスタのビット指定。以下の通り。
ビット 7 6 5 4 3 2 1 0 フラグ I T H S V N Z C
各フラグの意味は、
フラグ 意味 I 割り込み(Interrupt)フラグ。1の時割り込み許可状態 T ビットコピー保存フラグ。BLD,BST命令で使用 H ハーフキャリーフラグ。演算の結果ビット3からビット4への桁上がりがあるとき、1になる S サインフラグ。NフラグとVフラグをEX-ORした結果が反映される V 2の補数オーバーフローフラグ。負数表現に2の補数を使用している場合、オーバーフロー発生時に1となる N ネガティブフラグ。演算結果が負数になるとき、1となる Z ゼロフラグ。演算結果が0になるとき、1となる C キャリーフラグ。演算の結果桁上がりが発生したとき、1となる
命令一覧
ニーモニック オペランド 解説 オペレーション 変化フラグ クロック数 算術・論理命令 ADD Rd, Rr RdとRrを加算し、結果をRdに格納 Rd ← Rd + Rr Z,C,N,V,H 1 ADC Rd, Rr RdとRrをキャリー付きで加算し、結果をRdに格納 Rd ← Rd + Rr + C Z,C,N,V,H 1 SUB Rd, Rr RdからRrを引き、結果をRdに格納 Rd ← Rd - Rr Z,C,N,V,H 1 SUBI Rd, K Rdから定数Kを引き、結果をRdに格納 Rd ← Rd - K Z,C,N,V,H 1 SBC Rd, Rr RdからRrをキャリー付きで引き、結果をRdに格納 Rd ← Rd - Rr - C Z,C,N,V,H 1 SBCI Rd, K Rdから定数Kをキャリー付きで引き、結果をRdに格納 Rd ← Rd - K - C Z,C,N,V,H 1 AND Rd, Rr RdとRrの論理ANDを取り、結果をRdに格納 Rd ← Rd ・ Rr Z,N,V 1 ANDI Rd, K Rdと定数Kの論理ANDを取り、結果をRdに格納 Rd ← Rd ・ K Z,N,V 1 OR Rd, Rr RdとRrの論理ORを取り、結果をRdに格納 Rd ← Rd ∨ Rr Z,N,V 1 ORI Rd, K Rdと定数Kの論理ORを取り、結果をRdに格納 Rd ← Rd ∨ K Z,N,V 1 EOR Rd, Rr RdとRrのEX-ORを取り、結果をRdに格納 Rd ← RdとRrのEX-OR Z,N,V 1 COM Rd Rdの1の補数を取り、Rdに格納 Rd ← $FF - Rd Z,C,N,V 1 NEG Rd Rdの2の補数を取り、Rdに格納 Rd ← $00 - Rd Z,C,N,V,H 1 SBR Rd, K 定数Kを2進数にした時、1になるビットを1に。ORIと同じ Rd ← Rd ∨ K Z,N,V 1 CBR Rd, K 定数Kを2進数にした時、0になるビットを0に Rd ← Rd ・ ($FF - K) Z,N,V 1 INC Rd Rdに1を加算(インクリメント) Rd ← Rd + 1 Z,N,V 1 DEC Rd Rdから1を減算(デクリメント) Rd ← Rd - 1 Z,N,V 1 TST Rd Rdが0や負数かどうかを調べる。Rd自身は不変 Rd ← Rd ・ Rd Z,N,V 1 CLR Rd Rdをクリア Rd ← RdとRdのEX-OR Z,N,V 1 SER Rd Rdを$FF(0xFF)にセット Rd ← $FF Z,N,V 1 分岐命令 RJMP k 現在番地からk離れた所へ、相対ジャンプ PC ← PC + k + 1 なし 2 RCALL k 現在番地からk離れた所へ、相対サブルーチンコール PC ← PC + k + 1 なし 3 RET サブルーチンからのリターン PC ← STACK なし 4 RETI 割り込みからのリターン PC ← STACK I 4 CPSE Rd, Rr RdとRrを比較し、一致すれば次の命令をスキップ if (Rd = Rr) PC ← PC + 2 or 3 なし 1 / 2 CP Rd, Rr RdとRrを比較 Rd - Rr Z,N,V,C,H 1 CPC Rd, Rr RdとRrをキャリー付きで比較 Rd - Rr - C Z,N,V,C,H 1 CPI Rd, K Rdと定数Kを比較 Rd - K Z,N,V,C,H 1 SBRC Rr, b Rrのビットbが0なら、次の命令をスキップ if (Rr(b) = 0) PC ← PC + 2 or 3 なし 1 / 2 SBRS Rr, b Rrのビットbが1なら、次の命令をスキップ if (Rr(b) = 1) PC ← PC + 2 or 3 なし 1 / 2 SBIC P, b I/OレジスタPのビットbが0なら、次の命令をスキップ if (P(b) = 0) PC ← PC + 2 or 3 なし 1 / 2 SBIS P, b I/OレジスタPのビットbが1なら、次の命令をスキップ if (P(b) = 1) PC ← PC + 2 or 3 なし 1 / 2 BRBS s, k ステータスレジスタのビットsが1なら、kだけ相対ジャンプ if (SREG(s) = 1) then PC ← PC + k + 1 なし 1 / 2 BRBC s, k ステータスレジスタのビットsが0なら、kだけ相対ジャンプ if (SREG(s) = 0) then PC ← PC + k + 1 なし 1 / 2 BREQ k Zフラグが1(または比較命令の結果が一致)なら、kだけ相対ジャンプ if (Z = 1) then PC ← PC + k + 1 なし 1 / 2 BRNE k Zフラグが0(または比較命令の結果が不一致)なら、kだけ相対ジャンプ if (Z = 0) then PC ← PC + k + 1 なし 1 / 2 BRCS k Cフラグが1なら、kだけ相対ジャンプ if (C = 1) then PC ← PC + k + 1 なし 1 / 2 BRCC k Cフラグが0なら、kだけ相対ジャンプ if (C = 0) then PC ← PC + k + 1 なし 1 / 2 BRSH k 減算・比較命令の結果、同じか大きければkだけ相対ジャンプ。BRCCと同じ if (C = 0) then PC ← PC + k + 1 なし 1 / 2 BRLO k 減算・比較命令の結果、小さければkだけ相対ジャンプ。BRCSと同じ if (C = 1) then PC ← PC + k + 1 なし 1 / 2 BRMI k Nフラグが1(結果がマイナス)なら、kだけ相対ジャンプ if (N = 1) then PC ← PC + k + 1 なし 1 / 2 BRPL k Nフラグが0(結果がプラス)なら、kだけ相対ジャンプ if (N = 0) then PC ← PC + k + 1 なし 1 / 2 BRGE k 符号付き演算の結果が0より大きいか、または等しければ、kだけ相対ジャンプ if ((NとVのEX-OR) = 0) then PC ← PC + k + 1 なし 1 / 2 BRLT k 符号付き演算の結果が0より小さければ、kだけ相対ジャンプ if ((NとVのEX-OR) = 1) then PC ← PC + k + 1 なし 1 / 2 BRHS k Hフラグが1なら、kだけ相対ジャンプ if (H = 1) then PC ← PC + k + 1 なし 1 / 2 BRHC k Hフラグが0なら、kだけ相対ジャンプ if (H = 0) then PC ← PC + k + 1 なし 1 / 2 BRTS k Tフラグが1なら、kだけ相対ジャンプ if (T = 1) then PC ← PC + k + 1 なし 1 / 2 BRTC k Tフラグが0なら、kだけ相対ジャンプ if (T = 0) then PC ← PC + k + 1 なし 1 / 2 BRVS k Vフラグが1なら、kだけ相対ジャンプ if (V = 1) then PC ← PC + k + 1 なし 1 / 2 BRVC k Vフラグが0なら、kだけ相対ジャンプ if (V = 0) then PC ← PC + k + 1 なし 1 / 2 BRIE k Iフラグが1(割り込み許可状態)なら、kだけ相対ジャンプ if (I = 1) then PC ← PC + k + 1 なし 1 / 2 BRID k Iフラグが0(割り込み禁止状態)なら、kだけ相対ジャンプ if (I = 0) then PC ← PC + k + 1 なし 1 / 2 データ転送命令 LD Rd, Z Zレジスタで示されるレジスタからRdに、データを転送 Rd ← (Z) なし 2 ST Z, Rr RrからZレジスタで示されるレジスタに、データを転送 (Z) ← Rr なし 2 MOV Rd, Rr RrからRdにデータを転送 Rd ← Rr なし 1 LDI Rd, K Rdに定数Kを代入 Rd ← K なし 1 IN Rd, P I/OポートPからRdにデータを転送 Rd ← P なし 1 OUT P, Rr RrからI/OポートPにデータを転送 P ← Rr なし 1 ビット・ビットテスト命令 SBI P, b I/Oレジスタのビットbを1にセット I/O(P, b) ← 1 なし 2 CBI P, b I/Oレジスタのビットbを0にクリア I/O(P, b) ← 0 なし 2 LSL Rd Rdを左に1ビット論理シフト Rd(n+1) ← Rd(n), Rd(0) ← 0 Z,C,N,V 1 LSR Rd Rdを右に1ビット論理シフト Rd(n) ← Rd(n+1), Rd(7) ← 0 Z,C,N,V 1 ROL Rd Rdを左に1ビットローテートシフト(キャリー付き) Rd(0) ← C, Rd(n+1) ← Rd(n), C ← Rd(7) Z,C,N,V 1 ROR Rd Rdを右に1ビットローテートシフト(キャリー付き) Rd(7) ← C, Rd(n) ← Rd(n+1), C ← Rd(0) Z,C,N,V 1 ASR Rd Rdを右に1ビット算術シフト(ビット7はそのまま) Rd(n) ← Rd(n+1) ただしn=1〜6 Z,C,N,V 1 SWAP Rd Rdの上下4ビットを入れ替え Rd(3〜0) ← Rd(7〜4), Rd(7〜4) ← Rd(3〜0) なし 1 BSET s ステータスレジスタのビットsを1にセット SREG(s) ← 1 SREG(s) 1 BCLR s ステータスレジスタのビットsを0にクリア SREG(s) ← 0 SREG(s) 1 BST Rr, b RrのビットbをTフラグに転送 T ← Rr(b) T 1 BLD Rd, b TフラグをRdのビットbに転送 Rd(b) ← T なし 1 SEC Cフラグを1にセット C ← 1 C 1 CLC Cフラグを0にクリア C ← 0 C 1 SEN Nフラグを1にセット N ← 1 N 1 CLN Nフラグを0にクリア N ← 0 N 1 SEZ Zフラグを1にセット Z ← 1 Z 1 CLZ Zフラグを0にクリア Z ← 0 Z 1 SEI Iフラグを1にセット(割り込みを許可) I ← 1 I 1 CLI Iフラグを0にクリア(割り込みを禁止) I ← 0 I 1 SES Sフラグを1にセット S ← 1 S 1 CLS Sフラグを0にクリア S ← 0 S 1 SEV Vフラグを1にセット V ← 1 V 1 CLV Vフラグを0にクリア V ← 0 V 1 SET Tフラグを1にセット T ← 1 T 1 CLT Tフラグを0にクリア T ← 0 T 1 SEH Hフラグを1にセット H ← 1 H 1 CLH Hフラグを0にクリア H ← 0 H 1 NOP なにもしない なし 1 SLEEP スリープモードに入る なし 3 WDR ウォッチドッグリセット なし 1
第2回へ
電子講座のトップに戻る