秋月発売記念!AVR64DD28を使ってみる!

あけましておめでとうございます。

今年は最初から災難続きでございますが、できることを精一杯頑張って
まいりましょう!!


今回は昨年末に秋月電子通商から販売されたAVR-DDシリーズの
最大容量品であるAVR64DD28
の紹介をしていこうと思います。


AVR-DDシリーズはAVR-DBシリーズの小規模化したデバイスとなります。
DxCoreの品種比較表がわかりやすいです。またDBシリーズで存在した
エラッタがいくつか修正されているのも特徴です。

基本的な機能はAVR-DBを引き継いでいますのでAVR64DD28は現時点で
非常に使い勝手がよいAVRとなり、将来的にはATMega328Pを置き換えて
いくことでしょう。

●AVR64DD28のプログラムメモリ構成とrodataの取り扱いについて
AVR-Dxシリーズはデータ領域にプログラム領域の一部がマッピング
されており、LPM命令を使用しないでも通常のLD命令が使用可能な
領域が存在しております。


AVR64DD28においては64kByteあるプログラムメモリの後半32kByte分が
データ領域にデフォルトでマッピングされております。残念ながら
64KByte品では全領域とはならず半分の32kByte分となります。
32kByte以下の容量品では全領域がマッピングされております。


ちなみにNVMモジュールのCTRLBレジスタはデフォルトで後半32kByte分
のマッピング設定になっているため通常使いの場合は特に設定は
不要で後半32kByte分はデータ領域としてアクセスできるわけです。


が!




AVR128DA48とかAVR128DB28を使ったときにも同じ解説をしておりますが、
AVR64DD28というかAVR-Dxシリーズの64kByte以上のフラッシュ容量の
品種では何も考えないでビルドするとavr-gcc内にビルドインされた
デフォルトのリンカスクリプト(AVR64DD28ではavrxmega2.xn)を選択して
しまうため、上記のようなデータ領域のマッピングを意識しないメモリの
取り扱いをしてしまいます。
これでは旧AVR製品のように面倒なPROGMEMが必要となってしまいます。


ねむいさんは64KByte中後半32kByteをrodataとするような特別なリンカ
スクリプトを作成してPROGMEM使わなくてもSTM32みたいに普通にconstを
取り扱えるようにしてみました。
まぁAVRとしてはプログラム領域32kByteとrodata領域32kByteは十分すぎる
広さとなるでしょう〜
プロジェクト中にもありますが一応私が作ったリンカスクリプト貼っておきます。

/* Script for -n */
/* Copyright (C) 2014-2023 Free Software Foundation, Inc.
Copying and distribution of this script, with or without modification,
are permitted in any medium without royalty provided the copyright
notice and this notice are preserved. */
OUTPUT_FORMAT("elf32-avr","elf32-avr","elf32-avr")
OUTPUT_ARCH(avr:102)
__TEXT_REGION_ORIGIN__ = DEFINED(__TEXT_REGION_ORIGIN__) ? __TEXT_REGION_ORIGIN__ : 0;
__DATA_REGION_ORIGIN__ = DEFINED(__DATA_REGION_ORIGIN__) ? __DATA_REGION_ORIGIN__ : 0x802000;
__TEXT_REGION_LENGTH__ = DEFINED(__TEXT_REGION_LENGTH__) ? __TEXT_REGION_LENGTH__ : 1024K;
__DATA_REGION_LENGTH__ = DEFINED(__DATA_REGION_LENGTH__) ? __DATA_REGION_LENGTH__ : 0xffa0;
__EEPROM_REGION_LENGTH__ = DEFINED(__EEPROM_REGION_LENGTH__) ? __EEPROM_REGION_LENGTH__ : 64K;
__FUSE_REGION_LENGTH__ = DEFINED(__FUSE_REGION_LENGTH__) ? __FUSE_REGION_LENGTH__ : 1K;
__LOCK_REGION_LENGTH__ = DEFINED(__LOCK_REGION_LENGTH__) ? __LOCK_REGION_LENGTH__ : 1K;
__SIGNATURE_REGION_LENGTH__ = DEFINED(__SIGNATURE_REGION_LENGTH__) ? __SIGNATURE_REGION_LENGTH__ : 1K;
__USER_SIGNATURE_REGION_LENGTH__ = DEFINED(__USER_SIGNATURE_REGION_LENGTH__) ? __USER_SIGNATURE_REGION_LENGTH__ : 1K;
__RODATA_PM_OFFSET__ = DEFINED(__RODATA_PM_OFFSET__) ? __RODATA_PM_OFFSET__ : 0x8000;
MEMORY
{
text (rx) : ORIGIN = __TEXT_REGION_ORIGIN__, LENGTH = __TEXT_REGION_LENGTH__-32K
rodata (rx) : ORIGIN = __TEXT_REGION_LENGTH__-32K, LENGTH = 32K
data (rw!x) : ORIGIN = __DATA_REGION_ORIGIN__, LENGTH = __DATA_REGION_LENGTH__
eeprom (rw!x) : ORIGIN = 0x810000, LENGTH = __EEPROM_REGION_LENGTH__
fuse (rw!x) : ORIGIN = 0x820000, LENGTH = __FUSE_REGION_LENGTH__
lock (rw!x) : ORIGIN = 0x830000, LENGTH = __LOCK_REGION_LENGTH__
signature (rw!x) : ORIGIN = 0x840000, LENGTH = __SIGNATURE_REGION_LENGTH__
user_signatures (rw!x) : ORIGIN = 0x850000, LENGTH = __USER_SIGNATURE_REGION_LENGTH__
}
SECTIONS
{
/* Read-only sections, merged into text segment: */
.hash : { *(.hash) }
.dynsym : { *(.dynsym) }
.dynstr : { *(.dynstr) }
.gnu.version : { *(.gnu.version) }
.gnu.version_d : { *(.gnu.version_d) }
.gnu.version_r : { *(.gnu.version_r) }
.rel.init : { *(.rel.init) }
.rela.init : { *(.rela.init) }
.rel.text :
{
*(.rel.text)
*(.rel.text.*)
*(.rel.gnu.linkonce.t*)
}
.rela.text :
{
*(.rela.text)
*(.rela.text.*)
*(.rela.gnu.linkonce.t*)
}
.rel.fini : { *(.rel.fini) }
.rela.fini : { *(.rela.fini) }
.rel.rodata :
{
*(.rel.rodata)
*(.rel.rodata.*)
*(.rel.gnu.linkonce.r*)
}
.rela.rodata :
{
*(.rela.rodata)
*(.rela.rodata.*)
*(.rela.gnu.linkonce.r*)
}
.rel.data :
{
*(.rel.data)
*(.rel.data.*)
*(.rel.gnu.linkonce.d*)
}
.rela.data :
{
*(.rela.data)
*(.rela.data.*)
*(.rela.gnu.linkonce.d*)
}
.rel.ctors : { *(.rel.ctors) }
.rela.ctors : { *(.rela.ctors) }
.rel.dtors : { *(.rel.dtors) }
.rela.dtors : { *(.rela.dtors) }
.rel.got : { *(.rel.got) }
.rela.got : { *(.rela.got) }
.rel.bss : { *(.rel.bss) }
.rela.bss : { *(.rela.bss) }
.rel.plt : { *(.rel.plt) }
.rela.plt : { *(.rela.plt) }
/* Internal text space or external memory. */
.text :
{
*(.vectors)
KEEP(*(.vectors))
/* For data that needs to reside in the lower 64k of progmem. */
*(.progmem.gcc*)
/* PR 13812: Placing the trampolines here gives a better chance
that they will be in range of the code that uses them. */
. = ALIGN(2);
__trampolines_start = . ;
/* The jump trampolines for the 16-bit limited relocs will reside here. */
*(.trampolines)
*(.trampolines*)
__trampolines_end = . ;
/* avr-libc expects these data to reside in lower 64K. */
*libprintf_flt.a:*(.progmem.data)
*libc.a:*(.progmem.data)
*(.progmem.*)
. = ALIGN(2);
/* For code that needs to reside in the lower 128k progmem. */
*(.lowtext)
*(.lowtext*)
__ctors_start = . ;
*(.ctors)
__ctors_end = . ;
__dtors_start = . ;
*(.dtors)
__dtors_end = . ;
KEEP(SORT(*)(.ctors))
KEEP(SORT(*)(.dtors))
/* From this point on, we do not bother about whether the insns are
below or above the 16 bits boundary. */
*(.init0) /* Start here after reset. */
KEEP (*(.init0))
*(.init1)
KEEP (*(.init1))
*(.init2) /* Clear __zero_reg__, set up stack pointer. */
KEEP (*(.init2))
*(.init3)
KEEP (*(.init3))
*(.init4) /* Initialize data and BSS. */
KEEP (*(.init4))
*(.init5)
KEEP (*(.init5))
*(.init6) /* C++ constructors. */
KEEP (*(.init6))
*(.init7)
KEEP (*(.init7))
*(.init8)
KEEP (*(.init8))
*(.init9) /* Call main(). */
KEEP (*(.init9))
*(.text)
. = ALIGN(2);
*(.text.*)
. = ALIGN(2);
*(.fini9) /* _exit() starts here. */
KEEP (*(.fini9))
*(.fini8)
KEEP (*(.fini8))
*(.fini7)
KEEP (*(.fini7))
*(.fini6) /* C++ destructors. */
KEEP (*(.fini6))
*(.fini5)
KEEP (*(.fini5))
*(.fini4)
KEEP (*(.fini4))
*(.fini3)
KEEP (*(.fini3))
*(.fini2)
KEEP (*(.fini2))
*(.fini1)
KEEP (*(.fini1))
*(.fini0) /* Infinite loop after program termination. */
KEEP (*(.fini0))
/* For code that needs not to reside in the lower progmem. */
*(.hightext)
*(.hightext*)
*(.progmemx.*)
. = ALIGN(2);
/* For tablejump instruction arrays. We do not relax
JMP / CALL instructions within these sections. */
*(.jumptables)
*(.jumptables*)
_etext = . ;
} > text
.data :
{
PROVIDE (__data_start = .) ;
*(.data)
*(.data*)
*(.gnu.linkonce.d*)
. = ALIGN(2);
_edata = . ;
PROVIDE (__data_end = .) ;
} > data AT> text
.bss ADDR(.data) + SIZEOF (.data) : AT (ADDR (.bss))
{
PROVIDE (__bss_start = .) ;
*(.bss)
*(.bss*)
*(COMMON)
PROVIDE (__bss_end = .) ;
} > data
__data_load_start = LOADADDR(.data);
__data_load_end = __data_load_start + SIZEOF(.data);
/* Global data not cleared after reset. */
.noinit ADDR(.bss) + SIZEOF (.bss) : AT (ADDR (.noinit))
{
PROVIDE (__noinit_start = .) ;
*(.noinit .noinit.* .gnu.linkonce.n.*)
PROVIDE (__noinit_end = .) ;
_end = . ;
PROVIDE (__heap_start = .) ;
} > data
.rodata :
{
*(.rodata)
*(.rodata*)
*(.gnu.linkonce.r*)
} > rodata
.eeprom :
{
/* See .data above... */
KEEP(*(.eeprom*))
__eeprom_end = . ;
} > eeprom
.fuse :
{
KEEP(*(.fuse))
KEEP(*(.lfuse))
KEEP(*(.hfuse))
KEEP(*(.efuse))
} > fuse
.lock :
{
KEEP(*(.lock*))
} > lock
.signature :
{
KEEP(*(.signature*))
} > signature
.user_signatures :
{
KEEP(*(.user_signatures*))
} > user_signatures
/* Stabs debugging sections. */
.stab 0 : { *(.stab) }
.stabstr 0 : { *(.stabstr) }
.stab.excl 0 : { *(.stab.excl) }
.stab.exclstr 0 : { *(.stab.exclstr) }
.stab.index 0 : { *(.stab.index) }
.stab.indexstr 0 : { *(.stab.indexstr) }
.comment 0 : { *(.comment) }
.gnu.build.attributes : { *(.gnu.build.attributes .gnu.build.attributes.*) }
.note.gnu.build-id : { *(.note.gnu.build-id) }
/* DWARF debug sections.
Symbols in the DWARF debugging sections are relative to the beginning
of the section so we begin them at 0. */
/* DWARF 1. */
.debug 0 : { *(.debug) }
.line 0 : { *(.line) }
/* GNU DWARF 1 extensions. */
.debug_srcinfo 0 : { *(.debug_srcinfo) }
.debug_sfnames 0 : { *(.debug_sfnames) }
/* DWARF 1.1 and DWARF 2. */
.debug_aranges 0 : { *(.debug_aranges) }
.debug_pubnames 0 : { *(.debug_pubnames) }
/* DWARF 2. */
.debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
.debug_abbrev 0 : { *(.debug_abbrev) }
.debug_line 0 : { *(.debug_line .debug_line.* .debug_line_end) }
.debug_frame 0 : { *(.debug_frame) }
.debug_str 0 : { *(.debug_str) }
.debug_loc 0 : { *(.debug_loc) }
.debug_macinfo 0 : { *(.debug_macinfo) }
/* SGI/MIPS DWARF 2 extensions. */
.debug_weaknames 0 : { *(.debug_weaknames) }
.debug_funcnames 0 : { *(.debug_funcnames) }
.debug_typenames 0 : { *(.debug_typenames) }
.debug_varnames 0 : { *(.debug_varnames) }
/* DWARF 3. */
.debug_pubtypes 0 : { *(.debug_pubtypes) }
.debug_ranges 0 : { *(.debug_ranges) }
/* DWARF 5. */
.debug_addr 0 : { *(.debug_addr) }
.debug_line_str 0 : { *(.debug_line_str) }
.debug_loclists 0 : { *(.debug_loclists) }
.debug_macro 0 : { *(.debug_macro) }
.debug_names 0 : { *(.debug_names) }
.debug_rnglists 0 : { *(.debug_rnglists) }
.debug_str_offsets 0 : { *(.debug_str_offsets) }
.debug_sup 0 : { *(.debug_sup) }
}

