Nの電子講座・AVRマイコン編
第1回 AT90S1200



目次



1.概要
ATMEL社のAVRマイコンシリーズは、Flash EEPROM内蔵の1チップRISCアーキテクチャマイコンです。ここではその中でも一番ROM容量の少ないAT90S1200を取り上げます。なお、とりあえず使うには必要ないと思われる省電力モード設定、ウォッチドッグタイマ等の説明は割愛します。AT90S1200の主な特徴は以下の通りです。
これだけの機能が20ピンパッケージに収まっているので、非常に使いやすいマイコンになっています。現在1チップマイコンでは、Microchip社のPICが有名ですが、AVRの方が内部レジスタ等の扱いが簡単ですし、比較的安価なのでおすすめです。なお、ピン接続は下の通りです。



2.構成
2−1.レジスタ
2−2.アドレシングモード
2−3.I/Oアドレス空間
2−4.システムクロック
2−5.RESET


3.パラレルI/Oポート
AT90S1200のI/Oポートには、8ポートのポートBと、7ポートのポートDの2つがあります。ただし、他の機能との兼用ピンが何本かあるので、必ず15ポートすべてを使用できるというわけではありません。それでは各ポートを順に見ていきましょう。

3−1.ポートB
3−2.ポートD


4.割り込み
割り込み要因は4種類あります。

ベクタNoプログラムアドレス割り込み要因
1$000リセット
2$001外部割り込み
3$002タイマー・カウンタオーバーフロー
4$003アナログコンパレータ

ですから、$000にはRJMP命令を置いて、$004以降にプログラム本体を置く必要があります(割り込みを全く使用しないのなら別ですが)。

割り込みに関係するI/Oは以下の通りです。
名称略称I/Oアドレス内容
一般割り込みマスクレジスタGIMSK$3Bbit6(INT0)が1の時、外部割り込み端子(INT0)が有効
タイマー・カウンタ割り込みマスクレジスタTIMSK$39bit1(TOIE0)が1の時、タイマー・カウンタオーバーフロー割り込みが有効
タイマー・カウンタ割り込みフラグレジスタTIFR$38タイマー・カウンタオーバーフロー割り込みがかかったとき、bit1(TOV0)が1になる(このレジスタはリードオンリー)
MCUコントロールレジスタMCUCR$35bit5,4は省電力モード設定なので割愛(0を書き込むこと)。bit1(ISC01)、bit0(ISC00)は外部割り込み端子(INT0)の設定。下の表を参照のこと

ISC01ISC00外部割り込み発生条件
00INT0端子が0の時、割り込み発生
01予約済み(この設定はしないこと)
10INT0端子の立ち下がりで割り込み発生
11INT0端子の立ち上がりで割り込み発生

まとめると、割り込み設定の手順は以下のようになります。


5.タイマー・カウンタ
AT90S1200には1チャネルのタイマー・カウンタ回路があります。クロック入力にはシステムクロックの他に外部入力を使用することもできます。割り込みの項で出てきた以外の、タイマー・カウンタに関係するI/Oは以下の通りです。

名称略称I/Oアドレス内容
タイマー・カウンタ0コントロールレジスタTCCR0$33bit3(CS02)、bit2(CS01)、bit1(CS00)で入力クロックの設定。下の表を参照
タイマー・カウンタ0TCNT0$32カウンター初期値の設定。説明は後述

