AT90S1200用 内部RC発振回路有効化ボードの製作


目次


1.概要
AVRマイコンAT90S1200は内部にRC発振回路を持っているため、特に速さや時間精度を必要としない制御ならば、水晶発振子やセラミック発振子を外付けしなくても使用することができます。これは回路簡素化の面で非常に有利です。しかし秋月のAKI-AVRプログラマキットなどが採用しているシリアルプログラミングでは、内部発振回路の有効/無効が選択できません。このため内部発振を利用する場合はAT90S1200Aを使用しなければならず、使い分けが不便です。そこで、この内部発振回路の有効/無効だけを変更できるプログラムボードを製作することにしました。


2.回路
回路自体はAT90S1200で制御するようになっているので、非常にシンプルです。では、回路図と部品表を下に示します。

電源ですが、もし手元に安定化された+12V電源があるならば、78L12は省略出来ます。また、電源にACアダプタ等安定化されていない電源を使用される場合には、入力部に100μF以上の電解コンデンサを、積層セラミックと並列に入れて下さい。

参考までに、私の作成したボードの写真を載せておきます。

基板表
基板表


基板裏
基板裏



3.プログラム
内部発振回路有効化のプロセスは次の通りです。
  1. RESET端子に12V印加
  2. XA0=0、XA1=1、BS=0、PB6=1にして、XTAL1に正パルスを入れる
  3. XA0=1、XA1=0、BS=0、PB0=0にして、XTAL1に正パルスを入れる
  4. WR端子に1mS以上の負パルスを入れる
なお、逆に無効化する場合は、3.でPB0=1にします。では、プログラムを以下に示します。


;****************************************************************
; AT90S1200(A)用 RCEN書き換えボード制御プログラム Ver0.1
; 制御CPU:AT90S1200
;
;  Copyright (C) 2000  aPony
;
;****************************************************************


.INCLUDE "1200def.inc"


;**** 汎用レジスタの指定 ****

.DEF	TEMP = R16
.DEF	STACK = R17
.DEF	COUNT1 = R18
.DEF	COUNT2 = R19


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

	RJMP	RESET		; Reset handle
	RJMP	INT_HANDLE	; INT0 handle
	RJMP	RESET		; Reset handle
;	RJMP	RESET		; Reset handle

RESET:

;**** PORTのイニシャライズ ****

	; ポートBのビット6以外を出力に設定
	LDI	TEMP, 0xBF
	OUT	DDRB, TEMP
	
	; RESETを1(0Vに)、入力ビットはプルアップなし
	LDI	TEMP, 0x80
	OUT	PORTB, TEMP
	
	; ポートDのビット2・5以外を出力に設定
	LDI	TEMP, 0xDB
	OUT	DDRD, TEMP
	
	; 出力ビットはすべて0、入力ビットはプルアップ有り
	LDI	TEMP, 0x24
	OUT	PORTD, TEMP


;**** 割り込みのイニシャライズ ****

	; 外部割り込み、立ち下がりで発生
	LDI	TEMP, (1<<ISC01)
	OUT	MCUCR, TEMP

	; 外部割り込み端子を有効に
	LDI	TEMP, (1<<INT0)
	OUT	GIMSK, TEMP


;**** レジスタのイニシャライズ ****

	LDI	COUNT1, 0xFF
	LDI	COUNT2, 0xFF


;****  外部割り込みがかかるまでループ ****


	SEI
WAIT1:
	RJMP	WAIT1


;****  外部割り込み処理プログラム ****

INT_HANDLE:
	IN	STACK, SREG	; SREGレジスタを待避する
	
	CBI	PORTB, 7	; RESET端子に12V印加
	
	NOP			; 100nS以上待つ
	
	SBI	PORTB, 3	; WRを1に
	SBI	PORTB, 4	; OEを1に
	
	; XA0=0、XA1=1 (Load Command)
	SBI	PORTB, 0
	CBI	PORTB, 1
	
	SBI	PORTD, 0	; PB6=1に(FUSEビット書き込みコマンド)
	
	; XTAL1に正パルス印加(67nS以上)
	SBI	PORTB, 5
	NOP
	CBI	PORTB, 5
	
	; XA0=1、XA1=0 (Load Data)
	CBI	PORTB, 0
	SBI	PORTB, 1
	
	; MODEスイッチが1ならPB0=1に(内部発振無効)
	SBIC	PIND, 5
	SBI	PORTD, 1
	
	; XTAL1に正パルス印加(67nS以上)
	SBI	PORTB, 5
	NOP
	CBI	PORTB, 5
	
	; WRに負パルスを印加(1mS以上)
	CBI	PORTB, 3
WAIT_WR:	
	DEC	COUNT2
	BRNE	WAIT_WR
	
	LDI	COUNT2, 0xFF
	DEC	COUNT1
	BRNE	WAIT_WR

	SBI	PORTB, 3	; WRを1に戻す

WAIT_RDY:
	SBIS	PINB, 6		; RDY/BSYが0ならば、1になるまで待つ
	RJMP	WAIT_RDY
	
	
	; 後処理
	
	LDI	TEMP, 0x80
	OUT	PORTB, TEMP
	
	LDI	TEMP, 0x24
	OUT	PORTD, TEMP
	
	; 外部割り込み端子を無効に
	LDI	TEMP, (0<<INT0)
	OUT	GIMSK, TEMP
	
	OUT	SREG, STACK	; SREGレジスタを復帰する
	RETI



4.使用法
まず、内部発振回路を有効にするか無効にするかを選択します。PD5につないでいるスライドスイッチをONにしてGNDに落とすと有効化、OFFにすると無効化となります。その後、STARTスイッチを押すと、すぐに書き換え完了です。なお特に書き換え完了ランプ等は付けませんでしたが、気になる方はポートDの余った部分に付けて、プログラムを追加してください。また、現在の有効/無効の状態の取得も改造次第で可能だと思われるので、もし興味のある方は挑戦してみて下さい。ちなみに私は動作確認のために、秋月のライターと一緒についてきたLED点灯回路を利用しています。有効化されればこの回路が動くはずです。


5.配布
AT90S1200用・内部発振回路有効化ボード(回路図・プログラム)



戻る