これをLDFLAGSに食わせてやればこちらが優先されて上記のようにメモリが
配置される仕組みになっています。詳細は私のプロジェクト内makefileの
274行目あたりを参照してください。

ねむいさん式リンカスクリプト
dataセクションの使用領域が減りました。さらにrodata領域に
読み取り専用のデータが割り当てられています。
Memory region         Used Size  Region Size  %age Used
text: 2796 B 32 KB 8.53%
rodata: 144 B 32 KB 0.44%
data: 144 B 8 KB 1.76%
eeprom: 0 GB 256 B 0.00%
fuse: 0 GB 16 B 0.00%
lock: 0 GB 1 KB 0.00%
signature: 0 GB 1 KB 0.00%
user_signatures: 0 GB 1 KB 0.00%
一方デフォルトリンカスクリプトのメモリ使用領域は…
dataセクションに取られてしまい無駄にメモリ領域を圧迫してます。
Memory region         Used Size  Region Size  %age Used
text: 2940 B 64 KB 4.49%
data: 288 B 8 KB 3.52%
eeprom: 0 GB 256 B 0.00%
fuse: 0 GB 16 B 0.00%
lock: 0 GB 1 KB 0.00%
signature: 0 GB 1 KB 0.00%
user_signatures: 0 GB 1 KB 0.00%




20240123追:
GCC14ではコンパイル時のスイッチでリマップに対応するようです!!!
こうご期待!!!

20240123追:



●AVR64DD28向けのバイナリをAVR-GCCでビルドする方法
数年前からお伝えしている通り、avr-gccでAVR64DD28とかの最新の品種を
ビルドするためには自分でオブジェクトとかデバイス定義ファイルを
追加してやる必要があります。今回はavr-gccの導入から改めて解説して
いこうと思います。64bit版Windows10環境下を想定しております。


1.Windows向けavr-gccを取得する
Zak's Electronics Blogの"AVR-GCC 13.2.0 for Windows"をダウンロード
します。GCCが最新の13.2.0となっておりますが特筆すべきはビルドイン
されたリンカスクリプトに"__DATA_REGION_ORIGIN__"が追加されるように
なったのですがこれめっちゃ重要な修正なので必ず13.2.0のバイナリを
使用するようにしてください!!


ねむいさんの環境ではARM開発環境に倣って下記ディレクトリに展開します。
C:¥Devz¥AVR¥avr-gcc



avr-gccディレクトリ内はこうなります。
またmakeの呼び出し方はARMとまったく共通なのでARMマイコンのビルド
環境構築法
のCoreutilsの設定を参考にしてください。


2.MicrochipのサイトからDeviceFamilyPacks(DFP)を取得する
こっからがだいぶ面倒です。"Microchip Packs Repository"から
"Microchip AVR-Dx Series Device Support"をダウンロードします。
拡張子がatpackとなっていますが実態はzip圧縮ファイルです。
以下7zの使用を想定して進めていきます。

3.DFPからヘッダファイルとかデバイス定義ファイル抽出して追加
a.ヘッダファイルの追加
圧縮ファイル内の"¥include"に進みます。

"C:¥Devz¥AVR¥avr-gcc¥avr¥include"内にavrフォルダをコピーします。

b.device-specsの追加
圧縮ファイル内の"¥gcc¥dev¥avr64dd28"と進みます。

"C:¥Devz¥AVR¥avr-gcc¥lib¥gcc¥avr¥13.2.0"内にdevice-specsフォルダを
コピーします。

c.スタートアップファイルの追加

"C:¥Devz¥AVR¥avr-gcc¥avr¥lib"内にavrxmega2フォルダをコピーします。

あああめんどくさい…
とにかくこれで前準備が終わりました…

ほかの品種でもこの操作を行うことによって最新のAVRがビルドできます。





それでは改めてねむいさんのプロジェクトの上記の部分をavr64dd28にして
ビルドします。

ちゃんと設定ができていたらビルドが始まり…

すぐ終わった…


書き込みはavrdudeを使用します
書き込み方法はこちらのserialUPDIの記事を参考に…



プログラムはAVR128DA/DBと共通でデバイスの固有シリアル番号を表示
した後1秒ごとにチップ温度をUARTで送出するものです。
ADCとUART(ノンブロッキング)を使用しております。
チップ単体でできる基本的なことを網羅しております。





今回もぐだぐだとした内容になってしまいましたが、ねむいさんの
ぶろぐを見てる人はねむいさんより技術力が高い方ばっかりなので
多分理解してくれて大丈夫だと思います…


そんなわけでこんな感じで精いっぱいがむばっていこうと思います…!

XMEGAを使ってみる6 -どうしても外付けSRAMつけたかったので-

●XMEGAよ、やはりお前を救いたい
今から約10年前、ねむいさんはXMEGAをいじっておりましたがFatFsを実装し、
SPIのDMA化で力尽きました。ほんとは256kByteくらいのSRAMを外付けしたり
してやりたかったのですが残念ながら当時購入したATXMEGA128A1ではチップ
単体ではEBIを4PORTSRAMモードで動作させてもアドレスバスに当たる一部の
ピンが外部に出ておらず、SRAMを動作せしめることができませんでした。
(アドレスが1つだけでよいTFT-LCDとかならなんの問題もない)

その後USB機能付きのATXMEGA128A1Uが登場し、アドレスバスを別のポートに
割り当てできるようになっているとのことで入手せんと試み失敗したのが前回です

この半導体不足で何とか手に入れられないものかと思案した結果、部品が
だめなら製品を買えばよい!
と至って久々にAliexpressでお買い物をしました。




MCUZONE製のATXMEGA128A1Uボード。
USBブートローダはちゃんと動いたので本物でした!


慎重にチップをはがして載せ替えてみました。


ちなみにATXMEGA128A1のドアップ写真を。


オリジナルATXMEGA128A1


謎の縦じまがあるぱちもん。
ATXMEGA128A1UではなくATXMEGA128A1をリマークしたもの。


本物のATXMEGA128A1U!



●外付けSRAM

今回使用する外付けのSRAMは8bitバス,2Mbit(256kByte)の
CY7C1010DV33-10ZSXIです。
10年以上前にデジキでかって塩漬けにして以来の活躍です。製造メーカの
CypressはすでにInfineonに食べられてしまっていますね。



SRAMも付けたXMEGA基板の表裏はこんな感じです…
二度とバスの配線とかやりませんよもう!



●回路とコード


すみません回路図めんどくさくて10年前から書いてませんが割り振り表はあるので
まねされる方はそれを参考にしてください。
TFT-LCD駆動用にCS0をつかってしまっているのでSRAMはCS1とします。


外付けSRAM用4Port-EBIの設定です。実行する関数はmain関数より早く実行した
ほうが良いので".init5"セクションに配置します。


EBIの設定のほかにheap領域は外部RAMで行えるようにheapの初期設定も行います。
__malloc_heap_start__malloc_heap_endにheap領域を示すアドレスを代入します。
__malloc_heap_endってなんで固定値0xFFFFなのかについては最後に解説します


また、上記のコードで書いてあった変数"__extram_end"はリンカスクリプト内で
定義します。コード内で値の設定を行うときは&を忘れずに。


以上で外付けSRAMを使う準備ができました。


●動いた!…しかし


載せ替えたXEGAにプログラムを書き込みFatfsの動作を確認です。
チップリビジョンはATXMEGAA1Uを示す'L'になってますね。


mallocで領域確保したりちゃんとできてますね★



特筆する点はFatFsの転送スピードです!
内蔵RAMは8kByteしかないので転送用のバッファも少ししか取れずDMAの
恩恵に預かれなかったのですが、外付けで32kByteとってやると断然違います!
これだけでもわざわざATXMEGA128A1Uを手に入れた甲斐がありました!

しかし…

●立ちはだかる16bitの壁

さて、上でさらっと述べましたが何も考えないで内蔵RAMのように気軽に使用
できるのはメモリのアドレスが0xFFFFまでです。つまり最大でも64kByteまで
しかだめです。今回の作例ではメモリアドレス0x005000から開始しているので
0xFFFF-0x5000=0xAFFFで、10進数に治すと45055Byte分しか楽に使えません。

そこから先の世界に踏み出そうとすると10年以上前に頭を抱えた24bitアドレス問題
直面することとなります。私の作例では一応24bitアドレスアクセスルーチンも
テストの一部として入れております。DMAに関しては最初っから24bit分レジスタが
用意されているので心配はありません。

というわけでがんむばって256kByteのSRAMくっつけてたのがつけてから64KByte分
くらいしか得しないことを気づいてしまいましたが10年来心に抱え続けていたものに
決着をつけることができました。

世間はUPDIなAVR-DBシリーズに移行している中で盛大な寄り道をして
しまいましたが今回頭を唸らせた経験はきっと役に立つでしょう〜♨
(やばい思想にはまっている目で)。


