Arduino を使った ATtiny10 の書き込み (4)

今回は、

  • ブレッドボード・シールドの製作
  • ターゲットへのプログラム書き込み後に自動でそのターゲット・プログラムが走り出すようにするためのスケッチの修正点

を取り上げます。
単なる「フラッシュ書き込み器」として使うならば別に問題ないのですが、横着をして、周辺回路も組み込んで ISP 的に使おうとするとうまく行かない場合があります。
具体的には、DAC として PWM を使うために必要な LPF を、簡単のため LCR のパッシブ回路で構成すると、実用的な素子の値ではインピーダンスの低いものしか実現できません。
それが重い負荷となり、フラッシュ書き込み時のロジック・レベルに影響して書き込みに失敗する状態になります。
OP アンプを使ったアクティブ・フィルタにすればインピーダンスを上げ、書き込み時のロジック・レベルへの影響を減らせますが、AE-ATmega 基板上には十分なスペースがありません。
そこで、以下のページを参考に「ブレッドボード・シールド」を作成して、必要な回路をそこに組むことにしました。

もういっそのこと… で、『ブレッドボードシールド作ってみた』 - 熾火研究所*電子工作室

秋月電子 Arduino互換ボード AE-ATmegaの製作と使い方 by ボクにもわかる地上デジタル

写真を下に示します。 (ブレッドボード部のみです。 本体からは外してあります。)

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 側のピンは入力モードでプルアップなしの状態にしています。