LCDの表示は置いといて、タッチスクリーンを。
ハードウェア的には抵抗膜4線式スクリーン。
これをタッチセンサーのコントローラーであるADS7843でA/D変換し
SPI接続でホスト側で読み出す。
コントローラーの機能としては、タッチされたら通知するような割り込み用端子があるが
それは今回は使わない方向で。ついでに、BUSYの通知も使わない。
制御としては任意のタイミングで、その時点の値を読んで判断する。
ちなみに、コントローラーの世代的には古い部類らしい。
が、基本的に最近のものも制御自体は変わらない。
で、XMEGAのSPIモジュール。
なんか、設定すべきレジスタが1個しか・・・ない?
あとは送信・受信兼用のデータレジスタと、
割り込みステータス用のレジスタがあるだけ・・・・?
かなりシンプルね。
この場合、送受信の末端はひとつの関数で、
データを書いた後で割り込みフラグが立つのを確認、
その後にデータを取得すればいいのかな。
[code lang=”cpp”]
unsigned char SPIDCtrl_RW( unsigned char byte )
{
SPID.DATA = byte;
while( !(SPID.STATUS & SPI_IF_bm) );
byte = SPID.DATA;
return byte;
}
[/code]
このとき取得するデータは一つ前の送信に対する返答だってこと。
だから、コマンドの返事が欲しければ、ダミーで0xFFを送る。
そういえば、こんな一文が。
DMA support on the SPI module is only available in Slave mode.
・・・・DMAはSPI-スレーブの時しか支援しないよ・・・って
みんなSDカードをSPI接続で使うときにDMAしたくて仕方ないのに
この一文は堪える。
やりたかったらUSARTのSPIモードを使えと。
かなりの罠だww
と、いうことで。
つづく
なんか、もう、ヘトヘト(なぞ
LCDをサクッと。
つーか、初期化コマンドが多すぎて、ゲンナリなので(T_T)
横着して人様のサンプルを(ぉぃっ
とはいえ、それじゃ癪なので、
昔ながらのBoxFillにしてみました(を
VRAMの書き込み先アドレスに関するレジスタが
X座標とY座標をうまく割り付けてあるので、座標即値で指定できるのはいいね。
つーことで。
LCDの表示まで一応。
XMEGAだろうと、32MHzだろうと、ポートのパタパタではこれが速度限界かな。
まあ、表示領域の矩形を設定してバースト処理にすればもう少しは速くなるかもしれないけど。
今日は疲れたので、ここまで。
何故か次は、PSoCをやらねばならぬようです(なぞ
さて。
とりあえず、片方向は出来たので。
LCD側を作りますか。
ネタとしては、MicroSDとかもやらなきゃならないんですが、後回しで。
付属していたタッチパネル用のケーブルがコネクタの根元から抜けてしまったので
仕方なく基板側のコネクタを取っ払い、半田付けになりました。
見ての通り、CPU基板にスタッキングできます。
というか、ウチの製作物で基板サイズにこだわってるのは、
この為なのよね。
秋月電子の95mm x 72mmの基板を基準として考えてる。
今までPCBで起こしたものが大概このサイズになってるのは
CPUでもI/Oでも、スタッキングして使えるから。
で。
LCDの設定としては、買ってきたままだと16bitバスモードになってるらしい。
それを変えるには、キャリーボードからパネルを剥がしてR2をR1へ付け替える。
たしかに、フレキにシルクが入ってた。
この辺は、先駆者たちの情報に感謝。
そういえば、元々XMEGA128A1で16bit接続しようと思ってたから
やってなかったんだ。
そんなこんなで、バックライトぐらいは確認できるかな。
ほいっ。
ただのI/OポートでMOSスイッチをONしてるだけ。
そのうちここもPWMにしてやらないとね。
そんな感じ。
やっと本題。
内蔵発振器32MHzで動いてる状態で
ボーレートの設定値を計算すると
10進数で51。
とりあえず、送信レジスタに値を突っ込むだけのコードで実験。
一応、書いていいときはステータスを見て確認。
[code lang=”cpp”]
while(1)
{
if( USARTE0.STATUS & 0x20 )
USARTE0.DATA = 0x41;
};
[/code]
普通、こんなもんでも動くよね。
でも、化ける(爆
どうにも化ける。
イロイロやって、USARTのサンプルプログラム(AVR1307.zip)を参考にして
クロック設定からやり直し。
サンプルどおり内蔵2MHzで9600bpsを設定すると・・・
化けない。
うーん。
32MHzに戻して、もう一度考える。
・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
まさかね。
[code lang=”cpp”]
while(1)
{
while( !(USARTE0.STATUS & 0x20) );
USARTE0.DATA = 0x41;
};
[/code]
まあ、確かに・・・
こっちの書き方なら、その場でフラグ待ちしてその直後で書いてるから
次にフラグ見るときは、間違いなく動いてるのかも。
フラグの立つタイミングと送信レジスタの中身がなくなるタイミングが
重なって、まだ最後の数ビット残ってるところに書き込んでた・・・・のか?
この2つのコードにそれほど違いがあるようには思えない。
もしくは、最適化で何か起きてるのかも。
まあいいや。
そんな感じで。
解決。
とりあえず、ここまで出来たらあとは
LCD側の配線をしてしまわねば。
USARTを動かすには、まずクロック周りをきちんと抑えないと
設定値の割り出しすら出来ない。
最近のCPUを使うにあたり、かならずといっていいほど躓くのが
クロック周りの設定。
各I/Oモジュールに供給できるクロック源が複数ある上に
そのモジュールと源振の間にPLLだのDLLだのプリスケーラーだのと
イロイロ通ってくるので、その辺の設定をよく読み解かないと
一体何Hzが選択されてるのかもわからない、というのが良くある。
しかも、分かりにくい。
気の利いたメーカーなら、その辺の設定値を算出するようなエクセルファイルがあったり
サンプルコードを用意してる。
XMEGAに至っては通常のI/Oポートではなく、
「どこかのビットをセットして何クロック以内に書き込め」とか
そんな制約が付いてる。
この場合、C言語で書いたんじゃ多分ダメだろう。
で、今回は。
ここまでに充分に時間があったにもかかわらず
実はドキュメントの詳細は殆ど読んでないという現実を鑑みて(爆
とりあえず、ATMELのサイトから
解説pdfとサンプルプログラム(AVR1003.zip)を取得。
コードを読む限り、問題はなさそうだったので
そのままリンクして、サンプルと同じように呼び出し。
とりあえず、クロック周りは解決。
内蔵32MHzで動いてるようだ。
でわ。
やっと本題。
・・・・つづく(ぉぃっ
ライターに認識してもらえることが分かったが
肝心の書き込むモノがない(獏
つーことで。
とりあえず、LEDの点滅点灯プログラム。
その前に、LEDを物理的に追加。
AVRStudioを立ち上げて、プロジェクトを作成。
この時点でGCCを選べるのはありがたい話。
つーか、もう7年ぐらいメジャーアップデートされてないけど
どうなってんだろうね。
昔はGCCのサポートなんて、おまけか裏技か、ってぐらいで
しまいにゃVer3.8じゃないと・・・なんて話まであったぐらい。
それがまあ、いつのまにか正式サポートのようで。
ついで、デバイスごとのヘッダファイルをインクルード・・・すると
怒られる。
io.hの中でコンパイルオプションにしたがって自動的に個別の定義を読み込むような
しかけになってる。
・・・・まあ、この辺はWinAVRの仕様か。
で、めでたく書き込み完了。
ちょっと、AVRDragonの認識とターゲットの電源投入のタイミングが問題に。
AVRDragonに接続してからターゲットの電源を入れないとダメみたい。
ポートの動作は、大丈夫そう。
じゃあ次は・・・
USARTかな。
最低限、デバイス→PC方向だけでも確認しないと。
・・・・・・・・つづく(ゐ
オシロスコープがあってよかったね。
とりあえず、波形を確認。
ちょっと、なんか波打ってるけど、電源なんてそんなもん~~
・・・・・・なんて思って、見逃してたら。
結局、その波が原因だった○| ̄|_
1msでみて、結構ノコギリ?な感じだったので
「とりあえず、これを何とかしてみよう」と、電解コンデンサをちょっと追加したら・・・
・・・・・動いてますがな○| ̄|_
そりゃ、まあ、これがCLK線とかに乗ってきたら・・・・たしかに安定しないかも。
たぶん、プログラミングのモードに入れてないんだな・・・。
波形的にも、だいぶゆるくなったみたいだし。
これで、ハード的なところは、ひとまず解決かな。
PDIなライターが手元にないことに気づいた。
・・・・・
とりあえず、どこかからかAVRISPmkIIを借りる段取りをつけたのだが。
よくよく調べると、AVRStudioの最新版にすれば、
AVRDragonがPDI対応できるようだ。
ついでだから、ヘッダーを取っ払って20ピンのBOXにしちまえ~
あーこれでPDIもISPもJTAGも、全部使えるようになるべ。
それはさておき。
一向に通信できない(縛
ファームウェアアップデートしないと、使えないのは分かりきってるのに。
USBデバイスとしては見えるのに、ツールからは接続できない。
うーんと悩んだ挙句、古いAVRStudioをアンインストールせずに最新版を入れたから?と
古いのをアンインストール、新版をインストール。
すると、USBドライバがどこからかインストールされたようす。
とりあえず、ファームをあげてみる。
・・・・・・・・・・・・・・・・・上がったがな○| ̄|_
じゃあ、基板と接続じゃ~
と、やったら。
またここで、何故かつまづく。
・・・・・・・つづく。
場外乱闘すらそっちのけ(謎
外堀が埋まりまくってしまったので
そろそろまじめに回路図引かなきゃならんかの。
とりあえず、なんだろ。
CPUとして使ってみるってところからかな。
つーわけで。
この週末で回路図引いて部品集めて、配線したのですよ。
まあ、たかだか40数本なので。
構成は
MAXIMの昇圧DC/DCなICとSPIなシリアルFlashROM、あとは
中途半端にMIO-26という・・・ウチでいうところの「旧来の規格」。
その先には・・・aitendoなタッチスクリーンが付いた液晶YHY024006A。
これに先日買ったADS7843を繋ぐ。
なぜに電源が昇圧回路かといえば、電池駆動の予定があるので
その事前確認かな。
とりあえず、テスターチェックまで終わったのですが・・・
・・・・・・・つづく(ぉぃ
とりあえず、フォント。
8×8ドットにしたら、結構小さいな~
ここに至るまでに
プログラム本体を消失しかけた。
makeファイルの記述がまずいらしく、たまに.CPPファイルが消されるw
フォントとそのポインタをフラッシュメモリに置く指定をしたが
何故かポインタの配列だけ、PROGMEMで指定するとエラーになる。
仕方ないので、とりあえずconstだけにして回避。
とりあえず、フォントは出たけど。
文字が小さいのとひらがなが入ってない感じがするので
他のフォントをとりあえず探してこないとダメかな。
表示自体はまあ、
倍サイズに変換することは出来るので・・・Rom512byteと引き換えに。
・・・・・作ってみたw
1時間ちょっと。
こんなことすら「いつか来た道」。
昔は、自分でテーブル作ったけど
今は、プログラムで生成する方法をちゃんとみつけた。
・・・・・成長してるぢゃん、をれw
それにしても
AVRはFlashROMにデータを置くと
ソレをいちいち指定しないと、まともに実行されない。
アセンブリの時も苦労したけど
C言語を使ってても、それ以上に苦労する。
いわゆる、メモリ環境に余裕があって、
すべてをRAMに展開して実行するような環境に由来する
開発環境、高級言語の思想は
メモリの少ないマイコンには不相応な部分がある。
定数も変数も、全部RAMに置きたがる。
そんなことしたら、スタックすら取れないって。
今回も、RAMに展開したらメモリオーバーで暴走してた。
仕方が無いのでFONTの変換と一緒に2倍化のテーブルを吐かせて
ROMに置いている。
この問題は、AVRのアーキテクチャに由来するのも分かる。
コードとデータが別の空間にあるんだから、それを指定しないと
正しくアクセスできない。
だからこそ、マイコンのプログラムは
細部までコントロールできる、アセンブリ言語が使われる。
とはいえ、それがまず機種依存なので、開発現場では嫌われる。
というか、組める人間がどんどん減ってて、汎用の高級言語に移行しつつある。
・・・・・・現実的には
言語なんて問わないんだけどね。
考え方、作り方、構造、その辺をきちっとしてれば
何で作っても作れるわけで。
マイコンなんて、周りの回路の都合で組み方は変わってくるし。
そんな感じで。
つづく・・