(2010/07/09)今後はほとんど作業日誌に書いていくようにします。

もくじ
./作品集

  • Pdっすか。Pucketteが未来大に講演にきてましたね。 -- まつむら &new{2009-02-18 (水) 05:05:34}
  • たしか、マイクはステレオ扱えたと思うのですが、どうでしょうね。 -- まつむら 2009-02-18 (水) 05:11:02
  • まじですか>Puckette -- akita 2009-02-18 (水) 09:25:12
  • どうもステレオで入れられるマイク入力は、あんましないみたいです。ライン入力を狙ってみます。 -- akita 2009-02-18 (水) 09:25:45
  • ていうか私が呼びました。 -- kazushi 2009-03-08 (日) 16:57:20
  • あ、やはりkazushiさんでしたか。 -- akita 2009-03-12 (木) 23:01:21
  • さすがにシールド線のほうが良さそう…<簡易プローブ -- まつむら 2009-06-30 (火) 14:46:12
  • ↑まあ用途次第ですね。GNDを共通にしている時点で、かなりGNDレベルは暴れるわけで。 -- akita 2009-07-08 (水) 09:14:17
  • ↑さすがに外来ノイズが大きすぎて使い物になりませんでいた・・・orz シールド線でつくりなおしてみます -- akita 2009-08-12 (水) 11:47:50
  • バンドパスフィルタを、3色のLEDそれぞれに上手い具合につけてやれば...どうでしょう? -- まつむら 2009-11-27 (金) 04:45:09
  • ↑まあそうなんですが、それをつけずにどこまでいけるかな、と。 -- akita 2009-11-27 (金) 16:37:55
  • FT2232Hいいですよね。僕も使おうと思ってサンプルを2個ほど入手済みです。興味があれば一つどぞ。 -- まつむら 2010-01-17 (日) 01:42:57

10/06/30: RS485の終端抵抗

差動伝送のRS485で通信しようとするが、終端抵抗は、ふつうは受信端だけでよいようだ。(ref: RS485ドライバLTC16889のデータシート)送信端と受信端の両方を終端(100Ω)すると、1Vp-pとしてそこだけで20mAぐらい食ってしまうことになる。

10/06/29: iPhoneSDKのReference

こちら。
https://developer.apple.com/iphone/library/navigation/index.html
こんなところにもある(こんなところにも福井高専)
http://profo.jp/wiki/index.php?UITextView

10/06/29: VerilogHDLでUART受信機

以前、基準クロックを通信ビットレートの2倍にする方式で作ったことがあった(0/1の判定は、各ビットの中央で1回)が、どうも通信エラーが多くなることがあるようだ。

CLK 010101010101010101
RXD 111110000DDDDdddd
          ↑スタートビット

そこで基準クロックを通信ビットレートの4倍にして、各ビットで値を3回サンプリングし、多数決論理(3つの0/1で多い方を採用する)で1ビットの値を決めるようにしてみたら、かなり通信エラーが減った。

10/06/28: iPhoneSDK事始め(改)

よく理解していないところがあったので、鶴薗賢吾著「基礎からのiPhone SDK」(Softbank Creative)の特にChapter04を参考に基礎から。要点をまとめておく。

  • UI部品は、Resources/MainWindow.xibをダブルクリックしてInterfaceBuilderを起動して配置する
  • Objective-Cのポイント
    • インスタンスを使うにはポインタで指定。例: String* message
    • クラス自身もオブジェクトなので、String* message = [String alloc] とすると、Stringクラスのallocメソッドを実行できる
    • Property指定で、オブジェクトを使うコードを書きやすくなった(Objective-C 2.0)
    • [オブジェクト名 メソッド名]; という書き方をする。オブジェクト名.メソッド名、のような感じ。引数が複数ある場合は↓のような書き方をする。
  • ヘッダファイル ???Delegate.hにプロトタイプ宣言を書く
    • #importは、#includeに似ているが、多重定義を自動的に回避してくれる
    • @interface内に、インスタンス変数の宣言。例: UIWindow* window;
    • メソッドのプロトタイプ宣言を書く。ーから始まるのはインスタンスに対するメソッド、+からはじまるのはクラスに対するメソッド。
      - (void)sayHello; // 引数がないメソッドの場合。(戻り値の型) メソッド名;
      - (void)sayMessage: (char *)message; // 引数が1個のメソッドの場合。(戻り値の型) メソッド名: (引数の型)引数の名前;
      - (void)sayMessage: (char *)message <cr> speed: (int)speed; // 引数が複数個のメソッドの場合。「引数の説明」をコロンの前に書く。
      - (IBAction) loadUrl: (id)sender;
      • IBAction: アクションメソッドでは戻り値はこの型。(id)は、Objective-Cの任意のオブジェクト。InterfaceBuilderでこのアクションが何に接続されるかわからないので、(id)と書く。ここを(UITextField *)のように特定の型を書くと、その型のオブジェクトとしか接続できなくなる。
  • ソースファイル???Delegate.mに本体を書く。
    • @implementation内にメソッドの実装を書く。
      [voice sayMessage: "Hello" speed: 1 pitch: 2];
      • [オブジェクト名 メソッド名+引数1の説明 : 引数1 引数2の説明 : 引数2 ... ]; のような書き方。
    • メソッドのネストもできる
      [ [ mail subject] display]; // [mail subject]の戻り値のオブジェクトのdisplayメソッドを実行
      [ voice sayMessage: [mail subject]];  // [mail subject]の戻り値をvoiceオブジェクトのsayMessageの引数として与える
    • メソッドの実装例
      - (IBAction) loadUrl: (UITextField *)sender{
         NSString* urlStr = [sender text];
         NSURL* url = [NSURL URLWithString: urlStr];
         NSURLRequest* urlReq = [NSURLRequest requestWithURL: url];
         [webView loadRequest: urlReq];
      }

10/06/23: PLL (74HC4046)の設計

