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

●XMEGAよ、やはりお前を救いたい
今から約10年前、ねむいさんはXMEGAをいじっておりましたがFatFsを実装し、SPIの
DMA化で力尽きました。ほんとは256kByteくらいのSRAMを外付けしたりしてやりた
かったのですが残念ながら当時購入したATXMEGA128A1ではチップ単体ではEBIを4PORT
SRAMモードで動作させてもアドレスバスに当たる一部のピンが外部に出ておらず、
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容量の)イッパイ使用できて非常に満足しております…!
今回の記事で紹介した作例のソースコードはまだ公開用に整備中なのでもうしばらく
お待ちいただければ幸いです。


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

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

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

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

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


●製造開始直後の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が対応するのが最良なのですが首を長くして待ってます。
みなぎ氏のサイトではそれに近いことにちゃれんぢされているようですごく期待してます☆
ぁ、なんかいつの間にか薄い本同人のネタにしますって書き換わってる・・・・


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年前にねむいさんが行った手法でもってしてやないといけません
※みなぎ氏の調査によるとAVR32DAとか32kbの品種だとだと4809と同じようになるそうです。


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