今回の成果を反映したものをおきぱにおいておきます
忘れたころにXMEGA触る人に少しくらい役に立つと期待しております。

ATTINY202(とその他)を使ってみる3 -UPDI難民問題解決の件-

●私の中でUPDI難民問題に終止符が!!
新しい世代のAVRシリーズは従来からのISP,JTAG,PDI,TPI,dWireとは
全く別のプログラミング・デバッグインターフェース(UPDI)となって
いるのはご存じの通りかと思います。
ねむいさんもPDI,TPIまでは手持ちのデバッガ・ライタハードウエアで
で何とかしのげていたのですがUPDIに関しては市販の評価基板から線を引き出して
それに対応した特別なavrdudeを使用して茶を濁しておりました


そしてその後にpyUPDIというCOMポートの通信だけでUPDIの
プログラミングをお手軽にできる代物が世に広まっていき、
嗚呼…これがavrdudeにも実装されたらなぁ…
…とずっと願っておりましたが今年に入ってついに!ついに!
それが実現しました!!


●ハードウエアを用意する
avrdudeはsvnからgitに移行した時から鬼のような勢いでfixが入りまくり
日々成長を広げております。ねむいさんもgitからクローンしたやつから
ビルドして試してみました。なお今回紹介するお手軽COMポートUPDIは
avrdude内ではserialupdiと呼ばれているので以下それに倣います。


使用するCOMポートについてはUSBシリアル変換チップが勿論使用できます。
安物中華チップでもそれなりに動きますが5Vトレラントや高いボーレートが
保証されてるFTDI系のものがやはり安心です。
(注:後述しますがFTDIに関してはデバイスドライバの設定必須)

ねむいさんは☝写真の秋月製のFT23xモジュールを愛用しています。



そしてUPDI実現のための追加ハードウエアはたったこれだけ!
AVR側の電源は別口からとることを想定しております。また、FT234xなら
+5V信号を受けられるので、3.3~5Vの範囲ならば電圧レベル変換などの
考慮も不要です。


こんな感じでユニバーサル基板のきれっぱを使用してコネクタと部品を
実装して脱着可能アダプター形式にしてみました。



●実際に使ってみよう

まずは私も使っているATTINY202を使用しましょう。ちなみに昨年夏位に
pyUPDIが公表されてからUPDIのハードルが一気に下がったせいか秋月で一瞬で
売り切れてしましたが半導体不足の波も超え今では安定して入手可能となって
いますがたくさん買いすぎるなよ!

avrdudeはねむいさん特製ビルドのものを使用してください。最新のコミットのほかに
avrftdiのバグの修正やLUFAのAVRISP2エミュの不具合修正パッチもあてています。


avrdudeに与えるハードウエア名は"serialupdi"、使用するポートは
上記のように"COM"+"ポート番号"とボーレートを指定してください。



とその前に!
FTDI系のチップを使用する際はドライバの設定(デバイスマネージャから
COMポートのプロパティ->詳細設定)でBMオプションの待ち時間を1mSecに
しないと本来のスピードが出ません。

これ何かというとFTDI系は送信バッファがそれぞれのデバイスの上限に
達したらUSB転送開始もしくは上記待ち時間(latency_timerという)の時間が
過ぎたらとりあえずUSB転送する仕様となっており、最小の1mSecにすれば
USBフルスピードの1フレーム間隔(1mSec)でとにかく隙間なく転送される
ことになりCPUパワーは食いますが少量のバイト数の転送の場合に効率が
良くなります。

jtag2updiのサイトに深い記述があるのでこちらも熟読してください。

> "C:¥Devz¥Coreutils¥bin¥make.exe" program
C:/Devz/AVR/avrdude/avrdude -v -p attiny202 -P com3 -b230400 -c serialupdi -U flash:w:main.hex

avrdude: Version 6.99-20211218
Copyright (c) Brian Dean, http://www.bdmicro.com/
Copyright (c) Joerg Wunsch

System wide configuration file is "C:/Devz/AVR/avrdude/avrdude.conf"

Using Port : com3
Using Programmer : serialupdi
Overriding Baud Rate : 230400
avrdude: serial_baud_lookup(): Using non-standard baud rate: 230400 AVR Part : ATtiny202
RESET disposition : dedicated
RETRY pulse : SCK
Serial program mode : yes
Parallel program mode : yes
Memory Detail :

Block Poll Page Polled
Memory Type Alias Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
signature 0 0 0 0 no 3 1 0 0 0 0x00 0x00
prodsig 0 0 0 0 no 61 61 0 0 0 0x00 0x00
sernum 0 0 0 0 no 10 1 0 0 0 0x00 0x00
osccal16 0 0 0 0 no 2 1 0 0 0 0x00 0x00
osccal20 0 0 0 0 no 2 1 0 0 0 0x00 0x00
tempsense 0 0 0 0 no 2 1 0 0 0 0x00 0x00
osc16err 0 0 0 0 no 2 1 0 0 0 0x00 0x00
osc20err 0 0 0 0 no 2 1 0 0 0 0x00 0x00
fuses 0 0 0 0 no 9 10 0 0 0 0x00 0x00
fuse0 wdtcfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse1 bodcfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse2 osccfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse4 tcd0cfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse5 syscfg0 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse6 syscfg1 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse7 append 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse8 bootend 0 0 0 0 no 1 1 0 0 0 0x00 0x00
lock 0 0 0 0 no 1 1 0 0 0 0x00 0x00
data 0 0 0 0 no 0 1 0 0 0 0x00 0x00
userrow usersig 0 0 0 0 no 32 32 0 0 0 0x00 0x00
flash 0 0 0 0 no 2048 64 0 0 0 0x00 0x00
eeprom 0 0 0 0 no 64 32 0 0 0 0x00 0x00

Programmer Type : serialupdi
Description : SerialUPDI

avrdude: UPDI link initialization OK
avrdude: NVM type 0: 16-bit, page oriented write
avrdude: Entering NVM programming mode
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% -0.00s

avrdude: Device signature = 0x1e9123 (probably t202)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (1592 bytes):

Writing | ################################################## | 100% 0.36s

avrdude: 1592 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: input file main.hex auto detected as Intel Hex

Reading | ################################################## | 100% 0.14s

avrdude: 1592 bytes of flash verified
avrdude: Leaving NVM programming mode

avrdude done. Thank you.


> Process Exit Code: 0
> Time Taken: 00:02

脱線しましたが書き込みはこんな感じです。
ATTINY202はROM容量が少ないので早いのか遅いのかよくわかりませんが…



ではAVR128DB28で12kByteくらいのバイナリを書き込んで確かめてみた
curiocity nanoのmDBG
> "C:¥Devz¥Coreutils¥bin¥make.exe" program
C:/Devz/AVR/avrdude/avrdude -v -p avr128db28 -P usb -c pkobn_updi -U flash:w:main.hex

avrdude: Version 6.99-20211218
Copyright (c) Brian Dean, http://www.bdmicro.com/
Copyright (c) Joerg Wunsch

System wide configuration file is "C:/Devz/AVR/avrdude/avrdude.conf"

Using Port : usb
Using Programmer : pkobn_updi
avrdude: Found CMSIS-DAP compliant device, using EDBG protocol
AVR Part : AVR128DB28
RESET disposition : dedicated
RETRY pulse : SCK
Serial program mode : yes
Parallel program mode : yes
Memory Detail :

Block Poll Page Polled
Memory Type Alias Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
signature 0 0 0 0 no 3 1 0 0 0 0x00 0x00
prodsig 0 0 0 0 no 125 125 0 0 0 0x00 0x00
tempsense 0 0 0 0 no 2 1 0 0 0 0x00 0x00
sernum 0 0 0 0 no 16 1 0 0 0 0x00 0x00
fuses 0 0 0 0 no 9 16 0 0 0 0x00 0x00
fuse0 wdtcfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse1 bodcfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse2 osccfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse4 tcd0cfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse5 syscfg0 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse6 syscfg1 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse7 codesize 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse8 bootsize 0 0 0 0 no 1 1 0 0 0 0x00 0x00
lock 0 0 0 0 no 4 1 0 0 0 0x00 0x00
userrow usersig 0 0 0 0 no 32 32 0 0 0 0x00 0x00
data 0 0 0 0 no 0 1 0 0 0 0x00 0x00
flash 0 0 0 0 no 131072 512 0 0 0 0x00 0x00
eeprom 0 0 0 0 no 512 1 0 0 0 0x00 0x00

Programmer Type : JTAGICE3_UPDI
Description : Curiosity nano (nEDBG) in UPDI mode
ICE HW version : 0
ICE FW version : 1.21 (rel. 37)
Serial number : MCHP3280031800001375
Vtarget : 3.31 V
PDI/UPDI clock Xmega/megaAVR : 100 kHz

avrdude: Partial Family_ID returned: "AVR "
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% -0.00s

avrdude: Device signature = 0x1e970e (probably avr128db28)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (12076 bytes):

Writing | ################################################## | 100% 3.75s

avrdude: 12076 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: input file main.hex auto detected as Intel Hex

Reading | ################################################## | 100% 2.06s

avrdude: 12076 bytes of flash verified

avrdude done. Thank you.


> Process Exit Code: 0
> Time Taken: 00:07

serialupdi
> "C:¥Devz¥Coreutils¥bin¥make.exe" program
C:/Devz/AVR/avrdude/avrdude -v -p avr128db28 -P com3 -b230400 -c serialupdi -U flash:w:main.hex

avrdude: Version 6.99-20211218
Copyright (c) Brian Dean, http://www.bdmicro.com/
Copyright (c) Joerg Wunsch

System wide configuration file is "C:/Devz/AVR/avrdude/avrdude.conf"

Using Port : com3
Using Programmer : serialupdi
Overriding Baud Rate : 230400
avrdude: serial_baud_lookup(): Using non-standard baud rate: 230400 AVR Part : AVR128DB28
RESET disposition : dedicated
RETRY pulse : SCK
Serial program mode : yes
Parallel program mode : yes
Memory Detail :

Block Poll Page Polled
Memory Type Alias Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- -------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
signature 0 0 0 0 no 3 1 0 0 0 0x00 0x00
prodsig 0 0 0 0 no 125 125 0 0 0 0x00 0x00
tempsense 0 0 0 0 no 2 1 0 0 0 0x00 0x00
sernum 0 0 0 0 no 16 1 0 0 0 0x00 0x00
fuses 0 0 0 0 no 9 16 0 0 0 0x00 0x00
fuse0 wdtcfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse1 bodcfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse2 osccfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse4 tcd0cfg 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse5 syscfg0 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse6 syscfg1 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse7 codesize 0 0 0 0 no 1 1 0 0 0 0x00 0x00
fuse8 bootsize 0 0 0 0 no 1 1 0 0 0 0x00 0x00
lock 0 0 0 0 no 4 1 0 0 0 0x00 0x00
userrow usersig 0 0 0 0 no 32 32 0 0 0 0x00 0x00
data 0 0 0 0 no 0 1 0 0 0 0x00 0x00
flash 0 0 0 0 no 131072 512 0 0 0 0x00 0x00
eeprom 0 0 0 0 no 512 1 0 0 0 0x00 0x00

Programmer Type : serialupdi
Description : SerialUPDI

avrdude: serial_baud_lookup(): Using non-standard baud rate: 230400avrdude: UPDI link initialization OK
avrdude: NVM type 2: 24-bit, word oriented write
avrdude: Entering NVM programming mode
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% -0.00s

