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秒程度です。
匿名
画面が真っ暗、でもカーソルは出てる状況。
探して、ここにたどり着きました。
パスワード入力で、復活!
修理に出す寸前でした。ホントにありがとう!