--/--/--  --:--    スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
2010/09/24  00:34    AVR Dragon買ってみた
Digi-KeyでAVR Dragonを買ってみました。
P1020225s.jpg
噂では基板固定用の穴が無いと聞いていましたが、
届いたものはネットでみた画像の物と少し部品の配置や種類が変わっており、
ちゃんと固定穴が用意されていました。
不便な所がちゃんと修正されており、
地味ではありますがユーザーの声が届いていたのかなと思いました。
とりあえずPCに接続して認識してファームアップデートまではしましたが、
JTAG用の10PINケーブルをまだ用意していなかったので
実際にデバッグはまだしておりません。
またカンファの時に東京でケーブルを買ってこようと思います。

さて、前回いじっていたXMEGAボードですが、
UARTでの転送では時間がかかりすぎるため、SDをつないでデータを読み出してみました。
恥ずかしながら、今までSDを使った回路を作ったことがなかったため、
初めての試みとなりましたが、思ったよりはだいぶ簡単にできました。
もちろん、1から自分でプログラムを書くのは大変すぎるので、
有名なELM - ChaN氏のFatFsモジュールを用いました。
下位レイヤをXMEGA用に自分で書く必要がありましたが、
MEGA64でのサンプルが同ページにあるため、
参考にしながら下位レイヤの関数を書きました。
下位レイヤが正常に動けば、あとはプラットフォーム非依存な上位レイヤの関数を用いて
データをやり取りしてあげればOKです。
BMPデータのヘッダ情報へ構造体でアクセス出来るようにするモジュールを書いたので、
SDから一度SRAMへBMPデータを転送し、自作した関数でヘッダ情報を読みだしてから、
その情報を基に秋月液晶へ表示するというプログラムを書きました。
一応SDのルートに解像度が400*96かつ2・16・256色のBitmapファイルを入れておけば、
表示できるようにしました。タクトスイッチを使って次の画像へ切り替えることができます。
P1020230s.jpg
前の写真からmicroSDスロットとタクトスイッチが追加されただけですが・・・。
せっかくの機能も写真じゃ全然伝わりませんけど・・・。
今後の課題としては24bitBMPに対応したいですが、
RAM容量が不足しているため実装できない状態です。
今実装してあるSRAMは128KByteなので容量的には足りているのですが、
現状では64KByteにて使用しています。
64KByteを超えるアドレスへのアクセスにコンパイラが対応してくれれば
128KByteの領域を全部使用することができるのですが・・・。まぁ様子見ですね。


・追記
ふと思い立って、ATMELのEBIアプリケーションノートにある
サンプルプログラムを見てみたところ、
「GCCは24bitアクセスに対応してないから、
64KB境界を超えてアクセスするときには自分でRAMPZレジスタを書き換えてね」
と書いてありました・・・。
昔に実は、(シミュレータ上にて)自分でRAMPZレジスタを叩いて
無理やり0x10000にアクセスしたことがあったのですが、
実際にその方法が正しいやり方だったそうです。
なんかすっきりしないような・・・。
まぁ現状ではそれしか方法がないそうなので、また時間があったらやってみたいと思います。
スポンサーサイト
2010/09/06  00:56    XMEGAでUART&EBI
久しぶりにXMEGAについてです。
今回は、UART(USART)とEBIを試してみました。

P1020201.jpg
一応試している回路の全体像です。
XMEGAに秋月300円液晶とSRAM(CY62128EV30)を接続しています。
SRAMをつなぐことによって、今まではFLASH上に定数配置していた
イメージデータをSRAMに置くことができるようになるので、
読み出し速度の向上(結果的にはSRAMが45nsなのであまり向上しなかった)と
何かしらの方法で外部からイメージデータを転送してSRAMに格納し、
表示することができるようになります。

P1020203.jpg
SRAMはEagleにて変換基板を設計し、学校の基板加工機で削って実装しています。
以前にも少し書いた覚えがありますが、
XMEGAではついにラッチを使うことなくバスを出せるようにもなりました・・・が、
今の所XMEGAのシリーズで物理的にPORTLが存在しないのでラッチを付ける必要があります。
今回は変換基板の裏側に74AC573を実装しており、A0~A7とA8~A15を多重化しています。
まだ登場してあまり時間が経っていないせいか、
まだまだデータシートには不明確だったり分かりづらい部分が多くありました。
例えば、EBIは最大64MHzで動作可能と書かれており、
最初はタイミング表を見ていたのでシステムクロックである
32MHzを2逓倍してEBIは動いてくれているのだと思っていましたが、
ねむいさんのぶろぐ - いろいろ試す4
にてバスの64MHz動作の注意について書かれていたので、
32MHz内蔵発振器をCLKSYSに使うとバスも32MHzで動作してしまっているようです。
私は現状は32MHzのままで動作させていますが、
64MHzでバスを動作させたい方は注意が必要です。

