
ATTINY85からATTINY202への移行を検討しだして2週間くらいたちました。
まずは書き込み環境を整えることから開始しました。
ATTINY202は、便利な中華製パラレルプログラマ TL866-IIも、AVRISP2も使えません。
ICPという3線インターフェースから、UDPIという1線インターフェースに変わって
いるからです。
TINY85ではTL866-IIを使ってFUSE書き込みができたので、RESET(UDPI)端子を
GPIO化できたのですが、TL866-IIはこの新AVRシリーズに対応していないので、
それもできなくなりました。
(高電圧UPDIというものを使えばいいのですが、敷居も値段も高い)
閑話休題:UPDIはUSBシリアル基板があれば、書き込み器なら簡単に作れるという
情報がありましたので、まず書き込み器を作ります。
自分が参考にしたのはこれです。
UPDI to USB-Serial Programming Adapter
これなら、手持ちの中華製 USBシリアル基板を流用して簡単に作れそうです。


ショットキーダイオードがチップ部品しか見つからなかったので、ついでに全部
抵抗もチップ部品で作りました。
ターゲットへの3.3V/5V電源線も一緒に供給するようにしました。
USBシリアル基板のジャンパピンで5V-3.3Vの切り替えができて便利です。
ピンでもつなげます!
今回は、ジャンパ線でブレッドボードのTINY202につなぎます。(最初の写真です)
プログラムはネットでLチカのプログラムを拾って来て、ATMEL STUDIOに
貼り付けてビルドし、HEXファイルを作りました。
プログラムの構造の違いは前に説明した通りです。
このプログラムでは、少しわかりにくいですね。あとで修正しましょう
つくったプロジェクトのDebugフォルダにhexファイルが入ってます。
そのHexファイルを指定して、AVRDUDESS(AVRDUDEのGUI版)で
デバイスに書き込みを行います。
programmerに serialUPDIを指定し、com番号さえ入力すれば、あとは未指定で書き込みができました! AVRDUDESSのインストールホルダに最新のADRDUDEも入っているので、FUSE書き込み等
ややこしい内容をコマンドラインで書き込みを行うときは、このフォルダのAVRDUDEで実行す
るといいですよ。(FUSE書き込みは後で説明しますね)
これでPA2 (ピン5)に接続したLEDがチカチカしますよ。
赤LEDと1kΩくらいの抵抗を直列にして、GNDに落として下さい。
ON/OFF各1秒で指定していますが、ずいぶん点滅が遅いようです。
これは、TINY202のクロックがデフォールトで20MHzの
6分週、3.333MHzになっているためのようです。
このときは、いろんなことが理解できてなくて、とりあえず
書き込みができました~ というレベルでした。
FUSEを書き換えて、20MHzから16MHzに切り替えるのには、メッサ苦労しました!
後日追記:AVRDUDESSを使ってFUSEを書き換えるのは、こちら
クロックを
20MHz→16MHzに書き換えるだけでしたら、高電圧プログラマーは必要ありません。
新しいことを始めるのは、いろいろと大変ですね。
とくに年を取ってくると、おっくうになります。おっと、グチはこの辺で
それでは、次回をこうご期待!!
【2025/03/07追記】
このプログラムがわかりにくので、あとで書き直しましょう! が宿題で残っていたので
やってみました。
/*
* ATTINY202_LED_BLINK_SMPL1.cpp
*
* Created: 2025/03/07 10:27:45
* Author : todoPapa
*/
#include <avr/io.h>
#include <util/delay.h>
//#define F_CPU 20000000UL // CPU Clock = 20MHz (delay.hで定義済み)
#define LED_PIN PIN2_bm // PA2にLED接続
int main(void) {
// クロック設定 20MHz
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLA, CLKCTRL_CLKSEL_OSC20M_gc); // CLK 20MHz選択
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0x00); // 分周なし
// PA2を出力モードに設定
PORTA.DIR =LED_PIN; // IOMAPEDのVPORTAだと、OUTSET,OUTCLRが使えない
while (1) {
// PA2をHIGHに設定してLED点灯
PORTA_OUTSET = LED_PIN;
_delay_ms(1000);
// PA2をLOWに設定してLED消灯
PORTA_OUTSET = LED_PIN;
_delay_ms(1000);
}
だいぶ可読性が良くなったと思います。
このコンパイル後、F_CPUが重複しているとウォーニングが出たので、確認しました。
delay.hでF_CPUを1MHz定義していたので、これを20MHzに変更して、main.cppのF_CPUは
コメントアウトしました。
あとのプログラムの説明は、このブログの他の記事に詳しいので省略しますね。
VPORTAとPORTAの違いを説明します。
PORTAにアクセスするときは、レジスタ経由で書き込むので数クロックを必要としますが、
VPORTAはメモリマップドIOなので、1クロックでアクセスできるとのことです(ChatGPT談w)。
ただし、メモリアクセスと同じということで、アクセスの形式が少なくなっています。
ATMEL STUDIOの予測変換を見ればレジスタアクセスの選択肢がわかります。
VPORTAのレジスタアクセス設定
PORTAのレジスタアクセス設定
PORTAだとトグルもできるんですね。

関連記事