トラ技1999.6号にビンゴの記事があるが、そこにある手順をふまえて、備忘録。

  1. 位相比較器は、とりあえずPC2が無難。このゲインK_Pが、VCC/4π [V/rad]
  2. ターゲットの中心周波数からC1, R1, R2を適当に決めて、VCOのゲインK_Vを実測する。具体的には中心周波数付近での制御電圧の変化分ΔVと周波数の変化Δfに対して、K_V=2πΔf/ΔV[rad/V]を求める。
  3. この両者から、ループフィルタのカットオフ周波数f_cをf_c=K_P・K_V/2πN で定める。(N:分周比=ロック周波数÷基準周波数)※←2010/08/20加筆修正
  4. f_M=f_c / 10、f_L=f_M / 3、f_H = 3f_M を求める。
  5. ラグリード型LPFで、R2/(R1+R2)=1/10, f_H=1/(2πC2R2), f_L=1/(2πC1R2) をR2=10kΩなどとおいてC1, C2, R2を求める。(ラグリード型LPF: PC2 --[R1]--※--VCOin ※--[C1]--[R2//C2]--GND で※を接続した回路)

10/06/23: インダクタの表記

単位は[uH]で、基本的にはコンデンサなどと同じ。例えば102ならば、10*10^2[uH]=1000uH、ということになる。

10/06/16: PSoCで外付け水晶

komatsubara氏の2010/6/3の作業日誌を参考に。
32.768kHzを負荷Cとともにつけて、GlobalResourceで、CPU_32kをExternalにし、PLLをEnableにすると、PRoC TRMによれば、SYSCLKが23.986MHzになるようだ。半端な周波数だが、32.768kHz×732、ということだろうか。
PRoC TRMによれば、初期化の手順があるようだが、boot.asmあたりを読むと、自動でやってくれているようだが、その通りなのだろうか?(明日実機で要確認)

10/06/16: PSoCのSleepTimerモジュールのSetInterval

細かいことだが、SleepTimerモジュールのデータシートに微妙な誤字があって、SetIntervalの引数が、例えば"SleepTimer_1_Hz"と書いてあるが、正しくは"SleepTimer_1_HZ"(Zが大文字)

10/06/16: PSoCのSleep割り込みの許可

SleepTimerモジュールを使うと、SleepTimer_Start()でSleep割り込み(Sleepタイマのアンダーフロー時のSleepモードからの復帰)が許可されているが、SleepTimerモジュールを使わないときは次のように明示的に許可しないといけない。

M8C_EnableIntMask(INT_MSK0, INT_MSK0_SLEEP);

10/06/16: PSoCのシフト演算

ただしくは、PSoC用HITECH-Cの仕様のようだが、右シフト演算で8ビットを超えるビット数のシフトは使えない(定義されていないというWarningが出る)ので注意。

10/06/15: PSoCのCPU_CLOCKとタイマ割り込み/消費電力

CPU_CLOCKをSYSCLK/256のような遅い周波数にしておくと、当然ながら割り込み処理ルーチンの処理時間も長くなる。比較的短い周期でのタイマ割り込みを使う場合は、このあたり気をつけないと、割り込み処理ルーチンが終わると、すぐに次の割り込みがはじまってしまう(=メインルーチンに戻ってこない)。
Sleep時の消費電力を下げる、という目的であれば、特にWake-up時にアナログを使うのでれば、CPU_CLOCKは高めにしておいて、短い時間にWake-up中の処理を片付けてしまう、というのが吉。(実際、CPU_CLOCKを高くしても、[10/05/11]のように、思ったほどは消費電流は減らない)

10/06/10: iPhone SDK 事始め

HelloWorld的なアプリを題材に。(ボタンを押すと、ラベルの文字が変わる)

  • Xcodeで、新規プロジェクト、View-based Applicationを選ぶ。
  • Classesの中にある、???ViewController.hを開く。(???=プロジェクト名)配置するUI部品に対して名前をつけ(ここではボタンbtnとラベルlbl)、それらの定義と、コールバック関数(ここではボタンを押したときに呼ばれる関数)の型宣言をする。
@interface test2ViewController : UIViewController {
	IBOutlet UIButton *btn; <-----宣言(ボタン部品)
	IBOutlet UILabel *lbl; <-----宣言(ラベル部品)
}
@property(nonatomic,retain) IBOutlet UIButton *btn; <-----属性(ボタン部品)※まだ意味がよくわかっていない
@property(nonatomic,retain) IBOutlet UILabel *lbl; <-----属性(ラベル部品)
- (IBAction) btn_down:(id) sender; <-----コールバック関数の型宣言
  • 同じくClassesの中の???ViewController.mを開き、コールバック関数の実体を書く。また最後のほうで、終了時に使ったオブジェクトの開放をする(手動で明示的にやらないといけないらしい)
@implementation ???ViewController
@synthesize btn, lbl;             <-----UI部品の実体化
-(IBAction)btn_down:(id)sender{   <-----コールバック関数
	self.lbl.text = @"hoge";  <-----self(メインウインドウ)にあるlblのtextを"hoge"に変更する
}                                 <-----
- (void)dealloc {
    [super dealloc];
    [btn release]; <-----UI部品btnの開放
    [lbl release]; <-----UI部品lblの開放
}
  • Resourcesにある???ViewController.xibをダブルクリックすると、InterfaceBuilderが起動する
  • Libraryから、LabelとRound Rect Buttonをメインウインドウに配置する
  • File's Ownerを選んだ状態で、InspectorウインドウでConnection(上段のタブの左から2番目)を選ぶ→これで、メインウインドウに配置したUI部品に対するコールバック関数などを定義できる
  • Outlet内のlblとbtnの右側の○を、配置したラベルとボタンへドラッグして結びつける→UI部品そのものと、名前とメインウインドウ上の実体との対応付け
  • Received Actions内のbtn_downの右側の○を、配置したボタンへドラッグして結びつける(Touch Up Insideと結びつける)→コールバック関数と動作の対応付け
  • InterfaceBuilderで保存する(Xcodeでビルド・実行する前に、手動で保存しないといけない)
  • Xcodeに戻って、ビルドして進行→iPhoneエミュレータが起動して、アプリが実行される。

10/06/09: 1/fゆらぎのつくりかた

http://www.eleki-jack.com/mycom2/2008/07/led6.html
間欠カオス法というのが便利そう。

10/06/08: iPhoneSDKとシリアル通信

いろいろ調べてみるが、どうもjailbreakではない純正のSDKでは、Dockコネクタのシリアル通信もBluetoothのSPPでのシリアル通信も、できないっぽい。
http://lets-robot.com/modules/roboviemaker2/index.php?id=41
技術的な仕様・制約ではなく、Appleの方針、ということか。うーむ。

10/06/08: iPhoneのライン入力

いろいろ調べてみると、試すことはできそうだ。

10/06/08: PSoC Programmerのファイル読み込み

コンパイルをするたびに、毎回HEXファイルを読み込まないといけないのかと思ったら、プログラム開始時に、毎回自動的にHEXファイルを読み込む=毎回明示的に「開く」をしなくてよい、ということのようだ。

10/06/03: PSoC DesignerのHEXファイルの編集

もう少し使いやすく修正。コマンドライン引数に、先頭アドレス(1個目)とバイナリデータファイル(2個目)を指定して、標準入力からHEXファイルを吸わせると、その中の先頭アドレスから順にバイナリデータファイルの内容に置き換えて、チェックサムなども計算したHEXファイルを標準出力に出力する。(2010/08/03:少々バグがあったので差し替え)

10/06/01: PSoC DesignerのHEXファイル

E2PROMの初期値を、HEXファイルをいじって与えようかと試みて、HEXファイルの書式を確認。
http://www.pastelmagic.com/tips/hexform/hexform.html
E2PROMがマッピングされているアドレスのデータを修正し、最後のチェックサムもそれにあわせて直してみたが、PSoC Programmerで書き込もうとすると、HEXファイルが壊れている(corrupted)という。なんで?
(10/06/01追記:)以下によると、FlashSecurityとChecksumが拡張アドレスレコードで書かれている、とのこと。
http://19.pro.tok2.com/~cm/read.php?1228815968
たしかに、以下のようになっていて、1つめのオフセット=0x0010がFlashSecurity、2つめのオフセット=0x0020がチェックサムっぽい。

:020000040010EA  ←オフセット=0x100
:40000000FFFFFFFFFFFFFF0FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF0  ←FlashSecurityっぽい
:020000040020DA  ←オフセット=0x200
:020000007D95EC  ←チェックサムっぽい

ということは、ここのチェックサムの値も、あわせて変更すればOKということか?
たしかにAN2026b2のp.14などに書いてあって、この値は、Flash内の全データの2バイトチェックサム、らしい。つまりFlashに書き込まれる予定の全データ(もちろんHEXファイル内のアドレスレコードやチェックサムなど以外)を全部足したものの、2バイト分の値、ということになる。
というわけで、これを計算するプログラムをつくってみた。

10/05/31: PSoCで内部バスの信号を外へ出す方法

PSoCにはComparatorBusのような内部バスがいくつかあるが、その値を出力ピンへ出したい場合がある。一番簡単なのは、DigBufというユーザモジュールを使う方法。2系統までROバスに出せる。

10/05/31: Xilinx CPLD/FPGAのVauxピン

いまいち使い分けがよくわからないんだけど、XilinxのCPLD/FPGAにあるVauxというピンは、所定の電圧(CoolRunnerなら3.3Vなど)を与えた上で、プログラマのVrefピンにつないでおく、というのが吉の模様。

10/05/31: PSoCのPGAで交流成分の増幅

こんな方法を発見。
http://www.geocities.jp/chako_ratta/micon/PSoC_PGA.html
入力信号はCで容量結合して、別のPGAで出力したAGND(=VDD/2)を動作点として、PGAのReference=AGNDとして増幅。そうすると、PGAはAGNDからの差分を増幅することになるので、入力信号の変化分を増幅することになる。

10/05/29: PSoCのDeviceEditorでの操作と設定レジスタ

PSoCでのユーザモジュールの配置や設定、内部の配線やI/Oピンの機能の設定などは、すべて、対応する設定レジスタの値を、起動時に読み込むことで実現されている。それらの設定情報は、ほとんどlib/PSoCConfig.asmに書かれる(DeviceEditorで設定後、Generateすると、設定・配線に応じて、このファイルが生成される)。これらの設定レジスタの内容などは、PSoC Technical Reference Manualに載っている。
http://www.cypress.com/?rID=3208
例えば、(以下、xはポート番号。例えばPort0ならばPRT0GSなど)

  • I/Oピンの機能(標準I/Oピンか、GlobalIn/Outにつなぐか、など): PRTxGS
  • I/Oピンの駆動モード(Strong、Hi-Z、Pull-upなど): PRTxDM0/1/2
  • Analogピンをどこに接続するか: AMX_IN、ABF_CR0
    などなど。

10/05/28: PSoC CY8C24x23でのVDD=2.7V

そういう設定ができるんだけど(内蔵オシレータは12MHzまで)、POR(Power On Reset)の基準電圧を設定するところがない。具体的には、VDD=3.3VのときはPOR電圧が2.9V程度になるのだが、VDD=2.7VのときのPOR電圧が記載されていない。比例で下がると考えればいいのか?

10/05/27: PSoCのSleepとSleepTimer(ユーザモジュール)

PSoCのSleep機能と、ユーザモジュールとしてのSleepTimerの関係がいまいちよくわからなかったので、いろいろ試したりデータシートを熟読したりして、やっとわかった。

  • Sleepタイマは、基本的に常時動いている。その周期は、GlobalResourceのところか、OSC_CR0レジスタのSleep[1:0]、まてはSleepTimerユーザモジュールを使っている場合は、SleepTimer_SetInterval()で、512Hz/64Hz/8Hz/1Hzのいずれかに設定できる。
  • このSleepタイマがゼロになったとき(=設定した周期ごと)に、割り込みを発生させることができる。この割り込みの許可/マスクは、INT_MSK0レジスタのSleepビット(bit6)、またはSleepTimerユーザモジュールを使っている場合はSleepTimer_EnableInt()で設定できる。要するに、Sleepタイマは、普通の周期タイマ(ただし周期は4種類からしか選べない)として使うことになる。
  • Sleepモードに入るには、M8C_Sleepマクロ、またはCPU_SCR0レジスタのSleepビットを1にする。これで消費電力はほとんどゼロになる。(Analog系を止めた場合)

以上から、SleepTimerユーザモジュールを使うと、一定時間待つ(SleepTimer_TickWait())ことなどはできるが、CPU自体がSleepモードに入るわけではないので、消費電力は通常時と同じ。
普段Sleepモードに入れておいて定期的に起こすには、以下の手順をふめばよい。

  1. Sleepタイマ割り込みの許可 & M8C_EnableGInt; (グローバル割り込み許可)
  2. M8C_Sleep; でSleepモードに入る
  3. Sleepタイマがダウンカウントしてゼロになると割り込みが発生するので、Sleepモードから復帰する

10/05/26: PSoCのPowerCycle書き込みとパスコン

PSoCをMiniProgで、XRES(リセット端子)を使わずに電源のON/OFFを書き込みから切り替えて書き込みを制御するPowerCycle方式を使うとき、電源ラインに大きめのパスコンがついていると、電源電圧の立ち上がりが急峻にならず、うまく書き込みが開始できないことがあるようだ。これの解決策ってあるのか?パスコン/電源系を切り離せるようにするしかないのか?ダイオードをはさむ、というのは現実的ではないよなあ。

10/05/25: ボルテージフォロア

高速オペアンプ(LMH6639)でボルテージフォロアをつくってみたら、見事に発振(5MHzぐらい)した。定石にしたがって、VoutからV-へのフィードバックを、直結ではなく1kΩにしてみたら、だいたい大丈夫そう。100Ωでは発振は止まらなかった。もうちょっと大きくすると、もうちょっとよくなるのかな。

10/05/25: TektronixのDSOのFFTの振幅

以前調べたことがあったが、どうも間違いがあったっぽいので補足訂正。

  • 縦の1目盛りは、左下に表記されている(10.0dB、など)
  • 縦の原点の位置は、波形表示での縦の1目盛りによって異なる
  • 測定チャンネルの波形表示での縦の1目盛りが100mV/divのとき、左の「M>」のところが-40dB
  • 測定チャンネルの波形表示での縦の1目盛りが500mV/divのとき、左の「M>」のところが-27dB
  • 測定チャンネルの波形表示での縦の1目盛りが1V/divのとき、左の「M>」のところが-20dB
  • 振幅140mV(=実効値100mV)で、-20dB(カーソルで測定)
  • 振幅250mV(=実効値179mV)で、-15dB(カーソルで測定)
    そして実効値Vrms[V]に対して、20log_10(Vrms) ということらしい。
    とりあえずピークの高さはカーソルで測るのが無難っぽい。

10/05/16: uCAM

ちょっとほしいかも。C328と似ているが、ボーレートが高くできる。
http://www.4dsystems.com.au/prod.php?id=75

10/05/11: PSoCのSysClk/CPU Speed/アナログブロックと消費電流

簡単に調べてみた。

  • MCU: CY8C24123A
  • 使用ブロック; PGA + SAR6 + PWM8
  • プログラム内容: I/Oを初期化後、while(1)で空ループをまわす
    SysClkCPUAnalogIcc[mA]
    (1)6MHz1/256On1.74
    (2)6MHz1/2On1.96
    (3)24MHz1/256On3.09
    (4)6MHz1/256Off1.35

(1)-(4)の0.4mA程度が、アナログブロックの消費電流、ということになる。

10/05/10: PSoCでSleep中のPWM

PSoCでSleepに入ると、PWMも止まるようだ。元クロック(SYSCLK)が止まるのか?

10/04/28: 圧電ブザーの駆動

圧電ブザーをPSoCのI/Oポートにつけて駆動してみる。周りの関係で、0=Weak, 1=Strong、で駆動(Pull-downと同じ)するが、どうも0にうまく落ちないことがある。具体的には、そのピンの値を読もうとすると、0に落ちきらないことがあるようだ。圧電ブザーの静電容量はだいたい0.01uF程度のようだが、これの放電が間に合わないのだろうか。とりあえず100Ωぐらいの抵抗を圧電ブザーに並列につけて、強制的に放電させると、大丈夫っぽいが、詳しい原因がよくわからない。

10/04/14: Sonyの赤外線リモコンのキャリア周波数

文献によると、Sonyのものはキャリア周波数が40kHz、というものが散見されるのだけど、手持ちのマルチフォーマット対応リモコンでSony規格の信号を出すときは、他の規格と同じ38kHzのようだ。受信機側のバンドパスの帯域しだいだが、少なくとも38kHzで大丈夫な機器が多い、ということか。

10/04/08: PSoCのGPIO割り込みフラグ

INT_CLR0のbit5がGPIO割り込みの割り込みフラグで、GPIO割り込みがかかると、これが1になる。
GPIO割り込み中に、次のGPIO割り込みがかかっている可能性がある場合は、メインルーチンかどこかで、このフラグを0にしておかないと、GPIO割り込みがかかるタイミングでなくても、GPIO割り込みがかかったように見えるので注意が必要。

10/04/07: PSoCのCounterのクセと指定時間経過するのを待つ方法

微妙にクセがある。
カウンタの値を設定することができない(カウンタ値はDBxxxDR0レジスタだが、これはRead-Only)。つまり初期値を直接設定することができない。したがって、指定した時間(カウント値)だけたったらTerminalCountで割り込みをかける、という使い方ができない。
また、カウンタの値を読むためには、Counter8_bReadCounter()等を使うことになるが、これはいったんカウンタを止めて値を読んでまだ動かす、という動作をする。(APIのこ関数のSideEffectのところに書いてある)直接DBxxxDR0を読むのではダメ(常に0が返る)ようだ。つまりカウンタの値を読みながら、ある値だけ変化するまでPollingする、という使い方は、特にPollingの頻度が高いと、正確な計時ができないことになる。
データシートを熟読してみたが、カウンタが止まっているときは、Period(周期)レジスタに書き込むと、そのままカウンタ値にも書き込まれるようだ。ちなみにカウンタが動作中は、カウンタ値が0になったときに、Periodレジスタの値がはじめてカウンタにロードされる。
したがって、

  1. Counter8_Stop()でカウンタをとめる
  2. Counter8_WritePeriod()でPeriodレジスタ(とカウンタ値)を書き換える
  3. 必要であればCounter8_EnableInt()で割り込みを許可
  4. Counter8_Start()でカウンタ動作
    という順序をふめば、指定時間経過するのを待つことができることになる。

10/03/25: CygwinでCOMポート

昔なんかのときにつくったプログラムを使い回していたのだけど、データが送れない、という現象に遭遇して、改めて設定をしらべてみると、フロー制御を有効にしていたのが原因のようだ。具体的には、termiosのc_cflagで、CRTSCTSビットを立てているとフロー制御が有効になってしまうので、これを立てないようにしておく。

10/03/23: LED充電とPSoCのADCINC12/SAR6

LEDのK側をGND、A側をAnalogInに接続して光センサとして使うと、当然ながらA側の負荷容量で大きく充電時間が変わる。たとえばオシロのプローブをつけたときとつけていないときではぜんぜん違う。AnglogInをPGAにつないで、PGAの出力をオシロで観測すると、その違いがよくわかる。現実的には、無負荷時には充電時間が短いので、リセット(A=GNDで駆動)後、1ms後ぐらいに電圧を読む必要があるが、ADCINC12ではぜんぜん間に合わない。そこで、ほぼすぐに値が得られるSAR6を使うと、ADCのタイミングさえうまくあわせれば大丈夫そうだ。(ADCのタイミングは、原始的な方法だが、空いているピンにトリガーを立てるのが簡便か)

10/03/22: PSoC SDCardの消費電流

SDCard_Select(SDCard_ENABLE)後の状態だと、SDカードのCSbがアサートされているので、SDカードでの消費電流が比較的大きいが、SDCard_Select(SDCard_DISABLE)すると、SDカードのCSbがネゲートされるので、SDカードの消費電流がぐっと小さく(カードによるが-30mA程度)なる。

10/03/19: PSoC Designer5.0のDeviceEditorでの配置済みユーザモジュールの移動

ドラッグでできるみたいだ。知らんかった・・・

10/03/19: PSoCのE2PROMの初期値の与え方

#pragma abs_address で絶対アドレスを指定(そのアドレスはflashsecurity.txtに書いてある)して、Constの変数を配置しておく。
http://edycube.blog2.fc2.com/blog-entry-327.html
→(10/04/05追記)これはImageCraft C用の書き方の模様。HITECH-Cでの書き方は不明のまま。困った。

10/03/19: PSoCのDELSIG8

PSoCのDeltaSigmaADC(DELSIG8)ではまる。以前自分ではまったFAQであった。
http://akita11.jp/diary/archives/2008/07/psocadc.html
DELSIG8のモジュールとして設定するクロックはTimerにいくだけで、アナログブロックへのクロックは、手動で(しかもモジュールとして設定したクロックと同一に)設定しなければならない。ちなみにアナログのクロックソースをTimer16のTerminalCountにしたいときなどは、そのTimer16がおかれているディジタルブロック(のTerminalCount出力がついている側)に接続すればよい。

10/03/04: QFNの半田付け

いまさらながら、再現性の高いコツをつかんだような気がする。
位置あわせは厳密に。適量の手芸用ボンドで固定するとよい。フラックスはつけすぎない。QFNパッケージの端子側に半田が乗るように、基板を斜めにして半田づけするとやりやすい。

10/02/25: FT2232Hのデータ受信

どうもGetRxBytesAvailable()でバッファ中のデータのバイト数を取得しようとすると、ときどきハングする(この関数から戻ってこない)ようだ。こまったな。バッファが空になるまで空読みしようと思っていたんだけど、そういうことができないじゃないか。回数決めウチで空読みするか。

10/02/19: 圧着端子の圧着

「コネクタープライヤー」という工具で、芯線と被覆を同時に圧着できるようだ。
http://www.engineer.jp/product/pa08_10_15/pa08_10_15_16.html
ただしその分、芯線・被覆のサイズ(径)に制約が強い。

10/02/02: CY8C21123のアナログ入力

VDD=3.3Vのとき、ADC8の入力が2.7Vぐらいを超えると、どうも帰ってくる値がおかしくなる。(大きくバタついたり0xffにはりついたり)
ADC8のデータシートでは、ADC8_FULLRANGEを指定してStart()すれば0〜VDDの範囲を入力できると書いてあるが、CY8C21123のデータシートのDC特性をみてみると、アナログブロックのアンプのコモンモード電圧が0〜(VDD-1V)と書いてある。これが原因じゃないか。つまり、CY8C21123の仕様上、入力電圧は0〜(VDD-1V)に制限される、ということか。ADC8のデータシートの書き方が紛らわしい。

10/01/28: D2XXでのFT2232Hからのデータ受信

PC側のドライバのバッファの構造がよくわからない。
PCへの転送を停止させて、バッファ内のデータを全部読み出したあと(空になるのを確認してから)、1バイトだけPCへ送らせるようにすると、なぜかときどき300バイトぐらいバッファに残っているときがある(空のときもある)。ただしそのかたまりを読み出したあとで、もう1回、同じように1バイトだけPCへ送らせると、所望の1バイトが受信される。PC側のドライバのバッファの受信にレイテンシがあるんだろうか。それともダブルバッファになっているのか?とりあえず一連の動作(読み切り→1バイト送信させて読み出す)を数回ダミーで繰り返したあとで、改めて1回やるようにすれば、問題なさそう。

10/01/27: VisualC#で短い時間周期で処理をする

macyu氏に導かれて、マルチスレッドをマスターしようと目論む。
http://codezine.jp/article/detail/135
スレッドタイマを試してみたが、やはり50msぐらいが下限のようだ。
そこで、バックグラウンドの別スレッドで無限ループをまわし、
処理のあいまにSystem.Threading.Thread.Sleep(20);(20ms間sleepする)のようにしてみると、だいたいその時間ぐらいの周期で処理がまわってくる。20msぐらいまではイケそうな雰囲気。Sleep時間を10msにすると、平均で15msぐらい、というところか。(もちろんマルチタスクOSなので、他のアプリの実行状況などに依存する)→Sleepをいれずに無限ループをまわしても、親スレッドの反応が悪くなるわけでもなく、CPU利用率もほとんど変わらないようだ。(10/01/28追記)

10/01/27: Xilinx ISEでシミュレーションエラー(クロック設定後)

Xilinx ISEでBehavioralSimulationをしようとすると、クロックの設定のところを終わるところで、ISEごと落ちてしまう。よくソースをみてみたら、moduleのポート宣言のところに、ミスでクロック信号がダブっていた。こういうエラーになるのか・・・

10/01/27: FT2232Hのデータ転送速度

FT2232Hのデータ転送速度は、PC側のD2XXドライバのバッファのサイズと、PC側の読み書きの周期によって決まることになる。試しに以下の条件で実験。

  • PC側のReadを500ms周期で、GetRxBytesAvailable()で得たバッファ内のデータが0でなければ、あるだけすべてReadする
  • FT2232Hの非同期FIFOのWR#に与える書き込みパルスの周期を変える
  • TXE#が1になれば、FIFOがいっぱい=PCへのデータ転送速度の上限、ということになるので、そのときのPC側での受信データサイズを見る

WR#パルスの周期が122kHz程度で、63488バイトが上限のようだ。つまりこれがPC側の受信バッファのサイズ、ということか。
PC側のタイマ周期を60ms(16Hz)、バッファサイズを60000バイトとすれば、60000×16=1Mbyte/sというところ。

10/01/26: FT2232Hのプログラム(続)

  • ドライバは、CDMドライバを指定してあげれば、VCPでもD2CXXでも使える。
  • 245FIFOモードにするためには、外付けEEPROMをFT_PROGで書き換えないといけない。逆に言えば、動作開始後に、他のモード(BitBangなど)に変更してしまったら、245FIFOモードに戻す方法はない。
  • 245FIFOモードでのWrite(=外部デバイスからのRead)は、WriteするとFIFOにたまり、RXF#が0になるので、外部デバイスが、#RDを0にすれば1バイトずつ読み出せる。FIFOが空になるとRXF#が1になる。
  • 245FIFOモードでのRead(=外部デバイスからのWrite)は、外部デバイスがTXE#=0(FIFOに空きがある)であることを確認して、#WRを0にして1バイトずつ書き込む。アプリ側ではReadすればFIFOを順に読み出せる。FIFOに入っているバイト数はGetRxBytesAvailable()で確認できる。ちなみにFT2232HのFIFOは、各Ch、送信受信それぞれ4KBずつ。

10/01/21: I2Cのプルアップ抵抗

大きすぎても小さすぎてもだめ。
http://www.picfun.com/midi2c02.html

10/01/20: FT2232Hのプログラム

  • I/Oポートのように使えるBitBangモード: http://ore-kb.net/hard/BitBang/
  • FIFOモードにするには、外付けEEPROMが必要。そこへの書き込みは、専用ツール(FT_PROG)を使う。 http://www.ftdichip.com/Resources/Utilities.htm
  • C#のプログラム例はこのあたり http://www.ftdichip.com/Projects/CodeExamples/CSharp.htm
    といっても、Openして使うだけ。EZ-USB FX2より明らかにわかりやすい。
  • 同期FIFOモードは、外付けEEPROM設定でもAPI設定もできるが、ChAだけ。ChBは使えない。非同期FIFOモードは、ChA、ChBの片方でも両方でもOK。ただし外付けEEPROMに設定を書き込む必要がある。BitBangは、APIからしか設定できない。

10/01/16: USBデータ転送

トラ技2010.2でみつけたFTDIのFT2232H。FIFOモードもあって、APIも、CypressのEZ-USBよりわかりやすそうに見える。実測で20MB/s程度は出る模様。
http://www.hdl.co.jp/USB-101/index.html
http://www.ftdichip.com/Drivers/D2XX.htm

10/01/05: 3色LEDの分光特性(続)

緑色の感度が微妙だったので、緑として502nm(青緑), 525nm, 575nm(黄緑)を使ってみるが、たいして変わらない。また、特に青の受光感度が悪い。赤と緑だけだったら余裕そうだ。(ただし緑をあてても赤にも光電流はかなり流れる)

10/01/04: DSOのFFTの絶対値

TektronixのDSOでFFTをかけると、周波数成分の強度がdBで表示される。基準がわからないので、振幅を変えた正弦波を与えてみると、0dB=振幅=1.4V=実効値1.0V、-10dB=振幅0.45V=実効値0.32V、となった。つまり、実効値Vrmsに対して、20log_10(Vrms)、ということのようだ。

09/12/21: 絶対最大定格の電流の向き

吸い込みが+、吐き出しが−、という定義。
http://www.necel.com/faq/ja/f_spec1.html

09/11/26: 3色LEDの分光特性

RGB3色LEDに、RGBそれぞれの色のLEDの光をあてて、光電流で充電させてみる。目論見では、RはRにだけ選択的に光電流が流れるのかと思ったのが、さすがにそこまで波長弁別性はよくないようだ。緑や青をあてても、ほとんど同じように充電されてしまう。さすがに色センサ化は困難か。

09/11/25: PSoCのAnalogInput

ピン数が多いパッケージのPSoCでも、デジタルI/Oはその分増えているが、アナログ入力は、本当にACBの入力に使えるのはP0の8本だけ。もうちょっと多くしてほしいなあ。たとえば24本とか。

09/11/13: 指キタスカメラ

FPGAを使って仕込みなおし。

09/11/12: AlteraのFPGAのI/Oピン

AlteraのFPGAのI/Oピンは、いろいろと融通が利かないようだ。
・1本ごとにプルアップのON/OFFは指定できない(全体でON/OFFの指定だけ)
・しかもクロック入力のようにプルアップ抵抗が備わっていないI/Oピンに対しても↑の指定が効くので、「そのピンにはプルアップはできません」というError (Warningではない)が出てしまう。つまりクロックピンを明示的に指定している場合は、プルアップ抵抗そのものが使えない
・プルダウン抵抗はそもそも指定できない
ちなみにXilinxのやつは、いずれもできる。

09/11/05: 郵便物からの眺め

小型のなんちゃって定点カメラをつくって、やってみた。
http://akita11.jp/diary/archives/2009/11/post_917.html

09/10/27: VisualDSP++ via RDP

ちょっと思い立ってDSPを使ってみようと思い、学科所有のAnalogDevicesのSHARCボードとVisualDSP++を使ってみる。が、VisualDSP++が、ライセンスがとれないと、どうも起動できない。へんなエラーだな、と思ったら、RemoteDesktop接続経由ではVisualDSP++を起動できないらしい。まあボードをつないで使うんだから、当たり前といえば当たり前だけど、そういう仕様なのか。

09/10/15: Pickit2での書き込み

たまにうまくいかない現象に遭遇。しかも再現性が低い。電源周りを疑ってみたが、結論として、PCからPickit2までのUSBケーブルが長すぎたのか、USBハブを通していたのが原因で、書き込み時のPickit2からの供給電源電圧が下がっていたのが原因の模様。USBケーブルを短く、かつUSBハブをはさまないようにしたら、OKになった。

09/10/15: 3.3V動作のPICへのICSP

PICへICSPでプログラムを書き込むとき、Pickit2などのライタから電源を供給することができるが、電流容量は100mA程度。ボードのほうに電源供給されている場合は、Pickit2では自動的にその電源を利用するが、4.5V以下の電源ではブロックイレースができない。つまり3.3Vで動作するPICに、そのボードの電源を使ってICSPはできない、ということ。100mAなんてすぐに超えてしまうので、書き込み時だけ、PICをボードの電源から切り離せるようにしておくのが無難、ということか。めんどいな。

09/10/04: 電池の容量

参考データ。
http://slashdot.jp/~espy/journal/416700

09/10/02: PSoCの受信エラー

これまでややサボりぎみだったが、通信相手の電源を動的に切ったりすると、受信(RX)ラインが0V=Lに落ちるため、PSoCにとっては、フレーミングエラー(RX=Lなのでスタートビットと判断して受信開始するも、ストップビットがない、ように見える)になるので、ちゃんとエラー解除をしないといけない。エラー解除は、一番簡単なのは、UARTモジュールをStopしてStartすること。
http://projectmcx.cocolog-nifty.com/blog/2007/01/psoc_f00e.html

09/09/30: PSoCのE2PROM

PSoCのE2PROMの備忘録。
http://dr.matrix.jp/psoc.html#a5
ポイントは、flashsecurity.txtの当該ブロックをなおす(Uにする)ことと、1ブロック=64バイトで、flashsecurity.txtのWやUの1文字は1ブロック(64バイト)、ということ。つまりDeviceEditorのほうで設定する開始block番号の64倍が、flashsecurity.txtでUにするべきアドレス、となる。

09/09/28: Xilinx ISEで、急に回路がみえなくなる

回路をつくっていて、何かの拍子に、DesignのTreeの中にあったファイル(回路/module)が、?になったりすることがある。
今回の原因は、*.vのmoduleのところに、何かの拍子に1文字入ってtmoduleになっていた。*.vの中にmoduleで定義してある名前がみあたらないので、DesignのTreeの中で?に変わる、というからくり。素直にSyntax Errorといってくれれば気づきやすいのに。

09/09/06: PSoC SDCardとファイル数(続)

PastelMagicのBBSで質問してみたところ、回答をいただいた。
http://www.pastelmagic.com/psocbbs/index.cgi?m=read&bnum=1731&num=1733
どうも、「仕様」らしい。
FAT16でファイル数を気にして使うか、FAT32を避けるのが現実的か。

09/09/05: PSoC SDCardとファイル数

FAT16の仕様では、ルートディレクトリにおけるファイル数は512まで。またPSoCのSDCardモジュールは、ルートディレクトリにあるファイルしか扱えない。
つまり、PSoCでFAT16のSDカードに書き込めるファイル数の上限は512ということになる。
しかし512個目を超えても、fopenはできるようだ。しかし書き込もうとすると、FATが壊れるようで、PCからは読めなくなる。SDCardInitの戻り値も、ファイルシステム種類を示す上位4ビットが0になってしまう。
てっきり上限に達したら開けない(fopenでエラーが返る)のかと思っていたら、FATを壊してしまうのか・・・おそろしい。
ちなみになぜかFAT32で(Winで)フォーマットしたSDカードだと、途中128個目ぐらいで、同様にFATが壊れる。なんでだろう?

09/09/04: Eagle+PCBE

あまりないかもしれないが、EagleとPCBEで設計したデータとマージする方法について。Eagleはガーバーインができずないので、Eagle上でマージはできない。PCBEはガーバーインができるが、Eagleは正方形・円以外のアパーチャを使うので、そのままでは読み込めない。GCONVを使うテはあるが、いまいちうまくいかない。
そこで、以下の手順を踏んでみる。

  1. Eagleでガーバー出力(Offsetを適当につける)
  2. ↑ガーバー内のアパーチャ番号(Dコード)を、すべて100増やす(D10→D110など)
  3. PCBEで、↑Eagleのデータが置かれる場所はあけて設計する
  4. ↑をガーバーアウト。このとき、インチ系・小数点4桁(Eagleのガーバー形式:これから変更できない)にあわせる。
  5. 両者のガーバーデータをくっつける。ただしPCBEのガーバーは、最後にM02コードがあるので、これは手動で取り除く。(M02で終わりになってしまうため)
  6. PCBEのアパーチャリスト(gout.lst)に、Eagleの*.whlに記載のアパーチャリストを追加。ただし*.whlのDコードは、2.にあわせて100増やす。
  7. ドリルデータも同様に、2つをマージする

09/08/28: Spartan3のDCM

Spartan3には、DCMというクロック生成回路が入っている(Virtexや他社のFPGAも、だいたい入っている)。
DLLでクロックの逓倍ができるわけで、その設定Wizardが、欲しいクロック周波数を入れると逓倍比と分周比を求めてくれるんだけど、非整数の値を求めて、あたかもそれで動くように表示される。
もちろんそんなわけはなくて、逓倍比と分周比は整数しかできないわけだけど、まぎわしい。
ところで、欲しい周波数に最も近い周波数を得るための逓倍比と分周比を求めるのは、数学的には、ある実数を、最もよく近似する有理数n/m(ただしn, mはN以下の整数)を求める問題、といいかえられるわけだけど、それはどうやって解くのが一番いいんだろう。とりあえず総当たりで求めてみたが、もっと良い方法がある予感。

09/08/26: 正弦波の電圧とdBm表示

振幅が1V(=2Vp-p)の正弦波をオシロ(50Ω負荷)に与えてFFT解析すると、その周波数の成分の電力が10dBm、とでる。
振幅が1Vの正弦波の実効値は1/√2Vなので、50Ω負荷に対する電力PはP=V^2/R=0.01W=10mW。dBmは、1mWの倍率としての絶対値なので、これをdBm表記すれば10log(10mW/1mW)=10dBm、となる。

09/08/26: タップ加工

本格的にタップを立てる。太いビスのあたまのところに立てる。
・下穴は、旋盤やボール盤で。旋盤の方が中心を取りやすい。
・下穴をあけたあと、バリ取りをかねて、円錐形の刃で入り口を少し広げる
・タップは旋盤やボール盤で垂直に。
・まずは先(1番)or中(2番)タップで、最後は仕上げ(3番)で。

09/08/25: ハイサイドSW(訂正)

↓↓の、OFFのときの電圧が下がりきらない原因がわかった。モジュールの入力に与えている信号があって、そいつがHighレベルになっていた。そのため、電源がOFFになっても、入力保護ダイオード経由で電流が流れていたわけだ。
電源をOFFにするときには、モジュールに与える信号をすべてLowレベル(0V)にするようにしたら、電源電圧はほぼ0Vまで下がり、消費電流もほぼ0になった。
ハイサイドSWの、いわゆるON抵抗が意外と大きいので、実際にモジュールに供給される電圧に注意。必要に応じて、低抵抗のフォトリレー(SSR)を使うべき。

09/08:24: PSoCのSleepTimer

SleepTimerは、てっきりsleepモードに入って、一定時間たったら戻ってくるのかと思いこんでいたが、単なる思いこみ。
M8C_Sleepでsleepに入り、そこから戻るのに、SleepTimer割り込みを使う、ということ。
しかしSleepTimer_TickWait()とSleepTimer_SyncWait()の違い、特に後者が、いまいちよくわからん。

09/08/21: PNPトランジスタでハイサイドSW

カメラなどのモジュールの電源の+側を、PNPトランジスタでON/OFFする回路をつくってみる。
ONは問題ないんだけど、OFFにしても、モジュール側の電源端子(PNPトランジスタのC側)の電圧が下がりきらない(例えば2Vくらい)。
こんな中途半端な電圧だと、リセットもかかるにかからず、困るんじゃないか?と思ったが、消費電流はほぼ0に落ちているようだ。
よく考えたら、PNPトランジスタのC-E間のOFF状態の抵抗R_CE(off)と、モジュールの負荷としての等価抵抗との分圧が、ここの+端子の電圧になるわけだが、R_CE(off)は非常に大きいので、少しでもモジュールに電流が流れると、ここの+端子の電圧はほぼ0Vまで落ちるはずなわけで、そうなっていないということは、モジュールには電源電流は流れていなくて、OFF状態のモジュールの負荷としての等価抵抗が非常に大きい、というわけだ。

09/08/21: PSoCでSDカードにファイルを作るときの数字からはじまるファイルネーム

むかしハマったのを忘れていた。
http://akita11.jp/diary/archives/2007/07/post_637.html

09/08/12: HITECH-C(PSoC)のバグ?

else ifをたくさんつけたり、ifの条件をいろいろORしたりすると、場合によって、リンク時あたりに、よくわからんエラーが出る(再現性あり)。Tempにあるtempなファイルの中にあるエラー、と表示されるだけで、そのtempなファイルがみあたらないので、原因がわからない。
elseやORなどを減らすと、問題なくコンパイルがとおる。
なんじゃこりゃ?

09/08/12: PSoCの受信割り込み(バイナリ)の割り込みフラグ

割り込み処理中に、(念のためDisableIntしたうえで)もう1バイト受信すると、また割り込みフラグがたってしまうようだ。そのため、割り込み処理が終わると、また割り込みがかかってしまう。
レジスタレベルでこのフラグをクリア(DCB??を指定しないといけないので、Place依存なのでまりやりたくない)するか、割り込み処理中には1バイトしか受信しない(本来はこうするべき)ようにプログラムを書く、というところか。

09/08/11: PSoCの受信割り込み(バイナリ)

1バイト単位での受信割り込みに、いまいち恐怖心というか避けたい気分があったのだけど、冷静に考えてみれば、あまりややこしい話ではないようだ。
http://web.sfc.keio.ac.jp/~shokai/archives/2008/03/psoc-cy8c2946-uart-recv-int.html
http://projectmcx.cocolog-nifty.com/blog/2007/01/psoc_f00e.html
要は、本来の受信割り込みは1バイト受信した時点で起こるが、標準で生成されるCmdBuffer関係の処理がUART_int.asmに書かれているので、その前に、自分の割り込み処理ルーチンへljmpさせてしまえばOK、ということになる。
なるほど。

09/07/17: PSoCのpull-upとsleep

sleepに入ると、pull-upはoffになる(=電圧が0Vになる)ようだ。つまりpull-upの上の電源がoffになる、ということか。

09/07/14: PSoCの外部IO割り込みのマスク

PSoCの外部IO割り込みのenableは、PRTxIEの当該ビットを1にして、かつ、PRTxIC1/0の当該ビットで00(disable)/01(立ち下がり)/10(立ち上がり)/11(両エッジ)を設定する。PRTxIEの設定を忘れがちなので注意。

09/07/08: アクリル板にタップを立てる

備忘録。アクリル板だと意外と簡単に開く。
http://homepage3.nifty.com/yamaca/jisaku2/tap.htm
下穴は、仕上がり穴径-1mm程度、か。最初にボール盤を使って垂直にタップをあてるのがポイント。

09/07/03: ヒスノイズ

オーディオ用語。シャーという音。高周波成分なので、LPFである程度カットできる。メインアンプ前が効果的。

09/07/01: ボードレンズのマウント

http://www.computar.jp/modules/computar/index.php?page=cat&id=23
このあたりのボードレンズのマウントを自作してみようと考える。
マウントはM13P1.0、つまりネジ径13mmでネジのピッチが1.0mm。けっこう特殊なサイズのようだ。
汎用品でのナットはなかなかみつからず、
http://store.shopping.yahoo.co.jp/kokua/yamawatnp13100b.html
このあたりのタップを使ってみようと考える。
タップの「先」「中」「上」というのは、用途に応じた先端の形状らしい。
http://www.recoilj.com/recoil-tap.html

09/06/30: 点字ディスプレイ

いろいろ関連技術がまとまっているので備忘録。いろいろある。
http://www.tsukuba-tech.ac.jp/info/kenkyu/kaken/disp2.html

09/06/29: 簡易プローブ

Probe.JPG
ProbeConn.JPG

作ってみた。コネクタ部分は、↓と同じ回路。とりあえずテスト的な測定ならば十分そう。

09/06/26: HDLでSPI

同期式シリアル通信であるSPI送受信回路を、HDLで書いてみるが、Behaviorシミュレーションでは動くのに、実機だとどうも挙動があやしい。

	always @(negedge CK or posedge RST) begin
	...
			case (rcnt)
				8 : DBi[9] <= MISO;
				9 : DBi[8] <= MISO;
	...

こんな感じで、何ビット目かのカウンタ(rcnt)の値に応じて、結果レジスタの各ビットに受信データを書き込んでいるわけだが、書いているが、SPIの仕様上、送信と受信はCKのエッジが逆なので、送信側と受信側で、posedgeとnegedgeを使い分ける(か、2倍の周波数のクロックを使う)しかないわけだが、どうもこいつがマズいっぽい。論理合成後のRTLレベル回路図を見ると、各ビットのフリップフロップの前の組み合わせ論理回路がえらいことになっている(そりゃそうだ)。
そこで、同じようなものだが、1ビットずつシフトするように書き直してみた。

	always @(negedge CK or posedge RST) begin
	...
		else begin
			DBi[9:0] <= {DBi[8:0], MISO};
		end

クロックの逆エッジを使っているのは同じなので、ダメかなあ、と思ったら、意外とあっさり動くようだ。
しかしこういう両エッジを使わざるを得ない回路の場合は、どうやって書くのがスマートというか流儀なんだろうか。やっぱ2倍クロックで立ち上がりのみ、なのかなあ。

09/06/26: プローブの等価回路

簡易測定用に、先端がつまみやすい形状のプローブっぽいものを作ってみようかと思い立った。プローブ校正用のトリマ付近の等価回路
http://techon.nikkeibp.co.jp/article/NEWS/20070905/138795/

09/05/22: PCBEで4層基板設計

忘れないうちにまとめてみた。
http://akita11.jp/plan/pcbeguide/

09/05/21: PCBEで4層基板設計(予告)

けっこう難しい。近いうちに、いろいろまとめる予定。

09/05/14: MP3デコーダIC

前々から微妙に気になっていた、VLSI Solutions(http://www.vlsi.fi/)のMP3デコーダVS1011eを試してみる。
秋月でも売っている。http://akizukidenshi.com/catalog/g/gI-01484/
本来は、MP3形式(など)のバイナリデータをSCI経由で流し込むと、デコードして再生してくれる、というものなのだが、ファームウエアを持たせることができて、SDカードをつないでそこの中のMP3ファイルを再生する、みたいな機能もできる。
アプリケーションノートにある、Standalone Playerをみてみると、こういうプログラムを起動時にSCI経由で流し込めばOK、というのが載っているので、そのまま使ってみる。ファームウエアといっても5KB程度なので、制御用のマイコンのプログラム自体に入れてしまうこともできる。

で、ちょっと苦労しながら試してみた備忘録。(少し参考:http://www.picfun.com/PIC24F/AP/app24F08.html)

  • リセットは、50000クロックの間Lowにしないといけない。12.288MHzの水晶を使う場合だと、4msほど。結構長い。
  • クロック周波数の調整は、24.576MHzの水晶をつなぐ場合以外は、最初に設定しないといけない。(勘違いしていて、12.288MHzの水晶を使うなら、設定しなくてもいいのかと思い込んでいた)
  • マイコンからSCI経由でファームウエアのDLや制御をするなら、GPIO0は、Pull-downしてしまってOK。GPIO1, GPIO2, GPIO3, DREQはアプリケーションノートの回路図と同じようにSDカードにつなぐ。ただしGPIO2, 3はPull-upが必要なのに注意。
  • オーディオ出力は、Cでデカップリングしておけば、AGNDに対しての電圧、ととらえても差し支えなさそうなもよう。

しかし、どうもこいつのデータシートは、性にあわないのか、非常に理解しにくかった。レジスタ名とフラグ名が、似ていてまぎらわしい、のが理由なんだろうか。

09/05/10: PSoCのコンパレータのVref

備忘録。VDDを分圧してVrefとして与えるものしかない。
つまり電源電圧が変動すると、Vrefも、それに比例して変動するということ。
電池駆動しての絶対電圧の比較には向かない。3端子regなどで電源を安定化するか、ADCを使うか。

09/05/08: PSoC Designer5.0のWorkspaceとProject

PSoC Designer5.0で、WorkspaceとProjectの関係が、ごちゃごちゃしてきたので、備忘録。

  • Workspaceがシステム全体。Projectが、その中にある各PSoC、というイメージ。
  • Workspace=W_Aの中に、Project=P_1, P_2を作る場合の手順
    1. File→New Projectで、新しいProjectを作る。このとき、Name=P_1, Location=全体Workspaceの1つ上位階層のディレクトリ(「z:\」など), "Create directory for workspace"をチェックし、Workspace nameをW_Aとする。Workspace: Create new workspaceとする。
    2. 2つめのProjectを作る。File→New Projectで、Name=P_2, Location=↑のディレクトリ+Workspace名(「z:\W_A」など), Workspace: Add to Workspaceとする。

09/05/01: Cypress MiniProgの3.3V化

http://doggie.blog.so-net.ne.jp/2007-03-17
JP1のジャンパーピンを下側へ移動させるだけ。

09/04/24: PSoCのPull-downとGPIO割り込み

PSoCのI/Oピンの駆動モードを例えばPull-downにすると、PRTxDRで、そのピンのビットを0にしないと、Pull-downは有効にならない。
で、そのピンでSWなんかをつないでRising-Edge割り込みをかけたいとすると、そのピンが1になったときに割り込みがかかるわけだが、それにあわせてPRTxDRのビットが1になる。これを、再び0にしないとPull-downが有効にならないわけだが、その割り込み処理ルーチン内でPRTxDRのビットを0にしても、SWを押している間は、そのピンが1なので、PRTxDRのビットも、0にできない。つまりSWを離したあと、改めてPRTxDRのビットを0にしないといけない。(ただし当然ながら、そのSWを離したことは、PRTxDRのビットを0にできないので、Falling-edge割り込みでは検出できない)
PRTxDRのビットを適宜0にする方法は、例えばmainルーチン内のwhileループ内で常時やタイマ割り込みで定期的にPRTxDRのビットを0にする、といったところ。

09/04/24: 秋月のキットの回路図など

http://www.aki-den.jp/kit_manual/start.html

09/03/20: VAIO type PのVGAアダプタ自作

./VAIO type PのVGAアダプタ自作

09/03/13: マトリクスLEDとLEDセンサ

マトリクスLEDを、センサとして使う、という話。元ネタはいろいろあって、例えばhttp://elm-chan.org/junk/leddet/report.html など。
(以下、行:アノード側、列:カソード側と定義)
以下の手順。

  1. 行をすべて"1"、列をすべて"1"にする(リセット)
  2. 行をAnalog入力(つまり高インピーダンス)、当該の列のみ"1"、他をAnalog入力にする(蓄積)
  3. 光があたっていると、電位がある程度上がってくるので、ころあいをみて、コンパレータなどで0/1を比較。
    状況によっては、Analog入力の入力容量と、直列抵抗だけでは不十分なこともあるようだ。以下、備忘録。
  • オシロのプローブで行をみていると、それらしい波形が出るが、プローブをはずすと、動かない(放電しきらない)ことがある→並列にプローブ容量と同じくらいのCをつけてみる
  • このCが大きすぎると、すぐに電位が下がってしまうようだ(なんでだ?逆じゃないのか?)
  • 光電流に対する電位を稼ぐために大きい抵抗Rを並列につないでみる
  • このCRが時定数になって、放電時間がきまる→これが1列分の蓄積時間と同程度のオーダーに設定する
  • 室内照明の商用交流(60Hz)のゆらぎが、予想以上に波形にのる(蓄積中の放電の落ち方がゆらぐ)

ふと思い立って、リセット動作を、行・列ともに"0"にしてみて、蓄積中の当該列を"0"にしてみる。
蓄積にしたがって電位は上がっていくが、どうもこのほうが動作の安定度がよいようだ。
うまくやると、CもRもつけなくても大丈夫。
レーザーポインタぐらいの明るさだったら問題ないようだ。ペンライトぐらいの明かりで、どれぐらい動作するかは要チェック。

09/03/12: パスコンとスイッチングノイズ対策

ややノイズにシビアな信号を扱う回路で、アナログと高速で動くディジタル(FPGA)が混載している回路のノイズを退治する。
いろいろトライして、結果として最も効果があったのが、アナログ回路(アンプ)に対するパスコン(0.1uF程度)。最初は、ディジタル回路の方にパスコンをつけて、そこが発する電源系に乗るノイズを退治しようとしていたが、なかなかうまくいかない。そこで、そこから出るのはしょうがない、と割り切ったら、それなりに効果があった。

09/03/05: コイン電池の容量

たとえばFDKのCR2032で、220mAh@2.0V程度らしい。思ったより大きい。
http://www.fdk.co.jp/battery/lithium/cs03.html

09/02/27: パスコンとダンピング抵抗

↓の結果。併用すると、かなりよくなった。
最後は、ADCに入ってくる信号にのるクロック由来のノイズ。
こればっかりは、アナログ系のPCB配線をしっかりやるしかない。

09/02/25: CPLDとクロック線

CPLD(XC2C256)で、シリアルのADCをつついてみるが、どうも誤作動する。
具体的には、CPLDから与えているクロックの立下りでADCから出てくるデータが変化するはずなのだが、毎立下り以外でもデータが変化しているっぽい。オーバーシュートか。
ADCの入力ピンの規格だと、Lは0.8V以下、Hは2V以上となっているが、確かに0.8Vに近いオーバーシュートが出ている。
考えられる対策:

09/02/18: オーディオ信号の備忘録

  • ライン入力:機器側の入力Zは10kΩ程度。
  • ライン出力:機器側の出力Zは数10kΩ程度。負荷にも数10kΩ程度をつなぐと、2Vp-pぐらいの振幅。

ついでに、コンデンサマイクで拾った音をライン出力まで持っていく増幅回路の備忘録。
http://cba.sakura.ne.jp/sub04/jisaku19.htm

09/02/17: Pd

PCで、ちょろっと音を取り込んで、ちょろっと加工して出力したくて、調べてみると、Pdというやつがある。
http://d.hatena.ne.jp/octech/searchdiary?word=*[PD]

ただ、マイクは、どうもモノラルしかできないようだ。
http://blog.atamanikita.com/?eid=817204

09/02/09: DirectSoundプログラミング

ちょっと気が向いて、DirectSoundのプログラムを書いてみたいと思ってみる。ちょっと調べた範囲の備忘録。
http://quickprogram.blogspot.com/2008/07/managed-directx.html
http://www.tnksoft.com/reading/classgame/engine/03/030.php
http://hikari-hinomoto.hp.infoseek.co.jp/
http://www.clks.jp/csg/dx001.html (環境構築とか)

09/01/30: PSoCのSCBLOCKで全波整流

http://www.geocities.jp/chako_ratta/micon/psoc_rectifier.html

09/01/27: DCモータの制御

久しぶりにDCモータの定速回転を半日で仕上げる。エンコーダの出力のカウントがキモなわけだが、けっこう周波数が低いので、パルスがHになる時間をカウントすることにする。PSoCでやる方策をいろいろ考えてみたが、Counterで基準クロックをカウントさせ、そのEnableにエンコーダのパルスをあたえ、そのエンコーダの立下りで割り込みをかけてCounterの値の差分をとる(Counterの値をリセットする、という方法がわからない)、というのが、現実的のような気がする。

09/01/22: ISEのPost-fit Simulation

↓と書いたものの、動作が微妙にあやしいので、Post-fit Simulationをやってみると、予想以上にSetup-timeが短い。こりゃ動作が微妙なはずだ。
というわけで、全体を同期のステートマシンになるようにVerilogの記述をなおしてみるが、根本的には解決できず。
冷静に考えたら、クロック周波数が48MHzなのに、tpdが10nsのCPLDを使っているのが、そもそも無茶なようだ。もう少しtpdが短いCPLDを使ってみることにする。

09/01/15: Xilinx ISEのfitting

比較的高速に動く回路をXilinxのCPLDに焼いてみるが、微妙に動かないところがある。
具体的には、ビット列のうち、特定のビットだけ、値が1に張り付く。
どうも遅延っぽいなあ、と思って、fittingのpropertyにあるOptimizatingをSpeed優先にしてみたら(デフォルトはSize優先)、あっさり動いた。

09/01/14: 2.54mmピッチのコネクタ

千石(http://www.sengoku.co.jp)で売っていて、よく使うんだけど、型番不明で、千石以外では入手ができなかったコネクタのメーカと型番を、やっと見つけた。
https://www.linkman.jp/user/shohin.php?p=57596
リンクマンという会社のZL2543シリーズ。

09/01/07: 基板の裏のビニール線

昔作ったやつを久しぶりに動かそうとしたら、どうもうまく動かない。
原因を探っていったら、基板の裏に通っているビニール線が、挿入実装部品の足のでっぱりに刺さっていて、運悪くショートしてしまっていたようだ。

09/01/07: EZ-USB FX2 + VisualC#

USBでデータをもらいながらグラフを描画していると、どうも時々、エラーになる。
デバッガで原因をさぐってみると、どうもBeginTransferに失敗することがあるようだ。
原因をいろいろ考えてみたが、グラフの描画(とその準備の処理)に時間がかかる(ことがある)のが原因のような気がする。
グラフの描画の頻度を下げるしかなさそうだ。

08/12/12: PSoC I2CHWのsampleのバグ?

PSoCのI2CHWのデータシートに載っているsampleに、どうもバグがあるような気がする。
WriteやReadの終了判定を

while(!I2C_RTC_bReadI2CStatus() & I2CHW_WR_COMPLETE);

とやっているのだが、&より!が優先されるので、

while(!(I2C_RTC_bReadI2CStatus() & I2CHW_WR_COMPLETE));

じゃないとマズい。

08/11/25: 半田槽

ちょっと多めのビニール線を半田付けしないといけないことがあり、買ったけどつかっていなかった半田槽を使ってみる。
棒はんだ(やになし、Sn60%)を細かく切って槽にいれ、設定温度を400℃ぐらいにして溶かす。その後、ビニール線を突っ込んで、少し待つと、だいたいきれいにできるようだ。
一度冷ますと、半田の表面に酸化膜っぽいのができるが、内側は大丈夫なので、再度溶かせば、また使える。

08/11/25: UARTの受信エラー(続)

結局、送信が終わったあと(=受け側がデータを受け終わったあと)、受け側の送信端子(=PSoC側の受信端子)がHighになるようなので、送信が終わるまでUART_bReadTxStatus()をみて送信が終わるまでまち、その後、(必要であれば、その受信端子が1になるのをポーリングで待ってから)受信を開始するようにすると、うまくいくようだ。

08/11/21: UARTの受信エラー

どうもPSoCに限らず、UARTの受信エラーと、その対策が、いまいちよくわからない。
例えば受信端子をずーっと0にしてしまうと、フレーミングエラーが出るわけだが、
そのエラーフラグをクリアすれば、次からはまた普通に受信ができそうなものなんだけど、どうもうまくいかない。もっとシビアにタイミングを見てあげないといけないのかなあ。具体的には、受信端子のサンプリングのタイミングと、データ受信完了のタイミング。

08/11/21: 3.3V用MiniProgで5VPSoC書き込み

5Vで動作するようにconfigしてあるPSoCを一度書き込んでしまうと、3.3V用に改造したMiniProgでは書き込みができないようだ。

08/11/20: PSoC Designer5.0でI2CHWを使うと、謎のエラー

ときどきコンパイル時に謎のエラーがでる。
HITECH-Cのフォーラムで質問してみたら、どうもServicePack2で
修正される問題、らしい。

08/10/24: Xilinx ISEのRunとRerun all

Xilinx ISEで、Runをすると、その段階だけ実行される(ことがある)。例えばGenerate Programming FileのところをRunすると、SynthesisやImplementationは実行されない(ことがある)。Rerun allだと、最初から全実行。
作ったはずの回路ができず、これで1時間ほどつぶしてしまった。
教訓:コンパイルの過程に注目しよう。

08/10/23: HITECH-Cライセンス

  • 10/2のエラー話。HI-TECH社の掲示板で質問をしてみたら、Projectで使うように指定しているコンパイラがImagecraftだからでは?との回答。たしかにそうなっていた。→これをHITECH-Cに変更したら、問題解決。
  • HITECH-CコンパイラのEducational Licenseの問い合わせをしてみたら、650ドル程度。許容範囲なので、購入することにする。しかしLite版だとコンパイルのたびに有償版だとこれだけコードサイズが減るよ、というメッセージが出るのは、ほとんど刷り込み広告みたいなもんだな。

08/10/22: PSoC厄日?(後日談)

ためしにPWM16をStartしなくしても、パルスが出てくる。
そんなはずはない。
もしかして、と思って、プロジェクト内のmain.cを見たら、ずいぶん前のプログラムだった。ということは、どこかで違うmain.cをひらいて、そいつを編集していたわけだorz

08/10/21: PSoC厄日?

すごく簡単なプログラムを作ってみるが、どうもうまく動かない。
PWM16で、PWM16_WritePeriod()とPWM16_WritePulseWidthを設定してパルスの周波数を変えたいのに、InterconnectViewで設定している値から変更がきかない。なんじゃ?
ちなみにPWM16などのクロック信号は、電源3.3Vでは、グローバルバスに引き出せるのは12MHzまでらしい。見落としていた。

08/10/03: PSoC HITECH-Cでの割り込み記述

いろいろ検索して、2chに行き当たる。
結論として、(Tutorialにも書いてある)いままでのImagecraftコンパイラの書き方でも、Warningは出るが、使える、ということらしい。(本当は割り込みベクタのアドレスを記述するのがHITEC-C流らしいが、boot.asmをみないとブロックごとの割り込みベクタがわからないので、面倒といえば面倒)
実際使えたので、Warningは気にせずにこのまいくことにする。

08/10/02: PSoC Designer5.0のコンパイラのライセンス

新しいマシンに、PSoC Designer5.0をインストールしてみる。HITECH-C Liteを選んでいるんだが、

!E C:(Path名)\tools\InvalidCompilerLicense.txt(0): ...Operation terminated. Compiler License invalid or not accessible

と出てしまい、コンパイルができない。なんでだろう?
Googleで検索した範囲では、古いコンパイラの情報が残っている場合などに出ることがあるようだが、今回は更に入れたマシンなので、そんなことはないはず。
ためしに、45日評価版のライセンスに切り替ええても、やはり同様のエラー。
困った。

08/09/30: 軽負荷の三端子レギュレータ

三端子レギュレータの出力電圧が、予定より0.5Vほど高くなる現象に遭遇。負荷はFPGAのI/O電源。
もしかして、と思ってデータシートを読み直してみると、出力電圧の項が、負荷電流が5mA以上、という条件で書いてある。
というわけで、適当な抵抗を負荷につないでみたら、無事本来の出力電圧になった。
スイッチングレギュレータで負荷の下限があるのは知っていたが、三端子のようなシリーズレギュレータでもあるんだね。

08/09/22: PIC Webサーバ

ふと思うところがあり、ちっこいWebサーバを攻めてみる。
http://www.olimex.com/dev/pic-mini-web.html
ここのTCPスタック(バージョンは最新ではない)を書き込んでみるが、どうもうまくいかない。1回だけうまくいったんだけど、それ以外は反応がない。リバースケーブルでつないでも、HUB経由でもだめ。IPパケットをのぞいてみると、どうもARPに反応していないっぽい。なんでだろう。まさかARPってICMP_SERVERをイネーブルにしないと反応しないんだろうか?そんなわけないよなあ。

08/09/08: SMAコネクタのとりはずし

BluetoothモジュールについているSMAコネクタを交換するため、コネクタをとりはずす。
思いのほかコネクタの熱容量が大きいのか、熱風ブロアではビクともしない。
そこで、サンハヤトのSMD取り外し半田を使ってみる。
http://www.sunhayato.co.jp/products/details.php?u=797&id=02043
→あっさりとれた。すげー。脱帽。

08/09/04: VB/VC#でグラフを描画するライブラリ

北川先生より情報。
http://zedgraph.org/wiki/index.php?title=Main_Page

08/09/03: PSoC Designer 5.0

PSoC Designer5.0を入れてみる。統合環境としては、なかなか使いやすいような気はする。

  • I2CHWのMultiMasterを選んだとき、なぜかI2CHWCommon.hが生成されなかったりSingleMasterを選んだとき、I2CHWCommon.hをincludeすると、なぜか動かないが、これをincludeしないとちゃんと動いたり。よくわからん。ちなみにI2CHWのデータシートのサンプルでは、includeされている。
  • リソースエディタのほうでいろいろいじったあと、F7でBuildしても、Generate Applicationが自動でされないようだ。ぜんぶやる(Generate&Build)はF6になっている。これは不便だ。注意しながら使わないとハマる予感。
  • SDカードがバージョンアップされているかと、淡い期待をもってみたが、サブディレクトリは相変わらず扱えずorz

08/08/17: カメレオンUSB FX2 (EZ-USB FX2LP)備忘録

カメレオンUSB FX2
http://optimize.ath.cx/cusb_fx2/index.html
USB2.0経由で、高速にデータを送り続けるような用途に吉。

いろいろと備忘録。

  • CN2(赤ジャンパ):ON=EEPROM有効、OFF=EEPROM無効
    EEPROM書き込み時は、OFFにして接続(no EEPROM)→ONにする→CyConsoleのLgEEPROMから*.iicを書き込み
    (CyConsoleのOption→EZ USB Interfaceを選択してから)
  • EEPROM無効で接続→test_consを実行
    (test_cons.cpp内のusb->fwload(0, fw_bulkloop, NULL)で、bulkloop.iicと同等のものをDLしている
  • EEPROMにbulklook.iicを書き込み、再接続
    →usb->fwload(0, fw_bulkloop, NULL)を消したtest_consを実行、しても、OK
  • MAXIIの書き込み
    EEPROM無効で接続→cusbwr2 *.svfで書き込み
  • *.svfの作り方:
    QuartusIIのTools→Programmerでプログラマを起動
    File→Create/Update→Create JAM,SVFを起動し、Serial Vector Format[.svf]を選択してOK
  • 雛形としてのspd_chk
    spd_chkから、fw.incをincludeし、それをFX2LPに転送している
    ※Q: fw.cをコンパイル後に、fw.incに変換する方法は?
  • 標準のfw.incは、MODE設定などの機能があるので、このまま使ってもよい。
    →中途半端にいじらないほうがいいか?
  • PC側のspd_chk.cppを雛形として使えばよい→Cypress提供のSuiteUSBを使うとGUIプログラムも書きやすい。
  • MAXIIの回路
    fw.cの入出力にあわせると、FX2LPのfw.cの変更は最小限ですむ
  • FX2→PCの転送、メモリ内のコピーは十分間に合うが、ディスクに書き込むのは律速となるようだ(2048バイトあたり以降、FIFOがいっぱいになっている)
    →メモリにすべて格納、転送終了後に書き出し、か。
    →SuiteUSBを使うと、複数バッファ切り替えのタイミングを自作プログラムでつかみやすいので、ディスク書き込みでも十分間に合うようだ。
  • ※Q: FX2→PCの転送のバッファを、転送開始前にクリアする方法はないか?
    受信バッファの先頭が、どうも送られてくるデータの「最初」と一致しないようだ→解決策はないか?
    →SuiteUSB2.0を使うと、特に問題はないようだ(後述)
    →CPLD→FIFOの書き込み開始のタイミングと、PCの受信開始のタイミングの関係=FIFO書き込み開始後に、EP-inの受信を始めると、最初のほうのデータが抜ける
    →CPLD側で、ireg[0]をチェックしてFIFO書き込みの開始を、スタートアップタイマを入れて少し遅らせる

08/08/17: PSoC Designer 5.0

PSoC Designer 5.0を入れてみる。Cコンパイラが、HI-TECH Cになっている。
機能制限版は無料、フル版は有償(アカデミックで$650程度のようだ)、とのことで、とりあえず無料版でいってみる。
http://ameblo.jp/2st-rider/entry-10091603285.html
ここによると、いままで使っていたImagecraftのCコンパイラより、この無償版の方がいいこともあるようだ。むーん。
アカデミック版を買うかなあ・・・マルチユーザライセンスだし。

08/08/06: コネクタの圧着と圧接

JST(日本圧着端子製造)のコネクタ(ACHシリーズ)のコンタクトピンにケーブルを圧着しようとする。
http://www.jst-mfg.com/product/detail.php?series=9
が、あまりにも小さいので、断念して半田付け。JSTに問い合わせてみると、専用の手動圧着工具がある。10万円ぐらいするが、これは専用工具を使わないと無理だ・・・
ちなみに、昔買っていた、同じくJSTのSSRシリーズのコネクタは、ピンにワイヤを押し込んで固定する圧接、という方法で固定するが、こちらも、同じくJSTの専用工具があるようだ。しかし15万円ぐらいする。まあこちらは、それほどまではよく使うわけじゃないので、精密ドライバで押し込むか・・・

08/07/18: PSoCのアナログ部の消費電力

アナログブロックを全く使わないとき、GlobalResourceからAnalog PowerをOffにすると、2mAぐらい消費電流が減るようだ(CY8C29466の場合)

08/07/25: 環境整備計画

ちょっと手が空いたときに、実験や測定するときの、ちょっとした環境整備。

cable1.jpg

DC電源を何系統か使うとき、どの線がどの電源につながっているかわからなくなっちゃうことがあるので、色をつけてみる。あと、平行コードで線がバラけないように。

cable2.jpg

オシロのプローブで基板上のICの信号などを見ているとき、プローブだとつまみにくいところをつまみやすいようにクリップ(Sunhayatoの、本当は0.5mmピッチQFPの足もつまめるシロモノらしい)。やはり同じように色分け。あと反対側は、プローブでつまむように皮をむいただけだけど、もちろん半田メッキ。

08/07/18: 赤外線リモコン信号メモ

いろんなリモコンの信号をみてみる。

  • PSX
  • 古いのSONYのビデオ
  • Nationalエアコン
  • Sharp液晶テレビ
  • MITSUBISHIテレビ
    一応、http://www.256byte.com/remocon.htm という規格のようだが、結構いいかげんのようだ。以下、備忘録。
  • リーダー部がないものや、あっても規格外の時間(5msとか)のものが多い
  • ON/OFFの時間、いずれも規格どおりのものはすくなく、けっこう幅がある
  • 長いやつだと1ボタンにつき250ms近く信号が出るものもある
    以上をふまえて、こう扱うといいかもしれない方法
  • 最初の1回のON/OFFは、ちゃんとリーダー部があるものもあるので最大10ms程度まで時間を測る
  • 2回目のON/OFF以降は、長くても2ms程度
  • 2回目以降で、OFFが2ms以上続いたら、終わり、とみなす

08/07/17: 赤外線受信器

リモコンの赤外線を受信したくなって、久しぶりにちゃんと使ってみる。

  • パスコンをしっかり入れないと、蛍光灯のチラツキあたりをよく拾ってしまうようだ。→データシートどおり、100Ω直列+22uF並列のLPFを電源ラインに入れるのがよさそうだ。
  • 秋月で売っている赤外線受信器の出力のパルスの立ち上がりと立ち下がりが、異様に遅い。50usぐらいかかってゆっくり変化する。どうも仕様のようだ。このまま何も考えずにマイコンに入れると、0/1の判定がおかしくなる(0と判定した直後に、やっぱり1に判定してしまうことがある:入力の1/0の閾値からしたらしょうがないけど)
    →トランジスタでエミッタ接地増幅器を1段はさんで変化を急峻にしてもいいが、マイコン側に運良くシュミットトリガ入力がある場合は、それに与えれば、だいたい大丈夫。PIC12F629だと、GPIO-2だけ該当。まさに宝物の入力ピン。

08/07/03: ナットの半田付け

備忘録。ユニクロメッキのナットを基板に半田付けしたい場合(ってかなりレアだな・・・)に、けっこううまくいく方法を発見。

  1. 基板側に半田を盛る(電極部分に薄く膜を張る程度)
  2. ナットを↑の上に置き、ラジオペンチなどで固定する
  3. 大きめ(60W程度)の半田ごてで、ナットの上からあたためる
  4. 十分暖まって、ナットの下の半田が溶けたら、半田ごてをはなす
  5. 半田が十分冷えて固まるまで、ラジオペンチを動かさない
  6. おわり

08/06/14: PSoC書き込み方法

備忘録。PSoC Programmerの2種類の書き込み方法

  • PowerCycle: XRES(リセット端子)を使わずに、プログラマ(MiniProg)から電源をON/OFFして書き込みを制御する方法。8ピンなどのXRESがないPSoCは、この方法しか使えない。
  • Reset: XRESを使って書き込みを制御する方法。PSoCに、プログラマ以外から電源を供給する場合は、この方法を使う。

08/05/29: PRoC再チャレンジ

しばらくまえにいじろうと思って、なかなかうまくいかなかったので、しばらく放置プレイぎみだった、Cypressの2.4GHz帯無線機つきPSoCの、PRoC (CYWUSB6953)
http://www.cypress.com/products/?fid=65&rpn=CYWUSB6953&ref=sch

久しぶりにひっぱりだす。いろいろリハビリ。

  • 書き込みは、電源3.3Vを与えた状態で、3V用のMiniProgで、書き込みモードを、PowerCycleではなくResetで。5V用のMiniProgだと、PRoCがこわれるので、トラ技06/12の桑野さんの記事などを参考に、電源ラインにダイオードをはさむ。
  • 基本的には、WirelessUSBLSのデータシートのサンプルどおり。
  • 何バイトかまとめてSendDataしても、受信のbReadDataは、1バイトしか受信されないようだ。(戻り値がいつも1)仕様なんだろうか。
  • 受信のbReadDataの引数valid[]は、当該バイトで正しく受信できたビットと同じところが1になる、ということのようだ。つまり例えばvalid[0]=0xffならば、data[0]は正しく受信できている。valid[0]=0xfeならば、data[0]の、最下位ビット(LSB)が正しく受信できていない(だいたい0になるようだ)、ということ。このvalid[]をみて、ビット単位で誤り訂正をしたほうがよさそうだな。
  • GetRssi()で、受信強度がわかる。0x00-0x1f。設計した基板のパターンがいいかげんなのか、思いっきり近づけても0x09あたり。ただし、5mぐらい離しても、0x07とか。
  • 近くに同じ2.4GHz帯の無線機器があると、SetChannel()で選ぶチャンネル次第で、大きく通信品質が変わるようだ。例えばCh.7だと文字化けばかりでも、Ch.70あたりにすると、見違えるように文字化けしなくなったり。ただし再現性低し。

08/05/29: 多点CSDのチューニング

多点CSD(具体的にはとりあえず12点)で、ちょっと電極までの距離が長いやつのタッチ検出。デフォルトのパラメータだと、感度がいまいち(というか誤検出が多い)ので、CSDのDocumentの最後の方に載っているチューニングの方法に従って、チューニングしてみる。
ちなみにCSDモジュールのReferenceは、ASE11がおすすめ、と書いてあった。ScanSpeedはNormal, Resolutionは12bitに設定。

チューニングの手順の要点は以下の通り。

  1. カウント値(CSD_waSnsResult[])を出力するプログラムを書く。UARTとかI2CとかでPCへ。
  2. カウント値の変化を、タッチの有無で観測する
  3. Rb, Cmodを、タッチの有無でカウント値の変化が大きくなるように調整(Rb:0.5k-10k, Cmod:4.7-47nFの範囲)

結果は以下の通り。
(12個のスイッチのうち、SW0, SW5, SW11の3個のみ記録。値はけっこうバタつくので、俺フィルタを通したあとの平均値。タッチの強さによっても値が変わるが、弱めにタッチ(ワーストケースに近い)にしてみる。

OFFOnDiff
RbCmodSW0SW5SW11SW0SW5SW11SW0SW5SW11
2.2k10n6509501100180020502500115011001400
2.2k4.7n6509701100180020002600115010301500
2.2k39n6609701100210022002700144012301600
2.2k47n6609701100200021002500134011301400
4.7k10n130019002200390038004000260019001800
10k10n2400330037004096409640961696796396
4.7k39n130019002200350038004000220019001800
4.7k4.7n130019002200380039004000250020001800
3.3k10n93013601600300035003600207021402000
3.3k39n96013901620270028003500174014101880
3.3k4.7n92013601600340030003700248016402100

この結果から、微妙なラインではあるが、Rb=3.3kΩ, Cmd=10nFを採用。

本来は、このカウント値とBaselineとの差がFingerThreshold以上になったら、ON、になるはずなのだが、FingerThresholdの値が5〜255しか設定できない。これはResolutionが8bitのとき用で、12bitのときとかは、換算しないといけないんだろうか。
そのあたりをさぐるのが面倒なので、カウント値-baselineであるCSD_waSnsDiff[]を順番にみて、その値が閾値以上(例えば700)であればON、と判定するようにした。

ちなみにCSDは、勝手にVC1〜VC3のクロック源・分周比を設定してしまうので、TX8などのクロック源を自分で分周したVC3にできないので、SysClk*2で、PC側のUARTのボーレートをそれにあわせるか、CSDでセンスしたあとに、レジスタを直接いじってVC3のクロック源・分周比を設定(OSC_CR3/OSC_CR4)などしてTX8_Start()して、TX8でデータを送る。送り終わったら、TX8_Stop()して、レジスタを戻しておくのを忘れずに。(ただしTX8_PutCharの関数から戻るのは、送信開始時なので、送信が終わるまで待ってからTX8_Stop()しないと、途中で送信が止まってしまう)

08/05/28: 多点CSD

電極までちょっと長め(最大で1m弱)の線で引っ張るタッチセンサをCSDでつくってみる。

電極までの線を、電極につながる線とGNDが交互になっているフラットケーブルにしてみて、どれぐらいイケるか挑戦してみた。(未来日記)

場合によっては、ShieldElectrodeを使うようにして、このフラットケーブル内のGNDをShieldElectrode端子につないだほうがいいのかもしれないが、それは結果をみてから、にする。

08/05/22: 加速度センサとPSoC

  • macyu氏に分けていただいた加速度センサとPSoCをつないでみる。通信はSPI(同期式シリアル)。
  • SPIってよくわからなかったけど、だいいぶわかってきたので、SPIの備忘録
    • 1バイト送るのと1バイト受けるのを同時にクロックに同期して行う、というだけのことだった。なので、受け側が必要としていなくても、データを受信するためには、なんか1バイト送らないといけない。
    • マスタ(マイコン)側がクロックをスレーブ(相手)側に与える
    • マスタからスレーブへ向かうデータは、MOSI (Master Out, Slave In):「もし」
    • スレーブからマスタへ向かうデータは、MISO (Master In, Slave Out):「みそ」
    • 一般的なデータの送受信方法は、SPIのデータシートのとおり。基本的には次の通り。
      1. 送信バッファが空くまで待つ
      2. 送信データを書き込み
      3. 受信バッファが埋まるまで待つ
      4. 受信データを読み出し

08/05/21: 筋電アンプの電極

  • 銀板がよいようだ。どうもステンレスのネジだと、うまく筋電がとれない。銀板を、穴あけパンチで抜くと直径5mmくらいのきれいな円盤になるので、それを紙のカバーの上からトンカチでたたいて平たくのばす。これを基板に半田付け(明日の予定)。基板の電極以外の部分はプラ板で覆う。

08/05/15: NTSC信号の取り扱い w/ FPGA

  • NTSC信号をLM1881で同期分離し、VSYNCとCSYNC(CompositeSYNC)にあわせて同期をとり、特定行の部分を高速ADC(秋月で売っているAD9283 http://akizukidenshi.com/catalog/items2.php?q=%22I-01526%22&s=score&p=1&r=1&page=)でA/D変換して、明るさをとってメモリにストア。
  • NTSC信号はDCレベルの規定がないが、Y/C分離後に0.1uF程度のコンデンサでカップリングしてAD9283のAinに入れると、DCレベルが差動入力の反対側の/AinのDCレベル(1.0V)に一致する。VSYNC直後のあたりで少しDCレベルが変化するので、気になるといえば気になる。
    そこでNTSC信号の規格(?)に従って、HSYNCのときの電圧を基準として、そこからの相対値をとるようにする。つまりHSYNCのときの電圧をA/D変換して保存しておき、そこからの相対値を求めるようにする。
  • 本当はHSYNCをPLLで逓倍して、HSYNCに同期したクロックを作ってA/D変換(というかFPGAの動作クロック)するべきだが、面倒だし、そこまでの精度は不要なので、10MHzのクロックを適当に分周して使うことにする。

添付ファイル: filepsoc_romedit.c 1134件 [詳細] fileProbeConn.JPG 1275件 [詳細] filecable1.jpg 1240件 [詳細] fileGDc4.jpg 956件 [詳細] fileTNacq.jpg 932件 [詳細] fileGDu4.jpg 924件 [詳細] fileTNacq2.jpg 939件 [詳細] fileProbe.JPG 356件 [詳細] filePSoC_CalcChecksum.c 1198件 [詳細] filecable2.jpg 1293件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-10-02 (日) 11:12:58