avrdude: Device signature = 0x1e970e (probably avr128db28)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (12076 bytes):

Writing | ################################################## | 100% 0.85s

avrdude: 12076 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: input file main.hex auto detected as Intel Hex

Reading | ################################################## | 100% 0.78s

avrdude: 12076 bytes of flash verified
avrdude: Leaving NVM programming mode

avrdude done. Thank you.


> Process Exit Code: 0
> Time Taken: 00:05


>curiocity nanoのmDBG
計7秒
>serialupdi
計5秒
あれ…イケてるじゃないですか…☆
しかも純粋な書き込み時間だけ見たら3.75sec対0.85Secで圧勝ですね!

というわけで実践でも結構使えるUSBシリアルとavrdudeを使った
お手軽UPDIはこれから爆発的に流行ってくるとおもいます!
ねむいさんが記事にしたせいでATTINY202の在庫がまた切れて
しまうかもしれないので何度も言いますが一人で買い占めちゃダメだゾ!


☆serialupdi対応のavrdude-windows32bitバイナリはこちら☆

在庫復活記念!!ATTINY202を限界まで使い倒す!

●ATTINY202復ッ活ッ!
プーチンが突然けぉって顔真っ赤にしてウクライナに侵攻してから
半導体の納期がさらに悪化する兆しを見せやがっておりますが、その中で
ATTINY202の在庫秋月電子通商さんに復活しました!!

なんか20円値上がりしてる気がしますがたぶん気のせいでしょう…
そんなこと気にするより在庫が復活するのが超重要事項なのです!!!!

扱いが非常に簡単かつ非常に安価に使いまわせるので様々な
シーンで活躍していくことでしょう!!


●ていうわけでねむいさんも本腰入れて使ってみました
昨年になってATTINY202のポテンシャルに気付いた方々が爆買いに走り
気づいた時にはすっからかんとなっておりました。ねむいさんもちょっと
動かして満足してほっぽっていましたが
他の方の使用例に刺激されて
ATTINY202のROM容量限界まで使ってみました!!!


なお,ATTINY202はメモリリソースが非常に少ないです…。
ROM:2048Byte
RAM:128Byte


ねむいさんいつもSTM32H7等の大容量メモリを扱ってたのでパワーゲーム
慣れきってしまったせいか逆に少ないリソースのマイコンは新鮮に感じます。

私のモットーとしては
1.スタックを考慮してRAMはなるべく使用しない。
2.ROMもメモリ容量圧縮しつつギッチギチに使う


で攻めてみます!

●作例1:1-Wire温湿度計
過去にSTM32G0を使用したときのAosong製AM2322Bを今回も採用して
出力をUARTから吐くようなプログラムを作ってみました!


ROM容量は2037Byte....2048バイトまで10バイト弱…これはギリギリ


-fno-split-wide-typesをコメントアウトしてみました…
2バイト削減…もはや数バイトの戦い!


関数突入時のプロローグ/エピローグルーチンをあらかじめ作ってROM容量を
削減する効果がある-mcall-prologuesをあえてコメントアウト!
使用する関数がごく少ない場合は逆にコメントアウトしたほうがROM容量が
減ってお得です☆これで2027バイト…まぁこれでよいでしょう…!

なお、XMEGAとかでこのオプションちゃんと付けてないと確実に容量が
膨れ上がって爆死します☠



動いたところはこんな感じです。
内蔵クロックが20MHzもあるので230400bpsでも余裕です☆


●作例2:2-Wireで定番LCD(IC:HD44780)を動かす
すでにI2Cでキャラクタ液晶動かすネタはほかの人がやってしまっているので
ひねくれ者のねむいさんは11年前の無理やりすぎるやつをやってみました!
SUNLIKE製の安く購入できるものに代表される2行16文字で内臓コントローラ
ICがHD44780互換なキャラクタ液晶モジュールを受動部品を追加してたったの
2線で動かしちゃう実用性皆無の超力技
です!中国だもんなア…
↑のリンク先で牛という単語が散見しますが中国では牛を肯定的な意味で使用
 されることがあるとのことです。この力業は文字通り強い牛を見るようだ。



ソースコードは上リンクの中国の人のATMega16のものをベースに汎用で幅広く
使えるように一般公開向けに現在整備中です!
間に合わなかったわけじゃないよ!



しかし…


そこに立ちふさがるROM容量の壁!orz
ああっつ!「作例1:1-Wire温湿度計の計測」結果をUART出力の代わりに
かっこよく表示して今回の記事を〆たかったのに容量ぜんぜん足らない…!
あと500Byteあれば…


・・・


15分ほど頑張りましたが挫けてしまい文字列表示ルーチンだけ走らせて
敗戦の弁を述べさせていただきます…orz






というわけでSTM32に慣れ切った私の体には負担が強すぎたのはわかりましたが
ATTINY202の(ROM容量の)イッパイ使用できて非常に満足しております…!
今回の記事で紹介した作例のソースコードはまだ公開用に整備中なので
もうしばらくお待ちいただければ幸いです。

20231201追:
ATTINY202の無理やりすぎるプロジェクトを上げました。
ついてこれる人だけついてきてください…!!!

20231201追:




ところでねむいさん今回はUPDIプログラマ使ってなくてなんかUSBシリアル
変換だけで開発してない?ですって!?
それの詳細は次回以降でみっっっちりと解説させていただきますよぅ♥
ATTIY202売り切れしたのってこれ絡みが原因だったかもれませんがこうご期待!

AVR128DAとかDBをもうちょっと使ってみる

●XMEGAの後継!機能満載でエラッタも満載
品種的にはXMEGAの後継となるAVR-Dxシリーズ。数々の新機能がありますが
それは同時に数々のエラッタを仕込むこととなりエラッタシートとチップリビジョンに
注意しておかないとドハマリして目の下にクマつけてダブルピースして
しまいます。

現在、AVR128DAに代表されるAVR-DAシリーズとAVR-DBシリーズが
流通しております。
DAとDBの違いはアナログ入出力がさらに強化されているのと異なる電圧の
I/OそしてDAに存在したエラッタが修正されていることです。

マイクロチップは過去のシリーズで出たエラッタは新しい奴で修正するよという
スタンスなのでしょうか…???これから買う人はDBシリーズ以降にしておけば変な
地雷踏まずに済むと思います。ただし使用前にエラッターシートは必ず目を
通しておいてください。

20240229追:
秋月さんよりAVR128DB28が販売されました!!!!!!
20240229追:



●製造開始直後のAVR32DAに存在した致命的エラッタ
さてAVRはアトメル時代からまず大きめの容量のチップ作ってそのあとシュリンク
していく量産体制の流れになっていますがAVR128DAが世に出て少し経った頃に
製造されたAVR32DAというチップに致命的エなエラッタが存在していました!!!

エラッタの内容は本来は4バイト必要なリセットベクタが2バイト刻みになっている
というものです。AVR32DAのフラッシュ領域すべてにアクセスするためにはリセット
ベクタで4バイトのjmp命令を使う必要があります。が、ハード的に発生する割り込み
要因は2バイトずつで詰め詰めになってるのでjmp命令ではとんだ先がめちゃくちゃ
になってrjmp命令を使用しなければならず、8kB分しかアクセスできません。

↓以下AVRのジャンプ命令の参考資料

RJMPは16bitオペコードなので2バイト
(フラッシュ8kB以下のデバイスはこちら)


JMPは32bitオぺコードなので4バイト
(フラッシュ8kB以上のでデバイスはこちら)

avr-gccに関しては4バイト区切りの割り込みベクタアドレスを前提に
スタートアップコードがビルドインされておりうんこつきのAVR32DAでは
どう頑張ってもまともに割り込みが使えません!


↑データシートよりAVR32DAの割り込みベクタの解説。
アドレスは2ワード(=4バイト)区切りなのがわかります。

AVRって最初に出た当初は"すっきり16bitオペコード"を売りにしてて伝統的に
ワード(16bit)でプログラムアドレスを表現してきたからシュリンク設計した人が
バイトアドレスと間違っちゃったんじゃないかな…

というわけでこの製造初期に出てしまったAVR32DAは回収され、現在流通している
物については正しい割り込みアドレス間隔になっているそうです。わたしは怖くて
使う気もないですけど!

ちなみに致命的すぎるエラッタゆえにエラッターシートには記載されておらず、
AvrFreaksで指摘があって初めて広く知られるようになったそうです。


●AVR128DAにもやっぱりあかんエラッタ
そして私が持っているAVR128DAもフラシュメモリがらみのエラッタがありますが、
それは下記の条件がすべて重なった時に起こります。

.侫薀奪轡緡琉茲鬟如璽仁琉茲0x8000から32kB分をマッピングして読み書きする
FUSE領域のBOOTCODEに0以外の数値が入っている(=APPCODE領域を有効にする)
NVMCTRL.CTRLBのBOOTRPをたててブート領域のプロテクションを行う

上記すべてが重なると32kB区切りのどの領域をマッピングしても最初のBOOTCODEの
領域が頭のほうにかぶさってきやがります!!


↑超わかりづらい公式のエラッタシートの解説DA!。


ブート領域を設定しなかったりLPMでフラッシュ領域のデータの読み取りするなら
全く気にする必要はありませんがせっかくデータ領域にフラッシュ領域のデータを
マッピングできるのですからせめて活用はしたいですよね…!


●AVR-Dxを救いたい
というわけでせめて32kB分だけでもPROGMEMしないでSTM32とかと同じように
constな値を置いてみたかったので上記エラッタを踏まないように配慮したうえで
リンカスクリプトをいじりフラッシュ領域のマッピング機能を最大限に活用する
作戦を取りました!


1.通常版の場合

マッピングを使用せず素直にPROGMEMした場合のプランです。
128kByte自由に使えますが64kB以上のPROGMEMの読み出しはfarポインタを
使用する必要があります。


なお、私は使おうとするAVRのフラッシュ容量を見てfar使うか使わないかを使い分け
られるようにしてます。しかしなんでもかんでもfarにするとべらぼうにリソースを
食ってしまいますのでChaN師に倣いfarはなるべく使用しない方が吉です。

2.マッピングあり&フラッシュ容量32kBのマイコンとして使う

妥協案その1。AVR128DAを32kB分しか使わず残り96kBは見なかったことにしたら
32kByte全域にPROGMEMしないでもconstだけでアクセスできるわ♥ヤッター!
ってあほか!


3.マッピングあり&rodataだけ最終セクタに押し込む。

妥協案その2.リンカスクリプトをいじくり倒してrodataだけ96kB以降に押し込んで
この領域をマッピングする!
これが一番妥協できて無難ではないでしょうか?FONTX2みたいな馬鹿でかい
ファイルおかない限りはリード専用領域32kBは十分すぎると思いますよぅ。




リンカスクリプトのいじる際のミソは__RODATA_PM_OFFSET__にデータ領域へ
マッピングされたアドレス0x8000を指定することとtextの次にrodataが
来るようにすること(重要)
順番間違えたらビルドが通らないです。


こんなわけでAVR−Dxシリーズの売りの一つだったフラッシュ領域のデータ領域への
マッピングも一応使いものになってきましたので少しは救いになったかと思います!


今回のソースコードは↓になります。回路はAVR128DA48-CuriosityNANOに準拠した
つくりとなっておりますが設定を変えてビルドしたらDBシリーズでも使用可能です。
AVR-DAとかDBとか買ったはいいものの持て余してる方はお試しください。

