2013/08/21

[FPGA][MicroBlaze]MicroBlaze開発中に出てきたエラーと、その解決

,
 今日は待ちに待った2CELLOSのCD発売日なんですが、ヨドバシ秋葉マルチメディアには置いてなかったので激おこです。しょうがないので、これ書いたらプール行って帰ろうと思います。

 で、MicroBlaze人口が少ないからなんでしょうか、エラーメッセージで検索すると日本語のページが全然出てこなくて大変です。全く、失敗とその解決法も、動作法に劣らない程度に重要だと思うんですよね、時間を使って得た経験、ノウハウとも言えるでしょうし…
 いくつか、自分が嵌められた?エラーとその解決法についてメモしておきます。

1)MicroBlazeにあったdebug_moduleを消して、手動でまた追加する場合
 別のプロジェクト開いたら、xmdでfpga -f ***.bitはいけるのにconnect mb mdmでMDMがねえよって怒られたので…(このときのエラーメッセージはコピペしてメモしてないんだ、ごめん)

 まず、microblaze_0をダブルクリックし、Configuration WizardでEnable Debugにチェックを入れる。
 次に、IP CatalogからDebug→MicroBlaze Debug Module (MDM)を選択し、追加する。
IPコアの追加(Debugの一番下のやつね)
で、これだといろいろと配線が足りないと思うので、Bus Interfaceから
・debug_moduleのMBDEBUG_0を、microblaze_0_debugに
・debug_moduleのS_AXI(AXIバスを使っている場合)を、なんかそれっぽいのに(てきとう)
・Portsタブから、debug_moduleのDebug_SYS_Rstを右クリックして[Make External]、リセットのところの(名前がまちまちだろうけど、例としてproc_sys_reset_0)のMB_Debug_Sys_Rstにそれぞれ繋ぎます。
要は、debug_module⇔microblaze、debug_moduleのバス接続、Reset接続です(もしかしたらバスは要らないのかもしれない。Resetはないとエラーが出る)。
microblaze_0とdebug_moduleを繋げる。Bus Interfacesから。
Reset信号のモジュール同士の接続は、右クリック→[Make External]からだ。
でいいような気がする。変に直接ポート名をタイプすると、エラーだらけになって手に負えなくなるのでやらない。
MicroBlaze Debug Module 
で、最後にAddressesタブを開き、AXIバス上での(かなあ)アドレスを指定してあげます(すでにアドレスが割り当ててあるなら、この手順は別にいらないかもですね)。これには、モジュールを選択して右上にあるGenerate Addressボタンを押すだけで終わります。
Addressを割り当ててもらう。
参考:Xilinx エンベデッド システム開発 v12.3 8-14 アドレスの割り当て
//ハウツーマニュアルが、セミナーに行かないと貰えないのってちょっとどうかと思うんです…いくら商売とは言え…

2)逆に、debug_module(MDM)を2つ以上つないじゃった場合
 多分Run DRCsのところで SIGNAL: Ext_BRK - multiple drivers found: のようなエラーが出て通らないと思います。しかし困ったことに、これでもGenerate Netlist、Generate BitStreamは一応選択できるんですね…
 普通にBus Interfacesのところを右クリックして、Delete Instanceすればオッケーです(禍根を残さないようにAll Connectionをdeleteしてもらう)。で、自分は通った。
debug_moduleとmdm_0って名前が違うから、最初重複してることに全く気付かなかったのがそもそもの原因…

参考:http://forums.xilinx.com/t5/Embedded-Processors-and/Multiple-debug-modules-instantiation/td-p/273698

 ちなみにこの時はExport DesignからSDKが起動できなくて嘆いてた。その時のログは以下のようなもの。これだけだと通ってるように見えるから困る。
********************************************************************************
At Local date and time: Wed Aug 21 15:38:48 2013
 make -f system.make exporttosdk started...
IF NOT EXIST "SDK\SDK_Export\hw" @mkdir "SDK\SDK_Export\hw"
psf2Edward -inp system.xmp -exit_on_error -dont_add_loginfo -make_inst_lower -edwver 1.2 -xml SDK\SDK_Export\hw/system.xml 
Release 14.5 - psf2Edward EDK_P.58f (nt64)
Copyright (c) 1995-2012 Xilinx, Inc.  All rights reserved.

Checking platform configuration ...
IPNAME: plb_v46, INSTANCE: mb_plb - 2 master(s) : 9 slave(s) 
IPNAME: lmb_v10, INSTANCE: ilmb - 1 master(s) : 1 slave(s) 
IPNAME: lmb_v10, INSTANCE: dlmb - 1 master(s) : 1 slave(s) 

Checking port drivers...
Done!

3)Generate BitStreamに反応がない場合
 例として、というか自分の場合Run DRCs、Generate Netlistまでは通っているのに、Generate BitStreamを押しても以下のようなメッセージがコンソールに吐きだされて、Generateされない。
********************************************************************************
At Local date and time: Wed Aug 21 18:01:16 2013
 make -f cpu.make bits started...
"This project has been instantiated in Xilinx ISE Project Navigator. Please use ProjNav to generate the bitstream. "
Done!
もう知らん。そもそもXPSからProjectを開いたときに、以下のようなダイアログが出てくる時点でイミフだって
どゆこと…
(2013/09/08)これは、ISPのProject Navigatorで作られたプロジェクトは、ISEから開くべき、みたいなやつだったような気がする…

