AVR (3)

話が前後するがマイコンについて

メモリマップ

メモリ空間は3つに分かれている。

プログラムをRAMに載せて実行することはできない。

フラッシュ

内容 アドレス サイズ
応用プログラム用 0x0000 -
ブートプログラム用 - 0x1FFF or 0x3FFF 256 or 512 or 1024 or 2048

応用/ブートそれぞれに書き込み禁止などの設定が可能。

RAM

内容 アドレス サイズ
レジスタ 0x0000 - 0x001F 32
I/Oレジスタ 0x0020 - 0x005F 64
拡張I/Oレジスタ 0x0060 - 0x00FF 160
SRAM 0x0100 - 0x05FF or 0x0AFF 1280 or 2560

EEPROM

内容 アドレス サイズ
0x0000 - 0x01FF or 0x03FF 512 or 1024

ヒューズビット

拡張、上位、下位の3つのフューズビットがある。フラッシュメモリの消去、書き込みではアクセスできない。

間違った値を書いてデバッガからマイコンにアクセスできなくなった場合、パラレル通信で書込みを行うと修復できる。

ベクタテーブル

直接命令を書くタイプ。そのため基本的には rjmp 命令が並ぶ。

AVR (2)

AVR-GCC

AVR 用の GCC, Binutils, Libc がある。 Libc があるので C ライブラリ newlib をビルドしたりリンカスクリプトを書いたりする必要がない。

AVR Libc

マニュアルが2箇所にある。同じもののようだ。

開始時の処理

リセット後 .init0 から .init9 までのセクションに配置された関数を処理して main() を実行する。

https://www.microchip.com/webdoc/AVRLibcReferenceManual/mem_sections_1sec_dot_init.html

.initN 内容
0 __init() を呼ぶ
1 ユーザー定義
2 スタック, r1 初期化
3 ユーザー定義
4 > 64KB ROM: .data セクションのデータを flash -> SRAM, 他: .data のコピーと .bss セクションの 0 クリア
5 ユーザー定義
6 C++の場合: コンストラク
7 ユーザー定義
8 ユーザー定義
9 main() を呼ぶ

64KBより大きいROMのマイコンの場合、 .bss セクションが 0 クリアされない?

終了時の処理

https://www.microchip.com/webdoc/AVRLibcReferenceManual/mem_sections_1sec_dot_fini.html

組み込みの場合、使うことはまず無いが、main() を抜ける際には .fini9 から .fini0 まで処理する。

AVR (1)

ATmega16U4 / ATmega32U4 を調べたのでメモ。

日本語化された資料が以下にある。

https://avr.jp/

ATmega

Atmel 社のマイコン AVR の Mega シリーズ。

リセット

BOOTRST と IVSEL で設定する。

BOOTRST IVSEL リセット 割込ベクタ
0 0 0x0000 0x0002
0 1 0x0000 Boot領域先頭 + 0x0002
1 0 Boot領域先頭 0x0002
1 1 Boot領域先頭 Boot領域先頭 + 0x0002

Boot領域は BOOTSZ の値で決まる。

BOOTSZ1 BOOTSZ0 先頭(16U4) 先頭(32U4)
1 1 0x1F00 0x3F00
1 0 0x1E00 0x3E00
0 1 0x1C00 0x3C00
0 0 0x1800 0x3800

BOOTRST, BOOTSZ

ヒューズビットの設定値。

IVSEL

MCU制御レジスタ (MCUCR) の設定値。

HWBE

ヒューズビットの設定値。 0の場合、リセット時にPE2の入力LowでリセットアドレスをBoot領域先頭に変更する。BOOTRSTより優先。

ヒューズビット

プログラム領域とは別にマイコンの動作設定を行う領域。 設定によってはマイコンが動作しなくなったり、プログラム書き換えが出来なくなったりする。

MCUSR

MCUステータスレジスタ。リセット要因フラグがある。フラグは0書き込みでクリア。

