http://www.nishishi.com/blog/2010/07/windows7_start.html
ビンゴ。Drag and Goというプラグインをはずす。 http://oshiete.goo.ne.jp/qa/5828551.html
いままで使ったことがなかったけど、OneShotというユーザモジュールがある。 ディジタルブロックをシフトレジスタとして使って、ブロック1個あたり8クロック分の時間幅のワンショットパルスを生成する(2個使えば16クロック分のパルス)。ちなみにワンショットパルスとは、単安定マルチとも呼ばれ、トリガ(入力パルスの立ち上がり)が入ると、そこから一定時間だけパルスを発生する、というもの。 パルスが終わる(立ち上がる)ときに割り込みを発生させることもできる。つまり、トリガをかけてから一定時間後に何かする、という処理を書きやすい。ソフトウエア的にトリガをかけられると、プログラムからも使いやすいんだけど、できるのかな?(未調査)。
AN60486 "PSoC1 M8C ImageCraft C Code Optimization"を読んでみて、PSoC Designer5.1でImageCraftコンパイラでの効率化のテクニックを拾い読みしたうち、役立ちそうなやつをメモ。
http://web-marketing.zako.org/web-tools/dropbox-form.html
普通のI/OピンとしてPRTxDRで1/0を出力しても、駆動モードがPull-up/downだと、外部からの0/1駆動に負けてPRTxDRの値が変わり、0/1に変わってしまう。そこでRowDigitalInterconnectからGlobalOutputBusへの接続のところで、RowDigitalInterconnectLogicTableで、TRUE/FALSEを設定でき、常に1/0にできるので、これをGlobalOutputBus経由で出力ピンにつなげば、そのピンを常に1/0にできる。ちなみにPRTxGSの当該ビットが1のときは、I/OピンはGlobalInputBus or GlobalOutBusにつながるが、どちらにつながるかは、そのピンの駆動方法がHighZか、それ以外か、で決まる。前者はGlobalInputBus、後者はGlobalOutputBusにつながる。したがってPull-up/Down駆動も、GlobalOutputBusにつながる。
http://www.engineer.jp/1852.html グリスを塗るのが重要、のようだ。
http://d.hatena.ne.jp/kkomiyama/20091221/1261410409
uesaka氏の2011/8/1の作業日誌(内部向け)にあるShadowRegsについて、気になったので少し調べてみた。基本的にはOpenDrainHigh/LowやPull-up/downのピンが同じポート内にあるときに使う、ということのようだが、原理はどうなっているんだろう。このUserModuleのソース(lib/*.asm)を読んでみないとわからないな。というわけで保留。
→(2011/12/18追記)データシートをよく読んでみると、例として、P0[0]がPull-upでP0[0]=1としてあり、そこにつながっているスイッチ(GND間)がたまたまONで、P0[0]=0となっている状態で、P0[1]を1にしようとPRT0DR |= 0x02;とすると、いったんPRT0DRを読み出してから、P0[1]=1としてから書き込む、という動作になるため、もともと1だったP0[0]も0のままになってしまう(結果として0にクリアされた)、というのがあげられていて、これを回避する方法として紹介されている。で、ShadowRegsの実体は、単なる1バイトのRAMで、このメモリをPRTxDRだと思って書き込みして、それをあらためてPRTxDRに書き込む、という手順をとれば、書き込みの前のPRT0DRの読み出しが起こらないので、こういうことがおこらない、ということ。
PSoC Designer5.0でE2PROMを使うようなプログラムをコンパイルすると、E2PROMのデータシートどおり、64バイト単位での書き込みしかしない場合でも、RAM使用量が300Byteぐらいになって入らない(RAM利用率が130%とかになる)。
おかしいな、と思って、PSoC Deigner5.1でやってみると、RAMの使用量がぐっと落ちて、数バイト(スタックを除く)、となる。こっちのほうが順当っぽいが、バージョンの違い&コンパイラの違い、だけなのか?
例えばDCB??をTX8とRX8を切り替えると、CR0レジスタの意味が変わるので、切り替える前に必要であればCR0レジスタなどの値を保存しておかないといけない。
謎の現象に遭遇。さっきまで書き込めていたのに、PSoC(CY8C24123)が書込みできなくなる。書込み用ソケットをかえたり、直接ICのピンをつまんだり、MiniProgを抜き差ししたり交換したり、PCを再起動してみたが、書き込みできず。しかもエラーメッセージがいろいろ(PSoC3 Operationができない、とか、Can't acquire、とか)で再現性がない。結果として、USBハブを再起動したらなおった。そんなこと(接続しているUSBデバイスがおおむね動作するが、ときどきNG)もあるのか・・・
壊れたハサミの柄をiModelaで再生するプロジェクト(?)。
↑なぞりたい部品を、モノサシとともに写真をとる→GoogleSketchupにインポートして、モノサシの部分が実寸になるように縮小→線などでなぞる→ポップアップで立体化→STLで保存
↑そのSTLデータをModelaPlayerで読み込み(まずはここまで)
http://yasu0055.blogspot.com/2011/11/pluginshole-on-solid.html
いわゆるSTLだが、いろいろと相互変換できるようだ。
http://d.hatena.ne.jp/akihito_s/20110801 (iModelaのマニュアルが*.chmなので)
加速度センサMMA7455Lの3線SPI(CSb, CLK, MISO/MOSI切り替え)でのreadを2バイト以上行う手順は、データシートの書き方があいまいで、よくわからない。CSbをアサートしたあと、最初の1バイトでアドレスを送り、次の1バイトでデータを読み出す。つまり最低2バイト=16CLKのやりとりがあるわけだが、データシートによれば、read動作は、16CLKか8の整数倍CLKで行う、と書いてある。つまり、2バイト以上連続で読み出せるようだが、てっきり続く1バイト(通算で3バイト目)で、次のアドレスの1バイトが読み出せるのかと思ったら、そうはらなない。データ線(MISO/MOSI)をオシロで見ると、どうもこの1バイトは、MMA7455はデータを返さない、つまりMMA7455はこの線を入力にしているように見える。つまり、次の1バイトで、改めてアドレスを送り、さらに次の1バイトで読み出す、という動作のようだ。たしかにその動作だと、正しくデータを読める。でもこれだと、クロック数は16の倍数、ということになるはずなんだけどな。
いまさらながら、PCBE ver0.53では、拡張ガーバーでの出力ができることを知る。ガーバー出力時に「拡張」にチェックを入れておくだけでOK。同様にドリルデータのほうも、拡張ガーバー(っていうのかなな?アパーチャリストが入っている形式)で出力できる。つまり、ファイル名を変更するだけで、FusionPCBなどへ発注できる。
ちなみにガーバー形式は「ペンの移動」を記述する形式で、パターンの描画に使うペンの番号を指定する。しかしそれぞれのペンの太さ、は、ガーバー形式には書かれておらず、別途、ペン番号とペンの太さの対応表(アパーチャリスト)が必要となる。ガーバー形式にアパーチャリストを含むようにした形式が、拡張ガーバー形式。
komatsubara氏とkawakami氏に教えを請う。Arduinoのスケッチの書き込みはブートローダを経由して行う。ブートローダは、ArduinoのMPUであるATmegaのプログラムなので、AVRISPで書き込む。AVRISPのコネクタは6pで、信号名を見る限りSPIっぽい。OpenLogにも、コネクタJP2に信号は出ているようだ。
SH圧着金具用工具のチュートリアル http://www.digikey.com/PTM/IndividualPTM.page?site=us&lang=en&ptm=11135&WT.pn_sku=455-1376-ND&WT.z_ptm_source=Part_Detail
純正(?)ツール→http://panasonic.jp/support/sd_w/download/index.html
(11/12/08追記)ここに書いてあった→ https://github.com/magnuskarlsson/SDLogger/wiki/SDLogger-firmware-restore
レジスタ(IMO_TR)の調整(手動)で、微調整がきくようだ。 http://www.etosetora.org/tips01.htm
PSoC Technical Reference Manual (TRM)の2.4に、M8Cコアの詳細がのっているが、命令によってかなりバラツキがある。 例えば「ADD A, expr」(即値)は4サイクルで、「ADD A, [expr]」(間接アドレッシング)は6サイクルで、「ADD A, [X+expr]](演算付き間接アドレッシング)は7サイクル。
if (RX8_cGetChar() == 0xff) hogehoge();
をコンパイルしてみると、確かに0xffを受信しているのにhogehoge()が実行されない、というケースに遭遇。
d = RX8_cGetChar(); if (d == 0xff) hogehoge();
と書くと、たしかに実行される。 おかしいなと思い、output/*.lstにあるアセンブル結果を見てみると、前者の場合、この行がごっそり消えていた(コメントにCのソースはあるが、対応するアセンブル結果がない) ちなみに
if (RX8_cGetChar() == 0x50) hogehoge();
とすると、確かに0x55を受信するとhogehoge()が実行されるし、それに対応するアセンブル結果もある。 きっと、2番目の記述では、そのifの条件が絶対に成立しない(常にfalse)ので最適化で消されてしまったのではないかと思うが、なんでだろう。RX8_cGetChar()の戻り値はBYTEなんだけどな。
ちなみに、いったんdに代入してからifで比較すると、関数の戻り値がメモリに代入され、それを使って条件分岐が行われるが、dを介さずに関数の戻り値を直接ifで比較すると、関数の戻り値であるAレジスタをそのまま使って条件分岐をするので、その分速くなる。
TX8のデータシートにあるタイミングによると、データレジスタに書き込むと、すぐに転送がはじまり、TX8_EMPTYフラグがたつ(が、ダブルバッファなので、すぐに転送がはじまり、TX8_EMPTYフラグはクリアされる)。また転送の最後にストップビットの転送が終わると、TX8_COMPLETEフラグがたつ。つまりデータ転送をはじめるためにデータレジスタに書き込む前には、TX8_EMPTYフラグがたっていないかを確認する必要があるが、実際に転送がはじまるタイミングはわからない。また転送が終わるのはTX8_COMPLETEフラグをpollingでチェックするか、TX8送信終了割り込みをかける、しかない。つまり、送信が終わったら「すぐ」(ポーリングの時間もおかずに)に次の処理をする、というのは、原理的にできない。最も近いのは、割り込みかポーリングでTX8_COMPLETEフラグをチェックするのが順当か。
PSoCのユーザモジュールのAPI関数は、lib/*.asmに実体があるが、**_Start()などは、コントロールレジスタのフラグを立てるだけ。試しに、**_Start()と、それと同じようなレジスタ書き込み(DCB00CR0 |= 0x01;など)の実行時間を比べてみたら、前者が3us程度、後者が1us程度だった。(CPUCLK=12MHz)
Windows7でドライバを入れるとき、まずはWindowsUpdateを探しにいって、これがけっこう時間がかかる(くせにハードウエア依存ドライバはたいてい見つからない)ので、この検索をスキップさせるように設定するのが吉。 http://d.hatena.ne.jp/bogosorter/20111104/1320387920
Seeed StudioのSDLogger、シリアル通信速度は230400bpsまでいけるが、この速度で連続書き込みしても、ほとんどデータの落ちはないようだ。(たまにある)2ksps, 8byte/sample(=16KB/s)ぐらいならいけそうかも?
http://jp.blog.reinforce-lab.com/2010/06/craftrobo.html
http://kokumaijp.blog70.fc2.com/blog-entry-44.html →これも: http://www.douga-download.com/software/orbit.html
http://www.eleki-jack.com/arm/2010/12/mbed-5.html
Fusion PCBにPCBEで設計したデータを発注する手順
SPIでデータを送ってuSDカードに書き込むとき、DRDYが1になるまでの時間(=!00などのレスポンスが返ってくる前の時間)を計測。Wコマンドでデータを書き込むときは、書き込み完了後、ほぼすぐ(1us程度)にDRDY=1となる。そのあとのFコマンドでFlushするときのDRDY=1となる時間は、Wコマンドで送っていたデータ量にほぼ依存せずに25ms程度。
けっこうハマったので、メモ。
PSoCのSPIでは、ラッチのタイミングの表記にLeading Edge/Trailing Edgeと書かれているが、これは立ち上がり/立ち下がり、とは限らない。Leading Edge=前縁エッジ、つまり最初のほうのエッジのこと。 クロックの極性が正ならば、Leading Edge=立ち上がり、となるが、極性が逆ならば、Leading Edge=立ち下がり、となる。 http://d.hatena.ne.jp/ophthalmos/20091214/1260764661
どうもDHCPの仕様として変更できないようだ。 http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1012102825 現実的には、DHCP用と固定IP用と2つつくって切り替えるか、プロファイル切り替えアプリを使うか。
CY8C29466だと、入出力の場合いずれも3.5pF(typ)〜10pF(max)。
割り込みがかからないなー?と思っていたら、割り込み関数の名前を間違えている、というオチもあり得る。本来あるべき***_ISR()という関数名と違う関数名になっていると、当然ながら割り込みベクタからのジャンプがかからないので割り込み処理は行われない。
RX8受信割り込みへ飛ぶのは、割り込みがおこったとき、なので、実際の受信(受信完了フラグのクリア)は行われていない。したがって、割り込みルーチン内で実際の受信(RX8_cGetChar()など)をする必要がある。それをしないと、続く受信割り込みがかからない、と見える。
受信割り込み先でフラグを立てて、mainのループ内でその変数をチェックして何か処理、という構成にすると、受信が終わってから「何か処理」がはじまるまでの時間は30usぐらい(CY8C29466/CPUCLK=12MHz)。けっこう長い。ちなみに、受信が終わってから割り込み処理ルーチンへ飛ぶまでの時間は10usくらいでほぼ一定、とみなしてよさそう。
iMovie11だとできないようだ。。。 https://discussionsjapan.apple.com/thread/10093741?start=0&tstart=0
nDTR(11)=0としておかないとSleepに入っているぽく、動作しない。
けっこう実効速度はでるようだ。シリアル速度921600bps(上限)で連続して送っても、UDP/TCPともにデータ落ちはないようだ。つまり実効速度で921600bpsは大丈夫、ということになる。 →(2011/11/21追記)とはいいつつ、ときどきつまってデータが落ちることもあるようだ。データが落ちるときは,必ずしもCTSがアサートされている(=バッファがいっぱい)というわけでもなさそう。
FTDIドライバはMacOSX用もあるのでインストール。/dev/tty.usbserial-A900fu8r などが現れるので、これをopenしてread/writeすればよい。単体ターミナルならscreenコマンド。 http://www.ytsuboi.org/wp/archives/1219
TCPだと50kbpsぐらいが限度のようだ。うーむ。こんなもんか。。。(それより速いとsend()エラーが出てコネクションが切れる) UDPでも似たようなぐらい。
終了時に「ウインドウを再開しますか」をYesにしておくと、そのときに起動しているアプリ(ウインドウが開いていないものも含めて)が、次回起動時に起動する、ということらしい。 https://discussionsjapan.apple.com/thread/10096342?start=0&tstart=0
基本的には、ない、と考えたほうがよさそう。 http://inforati.jp/apple/mac-tips-techniques/windows-hints/how-to-turn-on-ms-ime-in-macos-boot-camp.html
いろんなアプリからEPSを作るのに、WindowsだとダミーのPostscriptプリンタをつくってファイルに保存、という方法がとれるんだけど、Macだともう少し簡単。適当なプリンタで印刷する直前に、Postscriptで保存(PDFで保存、のとなり)して、ps2epsで*.epsに変換できる。(ps2epsはMacPortで探してインストール)
もとの静止画と動画の縦横比(アスペクト比)が違うと、自動的にクロップされるようだが、どうも動画からフリーズフレームで切り出した静止画と、iPhotoから取り込んだ静止画は、同じ画素数・アスペクト比でも、クロップのされ方が異なるようだ。ImageMagickのconvertあたりで、手動で(そろえた位置で)クロップして動画のアスペクト比にあわせた静止画をつくってからiPhoto経由でiMovieで使うとよさそう。
IPアドレスの割り当て方のうちの、いわゆる「自動IP」というやつ。 DHCPサーバないなどでIPが割り当てがされなかった場合、IPアドレス=169.254.0.1 〜 169.254.255.254、SubnetMask=255.255.0.0 がZeroconfという機構によって割り当てられる。 双方がZeroconfで割り当てられたIPアドレスであれば、相互通信できる。 (ちなみに偶然同じIPアドレスが割り当てられていた場合は、自動的にIPアドレスが変更される) 片方で、このZeroconfが効かなくて自動的にこの自動IPアドレスが割り当てられない場合は、この範囲の固定IPアドレスとすればよい。
matsumur氏情報。100均のラミネートシートというのもアリ。 http://wenlock.web.officelive.com/elec/dac2.htm
http://sg356s.appspot.com/dy5hbW50Yy5wbWJsd2YvZXIxMC50bHd3aHJvZS5vai9vaWVpaWh3MF8xaG0=
b-mobileU300のSIMを設定するときのメモ。 APNやユーザIDなど(http://www.bmobile.ne.jp/sim/setting.html)を、設定Web画面の3GS/HSPAの、ネットワーク接続設定でユーザIDとパスワードを入力、ServiceTypeは、次のPDP設定で指定する番号(#1など)を選ぶ。PDP設定では、IPを選ぶとAPNを入力する欄が現れるのでAPNを入力。
MacのWineだと、デフォルトではAltキーが効かないようだ。X11の環境設定→入力→「OptionキーでAlt_Lと・・・」にチェックを入れておくと、Optionキーで効くようになる
iPhone構成ユーティリティーを使ってプロファイルをつくる。 http://support.apple.com/kb/DL1081?viewlocale=ja_JP
プロファイルの作成はこんな感じ。 http://d.hatena.ne.jp/TAC/20081013/1223898647
つくった*.mobileconfigをダブルクリックしてインストールし、WiFi設定の802.1Xタブで選ぶ。 http://mac.camerino.jp/2011/08/macosx_107_lion.html
http://chaosspace.de/launchpad-control/
ボールねじユニット、という部品。http://jp.misumi-ec.com/ec/CategorySearchView/103_20000000_20090000.html
Sparkfunのフォーラム(というかGS1011のところのコメント)によると、GainSpanでアカウントを作ってNDAを結ぶと、なんとかなるようだ。
http://winebottler.softonic.jp/mac
(11/10/28追記)ただ*.exeをコピーするかインストーラを使うかで、Copy Only...をチェックするかどうかを変える。http://d.hatena.ne.jp/kanonji/20100301/1267426143 あと日本語フォントの文字化け解消→http://www.semerumamoru.com/wblog/?p=1909
PSoC3/5を使うためにはPSoC Creatorを使うことになるので、簡単なプロジェクトを試してみたときの備忘録。
http://blog.zaq.ne.jp/igarage/article/1157/
PSoCは、SYSCLKの2倍(SYSCLK*2)をデジタルブロック等のクロックとして使うことができる。が、データシートによれば、これもCPU_CLKと同じように電源電圧によって上限がきまる。5Vならば上限の48MHz(=24MHz*2)までOKだが、3.3Vだと24MHzまで(ちなみに3.3VではCPU_CLKも12MHzまで)。そもそもSYSCLK*2は、入力クロックに対する両エッジトリガの単安定マルチ(一定幅のパルス=21ns@5V)を出す、という方法のようで、PLLで2倍に逓倍しているわけではない。ちなみに3.3V・SYSCLK=24MHzでSYSCLK*2を使ってみると、24MHzとして動くようだ。きっと単安定マルチのパルス幅が少し長くなって、2逓倍されなくなるんだろう。
いろいろ試して、だいぶ勝手がわかってきた。以下は、アクセスポイント(AP)モードで通信するときの主な流れ。
GainSpanのSerial-WiFiを試してみる。 http://strawberry-linux.com/catalog/items?code=18168 WPAの設定について、いまさらながら動作原理などを調べたので、メモ。WPA-PSK(WiFi Protected Access - Pre-Shared Key)では、まずあらかじめ決めたパスフレーズから、キー(PSK)を生成しておく。このPSKを、AP側と端末側の両方で使う。ただし端末側のGainSpanの場合、パスフレーズからPSKの生成がけっこう時間がかかる(&電力を食う)ので、AT+WPAPSKコマンドでキーを一度生成したらそれをprofileの一部として保存しておいて使う。
↓このあたりの情報によると、フロー制御(ホスト側でのCTSのチェック)はほぼ必須で、それをやっても100kbpsというところか。 http://unos.biz/blog/archives/category/xbee http://cyberworks.cocolog-nifty.com/blog/2011/03/xbee-a0dc.html
XBeeのファームウエア書き込みに失敗して、X-CTUなどから通信ができなくなったときに、強制的にファームウエア書き込みをする方法についてのメモ。 http://blogs.yahoo.co.jp/carcon999/30557062.html http://blogs.yahoo.co.jp/nagusa_kei/51358793.html http://macstrict.wordpress.com/2010/06/28/xbee%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%99%E3%81%90%E3%81%AB%E5%A3%8A%E3%81%97%E3%81%9F%EF%BD%A5%EF%BD%A5%EF%BD%A5/ http://www.faludi.com/itp_coursework/meshnetworking/XBee/XBee_firmware_upgrade.html (11/09/26追記)いろいろ試行錯誤して、うまくいった方法のメモ。 基本的にはこちらの方法→http://macstrict.wordpress.com/2010/06/28/xbee%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%99%E3%81%90%E3%81%AB%E5%A3%8A%E3%81%97%E3%81%9F%EF%BD%A5%EF%BD%A5%EF%BD%A5/ と、こちらの方法→ http://forum.sparkfun.com/viewtopic.php?f=13&t=25955&p=118440&hilit=xbee+recovery#p118440
M1.7のナベネジの頭どうしを接触させてみるが、どうも抵抗が大きい(数kΩ以上)。ぐりぐり押しつけると数Ωぐらいまで下がるが、安定しない。サラネジなら大丈夫そうだが、見た目、M1.7ナベの頭はかなり平べったいようだが、電気的接触は不安定のようだ。頭のところにステンレス用半田を少し盛ってみたら、接触圧が低くても数Ωで安定するようだ。
http://www.techand.jp/Digital/Arduino/Sensor-Net/Sensor-net.html http://cyberworks.cocolog-nifty.com/blog/2010/12/xbee-ed74.html この辺りを参考に。1対1で通信させるときは、DH/DLアドレスに、相手のMACアドレス(SH/SL)を入力。ホスト側をCOORDINATOR AT、ターゲット側をEND DEVICE AT、にする。ただしFW/設定の書き込みは、CTS/RTS等のフロー制御をかけないと(つながないと)失敗するっぽい。一度失敗すると、X-CTUからTestできなくなるようだけど、強制的に書き込む方法はないのか?/XBeeの面実装コネクタ経由でいけそうな気もするが、未調査。
FT232RLで、I/Oピンの電圧を決めるために外部から電圧を与えるVCCIOピンが未接続の状態で、5Vぐらいの電圧が現れる。これを3.3V電源ピンに接続しても、4.2Vぐらいの電圧になって、3.3Vにならない。原因を探ってみたところ、どうもあやしいのは、RESET#ピンの扱いで、データシートでは、RESET#ピンは未使用の時には未接続またはVCC(=5V)につなげ、と書いてある。で、その通りVCC(=5V)につないでみたが、常識的に考えればRESET#ピンの電圧もVCCIOで決められるべきで、RESET#ピンとVCCIOピンの間には保護ダイオードが入っていると思われる。そのため、VCCIOが未接続の状態でも、RESET#ピンに5Vを加えているので、この保護ダイオードの順方向電圧降下で、VCCIOに4.2Vぐらいが現れるのは納得がいく。
というわけで、RESET#ピンは未接続のままにするか、つなぐとしてもVCCIOにつなぐべき、と思われる。
PSoC Programmerでの書き込みは、HEXファイルのサイズ=ROMのサイズと、実際につながっているPSoCのROMサイズがあっているか、をチェックしているが、逆に言うと、チェックはサイズだけ。
例えばCY8C21123とCY8C24123は、ROMサイズが同じなので、24123用のHEXファイルは21123に書き込める。 ただし実際に実行されるプログラムの最初の方でデジタル/アナログブロックを初期化する(レジスタを設定する)ところで、PSoC依存の部分があるので、意図した動作をしないこと、がある。 例えば21123と24123だとアナログ部が違うので、ADCのようにアナログ部を使うユーザモジュールを含むプログラム(プロジェクト)だと、意図した値が得られない、などとなる。ただしこの2つはデジタル部が同じなので、デジタル部だけのプログラム(プロジェクト)だと、そのまま動く。 →(11/09/11追記)もしかしてうそかも。ちゃんと試してない。
一般的な呼称と異なるようなので、備忘録。Mode 1とMode 2が逆。
データラッチ | クロック極性 | PSoC SPIM | 一般的な名称 |
Leading | Normal | Mode 0 | Mode 0 |
Leading | Invert | Mode 1 | Mode 2 |
Trailing | Normal | Mode 2 | Mode 1 |
Trailing | Invert | Mode 3 | Mode 3 |
ちなみに「一般的な名称」の出典はこちら: http://elm-chan.org/docs/spi.html http://rugbysensor.com/~ohata/SPI_0.html
PSoCで、SPIのアクセスを以下のように行ったときにかかる時間を計測。
while(!(SPIM_bReadStatus() & SPIM_SPIM_TX_BUFFER_EMPTY)); // 送信バッファが空になるまで待つ SPIM_SendTxData(0); // 送信 while(!(SPIM_bReadStatus() & SPIM_SPIM_SPI_COMPLETE)); // 送信完了まで待つ d = SPIM_bReadRxData(); // 受信したデータを読み出し
SPIのクロックを1MHzと2MHzの2種類で試した時間は以下の通り。
convert -colorspace gray ...でできる
sleepさせて帰宅して、翌朝sleepが解除していることがある。system.logをみると、夜中に勝手にwake-upしているようだ。ネットワーク経由でsleep解除、が原因のことも多いようだが、それはoffにしてある。↓このあたりをみると、Bluetoothキーボード/マウスが、なんかのひょうしにsleepを解除してしまうことがあるようだ。というわけでBluetoothの設定から、Bluetoothデバイスがsleepを解除できる、をoffにして様子をみることにする。
http://forums.macrumors.com/showthread.php?t=810975 http://mikado.at.webry.info/201010/article_2.html
しかしこれだと、当然ながら、翌朝にBluetoothキーボードからsleepを解除できないわけで、そのために有線でキーボードがマウスを接続してしかないのか。
(setq line-number-mode t)
http://d.hatena.ne.jp/Seitaro/20090214/1234603644
ヒトの網膜の大きさは、だいたい直径40mm。形状が円だとすると、面積は13cm^2程度。 http://ja.wikipedia.org/wiki/%E8%A6%96%E7%B4%B0%E8%83%9E#.E7.B6.B2.E8.86.9C.E3.81.AB.E3.81.8A.E3.81.91.E3.82.8B.E7.A5.9E.E7.B5.8C.E7.B4.B0.E8.83.9E
網膜上の視細胞の数は1億個程度。 http://ja.wikipedia.org/wiki/%E7%B6%B2%E8%86%9C%E7%A5%9E%E7%B5%8C%E7%AF%80%E7%B4%B0%E8%83%9E ただし網膜上の視細胞の分布は大きく偏っている(中心部(中心窩(か))が非常に高い)ため、単純な計算はあまり意味がないが、仮に均等に分布しているとすると、視細胞1個あたりの面積は13um^2程度=正方形として3.5um角。
ちなみに中心窩の直径1mm程度。 http://ja.wikipedia.org/wiki/%E4%B8%AD%E5%BF%83%E7%AA%A9 中心窩での錐体の密度は、1800個/0.0069mm^2程度(出典不明:2004/6/30ゼミ資料より)、つまり1個あたり3.8um^2程度。正方形として2um角程度。
SMD(特にQFNのように横に端子が出ていないもの)部品用のパターンがとれてしまった場合、パターンがあったところに少し溝をほり、スズメッキ線の先をラジオペンチ等でつぶして平べったくしたものを、パターンがあったところに置き、他の残っているパターンと同じぐらいの高さにする(溝の深さを調整)。その後、通常通り、ホットエア等で半田付け。
市販のパイプカッターは、径3mmが下限のものが多いが、これは外形で、刃が届くのはφ1.5mmくらいまでのものが多いので、それより内径が細いパイプは切れないが、別のパイプなどを「ゲタ」としてはさめば、細いパイプも切れる。 http://www.geocities.co.jp/Playtown-King/5690/pipecutter.htm
http://andoroseikatsu.blog115.fc2.com/blog-entry-83.html
技術支援センターにある放電ワイヤーカッターという加工装置。φ0.2mmのワイヤーを動かしながら、材料の金属との間で放電させてカット。材料を移動させながらカットすることで任意形状にカットできる。当然ながら樹脂は不可。NC加工OK。
もう1個、CO2ガスレーザーカッター。基本的には切断用だがビーム径がφ0.2mmなので、ステンレス板にNC加工でメタルマスクも、なんとかできるが、ややバリが多い。吹き付けるガスが空気だとほとんどダメ、N2だと、流量を0.6MPaぐらいにすると、なんとかOKそう。バリを手動で切り取れば大丈夫か。加工はセットアップも含めて1時間程度。
convert -resize 1024x a.jpg b.jpg
とすると、a.jpgの横のサイズを1024画素にしてaspectを保ったままb.jpgに変換する。縦だけ指定するなら -resize x768 のようにする。
PCBEで細々とした作業をするツールをいろいろつくっていたけど、それらを1つに統合。
http://www.msng.info/archives/2009/03/how_to_change_time_machines_backup_interval.php
UART受信にタイムアウトを設定して、タイムアウトがあったら次の処理へ・・・ということをやるばあい、タイムアウトまでの待ち時間はパラメータだが、これは通信相手の応答速度次第。通信自体の時間を短くするためのBaudレートを高くすればよいのかといえば、必ずしもそうでもなく、UART受信割り込みで1バイトずつ処理をしようとすると、Baudレートが高いと、処理中に次のデータが来て取りこぼすことになるので、Baudレートはそこそこがいい。じゃあ受信リングバッファを構成して処理すればいいのか、というと、確かにデータの取りこぼしはなくなるが、バッファにデータがたまったかをチェックして処理する時間(周期)があまり長いと、そもそもタイムアウトまでに応答できないことになる。特にバッファのチェックをメインルーチンのループ内で行う場合は、そのチェックの周期が不定になるので、さらにやっかい。
結論として、Baudレートはそこそこにして、1バイトずつ受信割り込み内で処理する、というのが、応答も早くてデータの取りこぼしもしにくくて、よい、ということになりそう。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1223340087 EXORをとるのが一番それっぽくなるようだ。PSoCならLUTでできるね。
Timer16等のカウンタは、WritePeriodで周期(Period)を書き換えると、カウンタもその値にセットさせるので、カウンタの初期化に使えるのだが、カウンタの値がそうセットされるのは、カウンタがStopしているときだけ。
Globalで宣言している変数と同じ名前の変数をLocalで宣言して使うと、(エラーやワーニングは出ないが)関数を抜けるときに、Globalのつもりの変数の値が変わってしまうことがあるようだ。おそらくLocal変数が、他の関数のLocal変数と同じ領域に割り当てられていて、それがGlobal変数と同じ場所になっているのではないかな。
割り込み処理ルーチンでは、割り込みが禁止されているので、割り込みはかからない。(割り込みフラグは立っているので、実行中の割り込み処理ルーチンが終わってから、後の割り込みは実行される)そこで、割り込み処理ルーチン中で別の割り込みを使わないように注意。
いわゆるリングバッファを使って受信バッファリングする要点。
基本的に、とどいたら、調達係等で、学科ごとの棚に仕分けられ、1日2回(10時ごろと14時ごろ)の学内便で、学科事務室へ配達される。 が、期日指定の荷物など、一部の荷物は、いったん総務係にとどいたあと、学科ごとの棚に仕分けられる場合がある。(一瞬のタイムラグがある)
PRTxDM?レジスタとの対応。ときどき必要になるけど探すのがめんどいので、貼り付け。ちなみにPSoC-TRFのp.105
電子伝票でマルツで買えるものの型番等を入れれば、そのまま直接発注される。店頭で掛売り(請求書をもらってくる)もOKだが、事前に調達係に一言。
dsPICでかなりハマる。いろいろ備忘録。
「M3」とすると、タップ(ねじ穴)の寸法。「φ3」とすると、ふつうの穴(バカ穴)の寸法。
用紙セット時に、Enterキーを押すと、用紙をフィードしてくれるが、液晶表示が「ヨウシセット:ダイシアリ」は、カッティング台紙があるとき(=送り量が多い)。クラフト台紙のようにカッティング台紙を使わないときは、「ヨウシセット:ダイシナシ」でフィードする。
結局いろいろ試したが、"Toggle Setting"で、無線(3G,WiFi)のON/OFFや同期のON/OFFなどを明示的に使う場面に応じて切り替えるのがよさそう。ふだんは無線OFFで、使うときだけ3GまたはWiFiをONにして、あわせて自動同期をONにする。スリープ時には"自動機内モード"を使えば、自動的にぜんぶの無線をOFFにできる。Auto Task Managerを使えば、スリープ時に不必要な(=勝手に通信する)アプリをkillできる。
http://nonbiriserowde.naturum.ne.jp/e1104668.html このあたりを参考に。基本的にバックグラウンド通信をすると一気にバッテリが減るので、スリープ時に自動的に機内モードに入るようにして電波関係をすべて止め、使うときだけアプリを起動してデータを取得する、という使い方がよさそう。
厚さ0.3mmくらいのクリアファイルで半田マスクをつくるときの設定のメモ。
なお作成後の穴ぬきは、顕微鏡でのぞきながらピンセットで「つまみ取る」のがよさそう。
PSoCで、I/Oピンの割り込み(立ち下がり)がかかったら、UART受信を開始する、というのは、タイミングさえ間に合えば大丈夫(割り込み処理ルーチンの最初のオーバーヘッドが5usぐらいかかる)だが、立ち下がりの割り込み処理ルーチンの中で、DCBをいったん止めて配線やクロックリソースなどをいじってから再度Startして、UART受信をしようとすると、すぐに受信がはじまらないようだ。つまり、RX8をStartしてから、受信ピンの「最初の立ち下がり」をスタートビットの開始ととらえるようで、Startした時点で受信ピンが0の場合は、受信がはじまらないようだ。(例えば0x02を受信させてみると、途中の1ビット目の1のデータのあとの立ち下がりをスタートビットとみなして受信を開始する)RX8のデータシートを読む限り、RX8のStart時に受信ピンが0であった場合の挙動は書いていないのだが、Start後の最初の立ち下がり、をスタートビットとみなして受信を開始する、ということのようだ。
http://phys.hirosaki-u.ac.jp/wiki.cgi/gnuplot?page=%CC%F0%B0%F5%A1%A6%C0%FE%A1%CA%CC%F0%CC%B5%A4%B7%A4%CE%CC%F0%B0%F5%A1%CB%A4%F2%B0%FA%A4%AF set arrowで矢印を、no headで矢をつけずに描く
http://homepage2.nifty.com/kaitsuka/vision.html
http://www.sky-s.net/sky-blog/archives/2010/04/25-230923.php
http://healingk.blog72.fc2.com/blog-entry-16.html これによると、smbでつながっているNASは検索対象にできないらしい。
sshdは簡単に稼働させられる。 http://d.hatena.ne.jp/sugarball/20090316/1237134532
ターミナルからスリープもできる(ちょっとめんどい) http://evrythingonmac.blogspot.com/2009/03/blog-post.html
シャットダウンは、shutdownコマンドでいけそう。
LaTeX2eで原稿を書くときなど、写真EPSを含むPDFをつくるとファイルサイズが異様に大きくなる。(ビットマップの画像をテキストのEPSで貼り付けているので当然)。
gsに付属のeps2epsで、EPSを半分ぐらいのサイズにできるっぽい。 http://macwiki.sourceforge.jp/wiki/index.php/EPS
これよりも、MacのプレビューでPDFをひらき、「名前を付けて保存」で QuartzフィルタをReduce File Size選んで保存すると、かなり小さくなる。
意外と簡単だった。
gnuplotのグラフの線の色や形は、terminalによってバラバラだが、test、というコマンドで 一覧のテストパターンを表示できる。なんて便利。 http://www.ss.scphys.kyoto-u.ac.jp/person/yonezawa/contents/program/gnuplot/testterminal.html
http://inforati.jp/apple/mac-tips-techniques/system-hints/how-to-rebuild-macos-spotlight-search-index-database.html 以前うまくいかなかったが、この方法(ターミナルからのコマンド)でうまくいった。 他にもtips多数。
MacPortの使い方 http://www.key-p.com/blog/ohnishi/article.php?id=112
MacPortでpTeXをインストール http://knmac.math.kyushu-u.ac.jp/konno/modules/xpwiki/?TeX%20for%20Mac#jc348ac2
libXaw(Athena Widget Libary)がない、というエラーが出る(ldの-lXawがエラー、みたいなメッセージ)→たしかに入っていなかったので、port search xawでそれっぽいパッケージを探し、port install xorg-libXaw でインストールしておく。→その後、port clean pTeXでクリーンしてから、installのやりなおし。
dviビューアはxdviが無難か。(コマンドラインから起動できる)
ついでにCarbonEmacsにyatexを入れておく http://macwiki.sourceforge.jp/wiki/index.php/CarbonEmacsAndYatex
見当たらないぞ?と思ったら、Sliderから名前が変わっていて、しかも「すべてのWindowsコントロール」の中にしかない。 http://blog1.aitacos.com/?p=1317
作成に失敗したDVDなどが、サイドバーの「場所」などに残ることがあるが、Cmd+ドラッグでFinger外に持って行けば取り除ける。 https://discussionsjapan.apple.com/message/100587601
いわゆるX-Mouseの機能は、X11の環境設定、のウインドウ、から設定できる。 http://xquartz.macosforge.org/trac/ticket/381
VLOOKUPの4番目の引数の意味は、「検索の型」を表し、FALSEならば完全一致のみ、TRUEならば近似検索、となるが、この近似検索がけっこうクセモノっぽくて、明らかに違う人名でも一致と拾ってしまうことがあるようだ。しかも省略時はTRUEっぽいので、本当に一致するものを探すならば、明示的にFALSEと書くべき。
http://www.excel.studio-kazu.jp/lib/e1tw/e1tw.html
http://www.kanshin.com/keyword/2085583 ext3のディスクは、MacFUSE+ext2-fuseでマウントできる。 ftpdを動かして(環境設定→共有→ファイル共有、のオプションからftpをチェック)、日本語を使えるftpクライアント(Cyberduckなど)で、ファイル名のエンコーディングShiftJIS(Cyberduckだと環境設定→接続、の中)にして、自分にftpログインして転送。
Cmd+Option+Return http://blog.monkey-works.com/archives/2008/04/09220432.php
11/03/24のCiPTでうまくいかなかったが、FAQのようだ。 http://homepage.mac.com/zenitani/emacs-j.html
.emacsに、(setq yank-excluded-properties t)を追加すればよい。
http://wakabamac.blog95.fc2.com/blog-entry-866.html
ダイスは旋盤を使ってセンターを出す、というやり方もある。 http://www.nmri.go.jp/eng/khirata/metalwork/basic/bolt/index_j.html
サーバが落ちているとき、以前訪れたサイトで、Cacheに残っていれば、吸い出してhtmlで保存することができる。↓の方法がベースだが、要は、cacheをダンプ表示してあるページからバイナリデータ部分だけをawkなどで切り出して、Windows用のxeditに貼り付けて保存すればOK。 http://blog.livedoor.jp/r_c_3/archives/50694668.html
まず、Place&Routeのプロパティで、-x(Ignore User Timing Constrains)がチェックされていないことを確認。(これがチェックされていると*.ucfでタイミング制約を書いていても無視される) Timingがぎりぎり、などの場合、各過程のプロパティで、Effortをがんばる、に設定すると、時間はかかるが、とりあえず通るようになる(こともある)。
Excelのセルに入力する値を、リストから選べるようにするには、「データ」→「入力規則」から「リスト」を選べばよい。その選べる項目のリストが別シートにある場合は、「名前の定義」を使う。まぎらわしいが作るのは「リスト」ではなく、「名前の定義」で、その定義や変更は「挿入」→「名前」から行う。定義されている「名前の定義」は、「数式バー」の左端のボックス(「名前ボックス」)で確認できる(が変更はできないので、「挿入」→「名前」、から)。ちなみにExcel用語としての「リスト」は、あるグループに対して、ソートなどをできるデータのグループを作る、ことをいう。 (11/10/04追記:)対象セルで入力規則で「リスト」を選び、値のところは、「=名前」とする。(例えば「=グループA」)
http://www.eurus.dti.ne.jp/~yoneyama/Excel/n-kis_list.htm
WARNING:Xst:1710 - FF/Latch <Q_9> (without init value) has a constant value of 0 in block <DFFXPB1>. This FF/Latch will be trimmed during the optimization process.
こんなワーニングが出るときのありがちな原因:
komamura氏のEYEGAZE6では、initialで初期値を与えているところがあるが、これが原因か? →(11/03/28補足)CLKとして与える信号を、komamura氏はDCMからの出力を、PLL_LOCK=1のときに分周して出力するようにしていたが、これをDCMを使わずに作ろうとしていた。この際に、DCMを使わないのにPLL_LOCKを、クロック分周の条件に残してあったため、結果としてクロックが常に0になる、という状態であったことが原因と判明。クロック分周にPLL_LOCKを条件からはずしたら、クロックが正しく作られる記述になるため、確かに↑のワーニングは出なくなった。
komamura氏の力作EYEGAZEを、ほぼ同規模のFPGAのSpartan6に移植中、論理合成で以下のWarningが出た。
WARNING:Xst:3002 - This design contains one or more registers/latches that are directly incompatible with the Spartan6 architecture. The two primary causes of this is either a register or latch described with both an asynchronous set and asynchronous reset, or a register or latch described with an asynchronous set or reset which however has an initialization value of the opposite polarity (i.e. asynchronous reset with an initialization value of 1).
レジスタ(FF)のセットとリセットに、同期と非同期が混じっている、ということらしい。まだソースを精査していないが、これはどちらかにそろえれば解決しそうな雰囲気。 →(11/03/28補足)ちゃんと読めば、非同期set/resetの両方を使っているか、そのどちらかを使っているが初期値が逆(非同期resetの初期値が1、など)、ということのようだ。同期リセットを使うか、非同期リセットの初期値(リセット時の値)が0となるようにreg変数の値を決める、ことでOKのようだ。always文でresetをかけているところを一通りチェックしたところ、初期値が0でないところが何カ所かあったが、同期リセットとするか、reg変数の初期値は0として、それの反転を使う、などの対処で解決できるっぽい。
Ext2fsdだと日本語ファイル名もOKっぽい。 http://blog.so-net.ne.jp/top_2007/2007-07-15
WordやExcelからCarbonEmacsへテキストをクリップボード経由でコピーしたいとき、フォントや色などもいっしょに、リッチテキストとしてコピーされてしまう。そこで、↓こいつでクリップボード内データをプレーンテキスト化してペーストするとよい。 CiPT: http://homepage.mac.com/kaizawa/iblog/2/C1840517415/E1337206189/index.html
BlockMemoryなどをCoreGeneratorでIPとしてつくると、その設定情報は???.xcoというファイルに保存されるが、少なくともブロックメモリの初期値を指定する*.coeは、フルパスで保存されているようだ。そのため、プロジェクトごとフォルダを移動させると、ManageCore時に、*.coeが見つからん、というエラーが出る。とりあえず*.xcoの当該箇所を、"./???.coe"のように相対パスにすることで解決できる。*.xcoを編集することで、Manage時に、*.xcoが新しすぎるみたいだが大丈夫か?みたいな確認メッセージが出るが、OKとすればよい。
M8C_EnableIntMask(INT_MSK0, INT_MSK0_SLEEP); でEnableにできて、これとM8C_EnableGInt;と組み合わせれば、とりあえずSleepTimerで割り込みはかかる(=Sleepから起きる)
http://1n60diary.blogspot.com/2011/02/felica-rc-s620s-idm.html http://hiro99ma.blogspot.com/search/label/nfc このあたりをいろいろ調べてみたが、特にArduino用ライブラリでやっていることとは別のことをやっているわけではなさそう。 もしかして、と思って、カードをRC-S620の基板側にかざしてみたところ、あっさり読み取れた。つまり、いままで勝手な思い込みで、金属板側にかざすものだとばかり思い込んでいたが、そちらはシールド側、ということだった。なんというオチ。
ごちゃごちゃになってきたので、少し整理。 現在、学生証/教職員証の読み取りに使っているのは、IOデータのUSB2-NFC http://www.iodata.jp/product/mobile/nfc/usb2-nfc/spec.htm こいつが対応している規格は、MIFAREとFelicaで、MIFAREは「ISO/IEC 14443 Type A」の一種。http://ja.wikipedia.org/wiki/MIFARE Felicaは通信速度が212kbpsと424kbpsの2種類がある。 で、肝心の学生証/教職員証を読み取っているwada氏のZSK_Clientのソース(http://merl.ec.t.kanazawa-u.ac.jp/diary_private/index.php?cmd=read&page=wada/201011#k8e6b2e0)をみてみるが、Polling時にカードの種類を指定している箇所、というのが、みあたらない。ということは、順番にMIFARE、Felica(212/424kbps)のカードが見つかるかを試す、ということなのだろうか。→RC-S620でも、これら3つの規格のPolling(InListPassiveTarget)を試みてみることにする。
↓についてもう少し詳しく読んでみる。 NXPの157830_PN533_um080103.pdfによれば、昨日のPollingができない、というのは、レスポンスコードを読むと、カードが見つかっていない、ということのようだ。で、コマンドの詳細も載っているので、InListPassiveTargetを調べてみると、カードを探す、というコマンドだが、そのときに送るべきコマンドはISO/IEC 18092を参照(11.2.2.5章らしい)、とある。幸いこの規格書はフリーで入手できるようだ。 http://www.iso.org/iso/catalogue_detail.htm?csnumber=38578 というわけで、これから読む。
SONY RC-S620S http://www.switch-science.com/products/detail.php?product_id=353 仕様書は買うといただけるが、肝心のプロトコルについての記載がない。
公開されているArduino用のライブラリ&サンプルを読んで、初期化とPollingの方法はわかったんだけど、けっこうめんどいパケット構造。
で、PCとUARTで接続して手動でつついてみたが、初期化まではACKも返ってきてOKそうだが、Pollingがうまくいかない。そのArduino用ライブラリのPoll()のところには、"InListPassiveTarget"というコメントが書いてあるので、これをキーワードに検索してみると、けっこういろいろひっかかる。
これによると、NXPのNFC(Near Field Communication)モジュール、と似ているようで、コマンド体系もこれが参考になる。似たところで↓ここなど。
PCBのスルーホールを、少し(0.1mmとか)広げるとき、その径のドリルで穴を開けると、両面を導通させている穴の中の導体も削れてしまうので、要注意。あたりまえといえばたりまえ。表か裏の片方にしかパターンがない場合には、特に要注意。
http://item.rakuten.co.jp/nejiya/c/
http://airvariable.asablo.jp/blog/2009/07/06/4415959
こんなものを使う作り方も。 http://www.hands-net.jp/goods/6072-001012001 この純銀パウダーと木工用ボンドをまぜるだけ。けっこうちゃんと導通する。
そんなことができる。Adobe Readerではなく、「プレビュー」で開けばよい。ハイライトとかもOK。
なぜかRead Onlyという仕様なのだが、Periodレジスタ(DR1)に書き込むと、同時にDR0もその値になる。つまり周期を変えると最初からカウントする、という仕様らしい。(ちなみにPSoCのTimerのカウンタはダウンカウンタなので、初期値はPeriodの値、となる)これを使うと、任意のタイミングでカウンタの値をPeriodの値に設定する(リセット)、ことはできる。ただ、UARTの動作タイミングとは微妙にずれるようだ。具体的には、UART(TX8やRX8も)は、与えるクロックを8分周して1ビット分のクロックを作っているが、この8分周の分周器のカウンタは外部から設定できないようで、しかもStart/Stopしてもリセットされないようだ。つまり、UARTの1ビット分の送信タイミングを細かく制御することはできない。またVC2を分周してVC3を作る場合などの分周器のカウンタも、外部から設定できないようだ。従って、PWM8とTX8を同期させて動かすためには、(1)両者に同じクロックを与え、(2)PWM8の周期を8(Period=7)として、(3)所望のタイミングで、必要ならばnopでディレイを与えて動作を開始する、という手順をふむのが最適のようだ。ただ1クロック分ぐらいのずれは、動作の開始ごとに生じるようだが、1ビット=8クロックなので、このずれを許容するようなPWM8のパルス幅にする、というのが現実的か。
11/02/08の謎な現象の原因がわかった。PWM8とTX8の動作タイミングが、動作させるタイミングによって一定しないため、TX8の1ビット分の幅の間にPWM8のパルスが入る場合はOKだが、TX8の1ビットの境界にPWM8のパルスがまたがるばあい、両者のORをとっているので、短いパルスが2つでることになる。だから、「ときどき」ビット0が続くように見える、ことになる。だから0x55→0x00や0xff→0xfe、となるわけだ。(この0xfeのLSBの0は、スタートビット(0)の境界にPWM8のパルスがまたがったため)したがって、TX8とPWM8の動作のタイミングを合わせる必要がある。というわけで↑へ
dsPICのPIM(ドーターボード)をさして、最初から書き込まれているはずのデモプログラムが動かない、と困っていたら、UserManualに書いてあるのと違うdsPIC(dsPIC33FJ32)のPIMじゃないか。なんじゃそら。しかもこのPIMは、例えばポートA[0](RPA0)のつながる場所が、PIC24FのPIMと違うので、一つ一つ追いかけないと行けない。Webページをみたが、このPIMのピン対応表、は存在しない(!)ようだ。なんちゅうボード・・・
また同梱されているICD3は、最新のMPLAB8.6を入れ直したら対応していた。たしかに同梱されている紙ぺらに、最新情報をWebでチェックしろ、と書いてあるが、ちょっとひどいんじゃないか。
というわけで、http://www.mars.dti.ne.jp/~m7030/index.html を参考に、スクラッチからプロジェクトを作るようにしてみる。ポイントは、リンカスクリプトを使っているdsPICにあわせることと、ライブラリをプロジェクトに追加すること(FIRやFFTなどのDSPっぽい演算を使う場合は、dspのライブラリも必要)。Build Allしたあと、ProgramメニューからProgramをすれば書き込みが行われる。なおDebugモードとProgramモードは、排他的で同時には使えない。Debugモードのためには、Debug用のリンカ設定(Enable ICD2、みたいなチェックボックス)を書かないといけないようだが、どうもそれが見つからなかったので断念。Programで書き込み後、すぐに実行が開始される。
↓↓のことをCのソースでやろうとするとインラインアセンブラが書きたいが、こうやればいいようだ。http://www.pastelmagic.com/psocbbs/index.cgi?m=look&bnum=1549
#asm ... #endasm
または、
asm("...");
初期化というか書き込みができない、読み出しもいったん止めてPeriodレジスタに移して読む、という仕様になっている、とデータシートには書いてあるが、PSoC TRMのDigital Blockの詳細を読むと、DigitalBlockそのものの仕様のようだ。つまりCounterであるDR0レジスタはRead専用であり、しかも読み出しすると、その値がPeriodであるDR2にコピーされる、という仕様のようだ。ヘンな仕様だな。
PSoCのIrDATXでは、UARTの送信(TX8)とPWMをうまく同期させて、送信信号にあわせたパルスを出しているが、↑のとおり、PWMの動作(パルスが出る)タイミングを、カウンタを設定して途中で変えることができないので、どうやっているんだろう?とlib/IrDATX.asmを読んでみたら、IrDATX_Start()はこんなことになっていた。(一部略、適宜コメントを入れてある)
mov REG[IrDATX_1_TX_CONTROL_REG ], bfCONTROL_REG_START_BIT ; TX8のStart ; add user module configurable delay IF IrDATX_1_32_CLKS nop nop nop nop ENDIF or REG[IrDATX_1_BitTimer_CONTROL_REG], bfCONTROL_REG_START_BIT ; PWMのStart
nopを入れて開始のタイミングをずらす、という荒業。
断片的な情報だが、ある程度まとめておられる方: http://www.mars.dti.ne.jp/~m7030/index.html
いろいろと小細工ができる(隣のRowOutputと論理演算をしたり)のだが、動的にLUTの設定をいじりながら使っていると、「ときどき」所望の出力が出ないことがある。具体的には、RowOutput1(RO[1])にTX8の出力、RowOutput2(RO[2])にPWM8(周期はTX8の1ビット分と同じ)の出力をつないで"~RO[1] & RO[2]"を出力するようにすると、TX8の0のビットのところだけパルスが出るような出力が得られるはずだが、10回に1回ぐらい、0x55を送ったときでも全ビット分パルスが出たり、0xffを送ると0xfeを送った時のようにLSBだけパルスが出たりする。再現性はある(これらのパルスが出るか、所望のパルスが出るか、のいずれか)が、その頻度がバラバラ。PSoC TRMを読んでも、LUTにはクロック同期っぽい機能はない。なんだ?
VC1とVC2の分周比をともに1(default)の状態だと、VC1もVC2も24MHzとなるはずだが、それ(VC2)をPWM8に与えたところ(Vdd=3.3v)、パルスが出なかった。PWM8のデータシートには、input clockは3.3Vのときは24MHzまで、と書いてあるのだが、だめなんだろうか。CPU CLOCKはVdd=3.3Vのときは12MHzまで、という制約はあるのだが、それと同じ制約なんだろうか。ちなみにVC2の分周比を2にして12MHzをPWM8に与えたら、予定通りのパルスが出た。
Sn60%のハンダだと融点は200度ぐらいなので、コテの温度を低くしてもハンダがとける。Nd磁石は熱に弱く、300度ぐらいでハンダ付けするとかなり磁力が弱くなってしまうが、コテ温度を250度(使っているHOZANのやつで設定できる最低温度)にしてハンダ付けしてみると、磁力の弱まり度合いが小さいようだ。
http://tanakakohei.blog39.fc2.com/blog-entry-11.html
ちょっと謎の挙動をみつけた。
BYTE a, b; a = 0xff; // -1のつもり b = 0xfe; // -2のつもり if (a > b){...} // これは成立する if ((a + 10) > (b + 10)){...} // これは成立しない
確かにa+10=9、b+10=8、となるのだが、2つ目のif文は成立しない、ということは、BYTE型といっても、単に符号なし8bit、とは違う、ということか?アセンブルしてもう少し詳しく見てみよう。
当たり前と言えばあたりまえだが、ちょっとはまったので備忘録。
BYTE i; for (i = 5; i >= 0; i--){...
というコードを書くと、i=5,4,3,2,1,0というところで終わってほしいところだが、i=5,4,3,2,1,0,255,254,...と永遠に続く。iはBYTE型なので、0の次は-1=255となり、やはり0以上、という条件を満たしてしまう。
しばらく前にもやっていたが、備忘録。Xtalの負荷Cは、GNDではなくVDDにつなぐ(TRM参照)ので注意。あとはP1[0]/P1[1]の機能をXtalIn/Xtal/Outに設定して、GlobalResourceで32K_SelectをExternalにすればOK。電源ON後、PLLの安定まで少し(1s程度)時間がかかる。またPLL_ModeをExtLockにすれば、SYSCLKが32.768kHzを逓倍して23.986MHz(TRM参照)になるはず。(が、そうならない?(VC1などからPWM派を外に出して確認)電源系がいいかげんだからか?)
http://bluefish.orz.hm/sdoc/psoc3.html#外部水晶発振
http://mstssk.blogspot.com/2008/08/recently-used.html なるほど。
SleepTimerINT.asmに、_SleepTimer_ISRというラベルで割り込み処理ルーチンがあるので、Cソースのほうに#pragma interrupt_handler宣言をしたうえで、SleepTimer_ISR()という関数を書けばよさそうに思えるが、二重定義というエラーになる。(RX8_ISR()などはOKなのに)。とりあえずSleeiTimerINT.asmの_SleepTimer_ISRのところに、ljmp _SleepTImer_ISR_Cのように別関数名へのジャンプを書いて、SleepTimer_ISR_C()という関数を使えばよい。
あとで使うつもりでOpenやPull-Up等にしてあるI/Oピンの割り込みをEnableのままにしていると、意図していなくてもGPIO割り込みがかかるときがあるので、使わないI/Oピンの割り込みはDisableにしておいたほうがよい。
うまくリセットがかかるときとかからないときがある。といっても回路や使うレギュレータに依存するわけでもなく、NGなときは何回やってもNG、OKなときはいつもOK。再現性というかルールがよくわからない。
GPIOの場合、割り込みがかかってから割り込み処理が始まるまで、だいたい10usぐらい(CPU CLOCK=SYSCLK/2の場合)
Ctrl+Alt+Break
http://miau.s9.xrea.com/blog/?itemid=720 ChangeKeyというフリーウエアで変更できる。Fnキーを含むものでもOK。たとえばFn+↑をPgUp、のように割り当てできる。
Optionキーを押しながらDrag&Dropでコピー。
MATLAB初心者(=自分)が、時系列データにフィルタをかけたときの備忘録
常用ドローツールとしてInkscapeを試す。常用のためには使い慣れたショートカットキーが必須、ということで、カスタマイズを試みる。share\keys\default.xmlを編集する。 http://inkscape.paix.jp/manual/ Inkscape自体の設定は、Windows7ではc:\Users\???\AppData\Roaming\Inkscape\\preference.xmlに格納されている。 用紙設定のデフォルトを、templates\default.svgに書いても使われないのでおかしいな、と思ったら、default.ja.svgが使われるのであった。
上限に挑戦。FT2232H+VCPドライバ+Acknowrichで受信。WRnのサイクルタイムを変えて、正しく転送できるかを確認。(VCPのバッファ=4096B、Acknowrichのソフトウエアバッファ=256KB) 4MB/sはOKだが、4.8MB/sはだいたいOK(ときどき失敗)、6MB/sはNGっぽい(データ欠損がある)。もちろんPCの性能に依存しそう。しかし↓の方法でVC#でシリアル受信プログラムを書いてみたが、もっと低い転送レートでもデータ欠損が出てしまう。Acknowrichの中はプログラムになっているんだろう?
高速に連続で送られてくるデータを落とさずに受信するのはけっこう難しい。このあたりで、マルチスレッドにして受信する方法が紹介されている。 http://hpcgi1.nifty.com/MADIA/vbnet/wwwlng.cgi?print+200901/09010016.txt あと、serialPortのReceivedBytesThresholdプロパティの意味に注意。これは、受信バイトがこの値になったらDataReceivedイベントが発生する、わけではなく、受信バイト数がこの値「以上」になったらDataReceivedイベントが発生する、ということ。つまり、例えばReceivedBytesThreshold=2としておいたとき、DataReceivedイベントが発生するのは、2バイト受信時かもしれないし、3バイト受信時かもしれないし、4バイト以上受信したとき、かもしれない。したがって、DataReceivedイベントでは、バッファに入っている全データを読み出す、べき。
FTDIのFT245等で非同期FIFO送受信をVCPドライバで行うとき、PC側からはCOMポートとして見え、そのボーレート(通信速度)の設定は実際の通信速度と無関係、というのがあったが、COMポートの「データ長」は、受信(FT245→PC)にのみ関係あるようだ。具体的にはCOMポートのデータ長を7ビットに設定するの場合、PC→FT245は8ビット全部送られるが、FT245→PCは7ビットだけ、となる。
意外と落とし穴。使っていないUART受信機(=RX8)の入力ピン(受信データ入力)をオープン(解放)にしていると、電位が定まらないが、UARTの特性上、値が0となるタイミングがあると、UART受信が始まってしまう。特に受信割り込みを設定している場合は、不特定のタイミングで、動かないつもりの受信割り込み処理が行われてしまうことがある。未使用UART受信ピンは1に固定しておくべき。
いまいち混乱しがちだったので、あらためて整理。
コンパイル結果のアセンブリを見てみたが、基本的には初期値つき変数、としてRAM領域に確保されるっぽい。
C:/Program Files/Cypress/Common/CypressSemiBuildMgr/tools/include/???/m8c.h (※???:PSoCのシリーズ名)
INT_MASK1のようなシンボルなどが定義されている。
Ejectキー(Option+イジェクト)を長めに押す。または、iTunesからCmd+E。
マウスカーソルがウインドウに入るだけでアクティブになる、いわゆるX-Mouseは、コントロールパネル→コンピュータの簡単設定→マウスの設定、から設定できる。 http://www.nikep.net/srdpty/index.php?/archives/30-Windows-7.html
http://d.hatena.ne.jp/wadap/20080720/1216541500 これを使ってDynabookAZにUbuntuを入れる予定(via 日経Linux2011.1)
http://www.mmm.co.jp/electrical/emc/both_cdct/
半田ごてで予備半田をするときでも、2秒ぐらいコテ先にくっつくだけで、かなり磁力が落ちるようだ(コテ先にくっつく力がみるみる弱くなる)。相当手早く半田付けをしないといけない。または導電性エポキシを使うのが賢明か。
北川先生に教えを請う。
オシロのプローブや、UART受信端子などをつないでいると、負荷容量の関係か、書き込みに失敗することが多いようだ。
意外と温度分布が大きい。奥の方が、奥の板からの反射があるのか、温度上昇が早いようだ。手前は、ガラスの扉がある分、温度上昇が遅い。中央付近は、ヒーターの直下だが、奥の方よりは温度上昇が遅い。均一な温度分布とは言い難いので、全面でリフローをかけるのは、ちょっと無理がありそうだ。
Nd磁石(表面はたぶんNiメッキ)の半田付けのコツ。まずはコテをやや長めにあてて予備半田を盛る。竹のピンセットが使いやすい。
↓の件をFT2232Hをつかって実測。10kHzの方形波をWRnに与えてみたところ、データ転送速度は、PC側のCOMポートの設定にかかわらず、たしかに10kB/sとなった。
FTDIのFT245をVCPドライバで使うと、PC側からはCOMポートとして見えて、そこでの1バイト単位での送受信を8ビットの入出力として扱うことができる。つまり一種のシリーパラ変換、なわけだが、その転送速度は、COMポートの転送速度にはよらず、245FIFO側の入出力(WRn/RDnで制御)の速度で決まる。(と、FTDIのサポートに問い合わせたら回答があった)