AVR128DA48 CuriosityNANO TestProgram.



●AVR-XMEGA、お前は救えない

上でちょっと触れたfar使う使わないの判定ですがXMEGAにも横展開しました。
対象はChaN氏のAVR版xprintfと私のavr版fontx2ドライバです。
FONTX2ドライバとかサイズでかいからさいっしょっからfar必須でしょ
とお思いかもしれませんがankコードだけなら10kbyteもないものが
あるので少しでもリソース減らすために追加してみました。

なんというか4年ぶりのxmegaの更新をしましたがここまでプログラムの規模が
でかくなるとやはりSTM32とかの32bitマイコンのほうが使いやすいなと感じます。

一方AVR使うならフラッシュ容量32kB以下のものを使っていくのが適材適所かなと
感じてます。進化の袋小路に入りこんだXMEGA。そこから生まれたAVR-Dxは
どこまで正当な進化を続けられるのか?
これからの活躍を見届けたいと思います!




おまけ


超久しぶりにXMEGA触ったからAとAUの違いって何だろうと調べたらUSB機能追加の
ほかにPORTLが存在しなくて不可能だった4Port-EBIが完全に使用できるのが判明!
今さら遅いんだYO!

AVR128DA/DBシリーズとかATMega4809とか使ってみる

●買ったはいいものの肥やしになりそうなのでやるなら今しかねぇ…

昨年末に正統進化系のAVR128DAシリーズを入手しましたがようやくいじる
機会が出来たので紹介します。

AVR128DA48 Curiosity Nanoというキットで購入しました。
値段は2000円ちょっとです。

AVR DA/DBファミリーに位置付けられるこの品種はなんと動作電圧1.8V~5.5Vの
範囲で24MHz駆動を保証しておりUARTとかも待望のボーレート生成用分数割り算器
なんかも装備しておりなにより過去の品種と比べてもはるかに安価であるという
超進化を遂げております。

が、フラッシュメモリアクセス(後述します)とI/Oのトレラントは従来のまま
なのでもうちょっとがむばってほしいですね。


なお今回のブログ記事作成に当たり下記先達のサイトを参考にさせていただきました。
みなぎ様
なんでも独り言様
KemushiComputer様



●最初に立ちはだかるUPDI難民問題
そしてフラッシュの書き込み方式はAVR-0/1系と同じくUPDIというプロトコルに
従って書き込みを行います。これ実態は半二重のUARTなのですがLUFAとか
簡単に対応ができるんじゃないのと思っていたのですがXMEGAのPDIとも勝手が
違うらしく、従来の自作系ライタとは相性が悪くて実装例はあまりなくて
普及が進まない状態となっていると感じております。

でその中でとれる方法は大きく分けて4つ
ヾ冉阿靴ATMELICE/PICKITを買ってMicrochipの開発環境から読み書きする
安価な評価ボード(XPlained/Curiosity)のファームを書き換えてUPDI専用にする
jtag2updiで専用のavrdudeで書き込む
ぜ詑屬枠焼鷭UARTなので仮想COMでせこせこ自作する(pyUPDIとかも一例)


ねむいさんは値段対費用効果が高いと思われる△諒法をとりました。ATTINY202の
時にATTINY104XplainedをUPDIプログラマ化してAvrdudeで書き込んでいます。
い硫樵COM使う方法でavrdudeが対応するのが最良なのですが
 首を長くして待ってます。
みなぎ氏のサイトではそれに近いことにちゃれんぢされているようで
 すごく期待してます☆

ぁ、なんかいつの間にか薄い本同人のネタにしますって書き換わってる・・・・

20230927追:
avrdudeがserialUPDIに対応しました!!


avrdudeは現状はAVR128DA/DBなどの128kbフラッシュを持つ品種に対応して
おらず、パッチを充てる必要があります。ちなみにCuriosityNanoにも
対応してくれてすごく助かります♥

avrdudeを使って書いてみたところはこんな感じになります

> "C:¥Devz¥Coreutils¥bin¥make.exe" program
C:/Devz/AVR/avrdude/avrdude -v -p avr128da48 -P usb -c pkobn_updi -U flash:w:main.hex

avrdude: Version 6.3-20171130
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch

System wide configuration file is "C:¥Devz¥AVR¥avrdude¥avrdude.conf"

Using Port : usb
Using Programmer : pkobn_updi
avrdude: Found CMSIS-DAP compliant device, using EDBG protocol
AVR Part : AVR128DA48
Chip Erase delay : 0 us
PAGEL : P00
BS2 : P00
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 0
StabDelay : 0
CmdexeDelay : 0
SyncLoops : 0
ByteDelay : 0
PollIndex : 0
PollValue : 0x00
Memory Detail :

Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
prodsig 0 0 0 0 no 125 125 0 0 0 0x00 0x00
fuses 0 0 0 0 no 9 16 0 0 0 0x00 0x00
fuse0 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse1 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse2 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse4 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse5 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse6 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse7 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse8 0 0 0 0 no 1 0 0 0 0 0x00 0x00
lock 0 0 0 0 no 4 1 0 0 0 0x00 0x00
data 0 0 0 0 no 0 0 0 0 0 0x00 0x00
flash 0 0 0 0 no 131072 512 0 0 0 0x00 0x00
eeprom 0 0 0 0 no 512 1 0 0 0 0x00 0x00

Programmer Type : JTAGICE3_UPDI
Description : PKOB nano (nEDBG) in UPDI mode
ICE hardware version: 0
ICE firmware version: 1.17 (rel. 514)
Serial number : MCHP3280031800001375
Vtarget : 3.31 V
JTAG clock megaAVR/program: 0 kHz
JTAG clock megaAVR/debug: 0 kHz
JTAG clock Xmega: 0 kHz
PDI clock Xmega : 100 kHz

avrdude: Partial Family_ID returned: " "
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e9708 (probably avr128da48)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (2462 bytes):

Writing | ################################################## | 100% 0.79s

avrdude: 2462 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex auto detected as Intel Hex
avrdude: input file main.hex contains 2462 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.44s

avrdude: verifying ...
avrdude: 2462 bytes of flash verified

avrdude done. Thank you.


> Process Exit Code: 0
> Time Taken: 00:02



CuriosityNanoに搭載されているnEDBGはpkobn_updiと指定するようですね。
また、Xplainedの時みたいに無理やりファーム書き換えなくてもupdiがそのまま
使用可能なのもうれしいです。これで2000円ちょっとならよい買い物かも!?


●今度はAVR128DB28だ!

さて今度はキット上ではなく別の品種にも書けるか確かめてみました。
AVR128DB28です!!これもかつてのmega8系の上位互換となっていくでしょう。

と思いきやはじめはXplainedから改造したupdiプログラマから書き込み失敗して
焦りました。どうやらCuriosityNanoのファームではないとAVR128DA/DB
シリーズのフラッシュ書き込みに対応していないと考えられます。


CuriosityNanoで書いたところです。
> "C:¥Devz¥Coreutils¥bin¥make.exe" program
C:/Devz/AVR/avrdude/avrdude -v -p avr128db28 -P usb -c pkobn_updi -U flash:w:main.hex

avrdude: Version 6.3-20171130
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch

System wide configuration file is "C:¥Devz¥AVR¥avrdude¥avrdude.conf"

Using Port : usb
Using Programmer : pkobn_updi
avrdude: Found CMSIS-DAP compliant device, using EDBG protocol
AVR Part : AVR128DB28
Chip Erase delay : 0 us
PAGEL : P00
BS2 : P00
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 0
StabDelay : 0
CmdexeDelay : 0
SyncLoops : 0
ByteDelay : 0
PollIndex : 0
PollValue : 0x00
Memory Detail :

Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
prodsig 0 0 0 0 no 125 125 0 0 0 0x00 0x00
fuses 0 0 0 0 no 9 16 0 0 0 0x00 0x00
fuse0 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse1 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse2 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse4 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse5 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse6 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse7 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse8 0 0 0 0 no 1 0 0 0 0 0x00 0x00
lock 0 0 0 0 no 4 1 0 0 0 0x00 0x00
data 0 0 0 0 no 0 0 0 0 0 0x00 0x00
flash 0 0 0 0 no 131072 512 0 0 0 0x00 0x00
eeprom 0 0 0 0 no 512 1 0 0 0 0x00 0x00

Programmer Type : JTAGICE3_UPDI
Description : PKOB nano (nEDBG) in UPDI mode
ICE hardware version: 0
ICE firmware version: 1.17 (rel. 514)
Serial number : MCHP3280031800001375
Vtarget : 3.31 V
JTAG clock megaAVR/program: 0 kHz
JTAG clock megaAVR/debug: 0 kHz
JTAG clock Xmega: 0 kHz
PDI clock Xmega : 100 kHz

avrdude: Partial Family_ID returned: "AVR "
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.00s

avrdude: Device signature = 0x1e970e (probably avr128db28)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (2398 bytes):

Writing | ################################################## | 100% 0.79s

avrdude: 2398 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex auto detected as Intel Hex
avrdude: input file main.hex contains 2398 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 0.43s

avrdude: verifying ...
avrdude: 2398 bytes of flash verified

avrdude done. Thank you.


> Process Exit Code: 0
> Time Taken: 00:02



●最後にATMega4809を試す

こちらは3月くらいに秋月さんから販売されだしたmegaAVR-0シリーズの
品種になります。AVRDA/DBと比べると1世代前の品種になります。
こちらもフラッシュ書き込みはUPDIとなっています。


とりあえずCuriosityNanoで書いてみる
> "C:¥Devz¥Coreutils¥bin¥make.exe" program
C:/Devz/AVR/avrdude/avrdude -v -p atmega4809 -P usb -c pkobn_updi -U flash:w:main.hex

avrdude: Version 6.3-20171130
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch

System wide configuration file is "C:¥Devz¥AVR¥avrdude¥avrdude.conf"

Using Port : usb
Using Programmer : pkobn_updi
avrdude: Found CMSIS-DAP compliant device, using EDBG protocol
AVR Part : ATmega4809
Chip Erase delay : 0 us
PAGEL : P00
BS2 : P00
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 0
StabDelay : 0
CmdexeDelay : 0
SyncLoops : 0
ByteDelay : 0
PollIndex : 0
PollValue : 0x00
Memory Detail :

Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
prodsig 0 0 0 0 no 61 61 0 0 0 0x00 0x00
fuses 0 0 0 0 no 9 10 0 0 0 0x00 0x00
fuse0 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse1 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse2 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse4 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse5 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse6 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse7 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse8 0 0 0 0 no 1 0 0 0 0 0x00 0x00
lock 0 0 0 0 no 1 0 0 0 0 0x00 0x00
data 0 0 0 0 no 0 0 0 0 0 0x00 0x00
usersig 0 0 0 0 no 64 64 0 0 0 0x00 0x00
flash 0 0 0 0 no 49152 128 0 0 0 0x00 0x00
eeprom 0 0 0 0 no 256 64 0 0 0 0x00 0x00

Programmer Type : JTAGICE3_UPDI
Description : PKOB nano (nEDBG) in UPDI mode
ICE hardware version: 0
ICE firmware version: 1.17 (rel. 514)
Serial number : MCHP3280031800001375
Vtarget : 3.31 V
JTAG clock megaAVR/program: 0 kHz
JTAG clock megaAVR/debug: 0 kHz
JTAG clock Xmega: 0 kHz
PDI clock Xmega : 100 kHz