CS02CS01CS00入力クロック設定
000タイマー・カウンタはストップ
001システムクロックをそのまま入力
010システムクロック / 8
011システムクロック / 64
100システムクロック / 256
101システムクロック / 1024
110外部クロック入力(T0)の立ち下がり
111外部クロック入力(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になったときに別の処理をさせる、というような工夫が必要になります。


6.内蔵EEPROM
AT90S1200はプログラム用のFlash EEPROMの他に、データ用のEEPROMを64バイト内蔵しています。データ用EEPROMへのデータ書き込みは、プログラム書き込み時/実行時、どちらでも可能です。EEPROMアクセスに関係するI/Oレジスタは次の3つです。

名称略称I/Oアドレス内容
EEPROMアドレスレジスタEEAR$1E読み書きするEEPROMのアドレスを下位6ビットで指定
EEPROMデータレジスタEEDR$1DEEPROM書き込み時はここに書き込み、読み込み時はここから読み出す
EEPROMコントロールレジスタEECR$1CEEPROM書き込み時はbit1(EEWE)を1に、読み込み時はbit0(EERE)を1にする

読み出し/書き込みの手順は以下のようになります。
なお、EEWE、EEREは書き込み/読み出しが終わると自動的に0になります。また、EEPROMの書き込みには最大4mS程度の時間がかかるので、データを書き込む場合には、必ずEEWEが0であることを確かめてからにしなければなりません。

また、読み出し/書き込み、いずれの場合にも実行後は2クロックの間CPUの実行が停止します。


7.アナログコンパレータ
アナログコンパレータは、12ピン(AIN0)、13ピン(AIN1)を使用し、AIN0の電圧がAIN1より高ければ1が、逆ならば0が出力されます。そしてその出力の変化で割り込みを発生させることができます。AIN0、AIN1に加える電圧は0(V)〜Vcc(V)までだと思われます(曖昧な書き方ですいません。PDFに詳しく書かれていないので)。アナログコンパレータに関係するI/Oレジスタはアナログコンパレータコントロール/ステータスレジスタ(ACSR/$08)のみです。ACSRの各ビットの内容は次の通りです。

bit略称内容
7ACDAnalog Comparator Disable。1にするとコンパレータへの電源供給停止(Disable状態)
6 予約済み(Reserved)
5ACOAnalog Comparator Output。コンパレータの出力が直結されている。読み出し専用
4ACIAnalog Comparator Interrupt flag。コンパレータ割り込みが発生してから、割り込みプログラムが実行されるまで1になる
3ACIEAnalog Comparator Interrupt Enable。1にするとコンパレータ割り込みが有効になる
2 予約済み(Reserved)
1ACIS1Analog Comparator Interrupt mode Select1。割り込み条件設定。下を参照
0ACIS0Analog Comparator Interrupt mode Select0。割り込み条件設定。下を参照

ACIS1ACIS0コンパレータ割り込み発生条件
00コンパレータ出力が変わる毎に割り込み発生
01予約済み(この設定はしないこと)
10コンパレータ出力の立ち下がりで割り込み発生
11コンパレータ出力の立ち上がりで割り込み発生

なお、ACIS1、ACIS0を変更する場合には、不必要な割り込みが発生するのを防ぐため、必ずACIEを0にして、割り込みを無効にしておかなければなりません。

アナログコンパレータ割り込みの流れは以下の通りです。


8.命令一覧
記号の解説
命令一覧
ニーモニックオペランド解説オペレーション変化フラグクロック数
算術・論理命令
ADDRd, RrRdとRrを加算し、結果をRdに格納Rd ← Rd + RrZ,C,N,V,H1
ADCRd, RrRdとRrをキャリー付きで加算し、結果をRdに格納Rd ← Rd + Rr + CZ,C,N,V,H1
SUBRd, RrRdからRrを引き、結果をRdに格納Rd ← Rd - RrZ,C,N,V,H1
SUBIRd, KRdから定数Kを引き、結果をRdに格納Rd ← Rd - KZ,C,N,V,H1
SBCRd, RrRdからRrをキャリー付きで引き、結果をRdに格納Rd ← Rd - Rr - CZ,C,N,V,H1
SBCIRd, KRdから定数Kをキャリー付きで引き、結果をRdに格納Rd ← Rd - K - CZ,C,N,V,H1
ANDRd, RrRdとRrの論理ANDを取り、結果をRdに格納Rd ← Rd ・ RrZ,N,V1
ANDIRd, KRdと定数Kの論理ANDを取り、結果をRdに格納Rd ← Rd ・ KZ,N,V1
ORRd, RrRdとRrの論理ORを取り、結果をRdに格納Rd ← Rd ∨ RrZ,N,V1
ORIRd, KRdと定数Kの論理ORを取り、結果をRdに格納Rd ← Rd ∨ KZ,N,V1
EORRd, RrRdとRrのEX-ORを取り、結果をRdに格納Rd ← RdとRrのEX-ORZ,N,V1
COMRdRdの1の補数を取り、Rdに格納Rd ← $FF - RdZ,C,N,V1
NEGRdRdの2の補数を取り、Rdに格納Rd ← $00 - RdZ,C,N,V,H1
SBRRd, K定数Kを2進数にした時、1になるビットを1に。ORIと同じRd ← Rd ∨ KZ,N,V1
CBRRd, K定数Kを2進数にした時、0になるビットを0にRd ← Rd ・ ($FF - K)Z,N,V1
INCRdRdに1を加算(インクリメント)Rd ← Rd + 1Z,N,V1
DECRdRdから1を減算(デクリメント)Rd ← Rd - 1Z,N,V1
TSTRdRdが0や負数かどうかを調べる。Rd自身は不変Rd ← Rd ・ RdZ,N,V1
CLRRdRdをクリアRd ← RdとRdのEX-ORZ,N,V1
SERRdRdを$FF(0xFF)にセットRd ← $FFZ,N,V1
分岐命令
RJMPk現在番地からk離れた所へ、相対ジャンプPC ← PC + k + 1なし2
RCALLk現在番地からk離れた所へ、相対サブルーチンコールPC ← PC + k + 1なし3
RET サブルーチンからのリターンPC ← STACKなし4
RETI 割り込みからのリターンPC ← STACKI4
CPSERd, RrRdとRrを比較し、一致すれば次の命令をスキップif (Rd = Rr) PC ← PC + 2 or 3なし1 / 2
CPRd, RrRdとRrを比較Rd - RrZ,N,V,C,H1
CPCRd, RrRdとRrをキャリー付きで比較Rd - Rr - CZ,N,V,C,H1
CPIRd, KRdと定数Kを比較Rd - KZ,N,V,C,H1
SBRCRr, bRrのビットbが0なら、次の命令をスキップif (Rr(b) = 0) PC ← PC + 2 or 3なし1 / 2
SBRSRr, bRrのビットbが1なら、次の命令をスキップif (Rr(b) = 1) PC ← PC + 2 or 3なし1 / 2
SBICP, bI/OレジスタPのビットbが0なら、次の命令をスキップif (P(b) = 0) PC ← PC + 2 or 3なし1 / 2
SBISP, bI/OレジスタPのビットbが1なら、次の命令をスキップif (P(b) = 1) PC ← PC + 2 or 3なし1 / 2
BRBSs, kステータスレジスタのビットsが1なら、kだけ相対ジャンプif (SREG(s) = 1) then PC ← PC + k + 1なし1 / 2
BRBCs, kステータスレジスタのビットsが0なら、kだけ相対ジャンプif (SREG(s) = 0) then PC ← PC + k + 1なし1 / 2
BREQkZフラグが1(または比較命令の結果が一致)なら、kだけ相対ジャンプif (Z = 1) then PC ← PC + k + 1なし1 / 2
BRNEkZフラグが0(または比較命令の結果が不一致)なら、kだけ相対ジャンプif (Z = 0) then PC ← PC + k + 1なし1 / 2
BRCSkCフラグが1なら、kだけ相対ジャンプif (C = 1) then PC ← PC + k + 1なし1 / 2
BRCCkCフラグが0なら、kだけ相対ジャンプif (C = 0) then PC ← PC + k + 1なし1 / 2
BRSHk減算・比較命令の結果、同じか大きければkだけ相対ジャンプ。BRCCと同じif (C = 0) then PC ← PC + k + 1なし1 / 2
BRLOk減算・比較命令の結果、小さければkだけ相対ジャンプ。BRCSと同じif (C = 1) then PC ← PC + k + 1なし1 / 2
BRMIkNフラグが1(結果がマイナス)なら、kだけ相対ジャンプif (N = 1) then PC ← PC + k + 1なし1 / 2
BRPLkNフラグが0(結果がプラス)なら、kだけ相対ジャンプif (N = 0) then PC ← PC + k + 1なし1 / 2
BRGEk符号付き演算の結果が0より大きいか、または等しければ、kだけ相対ジャンプif ((NとVのEX-OR) = 0) then PC ← PC + k + 1なし1 / 2
BRLTk符号付き演算の結果が0より小さければ、kだけ相対ジャンプif ((NとVのEX-OR) = 1) then PC ← PC + k + 1なし1 / 2
BRHSkHフラグが1なら、kだけ相対ジャンプif (H = 1) then PC ← PC + k + 1なし1 / 2
BRHCkHフラグが0なら、kだけ相対ジャンプif (H = 0) then PC ← PC + k + 1なし1 / 2
BRTSkTフラグが1なら、kだけ相対ジャンプif (T = 1) then PC ← PC + k + 1なし1 / 2
BRTCkTフラグが0なら、kだけ相対ジャンプif (T = 0) then PC ← PC + k + 1なし1 / 2
BRVSkVフラグが1なら、kだけ相対ジャンプif (V = 1) then PC ← PC + k + 1なし1 / 2
BRVCkVフラグが0なら、kだけ相対ジャンプif (V = 0) then PC ← PC + k + 1なし1 / 2
BRIEkIフラグが1(割り込み許可状態)なら、kだけ相対ジャンプif (I = 1) then PC ← PC + k + 1なし1 / 2
BRIDkIフラグが0(割り込み禁止状態)なら、kだけ相対ジャンプif (I = 0) then PC ← PC + k + 1なし1 / 2
データ転送命令
LDRd, ZZレジスタで示されるレジスタからRdに、データを転送Rd ← (Z)なし2
STZ, RrRrからZレジスタで示されるレジスタに、データを転送(Z) ← Rrなし2
MOVRd, RrRrからRdにデータを転送Rd ← Rrなし1
LDIRd, KRdに定数Kを代入Rd ← Kなし1
INRd, PI/OポートPからRdにデータを転送Rd ← Pなし1
OUTP, RrRrからI/OポートPにデータを転送P ← Rrなし1
ビット・ビットテスト命令
SBIP, bI/Oレジスタのビットbを1にセットI/O(P, b) ← 1なし2
CBIP, bI/Oレジスタのビットbを0にクリアI/O(P, b) ← 0なし2
LSLRdRdを左に1ビット論理シフトRd(n+1) ← Rd(n), Rd(0) ← 0Z,C,N,V1
LSRRdRdを右に1ビット論理シフトRd(n) ← Rd(n+1), Rd(7) ← 0Z,C,N,V1
ROLRdRdを左に1ビットローテートシフト(キャリー付き)Rd(0) ← C, Rd(n+1) ← Rd(n), C ← Rd(7)Z,C,N,V1
RORRdRdを右に1ビットローテートシフト(キャリー付き)Rd(7) ← C, Rd(n) ← Rd(n+1), C ← Rd(0)Z,C,N,V1
ASRRdRdを右に1ビット算術シフト(ビット7はそのまま)Rd(n) ← Rd(n+1) ただしn=1〜6Z,C,N,V1
SWAPRdRdの上下4ビットを入れ替えRd(3〜0) ← Rd(7〜4), Rd(7〜4) ← Rd(3〜0)なし1
BSETsステータスレジスタのビットsを1にセットSREG(s) ← 1SREG(s)1
BCLRsステータスレジスタのビットsを0にクリアSREG(s) ← 0SREG(s)1
BSTRr, bRrのビットbをTフラグに転送T ← Rr(b)T1
BLDRd, bTフラグをRdのビットbに転送Rd(b) ← Tなし1
SEC Cフラグを1にセットC ← 1C1
CLC Cフラグを0にクリアC ← 0C1
SEN Nフラグを1にセットN ← 1N1
CLN Nフラグを0にクリアN ← 0N1
SEZ Zフラグを1にセットZ ← 1Z1
CLZ Zフラグを0にクリアZ ← 0Z1
SEI Iフラグを1にセット(割り込みを許可)I ← 1I1
CLI Iフラグを0にクリア(割り込みを禁止)I ← 0I1
SES Sフラグを1にセットS ← 1S1
CLS Sフラグを0にクリアS ← 0S1
SEV Vフラグを1にセットV ← 1V1
CLV Vフラグを0にクリアV ← 0V1
SET Tフラグを1にセットT ← 1T1
CLT Tフラグを0にクリアT ← 0T1
SEH Hフラグを1にセットH ← 1H1
CLH Hフラグを0にクリアH ← 0H1
NOP なにもしない なし1
SLEEP スリープモードに入る なし3
WDR ウォッチドッグリセット なし1





第2回へ

電子講座のトップに戻る