マイコンの最近のブログ記事

ずっとMPEG2の作業ばっかりやっていると、たまに違うことをやりたくなるわけでして。
先週、無性にアートワークがしたくなった時があって、ちょうどあったフリスクの空きケースを見て
思ったわけです。
「神は言っている。フリスクサイズのマイコンボードを(ry」

で、ありきたりではありますが、設計してみました。
フリスクケースに収めれば、携帯オーディオプレイヤーに。普通にピンヘッダつければブレッドボードでも使えそうなマイコンボードに。

使ったマイコンは最近秋月で単品販売を始めたルネサスRX(R5F56218BDFP)です。デコード専用IC等は載せません。
検証してませんが、たぶんRXならソフトウェアデコードできるだろう、と思いまして。

回路図はこちら3枚。
frisk-rx1.sch.sheet1.png frisk-rx1.sch.sheet2.png frisk-rx1.sch.sheet3.png
または→frisk-rx1.sch.pdf

ご覧になると分かるとおり、まだ定数値をTBDにしている箇所が結構あります。
(まだ何にも考えずに作っている証拠ですw)

現時点でのレイアウトも載せておきます。
frisk-rx1.brd.top.png frisk-rx1.brd.bottom.png

なお、今回のマイコンはD/Aが1chしかありませんので、別途D/A (MCP4922)を載せました。
そして、その基準電圧をRXの持つD/Aから出すようにしてみました。MCP4922は
出力段のアンプでゲイン2倍を選べるので、RXのD/A出力を中心に振ることができるうえ、
そのD/A電圧でボリューム調整ができるのでは、と思ったためです。
これでまっとうな音が出るのかは、試してないのでまだ不明です。
※詳しい方、ぜひツッコミいただけると嬉しいです。

とりあえずアナログ部分の試作評価と、ソフトウェアデコードが出来るのかをRX-Stickでも使って検証していきたいと考えています。

HIDaspx作ってみた

| コメント(4) | トラックバック(0)

世の中には凄いことする人たちがいるものです。

AVR-USBというプロジェクトがあります。AVRマイコンのソフトウェア制御で
USBを扱おうというものです。ソフトウェア制御ですから、90USB*とかUSB対応のデバイスである必要がありません。

なんと!tiny45とか、tiny2313とかでやってしまうんですね。こりぁ凄い!!
遊びのネタが増えました。

で、このAVR-USBを利用したAVRライタがいくつか提案されていて、そのうちのひとつ「HIDaspx」を製作してみました。
「おまえ純正AVRライタ2つも持っているだろう」というツッコミはなしで(笑)。
自分の手で作ることに意味があるんですよ!きっと!

回路図とボード図(EAGLEデータ) hidaspx1.zip


ケースインナー用紙のテンプレート AVR/HIDaspx - 千秋ゼミ
用紙テンプレートはpptx(PowerPoint2007)とPDFです。pptx編集出来ない人ごめんなさい。

ターゲットの配線でSCKとMOSI取り違えて結構時間つぶしたり、いろいろありましたが、きちんと動作しました。

HIDaspxはHID(ヒューマンインターフェースデバイス)のクラスを用いることで、デバイスドライバを導入しなくても使える、というのが特徴のライタです。最近は高速化も進んでいるようで、最新の制御ソフト(hidspx)を用いて読み書きしてみたところ、それほどストレスなく使えるくらいの速度は出ました。

ネックなのはhidspxをDOS窓(コマンドプロンプトです。古い言い方がクセになってます)に打ち込む必要があること。好きなエディタで編集してmake叩いて作業している時にはいいのですが、普段AVRの開発は開発環境(AVR Studio 4)でやっているのでちょっと不便。

そこで、現在AVRStudio用のプラグインを作成中です。近日公開予定?

あけましておめでとうございます。

相変わらずオシロは壊れたままで困っていますが、それでも開発の方は進んでおります。
ここにきて順調になっていた主な理由は、ATMELが開発環境をバージョンアップしたことにあります。

去年12月の中旬に32bit AVR関連の環境やコンパイラが相次いでバージョンアップされ、劇的に開発がやりやすくなりました。特にデバッグの応答の速さ、プログラミングの速さが飛躍的に上がり、テンポ良くデバッグできるようになったことが大きいです。

現在、ファームウェアをごりごり書いている最中です。ディスプレイを合わせた評価がまだできないのが残念ですが、とりあえず自力でSD(or SDHC)からファイルを読み込んで再生できるところまで来ています。

なお320kbpsのMP3でも難なく再生できます。DMAがあるとやっぱり便利ですね。詳細の公開はもう少しまとまってからにします。

今日はほとんどデバッグできなかった…。というのも、デバッガが絶不調。

書き込み→デバッグ→問題発見、とりあえず停止

その後、同じプログラム(すなわち再書込なし)で起動→冒頭からエラー→よく見るとフラッシュのデータが壊滅!

なんで??????
まだ書き換え回数は多くて数百回。typicalでは10万回書き換え対応だからまだまだいけるはずなんですが…。しかも大規模マイコンの場合、簡単にデバイスの入れ替えができない(配線量が多い、単価も高い)というわけで、困ってしまいました。

藁にもすがる思いで、フラッシュテスト(下記コマンド)をした後、
    avr32program flashtest -e -finternal@0x80000000 own_address
とりあえず、デバッグは復活したぽいですが…。まあとにかく、これに時間を取られすぎてやる気を無くしてしまったので、今日はこれまで。

ふぅ…。

HOSの移植(2)

| コメント(0) | トラックバック(0)

なんとかメドが立ちました。
HOS側でEVBA(例外割り込みベクタテーブル)全体をオリジナルに書き換え、独自の例外機構を扱うように変更しました。

まだ不安要素や未実装がありますが、とりあえず公開。HOS本体はオフィシャルの方から入手する必要があります。対応バージョンは HOS v4 1.02 です。

hos-v4_102_avr32_support.zipをダウンロード (2次配布は禁止させていただきます)

このzipには以下のファイルが含まれます。

  • AVR32用プロセッサ抽象化コンポーネント (include/avr32, src/avr32)
  • AVR32用インクルードコードを追加した include/hosdenv.h
  • AVR32用ライブラリ作成makefileとライブラリ (lib/avr32)
  • カーネルのコード訂正 src/mknl/sys/mexe_sys.c (オフィシャルで報告済。v1.03以降で公式に訂正されます)
  • hos4cfg のリリースビルド(MSVC6でコンパイル) (config/Release/hos4cfg.exe)

このHOSを利用するだけ(コード訂正しない)ならば、本体のinclude以下のファイルと、上記zipのinclude以下をマージしてAVR32のツールチェインの所に入れます。僕はkernel.hとかを標準のinclude先に混ぜてしまうのが嫌なので、

C:\Program Files\Atmel\AVR Tools\AVR32 Toolchain\avr32\include\hos-v4\include\...

にコピーしました。代わりに、AVR32Studioのプロジェクト設定でPathsに

${AVR32_HOME}/avr32/include/hos-v4/include

を追加する必要があります。
あとは toolchain/avr32/lib にライブラリファイル(dwarf-2形式デバッグ用 libh4avr32d.a、デバッグ情報なし libh4avr32.a)をコピーして完了です。

★割り込みの扱いについて

割り込みは本来の2048通り分岐を捨て、グループ毎の分岐としました。最大64通り。実際に使用されるグループはずっと少なく、AT32UC3B0256ならば 0~17 です。

割り込みの使用方法はできるだけHOS、というかμITRONの標準仕様に合わせるようにしました。詳しい方法は以下のリファレンスを参照してください。

●AVR32対応コードリファレンス

  1. 独自関数(HOS起動より前に呼ぶべきもの)
    • void set_sleep_function(FP pfn)
      アイドルループで繰り返し呼び出される関数を設定する。sleep命令等を書いた関数(引数なし、戻り値なし)をpfnとして渡しておくと、アイドル時にスリープする。敢えてHOS内部でsleep命令を実装しないのは、sleep命令に引数があるから。
       
    • void set_supervisor_call(FP pfn)
      スーパバイザーコール(scall命令)で呼び出される関数を設定する。
       
    • void set_interruptc_base(VP base)
      割り込みレジスタのベース位置を設定する。各デバイスのio.hで定義される AVR32_INTC_ADDRESS をVPにキャストして渡せば良い。
       
  2. μITRONの使用に基づき追加実装した関数(HOS起動後に適宜呼び出すもの)
    • ER def_inh(INTNO intno, T_DINH *pk_dinh)
      割り込みハンドラを定義(設定)する。intnoにはグループ番号(0~63)を指定する。また、pk_dinh->intatr には割り込み優先度(INT0~3)を0~3の整数で指定する。
      なお、実際に割り込みが発生した時、割り込みハンドラのexinfにはライン番号(すなわち、割り込み発生要因 ICRn が指す IRR レジスタ値で最下位の1のビット位置 0~31) が渡される。例えば外部割り込みピン EXTINT[2] による割り込みが起きた場合、intno=1 (EIC) の割り込みハンドラが exinf = 2 で呼び出される。
       
    • ER def_exc(EXCNO excno, T_DEXC *pk_dexc)
      例外ハンドラを定義(設定)する。excnoには例外番号(0~28)を指定する。
      …の予定ですが、def_excはまだ実装されていません。^^;
       
  3. コンフィグレーションで必要な記述
    • HOS_MAX_INTNO(?)
      割り込み番号の最大値(すなわち最大グループ番号)を指定する。
       
    • HOS_MAX_EXCNO(28)
      CPU例外番号の最大値(28)を指定する。
      例外番号とは、EVBAからのオフセットを4で割った値とする。たとえば、0=UnrecoverableException、4=NMI、8=IllegalOpecode、etc。
      AVR32 Architecture Manialの7.3項で参照できます。
       
  4. コンパイルの仕方
    • リンカオプションに -lh4avr32(d) を追加するだけ。必要に応じてincludeが通るようパスを追加指定すればよい。

ざっとこんなもん。例外の発生、割り込みの発生、タスクスイッチングについては確認済み。ただ例外あたりはまだバグがありそう。スーパバイザーコールに至ってはまだ確認もしてません(汗)。いや、まぁ、使わないし。

つっこみ、改善提案歓迎です。

HOSの移植

| コメント(0) | トラックバック(0)

さて、今回はHOS(Hyper Operating System)の移植のお話。

HOSはμITRON準拠のリアルタイムカーネルOSで、すべてCで記述されており、アーキテクチャ依存の部分だけを切り離してCやアセンブラで記述できるようになっています。H8等のマイコン用にはすでにアーキテクチャ依存部が存在しますが、avr32のは無かったので、自分で書きました。
タスクのスイッチングの所は全く問題ありませんでしたが、問題は割り込みです

AVR32では、割り込みが計64グループ×32要因の2048通りもあります。そして、標準ランタイム(libc.a)にある割り込み処理ルーチン(interrupt.o)では、この全ての割り込みについてテーブルを用意しようとします。テーブル1要素が8バイトで、2048×8=16kB。すなわちAT32UC3B0256ならば、内蔵SRAM(32kB)の半分を割り込みテーブルに取られます(笑)。んなアホな。

なお、実際に実装されている割り込みは38要因なので、非常に無駄が多いことになります。

解決策を考え中…。

AT32UC3BでSPI通信

| コメント(0) | トラックバック(0)

(3) SPI通信
次はSPI通信のテスト。最初はSPIモジュールでやってみます。USARTをMSPIモードで動かすやり方は次回。

まずは1バイトずつの転送。単純な方法。

	// pin configuration
AVR32_GPIO.port[0].pmr1 = (1<<17)|(1<<18)|(1<<19);
AVR32_GPIO.port[0].gperc = (1<<16)|(1<<17)|(1<<18)|(1<<19);

// SPI configuration
AVR32_SPI.mr = 0;
AVR32_SPI.MR.mstr = 1;
AVR32_SPI.MR.modfdis = 1;
AVR32_SPI.MR.pcs = 0;
AVR32_SPI.MR.dlybcs = 250;
AVR32_SPI.CSR0.ncpha = 1;
AVR32_SPI.CSR0.scbr = 250;
AVR32_SPI.CSR0.csnaat = 1;
AVR32_SPI.CSR0.dlybct = 10;

// enable SPI
AVR32_SPI.cr = (1<<AVR32_SPI_CR_SPIEN);

while(1)
{
while(!AVR32_SPI.SR.tdre);
AVR32_SPI.tdr = 0x55;
AVR32_SPI.rdr;
while(!AVR32_SPI.SR.tdre);
AVR32_SPI.tdr = 0xaa;
AVR32_SPI.rdr;
}

接続は
・NPCS0(PA16) → CS#
・SCK(PA17) → SCK
・MISO(PA18) → MISO
・MOSI(PA19) → MOSI
としました。0xaaと0x55の繰り返しをオシロで確認。

次に、PDC(DMA)を使用した非同期一括転送。

	char t[256];
int i;

while(1)
{
for(i = 0; i < sizeof(t); i++) t[i] = -1;

AVR32_PDCA.channel[0].mar = (unsigned long)t;
AVR32_PDCA.channel[0].psr = AVR32_PDCA_PID_SPI_RX;
AVR32_PDCA.channel[0].tcr = sizeof(t);
AVR32_PDCA.channel[0].marr = 0;
AVR32_PDCA.channel[0].tcrr = 0;
AVR32_PDCA.channel[0].MR.size = 0; // byte
AVR32_PDCA.channel[0].CR.ten = 1;

AVR32_PDCA.channel[1].mar = (unsigned long)t;
AVR32_PDCA.channel[1].psr = AVR32_PDCA_PID_SPI_TX;
AVR32_PDCA.channel[1].tcr = sizeof(t);
AVR32_PDCA.channel[1].marr = 0;
AVR32_PDCA.channel[1].tcrr = 0;
AVR32_PDCA.channel[1].MR.size = 0; // byte
AVR32_PDCA.channel[1].CR.ten = 1;

while(AVR32_PDCA.channel[0].tcr > 0);
}

コードは単純転送のwhileループの部分を上記のように変更。

思ったよりすんなり出来ました。注意点として、SPIでは送受信が必ず同時に行われるので、受信のみは不可であること。つまり、RX側の設定だけしてPDCを有効にしても、全く進まない。TX側も合わせて使って初めてクロックが生成されます。なお、データ受信が必要ない場合にTX側だけを使うのは問題なし。

なお、SDカードのセクタ読み出しなどでは、クロック生成の為の送信データは無難な 0xff などを利用する場合が多いと思われます。この場合、0xff で埋めたバッファを別に用意しても良いですが、メモリがもったいないので、受信バッファと共用できます。上の例がそうです。バッファtを送信データ(0xff = -1)で埋め、TX側・RX側の両方でMARに設定します。

こうすることで、0xff を送信しつつ、ひとつのバッファで処理できます。なお、PDCの優先度はRX<TXでもRX>TXでも大丈夫なようです。

今日はこの辺まで。

32bitに挑戦

| コメント(0) | トラックバック(0)

まぁ、こうなると思って名前に「ぼちぼち」と入れておいた訳で…実に5ヶ月ぶりの更新です。

さて、MP3プレイヤー計画については、AT90USBの導入を検討していましたが、最近になって32bitAVRでも良いかな、なんて考え始めました。

というのは、AT90USBとAVR32を比べると、ペリフェラルの充実度ではAVR32に軍配、消費電力ではおおよそ対等、プログラム容量やメモリ容量ではAVR32に軍配、と、AT90USBを採用する理由が無くなってしまったからです。
唯一の欠点といえば、AVR32はISPによる書き込みが出来ない(=JTAGツールが必須となる)ことですが、僕はJTAGICEmkIIを大枚はたいて買っちゃったので(笑)、そこんとこもクリア。

てな訳で、AVR32の評価です。国内ではまだUCシリーズの使用レポートが見あたらないので、このブログが最初なのかもしれません。データシートだけではいまいち分かりにくい所・使用上の注意点を挙げていきたいと思います。

使用デバイス:AT32UC3B0256-A2UT (約1,500円@Digi-Key)


(1) 電源
まず電源について。今回はUSBの5V→TA48033F→(3.3V)→VDDIO, VDDIN とし、コア電源はマイコン内部のレギュレータを使用して VDDOUT→(1.8V)→VDDCORE としました。
なお、アナログは使わないので、VDDANA, ADVREF共に3.3Vに接続。

また、電源ラインにはテスターを入れています(写真左)。これはオススメ。出力ピン短絡などのアクシデントにいち早く気づけます。マイコン単体のテストで、プログラムが空の時、5mA前後でした。もちろんピン入出力の設定をいじっていないので、マイコン本体に指を近づけると変動します。

(2) クロック
XIN1, XOUT1に12MHzの3本足セラロックを接続。これをPLLで50MHz程度にして使用したい…が、上手く行きません。

PLLの設定方法がまずいようです。LOCKしてくれない。

うーむ。さっそく問題がでてきました。

なんのこっちゃ、VDDPLLが未接続(笑)。VDDPLLをコア電圧1.8Vに接続したところ、すんなり動きました。

	// pull-up enable
AVR32_GPIO.port[0].puer = 0xffffffff;
AVR32_GPIO.port[1].puer = 0xffffffff;

// clock setting
// CPU : PLL0(source:OSC1)

// enables OSC1
AVR32_PM.OSCCTRL1.startup = 2; // about 1ms
AVR32_PM.OSCCTRL1.mode = 7; // crystal (>=8MHz)
AVR32_PM.MCCTRL.osc1en = 1; // enable
while(!AVR32_PM.POSCSR.osc1rdy);

// enables PLL0
AVR32_PM.PLL[0].pllcount = 32;
AVR32_PM.PLL[0].pllopt = 3; // wide-band, fVCO/2, fVCO<180MHz
AVR32_PM.PLL[0].pllosc = 1; // source is OSC1
AVR32_PM.PLL[0].pllmul = 4; // x5
AVR32_PM.PLL[0].plldiv = 0; // x2 (-> fVCO=120MHz)
AVR32_PM.PLL[0].pllen = 1; // enable
while(AVR32_PM.POSCSR.lock0 == 0);

// change CPU clock
AVR32_PM.MCCTRL.mcsel = 2; // use PLL0

なお、上記コードにあるように、全てのピンのプルアップを有効にしてフローティングしないようにし、PLLで60MHzを生成して動作クロック(CPU,HSB,PBA,PBBすべて)として使用したところ、消費電流は18.9mAとなりました。

JTAGICE2到着

| コメント(0) | トラックバック(0)

お待ちかねのAtmel JTAGICE mkIIが到着!

写真右下にある大きい方が本体。その下にあるのは、大きさ比較用のAVRISP mkIIです。(JTAGICE2のセットには当然含まれません。)

なんかAVRISP2がそのまま大きくなった感じです。USB、RS232C、ACアダプタと電源スイッチがあります。反対側はJTAGの通信ケーブルがフレキで出てきています。

評価は後ほど~。

昨日組んだブレッドボードの評価の途中、誤配線のためか、メインのマイコン(ATmega1281V)が昇天してしまいました。予備が一つあったので助かりましたが、コスト的に痛いです。Digi-keyで@1800円ほどもしたので。

新しいマイコンを変換基板に載せ、配線し直して評価を再開しました。また、念のために回路に流れている電源電流をデジタルテスタで監視するようにしたところ、一つ発見がありました。

普段の消費電流は、

  • マイコン ATmega1281V (3.3V、8MHz動作)
  • フラッシュメモリ AT49BV040B
  • アドレスラッチ 74LCX573

の構成で約7mAですが、マイコンに手を近づけると電流がぐんと上がり、12~13mAまで達します。きちんと対策されている方には当たり前のことだと思いますが、放置していた未使用ピンが消費電流を増やしていました。電圧がフロートなので指を近づけると変化するわけですね。もしかしたら、この未使用ピンの放置が最初のマイコン昇天の原因では?と思ったほどです。

main関数先頭ですべてのピンをプルアップするようにしたところ、電流増大の現象は綺麗に無くなりました。

バカにならないですね。恐るべし未使用ピン。AVRはピン一本ごとにプルアップが選択できるのでほんとに便利です。これもAVR好きな理由の一つですね。最大の理由はアーキテクチャが好きってことなんですけども。

このアーカイブについて

このページには、過去に書かれたブログ記事のうちマイコンカテゴリに属しているものが含まれています。

前のカテゴリはコーデックです。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

ウェブページ

Powered by Movable Type 5.04