4)Linuxのコンパイルについて

 多分自分のことだからどうせまた記事を書いちゃうんでしょうけど、Linuxのコンパイル時にはXilinx Wikiに書いてあるやり方だと怒られてビルド通りません。
 どうやらCROSS_COMPILEオプションを指定してあげた方がいいみたい?で、mb-かmicroblazeel-xilinx-gnu-だったかを書いてあげたら通りました。(要検証)

0)各ファイルの場所
最初のモジュール名がsystemなら、system\implementation\にsystem.bitとかができる。
最終的に生成されるdownload.bitは\software\cpu_hw_platform\以下。\software\は多分SDKで聞かれるworkspaceの場所。
\software\uboot_bsp_0\microblaze_0\libsrc\uboot_v4_00_c\にconfig.mkとxparameters.h

余談
http://blog.cronus-embedded.com/article/57563399.html
なるほどねーって思ってたら、1年前の記事だった。
Read more →

2013/08/20

[FPGA][MicroBlaze]MicroBlaze用u-bootのコンパイルと実行

,
 Xilinxの組み込みIPコアの一つであるCPU、MicroBlaze上でu-bootを実行するお話です。悲しいかなネットにある大量の情報の海に溺れかけ、ここまで2日かかりました。かなりいろいろとややこしいのでメモしておきます。Linuxが起動できればいいなあ(というかその前座)。

 まず、開発環境をメモしておきます。
・Xilinx ISE 14.5
・Xilinx Platform Studio 14.5
・Xilinx Software Development Kit Release Version: Release 14.5 Build SDK_P.58f
・ターゲットボードは、Xilinxの評価ボードSP605
・後UbuntuとTeraTermが必要。


 基本的な開発の流れは、XilinxのWikiであるところのこのページに従います。

MicroBlazeのハードウェア層を、XPSで設計する(ISE使わずともいけるっぽい)。

SDKの方で、u-bootの設定をする(u-bootのコンパイルに必要な、config.mkとxparameters.hを生成する)。

SDKで、.bmmと.bit(と後.elf?)を統合し、download.bitを生成しておく。

Ubuntuで、u-bootのコンパイルをする(上記2ファイルが必要。これでu-bootファイル(拡張子なし)を生成する)

必要なファイル(download.bit、u-boot)がそろったので書き込みする


1)とりあえず、最初に、Xilinxのページから、SP605用MicroBlazeのサンプルプロジェクトをダウンロードします。

2)旧バージョンのファイルを新しくする。

 展開したらsp605_bistというフォルダが出来たと思います(多分)。そしたら、XilinxのSDKの方を立ち上げ、[File]→[Open File]でsp605_bist/system.xmpを開きます。すると、XPSが立ち上がり「旧バージョンのファイルを新しくするよ」的なダイアログが出るので、Nextをペペペと押していきます。
※system.xmpをXPSで開いても、ただ中身を表示するだけで、ダイアログが出ない故のSDKからの起動であります。

3)MicroBlazeにMMUを載せる

 まずやることは、MMUをのっけることです。なぜならば、u-bootにはMMUが必要ですが、リファレンスデザインのデフォルト設定のまま書き込んでxmdからconnect mb mdmすると、No-MMUと見えたので…
(2013/09/06)MMU無しでも普通に動くらしいです。動きました。

 XPS上で、Bus Interfaceタブにあるmicroblaze_0をダブルクリックします。

 Configuration Wizardが立ち上がりますので、左のSelect configuration:からLinux with MMUを選びます。(Low-end Linux with MMUでも大丈夫なのかもしれない。uCLinux向け?)
 [Next]ボタンを押して設定を一通り見てもいいですが、別に見なくてもよかったような気がします。[OK]ボタンを押して、Wizardを閉じます。

4)MicroBlazeのBitStreamを生成し、XPSでやることを終わらせる。

 左のNavigatorから、Run DRCs、Generate Netlist、Generate BitStreamを順にやっていきます。多分エラーは出ません、出てもちょっとどうにもならないです…(無い場合は[View]→[Toolbars]→[Navigator]?)。ちなみにこの作業は結構時間がかかります。までもNavigatorがやることをわかりやすくリストアップしてくれてるので、めっちゃいいですねこれ。

5)SDKへの開発に移る

 Export Designを押し、ダイアログが出たら[Export & Launch SDK]をクリックします。すると、SDKのWindowが表示されるかと思います。ここからは、Eclipseの操作に慣れた方ならすいすい行くと思うんですが、とりあえずWelcome的なウィンドウを閉じます。

 えっと、ここで追加のプラグインみたいなものが必要になります。u-boot-xlnxです。Xilinxのgitにあるので、Ubuntuマシンの方でgit cloneしてDLしておきます。
※Eclipseへの追加から先は、このページによくまとめられています。めっちゃ参考にしました
 このページからuboot_bsp.tar.gzをDLします。どうにかして展開します。したらXilinx\14.5\ISE_DS\EDK\sw\lib\bsp以下に放り込みます。結果として、
