AVRメモ

  • 投稿日:
  • 更新日:2008/11/23
  • by
  • カテゴリ:

AVRの実デバイスを使った実験を始めたので、メモ。 なお、ATmega8/AVR Studio 4.14/WinAVR 20080610を使っています。

リセットポートを使う場合の注意

リセットポートに値を出力設定しないように注意。 たとえば、mega8の場合、PC6(RESETを兼ねる)の値を出力設定にしてしまうと、正常動作しない。 具体的には、DDRCのビット6を0にしておく。

1ポートのみ出力する、反転する

PORTCの5番ピンの例。 出力する場合は、

PORTC |= _BV(PC5);
PORTC &= ~_BV(PC5);

ここで、アセンブラ出力ではsbi/cbiが使われているようです。 これらの命令は2クロックかかるので、1ポートのみという制約がなければ、1クロックのoutの方がいい場合もあります。 反転する場合は、

PORTC ^= _BV(PC5);

このアセンブラ出力は次のようになります。

in	r24, 0x15
ldi	r25, 0x20
eor	r24, r25
out	0x15, r24

割り込みルーチン

割り込みルーチンはISRで記述しますが、先立ってmainなどで割り込みモードの設定と割り込み許可を行っておく必要があります。 ここでは外部割込みINT0で説明します。

// interrupt service routine for INT0
ISR(INT0_vect) {
  ...
}
int main(void) {
  // interrupt enable for INT0
  GICR |= _BV(INT0);
  // interrupt condition: down edge
  MCUCR |= _BV(ISC01);
  sei();
  ...
}

MCUCRの設定では、立ち下がりエッジの場合はISC01=1, ISC00=0ですが、初期値が0なので、ISC00の設定を省略しています。

AVRは割り込みハンドラに分岐する前に、割り込み禁止にします。 アセンブラ出力では、割り込みルーチンISRからは自動的にretiでリターンしているため、明示的な割り込み再許可は不要のようです。

逆に言うと、デフォルトでは多重割り込みはできません。 ただ、調べてみた限りでは、割り込み要求はキューイングされており、割り込み処理中の要求は、今の割り込み処理終了後にトリガされているようです。

USB-シリアルアダプタでの書き込み

秋月で買ったUSB-シリアルアダプタ、Prolific USB-to-Serial Comm Portというものを使用しています。 これに、COMポート制御ISPアダプタを作成・接続しています。

読み書きはかなり遅く、mega8のEEPROM(512バイト)の読み込みに2分18秒ほどかかります。また、208バイトのプログラム(消去、書き込み、べりファイ)に2分37秒程度です。


こちらもよく読まれています