avrdude: Partial Family_ID returned: "mega"
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.07s

avrdude: Device signature = 0x1e9651 (probably m4809)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (5344 bytes):

Writing | ################################################## | 100% 2.07s

avrdude: 5344 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex auto detected as Intel Hex
avrdude: input file main.hex contains 5344 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 1.02s

avrdude: verifying ...
avrdude: 5344 bytes of flash verified

avrdude done. Thank you.


> Process Exit Code: 0
> Time Taken: 00:03



最後にファーム入れ替えたXplainedから。えらいにぎやかになりました。
ATmga4809はXplainedでも書けます。
> "C:¥Devz¥Coreutils¥bin¥make.exe" program
C:/Devz/AVR/avrdude/avrdude -v -p atmega4809 -P usb -c xplainedmini_updi -U flash:w:main.hex

avrdude: Version 6.3-20171130
Copyright (c) 2000-2005 Brian Dean, http://www.bdmicro.com/
Copyright (c) 2007-2014 Joerg Wunsch

System wide configuration file is "C:¥Devz¥AVR¥avrdude¥avrdude.conf"

Using Port : usb
Using Programmer : xplainedmini_updi
avrdude: Found CMSIS-DAP compliant device, using EDBG protocol
AVR Part : ATmega4809
Chip Erase delay : 0 us
PAGEL : P00
BS2 : P00
RESET disposition : dedicated
RETRY pulse : SCK
serial program mode : yes
parallel program mode : yes
Timeout : 0
StabDelay : 0
CmdexeDelay : 0
SyncLoops : 0
ByteDelay : 0
PollIndex : 0
PollValue : 0x00
Memory Detail :

Block Poll Page Polled
Memory Type Mode Delay Size Indx Paged Size Size #Pages MinW MaxW ReadBack
----------- ---- ----- ----- ---- ------ ------ ---- ------ ----- ----- ---------
signature 0 0 0 0 no 3 0 0 0 0 0x00 0x00
prodsig 0 0 0 0 no 61 61 0 0 0 0x00 0x00
fuses 0 0 0 0 no 9 10 0 0 0 0x00 0x00
fuse0 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse1 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse2 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse4 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse5 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse6 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse7 0 0 0 0 no 1 0 0 0 0 0x00 0x00
fuse8 0 0 0 0 no 1 0 0 0 0 0x00 0x00
lock 0 0 0 0 no 1 0 0 0 0 0x00 0x00
data 0 0 0 0 no 0 0 0 0 0 0x00 0x00
usersig 0 0 0 0 no 64 64 0 0 0 0x00 0x00
flash 0 0 0 0 no 49152 128 0 0 0 0x00 0x00
eeprom 0 0 0 0 no 256 64 0 0 0 0x00 0x00

Programmer Type : JTAGICE3_UPDI
Description : Atmel AVR XplainedMini in UPDI mode
ICE hardware version: 0
ICE firmware version: 1.13 (rel. 43)
Serial number : ATML2678020200007560
Vtarget : 5.00 V
JTAG clock megaAVR/program: 0 kHz
JTAG clock megaAVR/debug: 0 kHz
JTAG clock Xmega: 0 kHz
PDI clock Xmega : 0 kHz

avrdude: Partial Family_ID returned: "mega"
avrdude: AVR device initialized and ready to accept instructions

Reading | ################################################## | 100% 0.09s

avrdude: Device signature = 0x1e9651 (probably m4809)
avrdude: NOTE: "flash" memory has been specified, an erase cycle will be performed
To disable this feature, specify the -D option.
avrdude: erasing chip
avrdude: reading input file "main.hex"
avrdude: input file main.hex auto detected as Intel Hex
avrdude: writing flash (5344 bytes):

Writing | ################################################## | 100% 1.72s

avrdude: 5344 bytes of flash written
avrdude: verifying flash memory against main.hex:
avrdude: load data flash data from input file main.hex:
avrdude: input file main.hex auto detected as Intel Hex
avrdude: input file main.hex contains 5344 bytes
avrdude: reading on-chip flash data:

Reading | ################################################## | 100% 1.38s

avrdude: verifying ...
avrdude: 5344 bytes of flash verified

avrdude done. Thank you.


> Process Exit Code: 0
> Time Taken: 00:04



こんな感じで市販のライタをそのまま流用もしくはファームだけ入れ替え
というアマチュアリズムに反する行為になってしまいましたが2000円
ちょっと出して電圧変換機能付きのUPDIプログラマ買えるのならもうこれで
いいかなと思いまし、た!



●残る問題、フラッシュ領域のアクセスはどうなった?
そういえばMicrochip体制のtinyAVRからフラッシュ領域のアドレスが
データ領域のアドレスに変換され割り振られ、PROGMEMを使わなくても
一般的なC言語のconstのように定義したら自動的にコンパイラが割り当てて
くれるようになってくれるはずですが実際にアセンブルリストと照らし
合わせてみてみましょう。


まずATMega1284p
main.cのグローバルにconst charの文字列リテラルをPROGMEMとか使わず
定義した場合、フラッシュではなくデータ領域のアドレス(0x800000以降)
として配置されます。この状態だとコンパイラがmain関数開始前に
フラッシュメモリからデータ領域のSRAMの該当アドレスに配置するルーチンを
実行しSRAMを大幅に浪費してしまいます。



続いてATMega4809の場合もデータ領域のアドレスに配置されるようになりますが、
このアドレスはLPMなどのフラッシュアドレスアクセス用の命令は必要がなく
普通のSRAMのように読み出しができるため、main関数開始前にフラッシュから
SRAMに読み出すようなルーチンは実行されません。


AVR128DA/DBは御覧の通り従来のAVRと同じになってしまいます。実は
ATmega4809と違って制約があり、データ領域は64KB以内のアドレスしか
参照できないためさらにI/Oの分も差っ引かれて実際には最大4832kByte分しか
参照できないことからくると考えられます。
まぁこれAVRのアーキテクチャーの宿命なので仕方がないのですけど128kByte分
フルに参照せしめるためには10年前にねむいさんが行っためんどい手法をもってして
やらないといけません!

※みなぎ氏の調査によるとAVR32DAxxとか32kByteのROM容量の品種では
 4809と同じくPROGMEMの考慮が必要なくなるそうです。
2023927追:
AVR-Dxシリーズでいろいろ試してみました!!



20240229追:
秋月さんよりAVR128DB28が販売されました!!!!!!

AVR再びはぢめました(ATTINY104とATTINY202を使ってみる)

●AVRは生きていた!
ねむいさんが東海自然歩道とか熊野古道とかを進軍しているうちに時代は
変わり、同じく8bitマイコンの世界も大きく変わっておりました…

今から三年前、ねむいさんはMicrochipに吸収されたATMELが擁していた
AVRに別れを告げて32bitマイコンの世界にどっぷりつかりこんだつもりでしたが…
AVRはMicrochipの庇護下で命脈を保ち、さらに現代風にリニューアルして
復活をしていた!!


秋月電気通商さんでAVR-0世代のATTINY202が発売されたのを機にねむいさんも
かつて背を向けたAVRに再び向き合うことにしました…!

そのまえに
●まずは旧世代のATTINY104

ATMEL時代の最後の嫡子ATTINY10xシリーズもついでに触ってみることにしました。
同じく秋月さんからATTINY104版のAtmelXplainedの在庫があったので
ATTINY202を買うついでにゲッツしました。
Xplained系は1000円台で純正デバッガmEDBGがついているのでお得です☆

ATTINY10xシリーズは旧世代のAVRシリーズであり、私が過去使用していた
XMEGA以前のAVRシリーズと同様のアーキテクチャーとなっています。
Lチカ程度なら余裕ですn…

なんとAVR-GCCがATTINY104に対応していなかった!!!orz
ATMEL STUDIOみたいな出来合いのツール使うのならば全く問題がないのですが
ねむいさんはコマンドラインビルド教なのでこれはきつい。
結局マカーの人がやった手順をなぞってavr-gccをATTINY10xに対応させて
ビルドしました。

書き込みはAVRDUDEを使ってXplainedに内蔵されたmEDBG(tpi接続)経由で
かきこみをおこな…i…

tpiで書き込めねぇ!!!!orz

Xplained系のATMEL評価ボード内蔵のmEDBGはAvrdudeではjtag3という
デバイス扱いで繋ぎに行くのですがなんとソースコードレベルで
jtag3のtpiモードに対応してなかった
orzもう6年以上たってるのになんで…


ATMELSTUDIOからならちゃんと読み書きできるんですけどね…
atmega1284pなのは気にしないでください。大昔の1284pのプロジェクトから
転用してATTINY104のプロジェクトこしらえたもので…


さて、ねむいさんはAvrdudeでどうしても書き込みしたかった。
Avrdudeのソースコード追ってくと手持ちのライタで書き込みができそう
だったのはLUFAとFTDI系でした。
まずはLUFAのAVRISPmk2化したATUSBKEYでtpi書き込み成功!!
(↑最初リセット繋げてなくて焦った)


お次はftdi、ねむいさんはJTAGKey2を作っているのでそれを使用しました。
TPIの結線はこちらのJTAGKey2紹介記事のリンク先回路図、
SWD接続の部分を参照の事。結線は以下の通り読み替えてください。
TPICLK = SWCLK
TPIDATA = SWDIO
RESET = TMS
リセットはRESETじゃなくてTMSなんですよねAVRだと。


そしてJTAGKey2でも危なげなく書き込み成功。
GUIツールはこれを使わせてもらいました。

なお、Avrdudeにもパッチ当てないとATTINY104で読み書きできないのでご注意を。
ねむいさんのavrdudeのバイナリはもちろん対応済です☆





●お次はATTINY202だ!

ATTINY202はAVR-0と呼ばれる新しい世代のAVRマイコンです。
AVR-0/1シリーズではプログラムメモリの規模は8ビットマイコンの力を最大限に
引き出せる64KByte以下に収まりATXMEGAと同じアーキテクチャとなりました。
そして旧世代AVRの弱点だったプログラムメモリのアクセスの煩雑さはデータ領域の
アドレスに割り当てることによって完全に克服をしました!!!!!
詳しい内容は先達の方々のブログ記事に習いました。ありがとうございます。
・なんでも独り言様
・GHz2000様


avr-gccはATTINY202に当然対応しています。なぜかATTINY104はぶっち
されていますが!!そしてAVR-0シリーズはXMEGAと同じ感覚で組めるので
ATXMEGA128A1のプロジェクトを転用して作ってみました。
また、ATMEL STARTなるATMELの忘れ形見のようなサイトのツールで
周辺やクロックの初期化コードを生成することができます。

クロックを20MHzに上げてGPIOをOn/OFFにするプロジェクトをササっと作って
いよいよ書き込みを行います。新世代のAVRはuPDIというXMEGAのPDIを進化
させた1wireのデバッグ・書き込みインターフェースで書き込みを行うわけですが、
今回は最初に紹介したATTINY104XplainedのmEDBGを使います☆


Xplainedの基板の裏にATTINY202はっつけてみました。


XplainedのmEDBG(ATMEGA32U4)はPE6がuPDIの信号線となっています。
このPE6をATTINY202のRESET(uPDI)に接続します。


別のAVRでも使えるようにXplainedのNCの部分をuPDI信号とします。
そして…