Xilinx\14.5\ISE_DS\EDK\sw\lib\bsp\uboot_v4_00_c\data\uboot_v2_1_0.mld
Xilinx\14.5\ISE_DS\EDK\sw\lib\bsp\uboot_v4_00_c\data\uboot_v2_1_0.tcl
の様になってればオッケーっぽいです。

したら、SDKから[File]→[New]→[Board Support Package]を選択します。図のようなダイアログが出ると思うので、左下をubootに変えて[Finish]を押します。
ubootのためにconfigファイルを作ります。
次に、よくわからないセッティングをします。下のようなウィンドウが出ると思うので(このSSはすべて設定し終えたときのもの)、Valueのところをデフォルトのnoneから繋ぎたいものに変えていきます。
セッティング
 終わったらOKを押すと、自動的にmakeが始まります。ここで結構エラー出ること多いです。MicroBlazeのピン接続が少しでも違うとダメっぽいです(Enable Debugにしたままデバッグポート繋げないとかするとエラーでた)。
 Can't find variable 'flash_memory_bank'みたいなエラーもでます。よくわからないので、出てきた解決策の通りに0固定にします。(これやるとu-bootのビルド時にgpioあたりでundefined referenceで落ちる?)
バンクってなんだよ…

ログ:
17:58:59 **** Build of project uboot_bsp_0 ****
make -k all 
libgen -hw ../sp605_bist_hw_platform/system.xml\
      \
      -pe microblaze_0 \
      -log libgen.log \
      system.mss
libgen
Xilinx EDK 14.5 Build EDK_P.58f
Copyright (c) 1995-2012 Xilinx, Inc.  All rights reserved.

Command Line: libgen -hw ../sp605_bist_hw_platform/system.xml -pe microblaze_0
-log libgen.log system.mss 


Staging source files.
Running DRCs.
#--------------------------------------

# uboot BSP DRC...

#--------------------------------------

Running generate.
#--------------------------------------

# uboot BSP generate...

#--------------------------------------

/* Main Memory is ddr3_sdram */

INFO automatic U-BOOT position = 0x57c00000

Running post_generate.
Running execs_generate.
'Finished building libraries'

17:59:03 Build Finished (took 3s.431ms)

 もしコンパイルがうまくいったならば、projectのuboot_bsp_0\microblaze_0\libsrc\uboot_v4_00_cあたりにconfig.mkとxparameters.hが出来てると思います。これをつかってu-bootをビルドします。

7)
 最後に、[Xilinx Tools]→[Program FPGA]を選択し、[OK]を押します。ここら辺の参考

6)書き込む

 ファイルが出来たら、いよいよ書き込みです。わけのわからない難解なジャンパの設定をしたら、電源を入れます。
 書き込みには、iMPACTではなくxmdというツールをCUIで使います。多分スタートメニューの[Xilinx Design Tools]→[ISE Design Suite 14.5]→[Accessories]に"ISE Design Tools 64bit Command Prompt"みたいなものがあります。それを選択します。
 コマンドラインが表示されたら、まずはdownload.bitとu-bootのあるフォルダに移動します。そうしたら
C:\***\***\***\>xmd
と打ちます。Xilinx Microprocessor Debugger (XMD) Engineだなどと表示されたかと思います。続いて、
XMD% fpga -f download.bit
XMD% connect mb mdm
XMD% dow u-boot
XMD% run
します。
xmdを使ってFPGAに書き込みする。
もしTeraTermなどのシリアルモニタを繋いでいれば(ボーレート115200)、u-bootが起動したメッセージが流れてきます。
u-bootの動作確認
ここら辺はこのページを参考にしました。

 ここまでXilinxのWiki通りに進めてきたわけですが、Xilinxに買収されたらしいPetaLinuxの話は一度も出てきませんでした。ネットにある僅かな情報によれば、それなりにコンパイルから書き込みまでが楽に行えるらしいのですが、一体どこに行ったんでしょう…

 後、実際に使うにあたってはFSBL(First Step Boot Loader)が無いと、起動してもu-bootすら読み込んでくれなくなりそうなんですが、どうすればいいんでしょう。SDKでApplication Projectを作成しようとすると、ExampleにSREC Bootloaderなるものが出てくるのですが、これなんでしょうかね…
SREC Bootloaderとは
ちなみになんでこんなことをやっているかというと、仕事でやることになったからです…Xilinx触ったことなかったんですが、仕事なのでそうも言ってられず。かといって初心者なので情報を端から端までいちいち眺めるわけです。とても覚えてられたもんじゃないので、Blogにまとめざるをえない…ですよねえ…

MicroBlazeを作りこむところからは、このpdfも参考になる。

おまけ:Xilinxの書き込みツールだけど、これで低価格品だと銘打っちゃうんだから、庶民には手の届かない世界のままなんだなあ…
Read more →

2013/08/15

[電子工作]ZedBoard用Linuxカーネルのコンパイル

,
 面倒くさかった。ネットに上がっているやってみた系サイトの情報の殆どが古くてなかなか進まなかった。
※私はLinux系を扱い慣れていませんので、冗長になっているかもしれません…

参考にさせていただいたサイト
Matrixのゆらぎ: Zed BoardのLinuxカーネルビルド編 http://goo.gl/jfC5ZP
FPGAの部屋 ZedBoardのLinuxカーネルコンパイルのテスト http://goo.gl/pgwT7z

