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


ATtiny861A-PUは秋 月などで安く入手できるマイコンですが、不思議なことに、その情報がほとんどWEB上に公開されていません。
そこで、ATtiny861へのスケッチの書き込み方法とIDEでのピン番号を紹介します。

こちらのページでATtiny用のアドオンの使い方を紹介しています。
以下のアドオンがATtiny861をサポートしていますのでこれを使います。
ATtiny(http://drazzy.com/package_drazzy.com_index.json)
FemtoCow(https://dl.dropboxusercontent.com/u/2807353/femtoCore/package_femtocow_attiny_index.json)

ArduinoISPを使ってスケッチを書き込む時の結線は以下の様になります。


ATtiny861のピン番号はこ ちらなどで多数公開されていますが、たとえば14番ピンにLEDを接続して
digitalWrite(4)とやってもLチカが正しく動きませんでした。
そこで、以下のような結線でディジタルピンのピン番号を調べてみました。


以下のスケッチを使って、青い線のピンポジションを変えながらディジタルピンのピン番号を調べた結果です。
Pin#はATtiny861のデー タシートの「Pin Configurations」ページに記載されている物理ピン番号(1-20)です。
0番から14番までの15個のディジタルピンが有ることが分かりました。

/*
 * ATtiny861 Sample Program
 *
 *  DigitalPin# : PhysicalPin#
 *  0 : Pin#20
 *  1 : Pin#19
 *  2 : Pin#18
 *  3 : Pin#9
 *  4 : Pin#8
 *  5 : Pin#7
 *  6 : Pin#4
 *  7 : Pin#3
 *  8 : Pin#2
 *  9 : Pin#1
 * 10 : Pin#14
 * 11 : Pin#13
 * 12 : Pin#12
 * 13 : Pin#11
 * 14 : Pin#17
 *
 */
#define out1Pin 0
#define out3Pin 13

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

void loop() {
  digitalWrite(out1Pin,HIGH);
  digitalWrite(out3Pin,LOW);
  delay(1000);
  digitalWrite(out1Pin,LOW);
  digitalWrite(out3Pin,HIGH);
  delay(1000);
}

次に以下のような結線でアナログ ピンのピン番号を調べました。




以下のスケッチを使って、緑の線のピンポジションを変えながらボタンを押し て、LEDが付けば当たりです。
その結果、A0番からA9番までの10個のアナログピンが有ることが分かりました。

/*
 * ATtiny861 Sample Program
 *
 *  AnalogPin# : PhysicalPin#
 *  A0 : Pin#20
 *  A1 : Pin#19
 *  A2 : Pin#18
 *  A3 : Pin#14
 *  A4 : Pin#13
 *  A5 : Pin#12
 *  A6 : Pin#11
 *  A7 : Pin#7
 *  A8 : Pin#8
 *  A9 : Pin#9
 *
 */
#define inPin A9
#define outPin 0

void setup() {
  pinMode(inPin,INPUT);
  pinMode(outPin,OUTPUT);
  digitalWrite(outPin,LOW);
}

void loop() {
  int data;
  data=analogRead(inPin);
  if (data > 4.9) {
    digitalWrite(outPin,HIGH);
  } else {
    digitalWrite(outPin,LOW);
  }
  delay(100);
}

ディジタルピン、アナログピンの数ともに、こちらのデータと 一致します。
IDE上のピン番号は以下の様になります。
// ATMEL ATTINY861
//
//                   +-\/-+
//      (D  9) PB0  1|    |20  PA0 (D  0)
//     *(D  8) PB1  2|    |19  PA1 (D  1)
//      (D  7) PB2  3|    |18  PA2 (D  2) INT1
//     *(D  6) PB3  4|    |17  PA3 (D 14)
//             VCC  5|    |16  AGND
//             GND  6|    |15  AVCC
//      (D  5) PB4  7|    |14  PA4 (D 10)
//     *(D  4) PB5  8|    |13  PA5 (D 11)
// INT0 (D  3) PB6  9|    |12  PA6 (D 12)
//      (D 15) PB7 10|    |11  PA7 (D 13)
//                   +----+
//

WEB上に上記のデータが見つからないのは不思議です。

ATtinyはモデルごとにピンの役割が違います。
ライブラリではその違いを吸収するために次の様なコードがよく使われます。

#if defined(__AVR_ATtiny25__) || defined(__AVR_ATtiny45__)
  HogeHoge
#endif

そこで、コンパイル時にどのようなモデル識別(??)が使われるのか調べてみました。

/*
 * ATtiny861 Sample Program
 */
#if defined(__AVR_ATtiny861__)
#define out1Pin 0
#define out2Pin 1
#endif

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

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

上のスケッチが正しく動きましたので「__AVR_ATtiny861__」がデファインされている事が分かりました。

続く
....