Mega128で漢字フォント表示
フラッグシップMega128の登場(6/11/08)
LEDマトリックスのお遊びに止め処がなくなって、とうとう、当がた老AVR研究所の旗艦チップ、Mega128の出番がやってきた。性能から言えば、このあいだ衝動買いしたH8/3069Fの方が16ビット機で、上だが、こいつは、表面実装の20Mhzクリスタルをおまけについていた25Mhzに取換えようと悪戦苦闘し、結局はずすことが出来なかったこともあって少し嫌気がさし、放置してある。それに秋月のこのAKI-H8/3069-LANボードは、512KのROMだけでなく、2MのSRAMが始めから付いている。 SDカードやLEDだけに使うのはもったいない。
Mega128の方は、このあいだ変換基板を載せたCPU基板を作り、準備が済んでいる。始めは168あたりでLEDとSDカードをつけようと思ったが、SDカードだけですでにフラッシュを14Kも使っており漢字フォントの処理でメモリ不足に悩まされそうなので、どうせブレッドボードで遊ぶのだから出し惜しみすることはないと早々と出番を決めた。
CPU基板に20本余りのピンヘッダーをつけたのだが、チップはTQFPで64本もピンがあって何を引き出してよいのかわからない。SDカード用とLEDマトリックスにしぼってピンアサインをしていったが、2段になったピンの順番の数え方が難しい。表と裏でどうしても混乱する。 しかし、Tiny2313からのコードを単に移植しただけのLEDマトリックスのプログラムは最初全く動かなかった。
Webの情報を参考にセットアップして(ISPのピンが違う、ヒューズビットを互換モードから変える、クロックの設定を外部にする)、AVRispで動くことは確認されているので、落ち着いて間違いを捜していく。タイマのレジスタの名前が変わっていたり、UARTの割込みベクタやレジスタの定義変更見落とし、出力ピンの定義間違いなど下らないミスが見つかった。その結果、何とかLEDが点くところまで行ったが、トランジスタアレイをパラレルにドライブするところが半分しか表示されないバグにはてこずった。 何度も配線を確認するが間違いはない。
データシートをよくよく調べていたら、トランジスタアレイをドライブしているPORTFはJTAGポートを兼ねているという記述があり表示されない部分が正しくその部分である。あれえWebにヒューズビットのデフォルトはJTAG無効になっていると書いてあったはずだがな、と念のためヒューズビットを調べてみたら確かにJTAG経由のデバッグは無効になっている。ところがヒューズビットを見ているうち別のビットにJTAG禁止/許可ビットというのを見つけた。ここではJTAG許可になっている。こいつかもしれない。このビットを念のため禁止にして動かしてみたら「あたり」であった。JTAG無効にするだけでは駄目だったのである。
やれやれ、動かすのに丸々1日かかった。フラッシュサイズは2313の限度2Kのままなので、使用率はわずか1.5%、目の眩むような広大な敷地が残されている。楽しみである。当面はこれも4KもあるEEPROMを使ってANKのキャラクタを入れてテストする予定だ。
Web情報を頭から信じてはいけない(6/14/08)
Mega128のフラッシュは128キロバイトもある。フォントファイルを入れたSDカードを読むプログラムを入れる前に、LEDのフォントをEEPROMに少し手入力し、電光掲示板の準備をしておこうと、新しいフォントをEEPROMに書くプログラムを追加したのだが、これが動かない。
Webの情報を元に、EEPROMのルーチンを書くが、全く思うところにデータが入っていかない。とにかく盛大な「ポインタ変数に整数を入れるな」という警告メッセージが出る。ポインターのキャストがうまく行っていないのかと警告のところを直すと、別のところで文句を言われる。変数定義を、始めからポインタにしてうまく行ったかと思うと、今度は「ポインターとポインターを足し算してはいけない」と今度は警告ではなくエラーになってバイナリを作ってくれない。LEDをまとめて発光させているので、スクロールさせるには2つのアドレスを足す必要があるのだ。ここにさらにキャストを入れれば直るのだろうが、余りキャストで一杯になるのも見にくいソースになってしまう。
EEPROMに関しては、キャストの警告を無視してもこれまで問題がなかったので、これが動かない原因とは思えないがとにかく、書かれる場所もでたらめなら、入っているデータもでたらめ。eeprom_write_block() というまとめてデータを所定のアドレスのEEPROMに書き込む関数が言うことを聞いてくれない。
思いあぐねていたとき思い当たったことがある。このWebサイトの情報は前にも間違っていてひどい目にあったことがある(UARTのレジスタ)。もしかするとこの関数の定義が間違っているのかもしれない。別のサイトで確認してみた。何と別のサイトの定義では、受け側と送り側の引数の順番が逆になっているではないか。しかし、このままではどちらが正しいのか分からないので逆にして動かしてみる。
やれやれ、最初のWebの情報がやはり間違っていた。プログラムは所定の場所に正しいフォントデータを記録するようになった。頭から信じた俺が悪かった。まあ、この関数の定義が通常とは違う順番(左から右、普通は右から左)になっているのもおかしいのだけれど、こういう肝心のところを間違えているのは頂けない。気を取り直し、せっせと数字をエディタで作り登録する。
我がLEDマトリックスは、UARTのキーボードから数字を入力するとそれを表示する電光掲示板となった。赤と緑は途中で色変更文字$を挿入すると変わるようにする。$を表示したければ$$と入れると$が表示されるようにもした。いや楽しい。数字以外のフォントも入れて遊ぶ。
しかし、重大な課題があることに気づく。プログラムを簡単にするためすべてのフォントは同じ幅(等幅)にしているが、数字や、Iのような文字を表示すると間延びしてしまう。いわゆるカーニングをしないと見栄えが悪い。フォントデータエリアをアドレスで操作すれば出来る理屈だが、Tiny2313からMega128に移植するときプログラムをすっきりさせるため、わざわざアドレスから配列でデータを処理するよう直したばかりだ。今さら前にもどすのも大変だし、まだ先にやることがあるので先の楽しみに残すことにする。とにかく、次々にやりたいことが増えていく。
SDカードから8ビットフォントが出た(6/17/08)
ここ数日は、Mega168に移植していたSDカードアクセスのプログラムを本来のMega128に戻し、これまでのLEDマトリックスのプログラムに合わせる作業をしている。SDカードに入った日本語フォント(美咲フォント)をLEDに使おうという計画である。これで今まで別々に開発していた機能が統合される。フォントは連続して表示することを考え、8×8のエリサフォントでなく、7×7の美咲フォントを選んだ。いずれもWeb上で公開され太っ腹なことに個人、商業目的にかかわらずすべてフリーである(9/06/08修正)。
コメントアウトしていたMega128のステートメントを戻し、ブレッドボードにSDカード基板を移して順調にSDカードが読めるところまで行った。これまでの開発では、一画面分で画面表示が止まり、何らかのキーを押せば次のテキストファイルが表示されるようになっている。シフトJISの漢字なら、日本語テキストも見える。フォントファイルの中からフォントデータを抽出するロジックをこれから開発する。ところが暫く読んでいるうち、プログラムが暴走を始め表示が止まらなくなった。あわてて電源を切り、もう一度入れなおしたら今度は動かなくなってしまった。
この日はもう深夜も2時を過ぎていたので、あれこれ考えながら床に就いた。その翌日、もしかしたら直っているかもしれないと再度動かしたが、やはり同じ。読んでいくだけでデータがこわれることは考えられない。別のSDカードも読めない。ソースを調べるが前と変わったところはない。大体、最初は動いていたのだ。何がおかしくなったのだろう。ピンを配線していないのでライトプロテクトとカード検出の結線はせずにソフトで常にOKにしている。これがいけないのだろうか。しかし何も変えていない。どうも初期化に失敗しているようだがわからない。遂にどこも調べるところがなくなり、仕方なく、ロジックアナライザーを持ち出した。
出てきた波形を見て驚いた。クロックは出ているが、信号が何も出ていない。こりゃあハードだ。ブレッドボードの配線を確かめる。ちゃんとみんな刺さっている。あれ、SDカードの6番ピンはGNDなのに何かが結線されている。何だ何だ、これはSPIの出力ではないか。隣の7番から移動してしまっている。
原因がわかった。暴走してあわててスイッチに手をかけたときジャンパーコードに触れて線がはずれそうになりつけ直したとき隣に差してしまったのだ。線に余裕がなく斜めになってささっていたので間違えたようだ。わかってしまえば何でもないお馬鹿なミス。正しいピンに接続して、SDカードは何事もなく作動する。やれやれ、ブレッドボードは便利だが、こういう危険がある。
フォントファイルはBDF形式といって、すべてがキャラクタなので操作がしやすい。夕方からロジックをメモに書き出し、フォントデータをUARTのコンソールに順次表示するコードを書く。久しぶりにC言語のライブラリで昔の参考書をひっぱりだしてstrcmpなどのなつかしい関数を組み込む。フラッシュはたっぷりある。何を組み込んでも余裕である。chaN氏のFatFSはいたれりつくせりの関数が用意されていて、簡単に組み上げられた。
最初、strcmpで文字列を比較して合わない、合わないと悩んでいたが、長さを揃えて調べないと一致しないことがわかり(strncmpを使う)、それからあとの進捗は早かった。
しかし、表示してみて、危惧したとおり、アルファベットやひらがな程度なら問題ないが、やはり漢字を8×8で表示するのは苦しい。しかもスクロールしながらでは余計わかりにくいだろう。折角、ここまできたが、ちょっと先行きが暗くなってきた。
| 固定リンク
「AVR」カテゴリの記事
- ソフトI2Cはクロックストレッチまで手を出してあえなく沈没(2017.09.02)
- オシロのテストどころかソフト開発で大はまり(2017.07.26)
- 超音波方式の人感センサーI2C化と新しいオシロ(2017.06.29)
- motionの動体検知はRaspi3の電源が安定しない(2017.04.16)
- 赤外線学習リモコンはデータ再現で挫折したまま進まず(2016.07.21)
コメント
報告ありがとう。とにかく動いてよかったですね。
私もよくやります。捺印や目印の小穴が紛らわしく、わざと間違い易くして消費量を増やそうという魂胆があるのかと疑いたくなる石もありますね。VccとGNDがたすきがけになっているDIPを逆さに差したら大抵おだぶつですから。
投稿: がた老 | 2011年5月16日 (月) 01時19分
お粗末な思い込みでした。解決しました。再コメントもありがとうございます。
落ち着いておかしいところを再チェックしました。
→ 基板の配線は誤りなし。
→ ピン間のショート、ハンダ不良なし
→ ISP、電源ほか誤接続なし(これら以外は未配線です)
→ 外観は?
...そこで、写真と比べてみて気がつきました。あれ?ベンダ捺印の方向が変???
ここでした。捺印表示が正常に読める位置の左下が1番ピンと思い込んでいました。
(少なくともSTM32はそうだった筈ですが...)
取り急ぎ変換基板に付けたチップコンデンサを付け直し、ソケットに90°づらして
実装したところ、ISPからアクセス可能になりヒューズビットも変更できました。
...一部のポートは壊れている可能性もありますが、取りあえずOKです。
ピン名はデータシート(PDF)の記載が2番ピン=(PDI/RXD0)PE0、3番ピン=(PDO/TXD0)PE1となっているのに沿って書いたもので、誤解はありません。
お騒がせして申し訳ありませんでした。
投稿: eNasty | 2011年5月15日 (日) 21時26分
そちらの書き込みにつられてISPのピンをPD0、PD1と書きましたが、
これはPDO(OUT)、PDI(IN)の意味で、実際のピン位置は
PE0、PE1ですが、こんな基本的な間違いではないか。
チップひとつで150mAというのは確かに異常と考えられますが、I/Oピンに何かつけているとそれ位流れるかもしれない。
投稿: がた老 | 2011年5月15日 (日) 16時28分
迅速回答、ありがとうございます。avrsp.exeによるシリアル書き込みについてATmega128では何か、前処理があるかとの期待で質問させて戴きましたが、MISO/MOSIラインの入れ替え以外は特に無いということですね。
3系統の電源系も配線上問題はなさそうですが、Chip単体で150mA(5V)程消費しているので、ピッチ変換基板への半田付け時にストレスを与えて壊れてしまったのかも知れません。同時に付けた2枚とも同一症状なので、精神的にも経済的にも一寸ショックですが。
重ねてありがとう御座いました。今後も所長の新たな挑戦や記事掲載を期待させて戴きたく思います。
投稿: eNasty | 2011年5月15日 (日) 10時28分
1. ISPのMISO/MOSIをPD0、PD1にする。
2. Mega128の工場出荷時は103互換モードになっているのでAVRSPなどで、拡張フューズビットを11にする。
(ネイティブモード)
http://www-ice.yamagata-cit.ac.jp/ken/senshu/sitedev/index.php?AVR%2Fnews07
ここまでは、上のURLに書いてありますが、
3.上位フューズビットを 10-11001 から11-11001にする(JTAGENをJTAG禁止にする)、がPORTFのピンを使うときに必要になります(これが後半の部分)
AVRispでは動くことは確認...というのは今になっては、思い出せませんね。別のプログラムライターで認識させたのでしょうか。
Mega128そのものが、ISPピンを通して認識されることが前提ですから別の原因でしょうか。VccやGNDが沢山あるので、全部接続されているかなどを調べられては。
投稿: がた老 | 2011年5月14日 (土) 23時59分
申し訳ありませんが、質問させてください。
所長が最初に制作されたと同じ(ChaNさんの)シリアルISPアダプタとavrsp.exeでATmega128にISP書き込みをしようとして失敗し、deviceが見つからないといわれます(Tiny2313やmega168は書き込みできてます)。
文中の「Webの情報を参考にセットアップして(ISPのピンが違う、....中略、AVRispで動くことは確認されているので」が気になります。MISOをPDOに、MOSIをPDIに繋ぎ換えはやっていますが、後半の「AVRisp」の部分が解けません。不具合の推測が付けばご教示戴ければ幸いです。
投稿: eNasty | 2011年5月14日 (土) 20時51分