ビルドした環境
OS:Ubuntu12.04 (Oracle VM VirtualBox上)
CPU:i7-3770K 1コア制限
メモリ:RAM 1GB割り当て

 基本的には、GitHubからソースコードをDLしてきて、後コンパイルに必要な物を揃える→makeするだけなんですが。以下やり方です。

1)まず最初に参考にした(上の方の)サイトに従って、色々とパッケージを入れていきます。ひたすらsudo apt-get install *****です。
※Cygwin環境だと、apt-getが存在しないので、代替としてapt-cygとか言うものを使うのが常套手段みたいです。しかし、自分がやってみたところ、setup.iniが無いだの、Package *** not found or ambiguous name, exitingというエラーが出てどれもインストールが出来なかったので、仮想マシン上のUbuntuで作業することにしました…
apt-cygは色々とダメ

2)GitHubからカーネルのソースコードとかをダウンロードします。コマンドは
git clone https://github.com/Digilent/linux-digilent.git kernel
です。(結構時間が掛かる)

3)参考にしたサイト(の下の方)通りに、ZedBoard_OOB_Design.zipを解凍し、でてきた/linux/.configをkernelフォルダにコピー。/linux/devicetree_ramdisk.dtsを/kernel/arch/arm/boot/dtsにコピー。
 
 で、参考にしたサイトを見ると、この先configurationをしていますが、まあZedBoard_OOB_Design.zipに入っている.configのままでいいかなあと思ったので、先ずコンパイルしてみます。

4)コンパイルにはXilinxのarm-xilinx-linux-gnueabi-gccが必要です。これはVivadoのSDKに入ってるみたいなので、それもDLしてきます。
 Xilinxのダウンロードページから、ソフトウェア開発キットの「Vivado 2013.2:スタンドアロン SDK 単一ファイル ダウンロード イメージ」を選択してDLしてきます(約1.7GB、tarファイル)。
SDKのダウンロードページ
解凍したら、/Xilinx_SDK_2013.2_0616_1/bin/linにあるxsetupを実行して、適当なフォルダにインストールします。(/Xilinx_SDK_2013.2_0616_1/xsetupではない模様、そっちを起動しても変なインストーラが出てきて終わる)
xsetupの実行

5)パスを通す
インストールフォルダが/home/***(ユーザー名)/Xilinx/とかの場合、端末から
export PATH=$PATH:/home/***/Xilinx/SDK/2013.2/gnu/arm/lin/arm-xilinx-linux-gnueabi/bin
export PATH=$PATH:/home/***/Xilinx/SDK/2013.2/gnu/arm/lin/bin
としてパスを通しておきます
Xilinxのページなどを見ると、/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/binに通せと書いてありますが、そんなフォルダは存在してません…このページに書かれているのが古いバージョンとかなんでしょうか…
多分どっちか一つでいいんだろうけど、どっちなのかあまり良く分からなかったので両方…後者でした
どっちが呼ばれるんだろう…(右側だった)

6)Makeする
パスを通したら、
make ARCH=arm CROSS_COMPILE=arm-xilinx-linux-gnueabi-
として、コンパイルします。私が実行した限りでは、数分でコンパイルが完了しました。
コンパイルの終わり
kernel/arch/arm/boot以下に、zImageが生成されています。
zImageが生成されている。
実際にZedBoardで動かすには、SDカードにあるREADMEだかの内容のとおりにします、元からあるファイルのうちzImageだけを、コンパイルして出来たものに書き換えます。ジャンパの設定と、ZedBoardの電源を落としてまた付けたときは、TeraTermの方でも再接続することを忘れずに…
 シリアルポートでのモニタによると、今回コンパイルしたカーネルのバージョンは3.6.0っぽいです(本当か?)
kernelバージョンの確認
SDカードのファイル:
BOOT.BIN
devicetree_ramdisk.btb
ramdisk8M.image.gz
zImage
(README)
ファイルたちの解説
以上が流れになります。ボトルネックはVivadoとGitHubからのDL時間ですね
Read more →

2013/08/03

[雑記]アウトドア用コンパクトデジカメ(OLYMPUS TG-2)買いました。

,
 登山の際に、今のメイン機であるLUMIX GX1を持っていくのは、流石に嵩張るし、いろんな写真を取りたいので交換レンズも必要だし、全部合わせたら重いということに気付いてしまったので、新しくアウトドア用の便利なコンデジを買おうと考えた次第。そやもう防水にGPSに、便利な機能がついてたらいいよねってことで候補を絞り込んで行ったら、LUMIXの かOLYMPUSのTG-2になりました。
 (元々大手メーカーのアウトドア向けコンデジしか見てなかったという、視野の狭さはある…)

 画素数と重量ではパナソニの方に軍配が上がりますが、やはりF2.0の明るさ、それとスーパーマクロ機能(実はGX1のマクロレンズを持っていなかったので、とても欲しかった)に惹かれてこっちを買いました。おまけ程度でしょうけど、レンズのコンバージョンキットとかもあるのも魅力的でした。
魚眼モードでLPC-Link2をパチリ。スーパーマクロでチップ部品もくっきりです。

 使ってみた感想ですが、