EBIを使った時の感じとしては、

WinAVRにてXMEGAから可能になったメモリ空間0xFFFFを超えるアクセスができません。
(強引にレジスタをいじると一応できます)
例えば0x10000にアクセスしようとすると0x0000にアクセスしてしまうようです。
以前Twitterにていえなが氏も同じ現象に出くわしている事をお聞きしたので、
まだ対応できていないと思われます。

また、外部SRAMと内部レジスタなどがアドレス的に重複している場合は、
CSが下がらない?(波形は未確認)ため干渉してしまうことはなさそうです。
今回は64KB(このSRAMは128KBであるが64KBとして使用)で、
ベースアドレスを0x0000に設定しましたが、
内部予約分0x3FFFまでは内部を使用し0x4000~0xFFFFは外部SRAMを使用できました。


SRAMにROM上配列を展開し、SRAMから液晶にデータを転送して表示させようとしましたが、
なぜかデータが化けるので、デバッグのためにUARTを使用しました。
モニタは有名なChaN氏が公開されている汎用printfモジュールを実装しました。
uartの受信・送信用の関数を用意して関数ポインタを渡してあげれば、
printfなどが使えるようになり、とても便利でした。
あわせて、同氏が公開されているI/F誌付録LPC2000基板の試食のソースを参考に、
簡易モニタを実装してメモリをDumpしながらデータ化けの原因を探しました。
結果、例えば0x8000にデータを書き込むと、
0x8002、0x8004が同じようにデータが変化したため、配線不良であると予測しました。
SRAM変換基板のSRAMの足を再度半田付けし直したところ、正常に動くようになりました。
やはりモニタが使えるとだいぶデバッグが楽に行えてモニタのすごさを実感しました。

せっかくなので、UARTから表示データを転送し、
SRAMに格納して秋月液晶に表示出来るようにしてみました。
これがまた一難ありまして、
バイナリデータをターミナルから送信すればいいと思っていたので、
C#にてBMP変換ソフトバイナリ形式出力対応版を作成し、
モニタのコマンドにてバイナリファイルを受け付ける用にしてみましたが、
なぜかうまくいかないので、悩んでいたところ
ターミナル(私はTeratermを使用しています)は基本文字データのやりとりしかできず、
色々なプロトコルにてバイナリデータ転送も出来るようになっていることがわかりました。
わざわざプロトコルに対応させるのは面倒だったので、
出力データ1Byteを4bitずつに分割し0x30と足しあわせ、
数字・記号データとして転送するように工夫して転送するようにしました。
データの転送量は基データの2倍になってしまいましたが、
ターミナルからイメージデータを転送できるようになりました。
バイナリデータは76KBで、UART-9600bpsにて約101秒で転送できました。

P1020204.jpg
試しにWEBページのロゴを転送して表示してみました。
PCからバイナリデータを転送すればいいので、
わざわざFLASHに画像データを書き直すという事をしなくても、
様々な画像を表示できるようになりました。
ただし、電源を落とすとSRAMなのでもちろん消えますが・・・

今回のソースを一応置いておきます。自己責任にてお使いください。
人に見せられるようなプログラムではないですが、少しでも参考になれば幸いです。
xmega_lcd_sram_uart.txt
(拡張子をtxtからzipに戻してから解凍してください)
2010/05/18  02:01    XMEGAでDAC出力
先日に引き続きXMEGAでいろいろ試していましたが、
今回はXMEGAシリーズで初めてAVRに搭載された周辺機能の1つである
DACを少しいじってみました。


プログラムは上記の通り。
sin_table.hの中には256通りのsinテーブルが入った配列が定義されており、
それを割り込みで読み込んでます。
ちなみにプログラムは前回の流用なのでPWM出力も2本残っていますが、
そこは気にしたら負けです。
10usごとにタイマカウンタE1で割り込みをかけて、
割り込み処理の中でDACAとDACBのデータレジスタに値を投げ込んでいます。
今回のプログラムの場合、DACA0からはsin波が、
DACB0からはノコギリ波が出力されるようになっています。
以下が出力波形をオシロで確認した写真。

P1010765.jpg

P1010764.jpg

