Nの電子講座・AVRマイコン編
第3回 プログラミング(2)



目次



1.外部割り込み
1−1.使用方法
1−2.特殊な使い方


2.内蔵EEPROM
AT90S1200には64バイトのデータ用内蔵EEPROMがあります。使い方の例としては、データテーブルをあらかじめEEPROM内に書き込んでおいて、実行時にそれを読み出す、などが考えられます。もちろん実行中の書き込みも可能ですから、書き換えもできます。ただ書き込みは多少遅い(最大4mS)ので、それだけは注意しなければなりません。読み出し/書き込みの例を以下に示します。


.INCLUDE "1200def.inc"

.DEF	STACK = R16
.DEF	TEMP = R17

	; EEPROM、$00番地を指定
	LDI	TEMP, 0x00
	OUT	EEAR, TEMP

	; EEDRに0x12を書き込み
	LDI	TEMP, 0x12
	OUT	EEDR, TEMP

	; そのデータをEEPROMに書き込み
	SBI	EECR, EEWE

WAIT:
	; EEWEが0になるまで待つ
	SBIC	EECR, EEWE
	RJMP	WAIT

	; EEPROM、$00番地を指定
	LDI	TEMP, 0x00
	OUT	EEAR, TEMP

	; EEPROMから読み出し
	SBI	EECR, EERE

	; そのデータをEEDRからTEMPに読み出し
	IN	TEMP, EEDR

ここで新しく出てきた命令を説明しておきます。SBIは「Set Bit in I/O register」の頭文字を取ったもので、I/Oレジスタのあるビットを1にします。書式は となります。上の例では2回出てきますが、前者はEECR($1C)のEEWE(bit1)を1にします。またここには出てきませんが、逆にI/Oレジスタのあるビットを0にしたい場合にはCBIという命令をつかいます。ただしこの2つの命令はどちらもI/Oレジスタ$00〜$1Fまででしか使用できないので注意が必要です。

その後のSBIC命令は「Skip if Bit in I/O register Cleared」の略で、I/Oレジスタのあるビットが0ならば、次の命令をスキップするという命令です。書式はSBIと同じく、 となります。また逆にあるビットが1の時にスキップするSBISという命令もあります。この2つの命令もI/Oレジスタ$00〜$1Fまででしか使用できないので注意してください。私的意見として、SBIC、SBISは下手に多用するとプログラムが読みにくくなるので、コメントはちゃんと書いておいた方が良いと思われます。


3.アナログコンパレータ
アナログコンパレータを使用する良い例はちょっと思いつきませんが、要するに2つの入力に加えられる電圧の大小の変化で割り込みを発生させるときに使用します。アナログコンパレータの出力は、AIN0がAIN1よりも大きいときは1、その逆の時は0になっています。例えばコンパレータ出力が0から1になるときに割り込みを発生させる場合には次のようになります。


.INCLUDE "1200def.inc"

.DEF	STACK = R16
.DEF	TEMP = R17

	; リセットベクトルと割り込みベクトルの指定

	RJMP	RESET		; リセット($000)
	RJMP	RESET		; 外部割り込み($001)
	RJMP	RESET		; タイマー0オーバーフロー($002)
	RJMP	ANA_COMP	; アナログコンパレータ($003)

RESET:
	; ポートBのbit1、bit0を入力に設定
	LDI	TEMP, 0xFC
	OUT	DDRB, TEMP

	; 内部プルアップはなし
	LDI	TEMP, 0x00
	OUT	PORTB, TEMP

	; コンパレータ出力の立ち上がりで割り込み発生
	LDI	TEMP, ((1<<ACIS1) + (1<<ACIS0))
	OUT	ACSR, TEMP

	; コンパレータ割り込みを有効に
	SBI	ACSR, ACIE

	SEI

	; 〜ここにメインプログラムを記述〜

ANA_COMP:
	IN	STACK, SREG

	; 〜ここにアナログコンパレータ割り込み処理プログラムを記述〜

	OUT	SREG, STACK
	RETI




電子講座のトップに戻る