まぁ一筋縄でいくわけがなく、ねむいさんが買ったATTINY104-Xplainedはtpi専用の
ファームとなっており、uPDIを使うためにはいったんATMEL STUDIOをインス
トールしてtpiのファームをuPDIのファームに変える必要があります。
具体的にはmedbgupdi.hex&binをmedbgtpi.hex&binにリネームし上書きします。
その状態でatfwというツールでアップデートします。
atfw -a medbg_fw.zip -t medbg -s (ここにXplainedのシリアルナンバを記述する)


ATMEL STUDIOからは見えた!勝った!


そしてAvrdudeでもちゃんと書…
…書けねぇ!orzなんか無限ループしてるorz


これもAvrdudeのバージョンアップでエンバグしてしまったらしく、変更箇所をもとに
戻したら書き込みができるようになりました。めでたしめでたし♥

そんなわけでまだ私が若くぴちぴちだった頃、はぢめてAVRを触れた頃を思い
出しながらAVR-0シリーズも弄っていこうと思います!まだわかくてぴちぴちですが。






ああ最後になりますが宣伝ですがATTINY104とXplained-updiにも対応した
AVRDUDEのバイナリはこちらになります!どしどし使ってください☆

XMEGAを使ってみる5 -FatFsのDMA化-

AVRマイコンの進化形であるXMEGA。ねむいさんの偏見ですがこれを触った
人たちの殆どが以下の運命を辿ってる気がしなくもなくもなくもないです…。

1.XMEGAが手に入りました(^^)DMAやDACが使えるので楽しみです。

2.ChaNさんのFatFsが動きました(>▽<)次はDMA化してみます(^^)

