ArduinoISPでATtiny84へスケッチを書き込む


ATtiny84へのスケッチの書き込み方法とIDEでのピン番号の注意点を紹介します
ArduinoISPを使ってスケッチを書き込む時の結線は以下の様になります。



こちらでArduinoISPとATtinyまたはFemtoCowで を使ってATtinyへ書き込みする方法を紹介しましたが
ATtiny84へスケッチを書き込むときに注意することがあります。
それはATtiny84を使うときのIDE上のディジタルピン番号の指定方法の違いです。

こ のページこ のページにATtiny84のピン配置のイラストがあります。
イラストによると以下の様に物理ピン#2がD0、物理ピン番号13がD10となっています。
// ATMEL ATTINY84 / ARDUINO
//
// +-\/-+
// VCC 1| |14 GND
// (D 0) PB0 2| |13 PA0 (D 10) AREF
// (D 1) PB1 3| |12 PA1 (D 9)
// (D 11) PB3 4| |11 PA2 (D 8)
// PWM INT0 (D 2) PB2 5| |10 PA3 (D 7)
// PWM (D 3) PA7 6| |9 PA4 (D 6)
// PWM (D 4) PA6 7| |8 PA5 (D 5) PWM
// +----+
一方、こ ちらのページこ ちらのページもATtiny84のピン配置のイラストがあります。
イラストによると以下の様に物理ピン#2がD10、物理ピン番号13がD0と逆になっています。
// ATMEL ATTINY84 / ARDUINO
//
//       +-\/-+
//      VCC  1|   |14  GND //  (D 10)  PB0  2| |13  PA0 (D  0) AREF
//  (D  9)  PB1  3|    |12  PA1  (D 1)
//  PB3  4|    |11  PA2 (D  2)
//  PWM  INT0  (D  8)  PB2 5|    |10  PA3  (D  3)
//  PWM        (D 7)  PA7  6|   |9   PA4 (D  4)
//  PWM        (D 6)  PA6  7|    |8   PA5 (D  5)  PWM
//                           +----+
こ ちらのページには物理ピン#2がD0、物理ピン番号13がD10と
物理ピン#2がD10、物理ピン番号13の両方が記載されています。

これはどちらかが間違っているわけではなく、使用しているAddOnの違いによるものです。
FemtoCow(https://dl.dropboxusercontent.com/u/2807353/femtoCore/package_femtocow_attiny_index.json)
あるいは
ATtiny(http://drazzy.com/package_drazzy.com_index.json)
のAddOnを使ってコンパイルすると、物理ピン#2がD0、物理ピン番号13がD10となり
ATtiny(https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json)
のAddOnを使ってコンパイルすると、物理ピン#2がD10、物理ピン番号13がD0となります。

FemtoCow(https://dl.dropboxusercontent.com/u/2807353/femtoCore/package_femtocow_attiny_index.json)
あるいは
ATtiny(http://drazzy.com/package_drazzy.com_index.json)
のAddOnを使ってコンパイルしたときのIDEで使用するピン番号
// ATMEL ATTINY84 / ARDUINO
//
// +-\/-+
// VCC 1| |14 GND
// (D 0) PB0 2| |13 PA0 (D 10) AREF
// (D 1) PB1 3| |12 PA1 (D 9)
// (D 11) PB3 4| |11 PA2 (D 8)
// PWM INT0 (D 2) PB2 5| |10 PA3 (D 7)
// PWM (D 3) PA7 6| |9 PA4 (D 6)
// PWM (D 4) PA6 7| |8 PA5 (D 5) PWM
// +----+

ATtiny(https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json)
のAddOnを使ってコンパイルしたときのIDEで使用するピン番号
// ATMEL ATTINY84 / ARDUINO
//
//       +-\/-+
//      VCC  1|   |14  GND //  (D 10)  PB0  2| |13  PA0 (D  0) AREF
//  (D  9)  PB1  3|    |12  PA1  (D 1)
//  PB3  4|    |11  PA2 (D  2)
//  PWM  INT0  (D  8)  PB2 5|    |10  PA3  (D  3)
//  PWM        (D 7)  PA7  6|   |9   PA4 (D  4)
//  PWM        (D 6)  PA6  7|    |8   PA5 (D  5)  PWM
//                           +----+

この違いはそれぞれの開発環境が使っている「pins_arduino.h」の違いによって発生します。
FemtoCowのAddOnが使っている「pins_arduino.h」は以下の様になっています。
赤字の部分でPBピン(物理ピン#2)からディジタルピンを割り付けています。

{‘前略}
const uint8_t PROGMEM digital_pin_to_port_PGM[] =
{
  PB, /* 0 */
  PB,
  PB,
  PA,
  PA,
  PA,
  PA,
  PA,
  PA, /* 8 */
  PA,
  PA,
  PB, /* 11 */
};

const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] =
{
  _BV(0), /* 0, port B */
  _BV(1),
  _BV(2),
  _BV(7), /* 3 port B */
  _BV(6),
  _BV(5),
  _BV(4),
  _BV(3),
  _BV(2),
  _BV(1),
  _BV(0),
  _BV(3),
};

一方ATtiny(https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json)
のAddOnが使っている「pins_arduino.h」は以下の様になっています。
赤字の部分でPA(物理ピン#13)からディジタルピンを割り付けています。

{前略}
const uint8_t PROGMEM digital_pin_to_port_PGM[] =
{
  PA, /* 0 */
  PA,
  PA,
  PA,
  PA,
  PA,
  PA,
  PA,
  PB, /* 8 */
  PB,
  PB,

};

const uint8_t PROGMEM digital_pin_to_bit_mask_PGM[] =
{
  _BV(0), /* port A */
  _BV(1),
  _BV(2),
  _BV(3),
  _BV(4),
  _BV(5),
  _BV(6),
  _BV(7),
  _BV(2), /* port B */
  _BV(1),
  _BV(0),
};

この違いがIDEでディジタルピンを指定するときのピン番号の違いとなります。
以下のスケッチをFemtoCowのAddOnでコンパイルすると、物理ピン#13と#12がブリンクしますが、
ATtinyのAddOnでコンパイルすると、物理ピン#2と#3がブリンクします。

/*
 * ATTiny84 blink
 */
#define out1Pin 10 // FemtoCow=PA0 ATtiny=PB0
#define out2Pin 9  // FemtoCow=PA1 ATtiny=PB1

void setup() {
  pinMode(out1Pin,OUTPUT);
  pinMode(out2Pin,OUTPUT);
  digitalWrite(out1Pin,LOW);
  digitalWrite(out2Pin,LOW);
}

void loop() {
  digitalWrite(out1Pin,HIGH);
  digitalWrite(out2Pin,LOW);
  delay(wait);
  digitalWrite(out1Pin,LOW);
  digitalWrite(out2Pin,HIGH);
  delay(wait);
}

ATtiny84のスケッチを公開するときは、ピン番号を物理ピン番号で表記するか、PAn/PBnで表記しないと、
コンパイル環境によっては、まったく動かない結果となってしまいます。
なお、アナログピンのピン番号については、どちらの開発環境を使っても同じことがこちらのページで分かります。

続く....