・防水防塵機能を謳っているだけあって、どの蓋もガッチリ閉まる。
・内蔵メモリーは22MBくらいで少ないが、机に向かっている時に、そうだ1枚部品の写真を撮ろうか、なんてときにはメモリーカード要らないので便利。
・やはり起動時、シャットダウン時の遅さは少しある(デジカメならしょうが無い?)
・絞り優先モードが、F2.0/F2.8/F8.0しかない
 これはコンデジで絞り変えられるというだけでも評価するべきなのか、やはりもっと段階が欲しかったとダメ押しすべきか…
・よく見ると厚さが結構ある。ヨドバシで触ってたときは、そこまで大きいという印象はなかったので、ちょっとびっくりした。
・USBに繋ぐと起動できない。
撮影モードの魚眼は結構楽しい。

 まあまだ説明書殆ど読んでないので、この中の不便な点幾つかは、私の設定に問題があるのかもしれませんが、大体こんなところです。何しろマクロ機能がとても良いので、買ってよかったとは思ってますよ。
 多分本格的に使うのは、木曜からの後立山連峰縦走です。ですが、まだGPSをONにした時のバッテリーの持ち具合などが未だ謎なので、電池切れという事態だけは避けたいし何かで使いたいですね…
Read more →

[電子工作]LPC-Link2とaitendoのLPC1114Fボード

,
 試験が終わって暇だったのでARMいいよなあって思いが募ってきたので、秋月に閉店間際に駈け込んで、LPC-Link2買っちゃいました。10ピンヘッダが1.27mmピッチなので、それ用のヘッダと基板も一緒にレジに持って行きました…

 あっ、この投稿では、LPC-Link2のCMSIS-DAP化と、aitendoのLPC1114基板でLチカするまでのことを書いています。
LPC-Link2と、aitendoのLPC1114基板(やっすい!)

 これで、家にあるARM基板(LPC2388の載ったインターフェースの基板とか)もさわれるようになるんでしょうかね…
 とりあえず、aitendoのLPC1114ボードを買って来ました。書き込みコネクタは8ピン2.54mmピッチなので、どうにかこうにかしないといけないのですが、まあ何とかなるでしょう…

 とりあえず、Keilの統合開発環境μVision4と、MDK-ARMを入れて、LPC-Link2を認識してくれるかやってみました。

 KeilでLPC-Link2を使うには、LPC-Link2をCMSIS-DAPというデバッガとして認識させないといけません。その為には、LPC-Link2に搭載されているLPC4370のプログラムを書き換えないとダメです。方法に関してはNXPさんのHPに詳しく解説が書かれています。
 この方法でやってみたら、ちゃんと認識されました。1つ困った点は、図8ではJP1を解放してUSBを繋ぐと、自動的にStep1が赤になると書かれていますが、私が実行した時にはここは緑のままでした。ちょっとビビったのですが、Step2のボタンをポチったらちゃんとStep3の書き換え成功のテロップが出ました…(真似する人は自己責任でお願い、壊れても知らん)
Step1が緑のまま進む様子
以下、μVision4で認識してる様子です。ターゲットは繋いでないのでなしです。
デバッガの設定画面([Flash]→[Configure Flash Tools])
LPC-Link2がCMSIS-DAPとして認識されています。CoreSight(ARMのデバッグ用のIPコア)が、SWDで繋がってるのも見えます。
で、今から開発します…
μVision4では、新規プロジェクトは[Project]->[New μVision Project]を選択し、ダイアログに従ってプロジェクトの保存場所を選んだら、CPUを選択して終了です。
CPUの選択画面
LPC1114は、基本的なペリフェラルなどの機能を使ったプログラムが、LPC Wareにサンプルとして用意されていますので、それを参考にすることにします。
 流石にデータシートとかと睨めっこして、レジスタを1つ1つ叩いていくのも馬鹿らしいので、CMSISライブラリを使うことにします。インクルードしたり追加するべきファイルはここら辺にも書いてありますが、
・core_cm0.h
・LPC11xx.h
・gpio.h(これがないとLPC_GPIO->とかがエラーになる?)
と、
・core_cm0.c
・system_LPC11xx.c
・startup_LPC11xx.s(空プロジェクトでも、追加しますか?ってダイアログが出る)
・gpio.c
です。他にmain.cppを追加し、そのなかにエントリーポイントであるmain()を書きます。

 とりあえずLチカコードを書きます。
#include "LPC11xx.h"
#include "gpio.h"

//Blink LED(PIO2_0)

#ifdef __cplusplus
 extern "C" {
#endif

void SysTick_Handler(void);
  
#ifdef __cplusplus
 }
#endif
 
  
//wait for 500ms
void SysTick_Handler(void){
 static unsigned int counter; 
  //LPC_GPIO2->MASKED_ACCESS[(1 << 0)] = 0;
 //interrupt function
 if(counter++ > 500){
  //toggle LED port
  LPC_GPIO2->MASKED_ACCESS[(1 << 0)] = ~(LPC_GPIO2->MASKED_ACCESS[(1 << 0)]);
  counter = 0;
 }
}

void portInit(){
 //set port function(reference : UM10398(datasheet written in Japanese) p.56
 //[2:0] : FUNC function PIO(default) -> 000
 //                  function DTR(Active Low) -> 001
 //[4:3] : MODE pullup -> 10(default)
 //[5] : HYS
 //[31:6] : 
 //LPC_IOCON->PIO2_0 = (1 << 4);
 //set direction(care about JTAG/SWD port...)
 LPC_GPIO2->DIR |= (1 << 0);
 //set output high
 LPC_GPIO2->DATA |= (1 << 0);
}