3.XMEGAではSPIはスレーブしかDMAをサポートしてないみたいですね〜
 UARTのMSPIモードでしかマスタでDMAができないようです(@o@)
 いやはやデータシートはしっかり見なくては(^^;
 (↑流し読みしないで初めからちゃんと見ろ!)

4.(XMEGA関連の更新が途絶え、関係ない記事ばっかりになる)

5.(息してない)

6.おや?スライムたちが集まって…?

7.
 
 こちらのサイトでこの文字を作らせていただきました!


…なんでねむいさんのほうを見る!?



といつもの戯言はこの辺にして以前挫折して放り投げていたXMEGAにおける
FatFsのDMA化、ねむいさんもついに成功しましたのでご報告します。

ain氏のXMEGAのDMA転送に関する記事が大きなヒントになったわけですが、
SPIは送信と受信が対になっていて「(SPIマスタで)データを得たければ先ずは送信せよ
というのが頭で固まってしまっていてずっとTxからDMAの初段をキックしていました。

まさかRxからキックを開始しなければ転送が成立しないなんて思いもしなかったので
目からうろこでした…。ホントにあとちょっとのところだったのに投げ出して
しまったのか私orz
…と後からいくらでもなんとでも言えるのでまぁ無事動いたから良しとしましょう!


ファイルの読み出し速度の比較を行ってみました。

↑DMAを使用しないベタな転送の時

↑DMA転送時
実験に使用したSDカードはSTM32の時に使っている物と同一です。

STM32F1でSPIのクロックが18MHz時のDMA転送では2100kByte/Sec程出ていました
が、XMEGAにおいて許容されるSPIクロックは16MHzまでとなります。そこから単純に
逆算すると、1800kByte/Sec近く出ることになります。DMA転送前の前処理等での
時間ロスを考慮すれば1500kByte/Secという値はある納得できるものだと思います。

これ以上転送速度を上げようと思ったらオーバークロックをするか、ダブルバッファ
リングで効率化を図る等が必要になるでしょう。同氏の記事にはそれらに加えて
ペリフェラルも合わせてDMAで動かすときの考察もされており非常に参考になります。



というわけで私のおきにあるXMEGAのプロジェクトも今回のDMA転送のサポートを
加えて更新しておきました。なんとうかずっと残っていた胸の突っかかりが取れたような
気分でほっとしております♥

また、トップにもたびたび告知していますが、今回の更新から私が使用させてもらって
いる他の方のライブラリやソフトのライセンスの表記について、ソースが入っている
Zipファイルに各コピーライト、ライセンスを記したテキストファイルを同梱し明確化
していくようにしました(ホント今更ですが…)。

もちろん私のSTM32等のプロジェクトも同様の整備を広げていくしていく方針です。

XMEGAを使ってみる4


たぬ

たぬ

たぬ!
ねむいさんもついにたぬたぬのOWNERになれた…
良いことあると良いですね〜♥法明院で見たとき以来惚れこみました♥
ちなみにこの子、前回たぬき村行った時にゲッツしたと言っていた物です!





…さて本題、Windows上でGCCにてAVR/XMEGAの開発が手軽にできる"WinAVR"は、
20100110版で開発は終了しており現在はATMEL公式から配布されている
AVR ToolChain
へとひきつがれています。
そして以前から非公式で海外の掲示板で出回っていた有用なProgramMemory
アクセスの為のマクロが今回から正式にとりこまれていたりするのでここいらで
ちょっとまとめてみたいと思います。



そもそものはじまりはXMEGA触り出した去年にさかのぼります。いろいろ
文句垂れながらXMEGAを動かして来たわけですがARMではお茶の子さいさいで
できたはずの"FontX2ファイルのような大容量のデータを配列として埋め込む"
ことができないという点で躓いたことからでした。これAVRの制約というより
AVR-GCCの制約と言った方が正しいのですが、

1.引数が32767以上の配列を確保することができない
2 uint32_tの配列としてバイト数を稼ごうとしてもそもそも合計32767バイト
  以上になる配列を確保することができない
3.64kb以上のメモリ領域のアドレスに通常のポインタを使って容易に
  アクセスができない

と分かる範囲で上げましたが、普通はAVR使いの人はフラッシュメモリ容量64kb
以下のAVRを使いフォント等の大容量のデータはSDカードに置いてそこから
アクセスするという手段が常套となっていて今回私のように横着してCの配列
として大容量のデータをフラッシュに焼きこむようなことを安易に考えると
この問題に引っかかるというわけです。


これ何とかならないかといろいろ検索して調べていると数年前に「PIC 
AVR 工作室」のnekosan氏も同じ問題
当たられていたようでこの制約について非常に深い考察をされていました。
nekosan氏は最終的に制約に引っかからないようにいくつか分割した配列として
アクセスする方式にされたようです。また同日のコメント欄にはnekosan氏と
Chuck氏のやり取りがあり、その中で中にGET_FAR_ADDRESSという単語が
出てきています。これは後述しますが"3."の制約を解消するための非常に
重要なキーワードとなります。


さて、制約はわかったけど実際どうすりゃいいのと言う話になりますが、
私はフォントファイルを直接オブジェクトにして焼きこんでCからは
インデックスだけ引っ張って来たらいいんじゃね?と考え、さらにググってみると
avr-freaksのフォーラムにavr-objcopyで行う方法の
議論がありました…って何年も前だけどこれあっちではFAQレベルなのか…



置き場にあるxmegaのFatFS+TFT-LCD表示のデモにはmakeファイル中に
具体的に美咲フォントをAnkと漢字ともにオブジェクト化しelfに取り込むための
記述をしてあります。

んでこれをCからアクセスするためにはavr-objcopyで吐かれたラベルを
参照すればおkです♥

…と言いたい と こ ろ だ が!

64kByte以上プログラムメモリを持つAVRにおいて、64kByte以上の領域に
いつもの調子でアクセスしようとするとお次は"3."の制約にあたってしまいます。
そもそもavr-gccはアドレスが16bitとして処理されていて、64kb以上の
メモリ領域にアクセスする時は非常に都合が悪いです(int型が16bitなのから
お察しできると思います)。たとえば…

prog_char inaisan[] = "daisuki!";

というプログラムメモリ上のデータを参照する際にこのデータがプログラム
メモリ上の64kByte以上のアドレスの領域にあった場合、

pgm_read_byte_far((uint_farptr_t)inaisan);

ってやっても配列inaisanの頭のデータ'd'は読み出せません。本来のアドレス
から65535さっぴかれたアドレスにある頓珍漢なデータが返ってくるでしょう。
これは本来24bitあるはずの配列のインデックスのアドレスを頭8bit分カット
した16bitで渡してしまうからです(ポインタ変数を介在させてもポインタの
サイズも16bitで、16bit分のアドレスしか表現できないから同じ結果)。
これを解消するのがGET_FAR_ADDRESSというマクロで、uint32_t型の値を返します。

このマクロを通すとpgm_read_byte_far等のELPMを使う関数へ24bitアドレ
として正常に値を渡すことができます。また、このマクロは長らく非公式でしたが
現在ATMELから配布されているAVR Toolchainではpgm_get_far_address
名をかえて公式にとりこまれることとなりました。めでたしめでたし。
…私の説明分かりずらいから各自pgmspace.h見た方が早いと思います…。


↑んで、見た目は去年と全く変わり映えしませんが上記のすべてを反映させて、
 AVR Toolchainでビルドして動かしたXMEGAのデモさん。
 やっぱARMの方が組みやすいなぁ…と思うことひとしきり




つらつらとまとまりきれないまとめを書いてみましたが、WinAVRからAVR Toolchainに
変わってから気づいたことのTipsとか

●unixライクなツール群
 WinAVRにはARMマイコンのビルドにも重宝したutilsフォルダ内のmakeを含む
unixライクなツール群があったのですがATMEL公式から配布されたAVR Toolchain
には存在しません!代わりにavr-gccと同じフォルダに同等の機能のものが一切
合財ぶち込まれていますが、使いやすさを考えるとWinAVRのutilsフォルダだけ
保存しといて旧来のWinAVRよろしくビルド時にはそこからmake呼び出せられるように
すればモアベターだと思います。
私みたいなコマンドラインビルド野郎向けですがー!

20121130追:
 WinAVRはもはや時代遅れです。WinAVRについていたutilsの代用は
 こちらをご覧ください

●EBIのSRAMモード
 24ビットアドレスのアクセスの問題はプログラムメモリの時の問題だけではなく、
 もちろんI/O領域にも波及しやがります。厳密に言うとAVR Toolchainとはあんまし
 関係ないのですが、ATMEL配布のXMEGAのEBIのSRAMアクセスのデモが地味に
 バージョンアップしていて、pgm_get_far_addressよろしく24bitアドレス用の
 マクロが用意されています。
 
 ねむいさんxmega使ってこれ以上やる気ナッシングになってしまいましたから
 あんまし関係ないですが…

●delay.h
 AVR Toolchainに変えたらmakefileで正しくクロック周波数を設定してヒューズも
 間違ってないのに以前と違ってちゃんと動かねぇ!1!とお嘆きの方、utils/delay.hを
 よ〜く見てください。
 HAS_DELAY_CYCLESというdefineを1から0にすると幸せになれるかも…。
 若しくは私みたいmakefile中でavr-gccにHAS_DELAY_CYCLES=0の定義を渡して
 やるとよいです。

or

 この問題、意外と根は深いようですね…

XMEGAを使ってみる3

Versaloon関連で飛んできた人はこちらへ


年度末になると何でか糞忙しくなりますね〜…私はというと企業研修で来ている知り
合いの学生の子(去年11月下旬からSTM32初めてあっという間にマイクロマウスまで
製作ってた!!)に私のブログの内容をしてねむいさんていどひくいと罵られたり、
お客さんの現場で生暖かい目で見つめられながらハーネス打ちかえたり、私より一回
り年下の弟が私より一回り年上の彼女連れてきたりするなかで隙を見てマイコンの
勉強をやってきてます…。


LPC2388やSTM32系のMCUで動かしてきた大きめのTFT液晶、EGO028Q02や
YHY024006AをATXMEGA128A1にも導入すべく準備を進めてきました。
前回、現行のATXMEGA128A1にはPORTLが存在しないため4PORT-EBIが実質上
使用不可能と書きましたが、メモリアドレスを2つ(アドレス線は一本)しか使用しない
上記液晶たちは話が別です。FPGAボードを接続する前の肩慣らしに先ず4PORT-EBI
でTFT液晶を制御する試みを行いました。

ATxmegaのEBIに供給されるクロックはシステムクロックの2倍なので最高64MHzの
クロックスピードで動作させることができます。
高速のSRAMは恩恵を受けられるでしょうが、LCDからしてみると早すぎです。
read時だけウエイトを0->4に落とす等の細工をしています。
長々と書きましたが4PORT-EBIは無事機能して,YHY024006Aに画像やフォントを
表示することができました。


↑まだFatFs積んでないので容量の都合上このサイズの画像しか表示できないです。
 ァァ残念だー(棒

あとATXEGAで試してみたい機能はADC,RTC,事象システム,FatFs(SPIをDMAにする)
搭載、それと今回試したEBIを今度は3PORT-EBIモードで大容量SRAMというか
それが乗っかったFPGAボードと接続する。そんな感じでしょうか
また、すz氏やいえなが氏も現在進行系でXMEGAを触られているのでお二方の
作品の完成もたのしみですね。










と、いつもならここで力尽きて日記が終わるわけですが…ていどたかい虹裏メイドを
目指すねむいさんもうちょっと頑張ってみます!!次いつ更新できるか分からないし!




私も多分にもれずSTM8S-DiscoveryというSTM32ボードを購入しましたが、以前から
目をつけていたVersaloonという汎用JTAGライタ/デバッガに改造を試みました!!

このVersaloonに使用されているマイコンはSTM32の48pin,ROM62kb,RAM20kB,
ペリフェラルとしてUSBが存在する物のようですね。そしてSTM8S-DiscoveryにSTLink
として乗っかってるSTM32F103C8T6はVersaloonになる条件をすべて満たします。

んでもっておあつらえ向きに書き換え用のJTAGの端子も出ているのでまずはUrJTAGで
様子を見てみました。


↑とりあえずJTAGKeyを繋げる…


↑ふつーのSTM32ですね〜…ちゃんとJTAGで見えます(ニヤ・・

次にOpenOCDからフラッシュのバックアップを取ろうとしましたが…


↑やっぱしダメか…

というわけで一度STM32のフラッシュを書き換えてしまうともう2度とSTM8Sを
Discoverすることが出来なくなってしまうわけです。しかし!ねむいさんは
STM32のボードを購入したつもりなので容赦なく消しましたオラー!!


次にVersaloon用の回路(後述のRelease1の回路構成)に作り替えます。必要なものは
12MHzのクリスタルです。STM8SにつながっているSWIMを構成している一部のピンは
VersaloonとDFUの動作を阻害するので必ず足上げしたりジャンパカットしてください。
注:基板の改造は必ず情報の1次ソースで提示されてる回路を参照してご自分で
判断を行ってください!!実験色が非常に強いのでここでは詳しく書きません!!



↑ねむいさんは横着なので基板からSTM32を外さずに無理やり上記の改造をしましたが
 真似される奇特な人は基板から外して別に組んだ方がいいですよ?
 ちょろっと出てるUEW線は用が済んで外したTDIとTDO。

↑使わなくなったSWIMのピンはDFUモードに入るためのモード
 設定ピンに再利用しました。
 中途半端に起立しているチップ抵抗がやっつけ感漂う…

VersaloonはDFUによりセルフアップデート出来る構成をとっています。
それに倣って最初はDFUを書き込みます…。
STM32F107系に慣れてしまった身ではとてももどかしいです。
JTAGで書くに越したことないですが、持ってない人は必要なピンだけジャンパ
引き出してシステムメモリからブートして書き込むって方法
もあります…。


↑DFUが立ち上がりDFUDemonstratorが立ちあがったところ。
 ここまで来たら勝ちです!

現在、Versaloonはいくつか種類があり、製作者のSimonquan氏のページから
ソース、回路図、ホスト側プログラム、OpenOCDへの対応方法などの情報は
すべて提供されています。
今回私はRelease1の回路を構成しRelease1用のファームをビルド、そして
DFU経由でVersaloon本体を書き込みしました。



↑出来上がったVersaloonを別のSTM32ボードと接続して、vsprogにて
 JTAGモードとSWDモードそれぞれの方法で認識させたところ。


↑vsprog(gui)で書き込みもできます。STM32だけではなく
 AVR/MSP430/PSOC/STM8Sも書き込めるようです。


↑SWDに対応するパッチを当てたOpenOCDを使用してSWDでデバッグ。

今は動作確認の為のやっけつの仮組ですが目的のSWDで使えそうなのがわかったので、
STM32を別の変換基板に移し替えて汎用のJTAGデバッガ/ライタに仕上げるつもりです。

今回の実験に使ったVersaloon用のDFUとVersaloon本体のプログラムをこちらに。非常に
実験色が強いので完全自己責任のご意見無用とさせてもらいます。

XMEGAを使ってみる2

NGワーオ:ARMその他32ビットマイコン
↑ねむいさんが余計な事を言わないため用



…さて、XMEGAを使えるものにすべく少しずつフレームワークを固めてきましたが、
今現在まだまだ手探り段階です。


↑突っ込みどころ満載な画像

私のXMEGA用の開発環境はコンパイラがWinAVR,ライタ/デバッガが
JTAGICEmk2です。主人の遺物から強奪したから譲り受けたJTAGICEmk2は
ハードウエアのリビジョンが古く、PDIモードが使用できないためJTAGモード
でしかアクセスできません!!

んでもって何でライタと書き込みアダプタをつなぐケーブルがFPCじゃないかというと
FPCコネクタがガバガバになってて普通の電線で無理やり繋げて修復するまで書き込み
すら満足にできなかったからですよクソァ!!
…はぁはぁ…まぁコマンドラインツール使えるからあまり不便には感じませんが…。


この環境でフラッシュメモリに焼きこんだFONTX2ファイルやBMPファイルを
表示できるようになるまで出来ました。AVR使いの方はご存知かと思いますが
コンパイラやAVRのアーキテクチャそのもののいろんな制約で表示できるように
なるまで難儀しました。しかし一度峠越えて扱い方わかるともうあとは楽でした…


↑BMPファイルを表示した上にFONTX2(美咲フォント)で赤文字透過表示したところ。
 一部誤字があってアレな部分が伏せ字になってしまってますが無害です(棒
 バレンタインだったし!


…さて、こっから先どうするかを考えなくてはならないのですが、EBIを使って
SRAMとか繋げることも考えました。XMEGAで使用できるEBIはALE無しでもSRAMに
接続できるはずですが現行のXMEGAのモデルではEBIを構成するために必要なの
一部のバス(PORTL)が物理的に存在せず、実質上ALE使わないと大容量のSRAMを
扱うことができませんクソァ!
…オホホ私ったら…失礼…
SDRAMはもっとひどいことになってるらしいですね…。

でもLCDを繋げるくらいならALE無しでも十分すぎるくらい賄えるので、前回の
液晶を先ずEBIで繋げてアクセスするところからはぢめます…。
それと今思いつきましたがMAI電子さんより購入した高速SRAM付きFPGAボードを
死蔵していますのでこれを利用しない手は無いですね…!
丁度fenrir氏がcblsrvをISE11.xでも使えるように更新してくれましたので…
ねむいさん今度こそ本気だす!!


↑やるやる詐欺

XMEGAを使ってみる

シリアルの動かしかたを数か月間分からなかったのを気に病むことはない!!ねむいさん
だっていないさんのブラのホックを外すことができるまでに9か月かかったのだから(キリッ

といいたいところですが何かしらの問題にぶつかった時にネットで検索してすぐ見つかる
レベルの他人のソースにあたる癖は止めてデータシートとエラッタシート等の基本的
情報は事前にしっかり読んで把握しておきましょうね。あと第三者が作った機械翻訳
バリバリ手抜きの日本語訳なんて当らずに原文を素で読める英文読解力付けましょうよ。
そういう指導ばっかしてたら一般には絶対降りてこない未知のエラッタがたくさん潜む
renesasとかのマイナーな品種のマイコンとかを実務で宛がわれた時に何も対処
できなくなっちゃって電子工作感覚でネット上のフォーラムで聞いて他人に笑われる
子を世に出しちゃいますよ!(ブーメランをかわしつつ)

電子工作の"遊び方"を教えるんじゃなくて電子回路設計する際の"考え方"を指導しましょう。



はぁはぁ…まぁいいやねむいさんの学習目的だし…
とは言いつつも私が公開してるプログラムが"コアダンプ吐いてビルド止まった!"り
"パスが通ってるのにエラーになったりしてビルドができない!"ていうコメントされて
るのを他の方のtwitterやブログ等で目の当たりにするとさすがに気が咎めてき(ても
私自身打つ手がなにもなかっ)たのですが、数多に存在するうまくいかない原因のうちの
一つをめっけました。makefile中のワイルドカードの指定がマズかったようです…。

いままで公開してきたものほぼすべてに波及してたので何とか時間見つけて修正して
きました…。LatticeのAVRコアだけはツールのライセンス期限切れで動作確認が出来
てませんがこちらも追々と…WinAVR更新してなかったら気づきもしなかったのか私…



長い前振りになってしまいましたがWinAVRを20100110に更新したついでに今まで死蔵
してたXMEGAを使ってみました。なんと今回がねむいさんのぶろぐ初のAVRカテゴリ!
使用にあたってすz氏O-Famiry氏、そしてSTM32のdfu作成プログラムでお世話に
なっているシバ某氏との使用記を参考にさせてもらっています。
最初に言っておくとすでにARM使いな人はXMEGA使う意味まったく無いのとAVRから
ステップアップして規模のおっきいマイコン使うこと考えてる人はプログラムの組みや
すさ考えると"やっぱARMっしょ"になってしまいますがそれは端に置いておきます!

日本で比較的容易に手に入るのはATXMEGA128A1ですね、今回私もこれを使いました。
取り合えずいつものSPIのTFT液晶でMCUの情報を読み出し表示させるところまで…。

今回購入したXMEGAのチップリビジョンは"H"でした。リビジョンHでも
errataがまだわんさかあります。
このXMEGAが世代交代するころにはきっとerrataも無くなるでしょう(ヲイ

ホントはでかいフラッシュ領域を頼りに絵とか日本語フォントとかもフラッシュに
焼きこんで表示したかったのですが、フラッシュ領域がRAM&I/O空間と分離されて
いるのとWinAVR固有の配列確保の時のサイズの制約のおかげでトリッキーにする
必要があり、うまく表示できるまでかなり時間喰われそうなので今回はパス。
せっかく買ったのがもったいないのですけど他の方が優れた作例を出されるまで
再び塩漬にしておきます…。



あと忘れるとこだったけど、冒頭のビルドエラー修正の"ついで"でSTM32F107VCT6用
液晶表示プログラム
前回使用した2.4"と3.2"用ドライバ(16bitアクセス)を
追加しているので現物を所持していて興味がある人は試してみてくださいね。

Go to top of page