ATtiny1614を使ってみた

ATtiny1614を使ってみようと思ったら、日本語どころか英語のサイトもあまり見つからなかったので、なんとか試行錯誤した結果を残しておく次第。需要は全くなさそうですが。

<2021/04/16追記>本記事の内容は2018年11月時点のものです。大分内容が古くなっていると思われます。より新しい情報をお求めの方はCQ出版社の[トランジスタ技術2021年4月号](https://toragi.cqpub.co.jp/tabid/949/Default.aspx)のAVR特集をおすすめします。


# ATtinyシリーズ
ATtinyシリーズはAtmel社(2016年にMicrochip社に買収)の開発したマイクロコントローラです。Arduino Uno/Nano/Mini等の製品で用いられているATmegaシリーズの兄弟分になります。

過去のtinyシリーズ製品については既に秀逸な記事があります。
[ArduinoユーザーのためのATTiny入門](https://qiita.com/tadfmac/items/3a42a641531f2c3679a1)

シリーズの製品一覧は[こちらの表(Wikipedia)](https://en.wikipedia.org/wiki/ATtiny_microcontroller_comparison_chart#Features)が分かりやすいです。

## tinyAVR™1シリーズ
ATtinyの名を持つ製品の中でも、tinyAVR1シリーズは最新の製品ラインナップです。2018年11月現在、ATtiny212/412, ATtiny214/414/814/1614, ATtiny416/816/1616/3216, ATTiny417/817/1617/3217の全14製品が販売されています。

製品名の数字はFlash容量とピン数を表していて、例えば3217であれば32KのFlashと28ピンであることを示しています。ピン数の法則が分かりにくいですが、下1桁が2なら8ピン、4なら14ピン、6なら20ピン、7なら28ピンとなります。

で、具体的にどういう特徴があるかというと
・**20MHzで動作する内蔵RC発振回路**
・**2種類のレベルを設定可能な割り込みコントローラ**
・**UPDIという単線式のプログラミング/デバッグI/Fを採用(従来のICSP廃止)**

というのが主なポイントで全体的に設計が新しくなっているようです(よく知らない)。

英語ですが、よくまとまっているレビューがあるのでこちらもご覧ください。
[ATMEL (MICROCHIP) tinyAVR 1-SERIES](https://jaycarlson.net/pf/atmel-microchip-tinyavr-1-series/)

## ATtiny1614
今回扱うATtiny1614は2017年に発表された新製品です。以下のような機能を備えています

・USARTx1, TWI(I2C)x1, SPIx1
・Timer 16bitx3, 12bit x 1
・16KB FLASH
・2KB SRAM
・256B EEPROM
・SOICパッケージ(0.65mmピッチ) - 14ピン
等々。詳細は下記のデータシートを参照してください。素晴らしいことに日本語のデータシートもあります。

[[EN]データシート(1614専用)](http://ww1.microchip.com/downloads/en/DeviceDoc/ATtiny1614-data-sheet-40001995A.pdf) by [Microchip](https://www.microchip.com/wwwproducts/en/ATTINY1614)
[[JP]データシート(1614/1616/1617共用)](http://ww1.microchip.com/downloads/jp/DeviceDoc/40001893B_JP.pdf) by [マイクロチップ・テクノロジー・ジャパン](https://www.microchip.co.jp/download/index.php?Mode=4&CategoryID=08ff3e00bf7fedc9fd6adb0aa9a3499b55a4aff3)

ATmegaシリーズと比べても遜色のないFLASH容量や、外付けのクリスタル等がなくても20MHzで動作可能な点がステキと思い購入してみることにしました。なお注意事項ですが1.8Vや3.3Vなどの低電圧では20MHz動作はできないのでご留意ください。

# 購入
[Digikey](https://www.digikey.jp/)や[Mouser](https://www.mouser.jp/)、[RS-Components](https://jp.rs-online.com/web/)などのサイトから購入することができます。私はRS-Componentsで買ったのですが、ここは10個単位でしか買えないし、ちょっと割高。ただ、ちょうど送料無料キャンペーンをやっていたので利用しました。

パッケージはSOIC(1.27mmピッチ)なので、私の技術力的にピッチ変換基板が必要でした。今回は[aitendo](http://www.aitendo.com/)の[これ](http://www.aitendo.com/product/16697)を選択しました。14ピン用は各ショップで取り扱いが少ない感じだったので、16ピン用を使ってもいいかも。

# はんだ付け
こんな感じになります。
![1614.jpg](https://qiita-image-store.s3.amazonaws.com/0/235258/a467a94d-3b70-8c14-0d6a-5655a0d4f148.jpeg)
左下が1ピン(VCC)で、左上が14ピン(GND)です。その間をパスコン(0.1uF)で接続してあります。各ピンはピンヘッダを接続してブレッドボード上に挿せるようにしました。

# プログラマー

tinyAVR1シリーズの新しい製品群は、それまで採用していた**ICSP(MOSI,MISO,SCK)による書き込みを採用していません。**代わりに、**UPDI(Unified Program and Debug Interface)**という単線式書き込み/デバッグインターフェイスを採用しています。

それに伴い、今までAVR界で使用されてきたAVRISP mkIIやUSBAspなどは使用できなくなっています。悲しいかな。

それで、UPDIが使えるプログラマーについては、AVRの製造元のMicrochipからいろいろ出ているみたいなのですが、ここでは実際に私が試して動作確認したものだけご紹介します。

| 名称 | 参考価格 | プログラミング | デバッグ | 詳細 |
|------|--------|---|---|------|
| [PICKIT 4](http://akizukidenshi.com/catalog/g/gM-13337/)| 5,700円 | ○ | ○ | かのPIC用の定番プログラマーの最新版。AVRにも仮対応 |
| [jtag2updi](https://github.com/ElTangas/jtag2updi) | 0円 | ○ | × | Arduino(ATMega328P/168P)に書き込んで使うファームウェア

PICKIT4については、昔からMicrochip社が販売してきたPICマイコン用プログラマーの最新版となります。近年AVRのAtmel社を買収したことで、PIC/AVRの統一した開発環境が提供されるかも、と一部に期待が高まっていたらしいですが、実際本製品ではベータ版ながらAVRに対応しています。

一方、jtag2updiはGithubで公開されている、ATMega328P/168Pチップに書き込んで、プログラマーとして使用できるようにするためのファームウェアです。これを使うとArduino Unoなどをプログラマーにすることができます。ファームウェアの書き込みはavrdudeを使用します。そしてjtag2updiを使ったプログラムの書き込みも当然avrdudeを使用します。

どちらも試しましたが、書き込み自体どちらでも可能です。お金使いたくない人はjtag2updiがいいと思います。私はPICKIT4の方をおススメしておきます。後述のAtmel Studioと合わせてステップ実行デバッグできるのは大きなメリットです。

# 開発環境
開発環境には[Atmel Studio](https://www.microchip.com/mplab/avr-support/atmel-studio-7)を用います。MicrosoftのVisual StudioのIDEをベースにしているらしく、VSに慣れている私には大分使いやすい感じです。慣れていない人には機能が多すぎて煩雑な感じがすると思いますが。
インストーラが公開されているので、ダウンロードして実行します。途中、アーキテクチャ(8-bit,32-bit,ARM)を選択する箇所がありますが、特に必要なければ8-bitだけ選択でOKです。
インストールが終了したら、起動してみて、最初に対応デバイスの更新を行います。メニューの「Tool」から「Device Pack Manager」を選択し、検索欄に「1614」と打ち込むと、対象のデバイスに関するアップデートが表示されるので、「Update」を実行します。
そこまで出来たらようやくプロジェクトを作成します。「GCC C Executable」または「GCC C++ Executable」を選択しプロジェクト名を入力、次にターゲットデバイスを選択します。今回は「ATTiny1614」をセレクト。
C/C++のコードが準備されるので、メニューの「Build」から「Build Solution」を実行。これでプログラマーで書き込みできるelfファイルおよびhexファイルが生成されます。あとはPICKITならばelfを、jtag2updiならhexファイルを使って書き込めばOK。


# ターゲットデバイスの準備

配線は以下のような感じにします。
![connection.jpg](https://qiita-image-store.s3.amazonaws.com/0/235258/1965b517-8a6b-0f60-48b6-1a5666d32454.jpeg)

図はPICKITの場合です。ICSPだと5本(MISO,MOSI,SCK,GND,RESET)だったのが3本になって大分楽ですね。MISOとMOSIどっちがどっちだっけなんて悩む必要もないし。
なお注意事項ですが、プログラマー自体は電源を供給しないので、ターゲットデバイスに対して別途5Vを供給してください。

なおPICKITにはUSBケーブル以外付属していないので、各自でオス-オスのジャンパワイヤを3本用意してください。私は[秋月で買いました](http://akizukidenshi.com/catalog/g/gP-02932/)。

# PICKITのセットアップ

jtag2updiの方はGithubの説明を読んでもらえばわかるのですが、PICKITの方はどうやったら使えるようになるのか全然分からなかったので説明します。ただし、ここの説明については大分適当なので、間違っている可能性、冗長すぎる可能性が大です。

購入したばかりの状態では、Atmel Studio上ではPICKITを認識してくれず、使用できませんでした。そこで、[Microchipのサイト](https://www.microchip.com/mplab/mplab-x-ide)からPIC系の統合開発環境である、MPLab X IDEならびにMPLab X IPEをインストールします。IDEのインストーラで両方インストールできます。

インストール方法については日本語の記事がありましたので、そちらも参照してください。
[サヌキテックネット : MPLAB X IDEのインストール(Windows編)](https://sanuki-tech.net/pic/development/install-mplab-x-ide/)


インストールして実行するのはIPEの方です。これはPICKITなどを通してプログラムを書き込むためのツールのようで、PICKITを正しく認識してくれました。そして、このツールを使って初めてプログラムを書き込む際、ファームウェアのアップデートを行ってくれます。このアップデート以降、Atmel StudioでもPICKITを認識してくれるようになった、気がします。多分。
なので、Atmel Studioで適当にプロジェクトを作り、ビルドを行い、出来上がったhexファイルをIPEで書き込んでファームウェアを更新してください。

もしAtmel Studio上でPICKITが認識されるようになったら、「Tools」の「Device Programming」から書き込みが行えるようになります。

# Lチカしてみる

Atmel Studioという立派なIDEはあるのですが、Arduinoみたいな便利なライブラリは特にはないようで、昔ながらのレジスタをゴリゴリするプログラミングとなります。インテリセンスが利くので少しは快適ですがね。

```c

#include <avr/io.h>
#define F_CPU 3333333 /* 20MHz / 6(default prescale) */
#include <util/delay.h>

/* Pin Assign
 * 7.PB2 : LED output
 */
#define LED_bp 2 // PB2
#define LED_bm (1<<LED_bp)

int main(void)
{
	// Port Configuration
	PORTB.DIRSET = LED_bm; // equals PORTB.DIR |= LED_bm;
	PORTB.OUTCLR = LED_bm; // equals PORTB.OUT &= ~LED_bm;
	
    while (1) 
    {
		// Blinking the LED 
		_delay_ms(500);
		if(PORTB.OUT & LED_bm){
			PORTB.OUTCLR = LED_bm;	
		}else{
			PORTB.OUTSET = LED_bm;
		}
    }
}
```

デフォルトの設定ではCPUのクロック数はプリスケーラによって1/6になっています。_delay_msなどのウェイト関数を用いるにはCPUのクロック数をF_CPUとして記述する必要があるので冒頭で`#define F_CPU 3333333`としています。プリスケーラを無効にしたい場合はプログラムの先頭で以下のように記載します。

```
_PROTECTED_WRITE(CLKCTRL_MCLKCTRLB, 0);　// この場合、F_CPUは20000000
```

GPIO用のレジスタは`PORT*.DIR`, `PORT*.OUT`, `PORT*.IN`などを使うことができますが、`PORT*.DIRSET`や`PORT*.DIRCLR`のように、ビットの追加専用・クリア専用の記述の仕方もできます。

![led_blink.jpg](https://qiita-image-store.s3.amazonaws.com/0/235258/52d750b2-79c8-1f66-ac88-c3fcef4f9954.jpeg)
右端のは5VのDCアダプタを接続するための[DCジャックDIP化キット(秋月)](http://akizukidenshi.com/catalog/g/gK-08415/)です。

# サンプルプログラム

とまあ、なかなか環境を整えるのも大変ですが、なんとかプログラムを作って動かすところまではできるようになりました。とはいえ、新製品ゆえに実際に使ってみた事例が少なく、タイマーやI2Cなど、各種ペリフェラルを試してみるのも大分苦労しました。

マイコンの持つ様々な機能のほんの一部に過ぎませんが、サンプルのソースコードを公開しています。
参考程度になるかと。
[https://github.com/chromia/attiny1614example](https://github.com/chromia/attiny1614example)

また、[Atmel Start](https://start.atmel.com/)というサイトでは各種のサンプルが提供されているので、そちらも要チェックです。

# まとめ
・新しいATtinyシリーズのATtiny1614を試し、書き込み/動作確認までできた
・お金がある人は[PICKIT 4](http://akizukidenshi.com/catalog/g/gM-13337/)があれば書き込みもデバッグも可能な開発環境が作れる
・お金がない人は[jtag2updi](https://github.com/ElTangas/jtag2updi)(とArduino)で書き込みが可能な開発環境が作れる
・DIPパッケージがないのでちょっと面倒(基板作れる人には省スペースなので良い)
・外付けクリスタルなしで20MHzだし、16KB Flashだしで、コスパはなかなか良い
・ググっても全く使用例とか出てこないので、頑張ってデータシート読もう