ビット MCUSR
5 USBRF USB
4 JTRF JTAG
3 WDRF ウォッチドッグ
2 BORF 低電圧
1 EXTRF 外部リセット
0 PORF 電源ON

Ergo42 (2)

購入・組み立て

Ergo42 Towel は基本セットを購入した。
基本セットにしたのは,フルセットにしてもキースイッチとキーキャップは買う必要があり,通販で探すとキースイッチとキーキャップに加えて Pro Micro やダイオードも購入できる TALP KEYBOARD があったため。
またネジや金属スペーサーは電子パーツ屋にあるだろうと思ったのだが,電子パーツ屋へ行ってみると M3 と M2.6 しか扱っていなくて M2 を通販することになった。

左右を接続する 3.5mm の TRS/TRRS ケーブルは,組み立て時は家で余っていたケーブルを使った。その後,秋葉原へ行く機会があったので 千石電商 秋葉原2号店 で購入。オシャレなケーブルが不要なら形状や長さのバリエーションが豊富で安くていい店。

ダイオードは表面実装ではなくアキシャルリードタイプにしたので,半田付けは問題なく終了。
したはずだったのだが,スイッチを取り付けた後で縦一列 (4個) の向きを間違えていることに気づいて面倒なことに。ダイオード両側のスイッチ 8 個だけ取り外してなんとか修正。

ファームウェア

msys2 でビルド・書き込みができるようだったので msys2 で行った。

ビルド・書き込みはコマンド1つ。

make ergo42:default:avrdude

書き込み処理が要求されたら Ergo42 のリセットボタンを押すと書き込み開始。 ブートローダーの種類なのかリセットボタンを押す回数が1回のものと2回のものがあるようだが,TALP で購入したものは1回だった。

Ergo42 (1)

かつては PS2 接続の FKB8720 を使っていたが,PC から PS2 コネクタが無くなり USB キーボードに変更した。
その時,いずれはそれなりに高級なものを買うとして,ひとまず安物でいいやとロジクールの K270 を購入した。

Wireless Keyboard K275

2018年現在は後継の K275 になっているようだ。(アドレスが K270 のままだが商品は変更されている)

その後,ときどきキーボードの購入を検討するものの,結局は買わずにいた。
この夏に再びキーボードを検討していたところ,この1, 2年で色々な自作キーボードが発表され購入できるのを知って,思わず購入してしまった。

tanoshii-life.booth.pm

どんなキーボードか?は下記ページに書いてある。
Why Ergo42? - 私が Ergo42 を作った理由

以前 KinesisErgoDox Ez を見て分割キーボードに興味があったので,Ergo42 の他には下記のキーボードなどを検討した。

この中から Ergo42 を選んだのは

  • 格子配列
  • キー数が多め
  • 親指まわりが普通
  • ケース (アクリル板) がセット
  • 販売中

といったところが理由。Mint60 もかなり気になったのだが,日本語配列派のため英語配列キーキャップを付けたくないのでやめた。

eZ Platform (2)

eZ Platform のドキュメント

eZ Publish 時代のドキュメントも公開されているようだ。

Symfony のドキュメント

過去のバージョンでは日本語版も作られていた。1.4 については辞書というより本になっているようだ。

eZ Platform (1)

eZ Platform を調べてみた。

  • eZ Platform は eZ Systems が開発する CMS
  • 以前は eZ Publish という名前だった。
  • 現在でも eZ Platform の Kernel のリポジトリの名前は eZ Publish 。
  • eZ Publish 5.0 以降は Symfonyフレームワークとして作られている。

ソースコードGitHub に公開されている。

GitHub - ezsystems/ezplatform

Platform と Kernel のバージョンは下記の関係。リリース日は GitHubリポジトリによる。

製品名 Kernel リリース
eZ Platform 2.x 7.x 2017-12
eZ Platform 1.x 6.x 2015-12
eZ Publish 5.x 5.x 2013-04

2012年10月-2016年1月の間は、公式サイトで日本語に翻訳されたブログも公開されていた。

BLOG - eZ Content Management System (CMS)