int main(){
 portInit();
 if(SysTick_Config(SystemCoreClock / 1000)) { //1ms?
  //Handling error.
  
  LPC_GPIO2->MASKED_ACCESS[(1 << 0)] = (0 << 0);
  while(1);
 } 

 //dummy loop
 volatile int i = 0;
 while(1){
  i++;
 }
 return 0;
}
コードの解説です。
1)ポートの設定は、
・IOCONレジスタでポートの機能、プルアップorプルダウンなどの選択
・DIRレジスタで方向の選択
・DATAレジスタで出力の値の選択
です。データシートに書いてあります(最新版ではないと但し書きがありますが、日本語データシートもLPC1114にはあります)。
 例の如くレジスタにorなどで値を書き換えていきますが、どうやら"あるbitだけを書き換える"ということが出来るらしく、MASKED_ACCESSがそれになります。この解説は以下のページが詳しいです。
JugglerYou日記 :: LPCマイコンを使ってみる(IO編 その2) http://blog.livedoor.jp/juggleryou/archives/5796273.html

最初はPIO1_0を使おうと思ってたんですが、ちょっと特殊らしく?当たり障りの無い方を選びました。

2)SysTick_Config()でタイマーを設定し開始します。設定値はSystemCoreClock / 100だとエラーが出た気もしますゆえ、/ 1000にして1msごとに割り込みを発生させます。
 唯一つまったのが、SysTick_Handler()が呼ばれなかったことで、どうやらcppで書くとextern "C"の記述が必要ならしいです。以下のページに詳しい解説が書かれています。

マイコン風雲録: ARM: Cortex-M3 割込みハンドラと weakシンボルと C++ http://avr.paslog.jp/article/1587312.html
C++編(言語解説) 第38章 C言語との連携 http://www.geocities.jp/ky_webid/cpp/language/038.html

3)デバッグについてですが、LPC-Link2は1.27mmピッチのコネクタしか無いと思ってましたが、端っこのLPCXpresso向けのピンも普通に使えるんですね。回路図を見ると、うえから
1 VIO_3V3ZZ
2 TMS/SWDIO
3 TCK/SWCLK
4 TDO/SWO
5 TDI
6 nRESET
7 EXT_POW
8 GND
9 ISP_CTR_OD
になっています。SWDインターフェースで書き込みたい場合、SWDIOとSWCLK、nRESET、VCC(3.3V)、GNDを接続すれば大丈夫みたいです。
書き込み/デバッグの風景、ワイヤ5本だから楽といえば楽。aitendo基板のLEDは電源のインジゲータ。
デバッグ時のIDEのスクリーンショット。無償IDE+約2000円のデバッガでこれ。
μVision4でのデバッグの仕方がいまいちわかりませんが、基本的な機能の他に、ウォッチ式への追加(これは基本?)、IOの状態をPeripherals→GPIOとかで見られること、などはとても便利です。

 ちなみに、秋月で1.27mm1列40ピンのピンヘッダ買ったんですけど、幅があるので1.27mmピッチで2つ並べる(2*5とか)ことが出来ないんですね…マルツに売ってるこっちを買うべきみたいです、切るの難しそうだけど。あと1.27mm2*5のケーブルは、秋月に売ってたんですね…意外とこれレアだと思ってた

//関係ない話ですけど、変わったデバイスとして、電子ペーパー触ってみたいですね。こういうやつです。でも結構お値段高いので手が出せませんね…
BADGEr – EReader badge and shield « adafruit industries blog http://www.adafruit.com/blog/2013/07/22/badger-ereader-badge-and-shield/

//KeilでSTM8Sもいけるんじゃないかと思ってたんですが、ST-Linkは認識されたけれど、肝心のデバイスで選べなかったです。残念。
 LPC2388はデバイスで選べるので、JTAG配線すれば大丈夫だと思われる
Read more →

2013/07/31

[電子工作]SPI温度計

,
(書きかけの記事です) 
基板作ってみるかも…
秋月の16bit温度センサーとやらを使って、部屋の温度を測定してみたくなった。

回路図(暫定)
・USBのジャンパは、逆流防止ダイオードD1(1S4)による電圧降下で、マイコンその他に影響が出る場合に、ショートすることで電圧降下を消す。しかし諸刃の剣みたいなもんで、

・USBのダンピング抵抗は完全に他人の回路を幾つか見て決めた、そもそも入れなくていいような気がする

・チェックピン全て未実装、使うのはマルツの表面実装用の

・在庫処分のために2SC1815をに使う

・RGB LEDはライブラリを作るのが面倒くさかったので(ここらへん端子がまちまちで困る)、aitendoのAnode commonのものを、Sparkfunのライブラリにあったやつで代用

・電源周りが全て未実装、FT232RLはあまりにもピンが余ってて宝の持ち腐れ感がすごいので、代用のものがないか検討中。

