8bitマイコンを使おう～ATTINY1616を使う～

8bitマイコンであるATTINY1616を使ってみます。
#8bitマイコンの良さを知るには？
なぜ今更8bitマイコンなのか？という疑問に
トランジスタ技術2021年4月号がAVRマイコン特集をお勧めします。
8bitマイコンは身近な例ですとUSBシリアルであるCP21XXなど意外と身近に使われていたりします。
8bitマイコンが使われる理由は
- 値段
- サイズ
- ピン数
が大きな理由です。
そして、私はクリスタルが必要でないというのも大きな選定理由になります。
なお、大規模なプログラムや高性能な性能が必要なモノには向きません。
#使用用途
例えばI2Cのデータロガーなどには、センサとマイコンだけで済みます。
そんな時に、価格が安く、小さい8bitマイコンがお勧めです。
さらに、先のUSBシリアルも大量に使うのであればファームウェアを書けばUSBシリアルチップより安くなる上に独自のソフトウェアを追加出来ます。
（ArduinoUnoなどが）
#ATTINY1616とは？
ATTINY1616はフラッシュやRAMの容量などの違いによりATtiny416/816/1616/3216に分かれる20ピンの8bitマイコンであり
GPIOやADC、PWMなど一通り以上の機能を有しています。
そして、クリスタルが必要ありません(32bitマイコンでも必要なわけではありません）
<img src="https://github.com/SpenceKonde/megaTinyCore/blob/master/megaavr/extras/ATtiny_x16.gif?raw=true"> </A>

|Specifications|	ATtiny416|ATtiny816|	ATtiny1616|	ATtiny3216|
|---|---|---|---|---|
|Flash (program memory)	|4096 bytes|	8192 bytes| 	16384 bytes| 	32768 bytes|
|RAM|	256 bytes| 	512 bytes| 	2048 bytes| 	2048 bytes|
|EEPROM|	128 bytes| 	128 bytes| 	256 bytes| 	256 bytes|
|Bootloader|	Optiboot (optional, not recommended)| 	Optiboot (optional)| 	Optiboot (optional)| 	Optiboot (optional)|
|GPIO Pins|	18 (17 usable)| 18 (17 usable)| 	18 (17 usable)| 	18 (17 usable)|
|ADC Channels|	12 (11 usable)| 	12 (11 usable)| 	12 (11 usable)| 	12 (11 usable)|
|DAC|	Yes| 	Yes| 	Yes| 	Yes|
|PWM Channels|	8| 	8| 	8| 	8|
|Timer type B|	1| 	1| 	2| 	2|
|Timer Type D|	Yes| 	Yes| 	Yes| 	Yes|
|Interfaces|	UART, SPI, I2C| 	UART, SPI, I2C| 	UART, SPI, I2C| 	UART, SPI, I2C|
|Clock options| 	Internal 20/16/10/8/5/4/1 MHz|	Internal 20/16/10/8/5/4/1 MHz|	Internal 20/16/10/8/5/4/1 MHz|	Internal 20/16/10/8/5/4/1 MHz|
__https://github.com/SpenceKonde/megaTinyCore/blob/master/megaavr/extras/ATtiny_x16.md__より引用 

ATTINY1616のＱＦＮ版であるATTINY1616-MNRは3㎜角のQFNになります。
32bitマイコンと比較してもサイズは小さく、そして単価は0.75ドルからと安いです。
（ただし、2021年4月現在は半導体枯渇に伴い8月以降の入荷）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/a4b0673d-8f2f-0722-41cd-9fae59d5ab08.png)
32bitマイコンで有名なSTM32の最安値であるSTM32F100C4T6Bは２．８４ドルからと４倍位の差があります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/f81e7e3f-ac2b-9467-bf2f-29f3156bbf15.png)
#ATTINY1616を触ってみよう
いきなり、ATTINY1616のQFNを実装して使う事は難しいでしょう。
今回は、SOP20のATTINY1616-Sを使ってみましょう。
こちらは0.91ドルからです。
__*個人的にSTM32L010F4P6はArduinoではありませんがお勧めです（＠95円）
　https://akizukidenshi.com/catalog/g/gI-15689/　__
#SOPを実装する
SOP20のATTINY1616-Sを実装してみましょう。
秋月電子のピッチ変換(DIP化)基板__ＳＳＯＰ２０ピン（０．６５ｍｍ）・ＳＯＰ２０ピン（１．２７ｍｍ）ＤＩＰ変換基板__を使用します。
__https://akizukidenshi.com/catalog/g/gP-10497/__
これにはんだ付けします。
![DSC_0200 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/38b16156-f631-0257-1192-b2aa9459ef8a.jpeg)
#開発環境
Atmelの開発環境でも良いですし、Arduinoでも可能です。
今回は、Arduinoを使います。
ArduinoにAttiny1616のボード設定を追加します。
Attinyのボード設定はGithubの
__https://github.com/SpenceKonde/megaTinyCore/__
を使用します。
#ボード設定
__ファイル⇒環境設定__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/3883a618-6e81-1c79-77fa-367d7d8ea387.png)
⇒__追加のボードマネージャーのURL
http://drazzy.com/package_drazzy.com_index.json__
を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/fe681134-be57-4382-28c7-72bf9490b6df.png)
__ツール⇒ボード⇒ボードマネージャー__から
__megaTinyCore__
をインストールします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/08a4dc35-a916-65db-fbcf-b96459e3d80c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/d761b0f5-0a1b-2795-4c3b-40cc207d15c6.png)
インストール後
__ツール⇒ボード⇒ATinny3216/1616/1606/816/806/416/406__を選択
Chipを__ATinny1616__を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/2d211216-f659-6f5a-9786-8eaf789546d8.png)
書き込み装置は__jtag2updi__を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/ce6c5598-cdd4-dda0-8cbc-fe6494c6d67c.png)
以上でプログラムを製作後、デバックすれば使用可能となります。
#UPDI書き込み装置jtag2updiの製作
今回ArduinoNanoをjtag2updiにします。
プログラムを
__https://github.com/SpenceKonde/jtag2updi__
からダウンロードして、ArduinoNanoに書き込みます。
jtag2updiで使用するUPDI端子はジャンパワイヤの間に4.7KΩの抵抗を入れます。
ジャンパワイヤをカットして抵抗をはんだ付けし、熱収縮チューブ等でショートしないようにしPD6のピンに接続します。
これでUPDIによる書き込み装置の出来上がりです。
![DSC_0210 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/935a8f99-7e8b-948d-049b-7ae181ac47e2.jpeg)
#ブートローダの書き込み
Arduinoのブートローダを書き込みます
Attiny1616は下表のようにArduinoNanoと接続します。

|Arduino NANO|Attiny1616|
|---|---|
|5V|5V|
|GND|GND|
|D6|PA0（UPDI)|
__ツール⇒ブートローダを書き込む__
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/94990538-ede5-5078-0ac8-1ee49d4980cf.png)
#Lチカ
環境確認もあるのでLチカをしてみます。
今回は、LEDのピンとしてPIN_PA7が指定されていますので__PA7__のピンにLEDと抵抗を接続しLチカを行います。
__ピン番号等はATtiny1616 / ARDUINOのこちらを参照します__
https://github.com/SpenceKonde/megaTinyCore/blob/master/megaavr/variants/txy6/pins_arduino.h
スケッチ例の__Blink__を使用します。
#デバック＆書き込み
普通のマイコンボードと同じようにマイコンボードに書き込みます
__マイコンボードに書き込む__
これでLEDが点滅しているはずです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/c0e1cb8b-392b-538e-6cbe-260f09175661.png)
![DSC_0212 (2).JPG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/285344/51794ffb-90e4-3659-a0b9-8c28ac1df959.jpeg)