Arduino を使った ATtiny10 の書き込み (4)
今回は、
- ブレッドボード・シールドの製作
- ターゲットへのプログラム書き込み後に自動でそのターゲット・プログラムが走り出すようにするためのスケッチの修正点
を取り上げます。
単なる「フラッシュ書き込み器」として使うならば別に問題ないのですが、横着をして、周辺回路も組み込んで ISP 的に使おうとするとうまく行かない場合があります。
具体的には、DAC として PWM を使うために必要な LPF を、簡単のため LCR のパッシブ回路で構成すると、実用的な素子の値ではインピーダンスの低いものしか実現できません。
それが重い負荷となり、フラッシュ書き込み時のロジック・レベルに影響して書き込みに失敗する状態になります。
OP アンプを使ったアクティブ・フィルタにすればインピーダンスを上げ、書き込み時のロジック・レベルへの影響を減らせますが、AE-ATmega 基板上には十分なスペースがありません。
そこで、以下のページを参考に「ブレッドボード・シールド」を作成して、必要な回路をそこに組むことにしました。
写真を下に示します。 (ブレッドボード部のみです。 本体からは外してあります。)
AE-ATmega 基板を使っていますが、その目的は、
- 「連結ピン」をハンダ付けして固定するためにランドを利用する
- ブレッドボードを貼り付ける土台として利用する
ためのもので、電気的な接続は何もしてありません。
ブレッドボード部分が左右中央ではなく、右側にズレているのは、AE-ATmega 基板の左端の 24P DIP 用のパターンのランド 1 列を露出させ、それを利用してコネクタを実装するためです。
現在は何も実装してありません。
2 番目の話題の、スケッチの修正については、当初はターゲット・マイコンに書き込んだプログラムを走らせるために、Arduino もろとも電源 OFF / ON を実行していたのですが、次第に面倒になってきました。
そこで、フラッシュ書き込み後は TPI 接続を終了し、周辺回路と干渉しないように Arduino 側のピンをハイインピーダンスに設定するようにスケッチを修正しました。
修正点を下に示します。
ファイル「Arduino918.pde」内の setup() 関数を下のように変更します。
void setup( void ) { // Digital 13 pin (LED) was changed to OUTPUT by bootloader pinMode(13, INPUT); // revert to INPUT /* Initialise USART for AVROSP communication */ avrosp_comm_init(); } // void setup()
これは、ブートローダで LED を点滅させるためにディジタル 13 番ピンの PB5/SCK を出力モードにしたままアプリケーション・プログラムへ制御を移すので、元の入力モードに戻すための pinMode() の呼び出しを 1 行加えたものです。
ファイル「TPI_driver.cpp」内の TPI 終了処理をする tpi_disable() 関数を下のように変更します。
/* Disable TPI */ void tpi_disable() { #if !defined(ORIGINAL) // modified for Arduino // clear NVMEN bit in TPISR tpi_send_byte(SSTCS |TPISR); tpi_send_byte(0); // disable NVM interface do { read_tpi_status(); } while (tpi_status) ; // wait until released // negate RESET (bring to HIGH) PORTB |= _BV(TPI_RESET); // PB2/SS# = '1' SPCR &= ~(_BV(SPE)); // disable SPI // set SCK/MOSI/MISO/SS# as input DDRB &= ~( _BV(TPI_CLK) // PB5/SCK | _BV(TPI_DATA_RX) // PB4/MISO | _BV(TPI_DATA_TX) // PB3/MOSI | _BV(TPI_RESET)); // PB2/SS# // disable pullup PORTB &= ~( _BV(TPI_CLK) // PB5/SCK | _BV(TPI_DATA_RX) // PB4/MISO | _BV(TPI_DATA_TX) // PB3/MOSI | _BV(TPI_RESET)); // PB2/SS# #else // original PORTD |=(1<<TPI_RESET);//Release RESET UCSR1B &=(~(1<<RXEN1)); UCSR1B &=(~(1<<TXEN1)); #endif }
この修正では、ATtiny10 側の「NVMEN」ビットを落とし、TPI 接続を終了させ、Arduino 側のピンは入力モードでプルアップなしの状態にしています。