追記(2013/09/10)
・FT232RLの他にもUSB-UART変換ICはありますが、RTS/CTSなどのポートを除いてTxD/RxDだけにしたものは、PL2303SAくらいのようです。このIC、マルツのキットに含まれていたこととシリコンハウス共立くらいでしか売ってた話を聞きません。勿論Digi-keyにも無いです。共立でもとっくの昔に在庫切れになってしまったらしいので、8ピンUSB-UARTのことは諦めます…
 そもそもUARTを使う必要が有るのか自体が疑問なので(LCDに表示されれば良い。LCDのライブラリは使ったことがあるから、そこまで困らないとは思ってる)、UARTのピンだけ立てておき、XBeeのパターンでも置いておくのが吉なのかもしれない。

・1608のチップ部品のハンダ付けは、割といけると分かったので、抵抗のサイズを2012→1608にします。

・Eagleのライブラリを作れるようになったので、電源周りもやはり組み込むことにします。Li-Poを使うようにしたいです。

Read more →

2013/07/08

[C#]SQL ServerのLocalDBを、Entity Data Modelで設計し生成する。

,
 C#でデータベースを使うお話です。私は初心者で、尚且つ情報をあまり上手に集められない人間なので、とても試行錯誤(或いは途方に暮れて迷うとも言う)しました。実際、ここに書くだけの内容を知るのにも、かなりの時間がかかりました。その覚書みたいなものです。

 まあデータベースと一口に言っても、実際には何種類も有りまして、例えばフリーライブラリのSqliteとか、MicrosoftのSQL Serverとかです。私のような情弱初心者だと、そもそもどれを使っていいかわからない…ということになってしまいました。
こんなにある…
上の写真は、VS2012で[サーバーエクスプローラー]ウィンドウで、[データ接続]を右クリック→[接続の追加]を選択した時のダイアログです。色んなデータベースの種類があります。例えば、
・SQL Server Compact 4.0とは、携帯向けのデータベースです。確か、データベースの容量や、使用出来るデータ型に制限があったような気がします。
・SQL Serverはその名の通りです。
・Access データベース ファイルとは、Microsoft Accessで用いるもの…なのでしょうか…?

 私の場合、データベースが必要といっても、アプリケーションを動かす場所は固定ではなく、ちょっとデータを保存したり読み込んだりできればいいので、保存場所はどちらかというとローカルの方が良いのです。なので、SQL Serverのうち、LocalDBと言うのを使うことにします。
//最初はLocalDBを知らなかったので、SQL Server Compact 4.0の方を使おうと頑張ってた… 
 LocalDBを作るには、[ソリューション エクスプローラー]でプロジェクト名を右クリック→[追加]→[新しい項目]で、[サービスベースのデータベース]を選択します。


 すると、このようなダイアログが出ると思います。ここでは、Entity Data Modelという機能を使いたいので、右の[Entity Data Model]を選択します。


 最初の段階から設計するので、ここでは[空のモデル]を選択。


 次に、Entity Data Modelでデータベースの設計をします。こんな画面が出てくると思います。ここでは、GUIツールを用いてぽちぽちとコンポーネントを配置することで、データベースのテーブルなどの設計図(のようなもの)を作っていきます。
 

 まず、右クリック→[新規追加]→[エンティティ]で、エンティティ(テーブルと同じようなもの?)を一つ配置します。ダイアログが出ると思います。ここは主キー(一意に識別するためのIDみたいなもの)と、エンティティに関する設定をします。多分そのままOKでいいような気がします…

 
 Entityへの要素(データ項目)の追加は、Entity上で右クリック→[新規追加]→[スカラー プロパティ]です。追加するとデフォルトでデータ型がStringになっているので、[プロパティ]ウィンドウの[全般]→[型]で適宜変更します。


 テーブル間のアソシエーション(SQLでのJOINのようなもの?)は、[ツールボックス]ウィンドウから[アソシエーション]を選択し、マウスでテーブル間をドラッグ&ドロップで繋ぐとできます。

 設計し終わったら、この論理モデル(≒設計図)から、実際にデータベース上に生成するための、SQL文を自動生成してもらいます。Entity Data Modelを設計するところの何も無いところを右クリック→[モデルからデータベースを生成]を選択します。
 

 最初のほうでプロジェクトに追加した、ローカルベースのデータベースファイルに接続することを確認します。そうしたら、次に行きます。



 DDLというタブに、論理モデルをデータベース上に生成するSQL文が書かれています。[完了]ボタンを押します。
 

 このSQL文を実行するには、左上の▷(右向き三角)マークの[実行]ボタンを押せば大丈夫です。しかし、接続文字列の問題からか、私の場合"database [Database1] does not exist. Make sure that the name is entered correctly."のようなエラーが出てしまい、実行出来ませんでした。どうやらSQL文の先頭の方にある、USE文でデータベースが選択できずにコケているようです。で、

ここで、このようなダイアログが出ることがあります。

 ローカルベースの場合(LocalDB)、この接続文字列には"(LocalDB)\11.0"などという文字列が入るものと思われます(参考:MSDN)。 の場面で右下のプロパティ欄に出ている接続文字列が、多分正しいものと思われますが、これをそのまま貼り付けると、文字数超過のようなエラーが出て接続出来ません。
 
 しょうが無いので、[サーバー エクスプローラー]→[*******.mdf]を右クリック→[新しいクエリ]を選択し、自動生成されたSQL文をそのままコピペして実行すると、同じようなエラーが出ますがなぜかテーブルは生成されています(なんでだ)。とりあえずできたので良しとはします…
コピペすると…
エラーが返ってくるが、なぜかテーブルは出来る…
これで一件落着、次はデータベースを操作することにします。長くなったので多分別の記事にします。

//書きかけ
Read more →

2013/07/03

[電子工作]VFD clockの回路図書いた

,
 若松で買った蛍光表示管LD8035とそのモジュールがあるので、そろそろ動かさねば…と思って回路図書きました。

備考
1)Atmega168になっているけど、使うのはAtmega328P