ノコギリ波の方の上がり始めの部分が少しおかしいですが、
とりあえず、sin波とノコギリ波は簡単に出力できました。
レジスタの設定も比較的簡単に設定できるので、
数分あればいろいろな波形を出せると思います。

・追記(2010/6/24)
波形がおかしかったノコギリ波ですが、学校のデジタルオシロで確認した所、
問題なく綺麗に表示されました。
家のアナログオシロの性能が残念だったのが原因のようです。
2010/05/16  03:12    XMEGAを使ってみる
前に共立で購入してピッチ変換基板に半田付けだけして放置していたATXMEGA128A1ですが、
時間もできたことなので少しいじってみました。

P1010759.jpg
共立で購入したATXMEGA128A1をサンハヤトのピッチ変換基板に実装しています。
また変換基板上でパスコンの実装と面倒だったのでGNDとVCCを共通化してます。
基板はそこら辺にあった切れ端を使用し、
ピンヘッダの在庫がほぼなかったので1辺だけの接続になってます。
1辺だけの接続ですが、前述の通り電源は全電源ピンに変換基板上で
供給されているので問題ありません。
下の基板上では電源用のコネクタとPDIコネクタ、LEDをPQ4に接続しています。
こんな見るからにてきとうな基板ですが、まぁいろいろ試してみてます。


今日いじった時のプログラムをぺたり。
あまり人に見せられるようなプログラムではないですが、まぁXMEGA初心者ということで。

内容としては、システムクロックを32MHz動作に変更、PWM出力、RTC割り込みです。
システムクロックに関しては、今までのMEGAやTINYではヒューズ切り替えでしたが、
XMEGAでは起動時2MHzでの動作をプログラム上で32MHzに切り替えることができます。
次にPWMでは搭載しているタイマカウンタを全て使用して24本のPWMを出力しています。
まさかAVRで24本ものPWMが出力できるとは思ってもいませんでした。
XMEGAさすがですね!
PWMはタイマカウンタごとに10倍ずつ周波数を上げており、
かつ同じタイマカウンタ内でデューティ比をそれぞれ変えています。
オシロで確認してみたところ全部ちゃんと出力が確認できました。
確認中も24本全てが違う波形だったのでなかなか面白かったです。
あとはRTCですが、割り込み+IO制御も一緒にテストしています。
リアルタイムクロックで0.5msごとに割り込みをいれて
PQ4に接続されたLEDを点滅させています。
ざっと動作はこんな感じです。

プログラムする上で気をつけた点としては、
XMEGAでは今までのレジスタ記述がMEGA・TINY系と違います。
機能名_レジスタ名 という形で記述します。
例 : PORTA_DIR
なので今までのDDRAというような記述はできません。

またIO関係のレジスタが大きく変更になりました。
一応DDRはDIR、PORTはOUT、PINはINというように対応していますが、
他にも各レジスタの一部のビットをセット・クリアするレジスタや、
プルアップするレジスタが独立していたりします。
なのでIOを使う際には注意が必要です。

システムクロックを切り替える際には、
起動時32MHz内蔵発振器が停止しているので、
まず32MHz内蔵発振器を許可しなくてはなりません。
さらに、発振器を起動させた際には安定するまで
ステータスレジスタを監視して安定を待たなくてはなりません。
その後やっとシステムクロックを切り替えるのですが、
システムクロックを切り替えるレジスタは保護機能によって保護されているため、
そのままでは書き換えることができません。
なので保護機能を一時的に解除するレジスタをいじって解除した後、
システムクロック制御レジスタで32MHzに切り替える必要があります。
上記のプログラムではもう使わない2MHz内蔵発振器を切り替えた後に停止しています。

リアルタイムカウンタもシステムクロック同様に、
まず32.768KHz内蔵発振器を許可しなくてはなりません。
許可する処理はシステムクロックと同様の手順です。
その後、RTCに供給するクロックを切り替える必要があります。

最後に割り込みについてですが、
今までと違うのは割り込みの優先度が3段階あることです。
各割り込みを許可する際に、今までは1bitをセットするだけでしたが、
XMEGAでは許可するビットが2bitあり、許可しつつ優先度を設定することができます。
また、PMIC_CTRLレジスタで各優先度の割り込みを有効にする必要があります。
そこさえ設定してしまえば、あとは今まで通り
ISR(ベクタ名) で割り込み処理を行うことができました。

とりあえず、今日XMEGAを初めて使ってみた感じを書いてみました。
一番驚いたのはやはり24本のPWMでしょうか。
まさかAVRでこんなにPWMが出せることになろうとは思っていませんでしたので。
明日も時間があればもう少しいろいろとやってみる予定です。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。