2)RTCモジュール(IC5)周りは、バックアップ時にVcc=3Vがマイコンなどには流れないように(RTCのみに流れるように)D4がついています。
 また、Vcc=5Vの時、バックアップ電源から流れて行かないようにD3がついています。こうすると、D3には逆方向電圧が掛かるので、D3に電流が流れません。漏れ電流、電圧降下によるVccの低下→RTCのHiレベルの低下をなるべく防ぐために、ショットキーバリアダイオードが良いと考えました。1N5817-Bのライブラリを使っていますが、実際に使うのは秋月の1S4です。
 そして、Vcc=3Vの時にはプルアップ抵抗から流れて行かないように、RTCモジュール内のプルアップのジャンパは外し、新たに外付けでVcc=5Vのところにプルアップ抵抗を付けます。

3)チャタリング防止回路は、『CPUの創りかた』に載っているのを参考にしました。シュミットトリガ(IC2, IC4)は実際は未実装、使うとしたら鈴商で売っている3ゲート搭載のTC74W14FK/FU。

4)AVccの配線を含む、電源系統がすべて未実装/未記入。

5)D1, D2は1N4148DO35-10を用いているが、実際は1N1588(だっけ)。

6)J1:VFD桁選択、J2:デバッグ用SerialRX/TX、J3:VFDのセグメントとGND


Read more →

2013/06/14

[電子工作]最近作ったもの

,
 最近また電子工作欲が高まってきたので、ちょこまかと小物を作ってたりします。

1)Li-Po充電器

 先ず初めはリチウムポリマー電池の充電器です。と言っても大したものではなく、aitendoで販売している専用IC MCP73831T-2ACIを使った簡単なものです。回路図はデータシートにある充電回路そのままで、抵抗とコンデンサが2つ程度しか乗っていません。
 この充電器、一応出力が4.16Vくらいになり、Li-Poも充電されていくのですが、ICが触っていられないほど発熱します。他の方の製作記を見ていても其のようなことは書かれていないので、どうやら私のに問題があるようです。これが果たして正常動作の範囲内なのか、それともどこかにバグがあるのか、まだ調査中です…

2)40kHz受信機

 ?
 CWをデコードするのには様々な方法があります。トーンデコーダICを用いるというのも1つの手だと思っています。40kHzの信号が在るときは1、それ以外は0を出すようなものなので、使えるかどうか今度試してみたいと考えています。

Read more →

2013/06/03

[C++]ビュフォンの針

,
ビュフォンの針のコード(C++)。課題でやらざるを得なかったので、メモ代わりに。

#include <iostream>
#include <cmath>
#include <random>
#include <algorithm>
#include <cstdint>

int main()
{
 const auto n = 10000000; //試行回数
 const auto d = 100.0; //平行線の間隔 //1.0
 const auto width = 100 * 255; //平行線の数 
 const auto l = 75; //針の長さ
 const auto M_PI = 6 * asin(0.5); //pi


 //乱数の種をまく
 std::random_device rnd;

 std::vector<std::uint_least32_t> v(10);

 std::generate(v.begin(), v.end(), std::ref(rnd));

 std::mt19937 engine(std::seed_seq(v.begin(), v.end()));

 std::uniform_real_distribution<double> distribution1(0.0, width);
 std::uniform_real_distribution<double> distribution2(0.0, 90.0);
/* std::uniform_real_distribution<double> dist(0.0, 1.0);

 //割ると(-1か1)を返す
 auto rev = [&dist, &engine] (double src) -> double {
  (dist(engine) < 0.5) ? src *= 1.0 : src *= -1.0;
  return src;
 };
*/
 //xの手前で一番近い平行線との距離
 auto func = [&d] (double x) -> double {
  while(x > (2.0 * d)){
   x -= 2.0 * d;
  }
  return x;
 };
 
 //ラジアンに直す
 auto radian = [&M_PI](double degree) -> double {
  return (degree / 180.0) * M_PI;
 };
 
 auto count = 0;

 //ビュフォンの針
 for(auto i = 0; i < n; i++){

  //針の中心位置
  auto x = distribution1(engine);

  //向いてる角度(-90度~90度)
  auto deg = distribution2(engine);
  
  //ラジアンに直す
  auto rad = radian(deg);

  if((func(x) + l * std::sin(rad)) >= (2.0 * d) || (func(x) - l * std::sin(rad)) <= 0.0){
   //円内にあるよ
   count++;
  }
 }

 //円周率を求める
 auto pi = 2.0 * (2.0 * l) * n / (2.0 * d * count);

 //出力する
 std::cout << "pi = " << pi << std::endl;

 return 0;
}
一応求まるけど収束性?がとても悪いです。

 一番困ったのは、最初定数を
Read more →