2013/09/29

[電子工作]LPC800 Mini-Kitもどき その3

,
 基板は今中国あたりのどこかを揺蕩っているはずです。主な部品もDigi-Keyで買いました。でもひとつ重大な問題がありまして…メインの肝心要のLPC810の在庫が、どこのショップでも0のままなのです。もはやギャグ。

 一応主要ショップでの在庫数はここから確認できるのですが、0のまま変化してないように思います…
 
 Digi-KeyでもLPC81xシリーズだけ0のまま。NXPさん生産する予定あるのかなあ、って思うくらい。
在庫が無いよう…
いつになったら手に入るんだろう…


追記: 2013/10/08

リセッタブルヒューズなんですが。
リセッタブルヒューズ各種
上から
MF-SM050-2 2920(7351メトリック) 最大電圧60V \53
MF-MSMF050-2  1812(4532メトリック) 最大電圧15V \24
になっている。明らかにサイズが違う…。後写真には写ってないけれど、
MF-FSMF050X-2 0603(1608メトリック) 最大電圧6V \45
というのも買った。1608なのでとても小さい。

 それはともかく、この前基板が届きました。
基板(表)
基板(裏)
えっと、まあ最大のミスは、パッドと間違えてビアを配置したことですかね…。シルクのロゴが綺麗に出てたのにはびっくりしました。
 で、これに部品をちまちまと乗せて行っているのですが、実装してみると幾つか問題が出てきたので書き留めておくことにします。

2013/10/05 Rev 1.1

基板出てきてハンダ付けした後の修正

・M3のネジ穴を角に4つ設ける
・Debug Port周り
1.シルク印刷が見えなくなるので移動する
2.リフロー用パターンなので、手ハンダが難しい(もしかしたらボックス無しのヘッダのためのパターンなのか?http://www.digikey.jp/product-detail/ja/GRPB052VWQS-RC/S9012E-05-ND/1786414みたいな)
3.1ピンと、ケーブル側コネクタの出っ張り部分を表示しないと、分かりにくい
・USB周りの電源の取り回し方がゴミ
・Vccの電源の幅を太くする(現状16mil)
・LED1、2に謎のシルクがある→Eagleでも既にあった
・SJ1を通じて、10PinコネクタからもVccへと給電する→ここはジャンパピンの方が良いかもしれない。
・Debugポートは全部端っこのほうがよい。
・LED、ダイオードのカソードにマークとか無いと実装しづらすぎる 

 一応LPC810をのっけて、LPC-Link2からLチカプログラムを書き込んだら動作しました。デバッグも順調みたいです。10ピンポートの方は大丈夫そうですね。
 FT232RLの仮想COMは、肝心のFT232を買ってなかったので、まだ動作未確認です。
LPC-Link2を繋いだ図
電源の配置に困っているので(真ん中にUSBポートが来るのはそのままであって欲しい)、それが出来たらRev 1.1として、そのまま発注はせずにファイルだけローカルに置いておこうと思います。

 現状ダイオードの電圧降下は200mV程度。LDOの発熱もほぼなく、といった感じ。
問題点として、USB経由で給電するときの電流値ってデスクリプタに書いたりすると思うんですけど、FT232RLは書き換えられるのかな…


Read more →

2013/09/28

[電子工作]aitendoのDDSモジュールを動かす その2

,
0)前置き

 前にこんな記事を書いて以来、aitendoのDDSモジュールも放置していたのですが、そろそろケースに入れたいのでまた触り始めました。
 取り敢えず、SPIでいい加減動かさないと…ということでSPIから制御する話です。

 使ったハードはArduino Duemilanoveなので(今となっては化石…)、Master側のSPI設定に困ることはないです。


1)ハード的な話

 AD9850は、どうも2ピンがLow、3・4ピンがHighならばデフォルトでシリアル通信モードみたいです。aitendoにある回路図を見ると、2ピンに繋がっているJP1をジャンパしておけばGNDに落ちるみたいなので、パラレル→シリアルへの変換コマンドを送る必要はないみたいです。

 出力ですが、IOUTが200ΩでGNDに落ちているので、そのまま出力インピーダンスも200Ωなのでしょうか…?評価キットの回路図では、IOUTBは25ΩでGNDに、IOUTは50ΩでGNDに落ちてますが…

2)ソフト的な話

 AD9850のデータシートに書かれている、SPI通信のタイミングをみます。
AD9850 Data Sheet 英語 Rev H(http://www.analog.com/static/imported-files/data_sheets/AD9850.pdf)より転載
で、AD9850のシリアル信号線の名前は、SPIによくあるSS、MOSIなどとは違ってますが、結局役割は同じみたいです。

FQUP(FreQuency UPdate) → SS(10)
WCLK → SCLK(13)
D7 → MOSI(11)


 SPI通信をするときには、幾つか設定しないといけない事がありますが、AD9850のデータシートを見る限りでは、以下の様になってるみたいです。

・動作モード
 CLKの立ち上がりでデータをサンプリングするみたいです。又、通信していない時のCLKはLowなので、SPI_MODE0になります。

・データの送り方(BitOrder)
 BitOrderは、データの送る順番がw0(LSB)から順にw1、w2、…、w31(MSB)なので、LSBFIRSTです。

・SS(FQUP)の制御
 SPI通信では、先ず最初にSSを下げてから通信をしますが、どうも通信終わりのSS↑↓は自分でやらないといけないみたいです。

・AD9850のRESET信号
 RESETを最初に落とすことになりますが、このRESETは正論理(!)なので、Resetしたい時に0にします。最初負論理だとてっきり思っていて、動かずに困りました…

・送るデータですが、EF_AD9850に依れば、
//Calculate the frequency of the HEX value
x=4294967295/125;//Suitable for 125M Crystal
frequence=frequence/1000000;
frequence=frequence*x;
y=frequence;
らしいです。例えば40kHzであれば、0b00000000, 0b00010100, 0b11111000, 0b10110101になります。

最後のw32~39のControl Registerには、
bit[1:0] Control Serialならば00
bit2 Power Shutdown 0
bit[7:3] Phase
を書き込みます。


 ということで、ArduinoのSPIを使うように改造しました。一応クラスにしてますが、8bitレジスタ5個分を送るだけの簡単なプログラムです。
class AD9850{
 //7 reset
 //10 fqup
 //11 d7
 //13 wclk 

private:

public:
 AD9850(){};
 ~AD9850(){};

 //Initialize SPI & DDS(AD9850)
 void Init(){
  //set
  pinMode(7, OUTPUT);

  //Send Reset signal
  digitalWrite(7, 0);
  digitalWrite(7, 1);
  digitalWrite(7, 0);

  //Init SPI
  SPI.begin();
  SPI.setDataMode(SPI_MODE0);  //Idle : clk low, rising edge. 
  SPI.setBitOrder(LSBFIRST);
 };

 //freq : Frequency[Hz]
 //w0 : Control Register Value
 void SetFrequency(const unsigned char w0, const double freq){
  const double xtal_freq = 125;  //125MHz Xtal
  const double x = (4294967295 / xtal_freq)  / 1000000;
  long int y = (long int)(freq * x);
  
  SPI.transfer(y & 0xFF);
  SPI.transfer((y >> 8) & 0xFF);
  SPI.transfer((y >> 16) & 0xFF);
  SPI.transfer((y >> 24) & 0xFF);
  SPI.transfer(w0);  //Control Register
  //FQUP
  digitalWrite(10, 1);
  digitalWrite(10, 0);
 };
};
このプログラムを実機上で動かして、ロジック・アナライザで通信データを見てみたところ、下の写真のようになりました。
ロジアナで見たSPI通信

 SPI.transfer()を1byteごとに呼んで送信しているため、1byteごとに何も通信していない部分(A2のMOSIが1になっているところ)がありますが、CLKもLowのままでサンプリングされてないので問題無いと思っています。

 DigitalWrite()でSS(FQUP)を制御しているので、SPIの通信が終わってからSSが上がるまでに結構時間がかかっているみたいですが、まあ動いてるので大丈夫でしょう…

 使い方は、前のライブラリ(EF_AD9850)とほぼ一緒。
Read more →

2013/09/21

[電子工作]出てきたDAC08ボードのなにか

,
※書きかけ
 昔作ったDAC08の載ったなにかが出てきました。よくわからないので回路図を調べました。
DAC08周辺回路図

 電源周りは全ての部品を書いてるわけではないです。
載っているDC-DCコンバータモジュールは、+-5V出力のMAU106。Vref用の基準電圧源はLM336-2.5。DAC : DAC08です。8bitパラレル入力で、セトリング時間は最高85ns。私はDAC/ADCに関して無知なのでよく分からないのですが、セトリング時間の逆数が、サンプリングレートになるんでしょうか?だとしたら、11.8Mspsくらいでしょうか。鈴商で買ったやつです。

 で、調べてみるとこの回路には少し問題があるみたいで…

1)DC-DCコンバータモジュール

 MAU108ですが、安定出力域は、出力電流で+-42mAまでです。これは大丈夫そうだった
 
 他に、出力リプル電圧が大きいこともあります。データシートp.3の、"Ripple & Noise (20MHz)"の項目に、Typ. 50mVp-p、Max. 75mVp-pと書かれています。
 エレキジャックの記事にも、高周波ノイズが多いので、チョークコイルとコンデンサによるフィルタを入れていると書かれていますし… 今のところ本当に出力をDAC08の+V/-Vに直結しているので、ここを改善しないといけなさそうです。
 
 また、上の記事には「ただし、出力は安定化されていないので負荷電流で出力の電圧が変化してしまいます」とあります。

 どちらにせよ、ノイズに弱く電源が綺麗じゃないといけない(?)DAC/ADCのことなので、もうちょっとどうにかしたいです。

2)DAC08の出力抵抗

 DAC08のデータシートp.11 Figure 24には、

と書かれています。
 上の回路図の定数(Vref = 2.5V、Rref = 5.1kΩ)でIfrを計算すると、大体4.88mAになります。ですが、データシートp.3のSpecificationsのFull Range Currentには、Ty.で1.992mA、Max.でも2.000mAとなっています。
 なので、Ifrはどう考えても流し過ぎなんじゃないかなあ、と。絶対最大定格を見ても、Reference Input Currentは5.0mAとなっています。ICが壊れる寸前ということなのでしょうか


Read more →

[雑記]PS3と机買いました

,
 知り合いから譲ってもらったんですが…初期型PS3(20G)で、全面のフタが折れてるものを、\10,000。

 もちろん20GBじゃあ足りないので、HDDを換装することにしました。換装はそこまで手順が多いわけではないですが、ネジが外しにくくて大変でした(1つねじ山潰してしまった…)。

 周辺機器で買ったもの:

・HDMI-DVI変換アダプタ PL-HDDVAD \950 Amazon
・HDMIケーブル1.0m DH-HD14ER10BK \950 急いでたのでヨドバシ
・HDD(2.5inch 海門 500GB) \3,000 (別の方から譲ってもらった)
・PS3 メモリーカードアダプター CECHZM1J \980 じゃんぱら
 ちょうど中古で売りに出てて良かったです。発売が2006年11月なので、新品はあまり販売されておらず(大体のところでは販売終了)、どっかに出てる中古品を回収する感じです。

 
 これとは別に、机と棚も買ってしまいました。

・デスク(リッケン2 120-DBR) \9,990 ニトリ
・シェルフ?
A4 3段ケース(ZHU-BK) \1,490 ニトリ

 本当は、そろそろ限界が来てるPC用の椅子(といっても、4脚のダイニング向けの普通のを使ってた)を、買い換えたかったのですが… なるべく早く欲しかったので近所のニトリに行ったのですが、タンパ2 HL937に実際に座ってみると、座面と背もたれが同時に倒れるのがなんか怖かったので(そして在庫もなかった)、今回は辞めました。

 机はで、今の105cmの学習机みたいなものから、幅120cmに広がったので、それなりに余裕ができてよかったです。唯、奥行きが約75cm→60cmに狭まってしまいました。まあキーボード打つときに肘が置けるので、今のところの問題はないですが…

 他に、机の下に入れるラックと本棚も買い物リストには入ってましたが、ラックはどうも入れるスペースがなさそうなこと、本棚は売り切れでダメでした。

 ニトリの家具については、組み立ての時の説明書が、IKEAのよりも分かりやすく、気のせいかもですが、ネジとかがちょっと頑丈な気がしてマシだと思いました。
 しかし、低価格な収納小物になると、紙製のものがとても多いですね。あれは若干不安になるので、自分では買わないようにしてるんですけど…実際のところどうなんでしょう?

 
 後最近買ったものといえばアブサンというお酒です。
某H○Bで天国への階段というカクテルがありますが、あれを飲んで以来ハマってしまったので、遂にお家用に買ってしまいました。

・ペルノ・アブサン700mL \4,460(送料込) Amazonマケプレ
・アブサンスプーン(フイユ柄) \1,995 Absinthe-Tokyo
Lyonnais (リヨネ、グラス) \1,050 Absinthe-Tokyo

 買ったのはアブサンの中でも、比較的オーソドックスなペルノ・アブサン。H○Bで天井から吊るされてるのと同じやつです。
 アブサンスプーンなんですが、ちょっとお金を出してもいいから好きな柄のを買おうと思ってこれにしました。

 実際に作ってみると、何しろアブサンファウンテンが無いので、水の入れることの難しいこと。本来なら1滴ずつ入れ、アブサンに起こる変化を楽しむんですが…なかなか難しいです。
Read more →

2013/09/16

[電子工作]LPC800 Mini-Kitもどき その2

,
 1枚の基板としての設計(といえるほどのものではない…)は終わりました。
1)仕様 
 
 2層基板、幅98.63mm×高さ47.3mm。

2)パターン
全体のパターン
パターン(裏面のみ)
パターン(表面のみ)
3)回路図
回路図
4)変更点

・参考になったサイト
EAGLE on PCB Design (EAGLEを使った回路・パターン設計) http://slidesha.re/149g2L1

・どうせだから基板を横10cmまで伸ばした。結果的にめっちゃスペースが余ることになって、大きめのロゴとかはそっちに移動させた。

・コネクタの信号名をシルクで入れた。これがないとPCのモニタとにらめっこすることになって、個人的にとてもうざったい。

・パスコンの位置を、VccがICに入る前に移動。

・ダイオードをなんか適当なやつ(SOD-123パッケージ)に変えた。

・Vccを幅16mil、ドリル16mil、ビア外形32milにした。
 1mm幅で許容電流1Aくらいって聞いたので、USBの0.5A(実際はそこまで流れないだろうとは思う…)弱で耐えれるように。16mil=0.4064mmだからダメか…

・10ピン1.27mmのヘッダ(CN1)を、表面実装品に変えた。これは、ライブラリの1.27mmの貫通する方のヘッダだと、クリアランスのエラーが出ちゃうため。
Read more →

2013/09/15

[電子工作]IV-16用ボード

,
※あとで書く
 フィラメント管IV-16用のボードです。ユニバーサル基板でやろうとして、隣の桁の同じ部分も表示されてしまい頭を抱えてたので、思い切ってプリント基板で作ってみました。
 
 動かなかった原因
・フィラメント管は応答速度が遅いらしく、すぐには消えてくれないこと(未検証)
・フィラメント管は文字通りフィラメントが並んでいるので、発光ダイオードなどと違い、逆方向にも電流が流れる…?ちゃんとGNDに落としてないと消灯できなさそう。なのかなあ。

作ったもの

パターン
Top View
Bottom View(表面レイヤー非表示)
回路図
回路図

部品について


部品リスト:
Part     Value          Package    Library   Position (mil)        Orientation

C1       0.1            C2012      rcl       (2787.5 837.8937)     MR180
C2       0.1            C2012      rcl       (1675 850.3937)       MR180
C3       0.1            C2012      rcl       (587.5 837.8937)      MR180
C4       10?            C3216      rcl       (3225 725)            R180
C5       10?            C3216      rcl       (3225 575)            R180
CN1      CON8           CON8       1-MyLib   (2737.5 1012.5)       R180
CN2      CON2           CON2       1-MyLib   (3375 1012.5)         R180
R1       1.1k           R3225      rcl       (2475 750)            MR270
R2       1.1k           R3225      rcl       (1450 812.5)          MR270
R3       1.1k           R3225      rcl       (439.37008 903.74016) MR270
R4       5k             R1206      rcl       (3337.5 125)          R180
R5       10k            R1206      rcl       (3337.5 225)          R180
R6       10k            RTRIM3224J rcl       (3462.5 387.5)        R180
SJ1                     SJW        jumper    (3262.5 837.5)        R180
U1       IV-16          IV-17_COMP untitled1 (3050 300)            R0
U2       IV-16          IV-17_COMP untitled1 (2500 300)            R0
U3       IV-16          IV-17_COMP untitled1 (1950 300)            R0
U4       IV-16          IV-17_COMP untitled1 (1400 300)            R0
U5       IV-16          IV-17_COMP untitled1 (850 300)             R0
U6       IV-16          IV-17_COMP untitled1 (300 300)             R0
U7       TC62D748CFG    TSSOP-24   untitled1 (2787.5 637.5)        MR270
U8       TC62D748CFG    TSSOP-24   untitled1 (1675 637.5)          MR270
U9       TC62D748CFG    TSSOP-24   untitled1 (587.5 637.5)         MR270
U10      TL1963ADCQR    SOT-223-6  untitled1 (3462.5 650)          R270

作るときには、以下のサイトをめっちゃ参考にさせていただきました。分かりやすいページをありがとうございます。
 フィラメント管 IV-16 - N->N->N http://bit.ly/1dgwdsx
 フィラメント管時計 - N->N->N http://bit.ly/1dgwiMZ

駆動部:


 定電流LEDドライバICを使ってる方がいたので、それに倣った。ただ、TLC5940はちょっと高い(\335)のと、面実装パッケだと裏側にサーマルパッドがあってややこしそうだったのでやめた。Aduinoでの作例が多いからちょっと残念だけど…

STP16CPC26PTR \102 24-SSOP(QSOP) SPI http://www.digikey.jp/product-detail/ja/STP16CPC26PTR/497-11923-1-ND/2757659
TC62D748CFNAG(EL,H \111 24-SSOP 東芝! SPI http://www.digikey.jp/product-detail/ja/TC62D748CFNAG(EL,H/TC62D748CFNAG(ELHCT-ND/2790827
TLC5925 \172 24-TSSOP SPI http://www.digikey.jp/product-detail/ja/TLC5925IPWR/296-24466-1-ND/2057694

 で、どうやらどれもピン配置は同じらしい。コンパチって感じ。
それっぽいパラメータを比較したのが以下のテーブル。後から考えてみると、最大周波数ってSPIの方か…テーブル作るのにはmobtabgenというサイトを使わせていただきました。

IC名出力電圧出力電流最大周波数最大損失Ignd(GNDに流せる最大電流)
STP16CPC2620V(max)5~90mA30MHz1600mA
TC62D74817V(max)1.5~90mA25MHz1.56W
TLC592520V(max)3~45mA30MHz1.1W750mA

 ピン配置は以下のよう。変わらぬ…
 DP含めると8エレメント、それで16ポートあるんだろうけど、生憎DPが無いので2ポートは空き。ICの片側にちょうど8ポート出力があるので、左右で管を分ける感じ。
定電流LEDドライバICのピン配置比較
各々のデータシートから転載させていただきました。
信号線がよく分からない。スタティック駆動だからnOE(Output Enable)はいつもLowでいいんじゃないか?
 nSLATはLowだと、SINから入ってきたデータをラッチせず、そのままSOUTに流すだけなんだけど、こればかりは各ICごとに別々に制御しないとダメなんじゃないの?共通にすると全部のICが素通りかラッチしか出来ないし…。と思ったのでnSLATは1~3で分けてます。ここらへんは使ってみないとよく分からないという感じ(その割にボードは既に投げてしまった)…

 フィラメント管のパッケージはTO-100らしく、一応ソケットがあるみたいですが、確かに高いので今回は見送りました…フィラメント管には寿命があるとはいえ、まあ大丈夫でしょう…(てきとう)


電源部


 フィラメント管用のVccを生成する電源部ですが…

 フィラメント管は各エレメント当たり17~22mAほど流れる。(ニキシー管などによくある)延命のために、少し電流を少なくするとしても15mA。全管全エレメントが点灯すると考えると、15mA * 7エレメント/tube * 6管 = 630mAは流れる。よって、余裕を見て1A程度は流せて欲しい。

 さらに、フィラメント管の駆動電圧は3.15V~4.5Vらしいけど、TC62D748での電圧降下がどれくらいかよく分からなかった(データシートの回路例によれば、+1.0V)ので、ちょっと電圧調節出来て欲しかった。

 そもそも4V出力のLDOは少なく(東芝のTA48M04Fくらい)、0.5A出力だともしかしたら足りないかもしれないので、可変LDO?を使うことにした。LDOは、小型でVdropがそこまで大きくないやつ(LM317とかはちょっと…)ということで、Digikeyで適当に見繕った。
 ただ、電圧可変のLDOってどれも高い、TL1963ADCQRでも\335。

Vadjの抵抗の計算

Vout = 1.21V * (1 + R2 / R1) + (Iadj) * R2
Iadj = 3μA@25℃なので無視して、
Vout   R2 / R1
3V 1.56
4V 2.305 10kと?
4.1V 2.388 10kと23.7k(R96)
→ここらへんを可変にするには、R1 = 10k、R2 = 15kと10k半固定にするとか。(この組み合わせだと上の理論値が3.025Vしか出ないです…)

 出力コンデンサはESR < 3Ωで10μF以上、Z5U Y5V X5R X7Rシリーズとかが良いらしい。

 最初は通信線のコネクタから電源引っ張ろうかとも思った(SJ1)けど、この分だとダメそう。

 何かあったら怖いから電源すぐ落とせるように、一応スイッチとリセッタブルヒューズくらいはつけておこうと思ったんだけど、忘れてた。パターン一旦切るのもちょっと無理そうだし、諦める…。


パターンで苦労したところ


  • オートルーターだと最初25%くらいしか行かなかった。頼りきりなのもどうかと思うけど。オートルーターかけると、配線が遠回りになったり、曲げる角度が直角になる(設定で変えられるかも)ので、結局Ripupして手動でやり直すのが多かった。
  • 最初Viaのサイズをドリル0.6mmとかにしてもずっとDRCエラーが出てた。なんでだろ…Elecrowのホームページによると、最小ドリル径は0.3mmらしいんだけど。Twitterで教えていただいたところによると、Drill 12mil(0.3048mm)、外枠 24mil(0.6096mm)で大丈夫らしいのでそうしてる。
  • 一旦配線した後で、部品を移動させると配線がちょっとめんどくさくなる
  • GND端子の配線を既にしている状態で、端子を残すように(Terminal→Thermals on)Polygonでベタグラウンドを書くと、GNDパターンの周りがThermalパターン+配線みたいになっちゃう。
なんか残ってる
ベタグラウンドでGNDに落とせるって分かってるなら、配線しないほうがいいのか…?

  • 回路図エディタで、コピペして配線くっつけようとすると地味に繋がってなかったりする。めんどくさい。
  • バスの信号線は、名前を"SIGNAL[0..5]"とかにすればSIGNAL1~5までが作られ、"OE,SCK,SIN,SOUT"とかカンマで区切れば、それぞれ出来る。
     唯のNet→Busへと配線するときは、Netの名前がBusの名前と一致しないとつなげませんと怒られる。Bus→Netするときは、Bus上をクリックした時点でどの信号線を選ぶか出てくる。こっちのほうが良さげ。 

パターンのヤバイところ(主にトラ技だけ読んでやばそうなところ)


・異なる層の配線を並行させてる(めっちゃダメらしい)。
・もしかしたらベタGNDで浮島パターンみたいなのがある…
・一部途中で配線が切れてる気がする。
・LDOのVadjの抵抗が、微妙にICから離れてる(なるべくICに近づけて配置するのが望ましい、らしい)。
・ネジ穴が基板の外枠からあまり離れていないので、強度的にとても不安。あとφ3なんだけどM3のねじがちょうどぴったりではいらない事例が起きるような気がする。3.2とかにしておけばよかった…
・半固定のサイズが結局わかってない。
・GNDを分かりやすくするように、端子の周りを白シルクで囲おうとしたけど、端子の上からシルク塗るのってどうなんだろう…と思ったのでやってない。
・パスコン周りのViaとかGND抜きとか、とりあえずただ闇雲にベタGNDにしてはいけないらしい。よく読んでないのでよく分からないんだけども…
・パスコンを経由してからICのVccに配線するのは多分出来てるはず…

 問題が多すぎますね。初めてだからしょうが無いといえばしょうが無いのです…本なりなんなりでお勉強したいですね…

(2013/09/16) 昨日Elecrowに注文しました。

2 Layer 10cm * 10cm Max PCB - 5/10pcs (Color Free)
Qty - 10
Layer - 2
PCB Thickness - 1.6mm
PCB Dimension - 5cm Max * 10cm Max
PCB Color - Black
Suface Finish - Hasl
E-Test - 50% E-test
Panelizing - 1 copy
File - 1122. untitled.zip
で$23.90、220gなので送料$6.52かかって計$30.42でした。5cm*10cmと10cm*10cmは値段が変わらない(輸送量は変わるかもしれない)ので、若干損した気分…

 朝起きたら、もう「生産の方に回したよ」みたいなメール?が来ました。レベルシフタ(アウトライン無かったやつ)と違ってめっちゃ早かったです。

The comments for your order are: Dear Customer,
We have put your design into production, it will cost about 4-6 business
days. Thank you!
Best Regards
Elecrow

Your order has been updated to the following status:
New status: In production
だそうです。
Read more →

2013/09/10

[電子工作]LPC800 Mini-Kitもどきの製作 その1

,
※書きかけ、やりかけ

 LPC800 Mini-Kitが探しても本当に見当たらないので、業を煮やしてそれっぽいのを作ることにしました?
 初心者がやるとこーなるのかーーーーみたいなことを分からされててとてもつらいなあ。

ピンの設定
ISPモードに入るためGNDに落とすスイッチが5ピン。
ISP書き込み用のUARTが

部品の選定
 

 電源周り、自動切り替えするICは使わずに、原始的にダイオードで済ます。一応VBUSを外に出して使うことも考えてはいるので、バイパス用のジャンパパターンを付けておく。
 ショットキーダイオードは思考停止でライブラリにあるSOD523を選んだ。でも実際ボードいじってると、これじゃあ小さすぎて無理だと思わされるってワケ。一応Digikeyにはこのパッケで使えそうなのがある(http://www.digikey.com/product-detail/en/PMEG3005EB,115/568-7397-1-ND/2697417)。けどねえ…
 
 スイッチング電源はコイルを選ぶ才能がないと気付いたので、LDOにした(楽)。選択基準とか候補が次のようになってる。
3.3V LDO Vdrop < 1.0V、Iout > 0.3A

ノイズ入るとヤバイとも思えないんだけど、なんか面倒くさいしLDOにしておく。
BA33BC0FP-E2 \107 1A TO252-3 Vin < 16V Vdropは0.3V@200mA? Rohm
http://www.digikey.jp/product-detail/ja/BA33BC0FP-E2/BA33BC0FP-E2CT-ND/3663735
KA78RM33RTF \72 0.5A TO252-3 Vin < 20V Vdropは0.6V@500mA、200mAだと180mV程度。 Fairchild
http://www.digikey.jp/product-detail/ja/KA78RM33RTF/KA78RM33RTFFSCT-ND/3478379
MCP1802T-3302I/OT \69 SOT23-5 0.3A Vin < 10V Vdropは0.2V@100mA
http://www.digikey.jp/product-detail/ja/MCP1802T-3302I%2FOT/MCP1802T-3302I%2FOTCT-ND/1979781
AP7215-33YG-13 \58 SOT89-3 0.6A Vin < 5.5V Vdropは0.1V@100mA 本当はこれを使いたかったが、外部9Vも無くはなさそうだから断念…
http://www.digikey.jp/product-detail/ja/AP7215-33YG-13/AP7215-33YG-13DICT-ND/2179740
TA48S033AF(T6L1,Q) \128 5HSIP(TO-252-6) 1A Vin < 16V Vropは0.69V@1A
http://www.digikey.jp/product-detail/ja/TA48S033AF(T6L1,Q)/TA48S033AF(T6L1Q)CT-ND/2273210

 とりあえずKA78RM33RTFを使う方針で行きます。AdafruitのライブラリにTO252があります、78XXのライブラリもあります。なので唯のコピペ。
 コンデンサは入力側は0.1μFだけど、出力側が33μFなので、チップ積層セラミックコンデンサならこれ
C3216X5R0J336M130AC TDK 3216 ±20% \95(高い…)
http://www.digikey.jp/product-detail/ja/C3216X5R0J336M130AC/445-4060-1-ND/1965707
ちな、秋月には33μFは売ってない。


回路図(暫定、ほぼ決定)
かいろず
配置が下手、読みにくさヤバイ。特に部品の番号とかの重なりがひでえ。

パターン
 ICの近くに、ICと同じ配置したピンを出しておく。
 VBUS、Vccもパッドで外に出しておく。
Top
FT232RL周りが本当にきつくて、全然配線できない。やばい。Arduino Duemilanoveとかどうしてるんだろ…
 とりあえず、5cm * 5cmにはどうやっても収まりそうにないから、5*10か10*10になるんだろうなあ…
Read more →

2013/09/08

[電子工作]双方向レベルシフタ基板を設計して、Elecrowに投げてみた

,
 なんかそろそろ基板作れるようになりたいよなあ、ということで、試しに双方向レベルシフタの基板を作ってみました。双方向レベルシフタを選んだのは、部品点数が少なく、基板の規模も小さく、そして少しは実用になるもので思いついたのがこれしか無かったからです…
 使うレベルシフタICは、Texas InstrumentsのTXB0108です。単純にググって一番上に出てきたから使おうと思っただけの話。
 変換基板は、Adafruitのこれパクリ目標にして作りました。

 設計にはEagleを使いました。

・ライブラリを準備する

 メインの部品であるTXB0108が、Adafruit.lbr(GitHub)に元から入っているので、自分でライブラリを作るということはありませんでした。というか、面倒そうなのでその必要がないようなものを選んでました。

・シルクの編集

 シルクの編集には、表面ならレイヤ21(tPlace)あたりにテキストを書き込んだりする。Vectorフォントの方が無難、らしい。フォントが3種類しか選べないのがとてもつらい。
参考:EAGLEでのシルク印刷編集: 組込み徒然草 http://bit.ly/1cT9LFD

・イメージの追加(import-bmp.ulp)

 import-bmp.ulpを使うと、シルクに.bmpが追加できるみたいです。でも失敗しました。なので今回は使用していません。
シルク印刷する、どちらかの色を選ぶべき(決して両方ではない)
どうやら、上の画面でなぜかバカ正直に2つともチェックを入れてしまってたのが問題だったみたいです。使う色を指定する画面なので、モノクロビットマップならば、黒(かもしくはネガポジ反転となる白)のどちらかを選ぶべきでした。(2013/09/10)
画像のサイズの指定。シルクは21(tValue)
あと、次に表示される上のようなダイアログでは、シルクとして印刷したいなら[Choose start layer for 1st selected color]の欄を21にすべきです。サイズの指定は様々ですが、いきなりInchで指定しろと言われても分からないので、mmにしてます。
 FormatをDPIとかScaledにすると、大抵サイズが自分の思った通りにならないので、正直に幅を指定することにします(Aspect/Ratio m)。

 使う.bmpファイルですが、不精なのでペイントでやっています。でもまあフリー素材のロゴの脇に文字入れるくらいだったら、それなりに満足できるものが作れそうです。
 保存するときには、モノクロビットマップよりも16色ビットマップで保存し(黒白だけしか無い画像だと仮定して)、色選択の時に白、灰を抜かして黒だけにすると、モノクロビットマップで保存してimportした時よりも綺麗に出来ました。特にフォントの縁のギザギザが、心持ち少なくなったような気がします。

例えばこんなロゴを作ってみた。フォントがやはりギザギザしている…

・ベタアースにする

 ベタアースにするためには、ポリゴンとかいうのを使うみたいです。ベタパターンの描画 - 電子工作室さんのページを参考にしました。
 ランドの塗り方は右のほうにしました。また、この時はまだSeeedStudioに頼むつもりだったので、Isolatedの値も0ではなく にしました。ちなみに、ベタアース表示のボタン(Ratsnest)はです。
 
 Isolatedの値を0にすると、配線との配線の間に孤立したランドみたいなのが作られ、尚且つこれが消せなくなってしまうことがありました。それだけなら実害がないのですが、配線がランドのせいでRipUp状態になることがありました(後から考えてみると、元々ここは配線されていなかった?)。こうなるともうお手上げでした…
17ピンが×、今の自分の知識では直せなかった。
ピンヘッダとか穴のある部品でも、配線は穴を通り越して真ん中まで行くんですね…ちょっと解せない点です…

・最終確認

 念には念を入れよということで、ガーバーデータを送る前に最終確認したほうがいいみたいです。GC-Prevueというフリーソフトを使ってみました。
参考:CuBeatSystems: EAGLEで設計した基板の製造をFusion PCB Serviceに頼む。(EAGLE用の一発生成CAMファイルや、ガーバデータの検証方法もあります。) http://bit.ly/1cTamY0
GC-PrevueでTop layer(.GTL)とSolder Stop Mask top(.GTS)を表示した時のスクリーンショット。

 で、出来た基板はこんな感じです。
ボード…あれこれ下枠切れてたり左が歪んでるけど大丈夫なのか??まずくね?
回路図
本当は最初SheedStudioというところに投げようと思っていたのですが、TwitterでElecrowの方が基板の色が選べておトクと聞いたので、そっちにしました。
 緑の基板が嫌いだから赤か青にしようという、個人的な話です… 

かかったお金は以下の様な感じです。

1 x 2 Layer 5 * 5cm Max - 5/10pcs (Color Free) (SPF20505S)  = $9.90
        Qty 10
        Layer 2
        PCB Thickness 1.6mm
        PCB Dimension 5cm Max * 5cm Max
        PCB Color Red
        Suface Finish Hasl
        E-Test 50% E-test
        File 1068. LevelShifter.zip
------------------------------------------------------
Sub-Total: $9.90
Registered Air Parcel (Weight: 110 g. ): $4.59
Total: $14.49
Reward Points earned: 10

赤で1.6mm厚、最大5*5cmまでの基板が10枚で$9.9。なんて安いんだろう…

 .drcファイルと、ガーバーデータ出力のための.camファイルはElecrowの注文画面にあります。Fusionって書いてあるけど…
 あとElecrowって部品実装サービスみたいなのもやってるんですかね。ゆくゆくはZynqとか使ったり乗っけたりしてみたいですよね。というかBGAパッケが使えないのは相当痛いような気もするし。

(2013/09/10)  一昨日投げたんでしたっけ?昨日の夜?とりあえず、9/8にはOrder UpdateなるEメールが飛んできて、こんなことが書いてありました。

Elecrow
------------------------------------------------------
Order Number: ****

Detailed Invoice:
 ttp://www.elecrow.com/index.php?main_page=account_history_info&order_id=****

Date Ordered: 2013/09/07

The comments for your order are: Dear Customer,
We have recieved your order and the gerber file, our engineer is checking
the gerber file, if the file meet the requirements, we will put it into
production ASAP. Thank you!
Best Regards
Elecrow

Your order has been updated to the following status:
New status: Processing

Please reply to this email if you have any questions.

 あれ通ったんですか…確かにdrcには引っかかからないけど、根本的にボードに過ちがあるような…でも英語のメール考えたくないので、放置します…

(2013/09/14)通ってませんでした。あっちの人からメールがきました。
Hi ***
There is a problem that the gerber file don't have outline.
Please look at the picture.
please send the gerber file to me again.
Best Regards,

だそうで。アウトラインの欠けているところを、わざわざ写真までつけて教えてくれました。ごめんなさい…
 訂正したガーバーファイルを、添付して送ってみたら、お返事がきました。
Hi ***
I will arrange it into manufacture now.
it will return to us in 3 to 6 days.
we will ship it to you soon after we get the PCB boards.
Best regards,
だそうです。
こっから3~6日+配送みたいですね。待ってます。そろそろ部品買わないと…

 パーツリストは、part2html.ulpなるものがあるのでそれを使いました。
Part Value Package Library
C1 0.1u C2012 rcl
JP1 1X11 pinhead
JP2 1X11 pinhead
U1 TSSOP20 adafruit
だそうです。買うのはICだけでいいかなあ。

(2013/09/16) パーツリストの出力なら、[File]→[Export]→[Partlist]の方がいいかもしれない。見やすい。[BOM]だった
Part     Value          Device     Package  Library  Sheet

C1       0.1u           C-EUC2012  C2012    rcl      1
JP1                     PINHD-1X11 1X11     pinhead  1
JP2                     PINHD-1X11 1X11     pinhead  1
U1                      TXB0108PWR TSSOP20  adafruit 1

Read more →

[電子工作]LPC11U37でのXorshiftのメモリ消費量とかを調べた

,
 ちょっと気になったので、Xorshiftのコードサイズがどれくらいになるのか確かめてみました。あと最初うまくいかなかった時に何をしたのかの、ログです。

ぜんたいのこうせい
1)前置き
2)ソース
3)実行結果
4)まとめ
5)おまけ

使った環境
MPU : LPC11U37/401 Cortex-M0
Toolchain : Keil MDK-ARM Version:4.72.1.0

1)前置き - なんでXorshiftか
 乱数が欲しい時は何を使えばいいんでしょうか。標準的な関数rand()は、今では精度の悪い(≒ランダム性が高くない)、使わない方がいい乱数生成器の代表になってしまいましたが、シード含めて2つの関数を呼べば乱数が出てくるので、気軽に使える乱数生成器の1つです。この気軽に使えるというのが重要で、例えばC++の標準になった乱数生成クラスだと、何回かクラスのインスタンスをゴニョゴニョして、んでもってやっと乱数が出てくる(精度はいい、らしい)感じです。これだと、PC上で実行する分にはいいけれど、メモリが少なく速度が遅いマイコンだと、本当に使えるのかと疑問になってしまいます(まあそもそもC++のこれにまだ対応していないのが多いような気もする、<random>インクルードしたらエラーになったし)。
 ということで、今回はある程度精度があって、とても高速だと言われるXorshiftというものを使ってみます。
 解説とサンプルコードは、Wikipedia(http://ja.wikipedia.org/wiki/Xorshift)にあります。
 
2)ソース

 こんなかんじのコード(main.cpp)になりました。他に、startup_LPC11U**.s、system_LPC11Uxx.c、core_cm0.c、core_cm0.h、サンプルプログラム集にあるuart.c、uart.h、type.hが必要だと思われます。

#ifdef __cplusplus
extern "C" {
#endif
 
#include "LPC11Uxx.h"
#include "uart.h"
#include 
 
void SysTick_Handler(void);
 
#ifdef __cplusplus
}
#endif

//xorshift
uint32_t xor128(){
 static uint32_t x = 123456789;
 static uint32_t y = 362436069;
 static uint32_t z = 521288629;
 static uint32_t w = 88675123;
 
 uint32_t t = x ^ (x << 11);
 x = y;
 y = z;
 z = w;
 return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
}

void uart_init(uint32_t baudrate)
{
 UARTInit(baudrate);
}

//delay functions
volatile static uint32_t msTicks = 0;
void SysTick_Handler(void) { 
 msTicks++;
}

inline void delay(uint32_t delayTicks) {
 uint32_t curTicks = msTicks;
 while((msTicks - curTicks) < delayTicks);
}

//entry point
int main()
{
 SystemCoreClockUpdate();

 uart_init(9600);
 
 if(SysTick_Config(SystemCoreClock / 1000)){
  //handle error
 }
 
 while(1){
  char str[24] = {0};
  const uint32_t length = (uint32_t)(sizeof(str) / sizeof(str[0]));
  //convert uint32_t to char array.
  if(EOF != sprintf(str, "%u\r\n", xor128())){
   //send to console(UART serial).
   UARTSend((uint8_t*)str, length);
  }
  
  delay(1000);
 }
 
 return 0;
}

 このプロジェクトをまとめたものを.zip形式で上げておこうと思ったんですが、Bloggerがファイルのアップロードに対応していないらしいので、考え中です…この際意識高くgitデビューしちゃうか。

3)実行結果

 他に書くこと無いので、メモリ消費量と逆アセンブルを書いておきます。なお、これはXorshiftを使っているけれど、上のコードとは少し違うものをコンパイルした時のものです。
 途中に出てくる-O0、-O1、-O2、-O3というのは最適化の度合いで、数字が大きくなるほど最適化が書けられていきます。いらないものはバッサバッサ切り落とされちゃいます。これを設定するには、Keil μVision4なら、[Project]→[Options for Target '<project name>'...]で出てくるダイアログの、[C/C++]タブ、[Language/Code Generation]のOptimizationで設定可能です。

 また、ここに書いてある逆アセンブルはデバッグ時に表示されるものをコピー&ペーストしています。困ったことに、無償版だとこうしないと表示してくれないみたいです(参考:http://mbed.org/users/MACRUM/notebook/offline_compiler_2/)。


-O0です。
xorshift書く前
Program Size: Code=4724 RO-data=224 RW-data=172 ZI-data=676

xorshift書いた
Program Size: Code=4792 RO-data=224 RW-data=188 ZI-data=676

xorshiftをボーレートにした(強制的に使う)
Program Size: Code=4796 RO-data=224 RW-data=188 ZI-data=676


逆アセンブル
                 __rt_exit_exit:
0x00000160 BC03      POP      {r0-r1}
0x00000162 F001F8F3  BL.W     _sys_exit (0x0000134C)
0x00000166 0000      MOVS     r0,r0
    19:         uint32_t t = x ^ (x << 11); 
0x00000168 484E      LDR      r0,[pc,#312]  ; @0x000002A4
0x0000016A 6800      LDR      r0,[r0,#0x00]
0x0000016C 02C0      LSLS     r0,r0,#11
0x0000016E 4A4D      LDR      r2,[pc,#308]  ; @0x000002A4
0x00000170 6812      LDR      r2,[r2,#0x00]
0x00000172 4050      EORS     r0,r0,r2
0x00000174 4601      MOV      r1,r0
    20:         x = y; 
0x00000176 484C      LDR      r0,[pc,#304]  ; @0x000002A8
0x00000178 6800      LDR      r0,[r0,#0x00]
0x0000017A 4A4A      LDR      r2,[pc,#296]  ; @0x000002A4
0x0000017C 6010      STR      r0,[r2,#0x00]
    21:         y = z; 
0x0000017E 484B      LDR      r0,[pc,#300]  ; @0x000002AC
0x00000180 6800      LDR      r0,[r0,#0x00]
0x00000182 4A49      LDR      r2,[pc,#292]  ; @0x000002A8
0x00000184 6010      STR      r0,[r2,#0x00]
    22:         z = w; 
0x00000186 484A      LDR      r0,[pc,#296]  ; @0x000002B0
0x00000188 6800      LDR      r0,[r0,#0x00]
0x0000018A 4A48      LDR      r2,[pc,#288]  ; @0x000002AC
0x0000018C 6010      STR      r0,[r2,#0x00]
    23:         return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); 
0x0000018E 4848      LDR      r0,[pc,#288]  ; @0x000002B0
0x00000190 6800      LDR      r0,[r0,#0x00]
0x00000192 0CC0      LSRS     r0,r0,#19
0x00000194 4A46      LDR      r2,[pc,#280]  ; @0x000002B0
0x00000196 6812      LDR      r2,[r2,#0x00]
0x00000198 4050      EORS     r0,r0,r2
0x0000019A 0A0A      LSRS     r2,r1,#8
0x0000019C 404A      EORS     r2,r2,r1
0x0000019E 4050      EORS     r0,r0,r2
0x000001A0 4A43      LDR      r2,[pc,#268]  ; @0x000002B0
0x000001A2 6010      STR      r0,[r2,#0x00]
    24: } 

-O3です。
xorshiftのxor128()をコメントアウトしている
Program Size: Code=3236 RO-data=236 RW-data=172 ZI-data=676

xorshiftをボーレートにしてない。
Program Size: Code=3280 RO-data=224 RW-data=188 ZI-data=676

xorshiftをボーレートにした
Program Size: Code=3280 RO-data=224 RW-data=188 ZI-data=676


逆アセンブル
    19:         uint32_t t = x ^ (x << 11); 
0x00000168 492A      LDR      r1,[pc,#168]  ; @0x00000214
0x0000016A 6848      LDR      r0,[r1,#0x04]
0x0000016C 02C2      LSLS     r2,r0,#11
0x0000016E 4042      EORS     r2,r2,r0
    20:         x = y; 
0x00000170 6888      LDR      r0,[r1,#0x08]
    21:         y = z; 
0x00000172 6048      STR      r0,[r1,#0x04]
0x00000174 68C8      LDR      r0,[r1,#0x0C]
    22:         z = w; 
0x00000176 6088      STR      r0,[r1,#0x08]
0x00000178 690B      LDR      r3,[r1,#0x10]
    23:         return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8)); 
0x0000017A 60CB      STR      r3,[r1,#0x0C]
0x0000017C 0CD8      LSRS     r0,r3,#19
0x0000017E 4058      EORS     r0,r0,r3
0x00000180 0A13      LSRS     r3,r2,#8
0x00000182 4053      EORS     r3,r3,r2
0x00000184 4058      EORS     r0,r0,r3
0x00000186 6108      STR      r0,[r1,#0x10]
    24: } 
    25:  
    
0x00000214 0000      DCW      0x0000}#0x10]                            /* Function successful */ SysTick Timer */ 

ちなみに、Global Symbolsによれば(<project name>.map。プロジェクトをダブルクリックすると表示される。)

Symbol Name                              Value     Ov Type        Size  Object(Section)
-O3 xor128()                                 0x00000169   Thumb Code    34  main.o(.text)
-O2  xor128()                                 0x00000169   Thumb Code    34  main.o(.text)
-O1  xor128()                                 0x00000169   Thumb Code    34  main.o(.text)
-O0 xor128()                                 0x00000169   Thumb Code    62  main.o(.text)

また、static変数は
Image Symbol Table

    Local Symbols

    Symbol Name                              Value     Ov Type        Size  Object(Section)
    x                                        0x10000004   Data           4  main.o(.data)
    y                                        0x10000008   Data           4  main.o(.data)
    z                                        0x1000000c   Data           4  main.o(.data)
    w                                       0x10000010   Data           4  main.o(.data)
のようになっている。uint32_tだから4Byteなのは妥当。だけどどこで初期化されているんだろう?

 UARTがなんか動かないので、まだxor128()がちゃんと乱数を生成しているかまでは検証していない。UARTでXorshiftが動いてるのを確認しました。
Xorshift

4)まとめ

 50Bytesとかだったら、余裕でプログラムに組み込んでいける。
 1clk = 48MHzとして、1clk1命令だとする(どうなんだろう)。すると、約21nsで1命令。16命令あるから、21*16=0.336μsが理想の動作速度?

 問題はx、y、zとかのシード値をどうするかで、C++11の<random>なら、ハードウェアエントロピーリソースを用いた予測不可能な乱数std::random_deviceが使えますが、ああいったものを考えないと毎回同じ数値が出てきてしまいます。1000回ごとにEEPROMに保存して、次回はそれをシードにするとかでしょうか…


------------------------------------------------------------------------------------------------------
5)おまけ! - extern "C"を忘れて、SysTick_Handlerが無限ループしてた話

 上のコードは、最初は次のようなコードでした。しかしこれだと、UARTに1~2文字ほど表示されるだけで動作が止まってしまい、ちゃんとxor128()が動いているのかわかりませんでした。
#ifdef __cplusplus
extern "C" {
#endif
 
#include "LPC11Uxx.h"
#include "uart.h"
#include < stdio.h >
 
 
#ifdef __cplusplus
}
#endif

//xorshift
uint32_t xor128(){
 static uint32_t x = 123456789;
 static uint32_t y = 362436069;
 static uint32_t z = 521288629;
 static uint32_t w = 88675123;
 
 uint32_t t = x ^ (x << 11);
 x = y;
 y = z;
 z = w;
 return w = (w ^ (w >> 19)) ^ (t ^ (t >> 8));
}

void uart_init(uint32_t baudrate)
{
 UARTInit(baudrate);
}

//delay functions
volatile static uint32_t msTicks = 0;
void SysTick_Handler(void) { 
 msTicks++;
}

inline void delay(uint32_t delayTicks) {
 uint32_t curTicks = msTicks;
 while((msTicks - curTicks) < delayTicks);
}

//entry point
int main()
{
 SystemCoreClockUpdate();

 uart_init(9600);
 
 if(SysTick_Config(SystemCoreClock / 1000)){
  //handle error
 }
 
 while(1){
  char str[24] = {0};
  const uint32_t length = (uint32_t)(sizeof(str) / sizeof(str[0]));
  //convert uint32_t to char array.
  if(EOF != sprintf(str, "%u\r\n", xor128())){
   //send to console(UART serial).
   UARTSend((uint8_t*)str, length);
  }
  
  delay(1000);
 }
 
 return 0;
}
この方(http://mibc.blog.fc2.com/blog-entry-82.html)と似たような症状なのかな。

5-1)問題を切り分けたい…

 とりあえず、デバッガを起動して実行してみます。すると、デバッガのステップ実行ではうまく文字が送信されるのに、リリース(FlashへのDownload書き込み)では動かない事がわかりました。
 どこに問題があるんでしょうか…。とりあえずブレークポイントを全て消し、プログラムをしばらく走らせ、徐ろにStopさせます。すると、SysTick_Handler()のB命令でずっと止まっているのがわかりました。本来ならばmsTicks++;が実行されるだけなので、なんか変です…

 しょうが無いのでプログラムで問題がありそうなところをコメントアウトしていきます。すると、次の部分をコメントアウトしたら動きました。
if(SysTick_Config(SystemCoreClock / 1000)){
 //handle error
}
ということは、SysTick_Config()が原因みたいです。SysTick_Config()はSysTickタイマーを設定・開始させる関数なので、もしかしたら割り込みが悪い影響を与えているのかもしれません。例えば、UART送信中に割り込みが来たりしたら動かなくなるとか?(違った)
 ということで、UARTSendのところに
__disable_irq();
UARTSend((uint8_t*)str, length);
__enable_irq(); //割り込みを再設定しないといけない?
としてみました。すると、最初の1回だけは正常に動きます。どうやら、問題はUARTSendではないようです(ライブラリからコピーしてきたので動いて当たり前か…)。

 で、SysTick_Handler()が無限ループになることも考えると、UART送信中にSysTickタイマの割り込みが発生し、SysTick_Handler()に飛んで無限ループに陥るために、送信できないのかもしれないと考えます。

5-2)void SysTick_Handler(void)はどこなのか

 startup_LPC11Uxx.sではSysTick_Handler()は
SysTick_Handler PROC
                EXPORT  SysTick_Handler           [WEAK]
                B       .
                ENDP
となっています。EXPORT SysTick_Handlerを右クリックし、[Go To Definition of 'SysTick_Handler'...]を選んでみても、ちゃんとmain.cppにあるSysTick_Handlerに飛びます。
その割には、逆アセンブルを見ると、
   151:                 EXPORT  PendSV_Handler            [WEAK] 
0x0000030A E7FE      B        SVC_Handler (0x0000030A)
   152:                 B       . 
   153:                 ENDP 
   154: SysTick_Handler PROC 
   155:                 EXPORT  SysTick_Handler           [WEAK] 
0x0000030C E7FE      B        PendSV_Handler (0x0000030C)
   156:                 B       . 
   157:                 ENDP 
   158: Reserved_IRQHandler PROC 
   159:                 EXPORT  Reserved_IRQHandler       [WEAK] 
0x0000030E E7FE      B        SysTick_Handler (0x0000030E)
   160:                 B       . 
0x00000310 E7FE      B        Reserved_IRQHandler (0x00000310)
となっています。これは、main.cppで定義したSysTick_Handler()ではなく、無限ループなのでは?

 アプリケーションノートのp.424~425とp.426の"Figure 23?80 Vector table"には、SysTickの割り込みベクタは0x0000003Cらしいですが、このアドレスを見る限りだと
0x0000003C 030F      DCW      0x030F
0x0000003E 0000      DCW      0x0000
となっているので、
    32: //delay functions 
    33: volatile static uint32_t msTicks = 0; 
    34: void SysTick_Handler(void) {  
0x000001C0 BD10      POP      {r4,pc}
    35:         msTicks++; 
0x000001C2 4844      LDR      r0,[pc,#272]  ; @0x000002D4
0x000001C4 6800      LDR      r0,[r0,#0x00]
0x000001C6 1C40      ADDS     r0,r0,#1
0x000001C8 4942      LDR      r1,[pc,#264]  ; @0x000002D4
0x000001CA 6008      STR      r0,[r1,#0x00]
    36: } 
にはどう考えても飛ばなさそうです。

5-3)顛末

 ここで、SysTick_Handler()の設定の仕方に何か問題があるのではと調べたら、これが出てきました。この通りにextern "C"したらちゃんと動きました。そうだった、前も同じミスをやったんでした。完全にバカですね。

 実際に動かない場合の.mapファイルを見てみると、関数は
    xor128()                                 0x00000179   Thumb Code    62  main.o(.text)
    uart_init(unsigned)                      0x000001b7   Thumb Code    12  main.o(.text)
    SysTick_Handler()                        0x000001c3   Thumb Code    12  main.o(.text)
    main                                     0x000001cf   Thumb Code   132  main.o(.text)
    __use_two_region_memory                  0x000002f1   Thumb Code     2  heapauxi.o(.text)
    __rt_heap_escrow$2region                 0x000002f3   Thumb Code     2  heapauxi.o(.text)
    __rt_heap_expand$2region                 0x000002f5   Thumb Code     2  heapauxi.o(.text)
    __I$use$semihosting                      0x000002f7   Thumb Code     0  use_no_semi.o(.text)
    __use_no_semihosting_swi                 0x000002f7   Thumb Code     2  use_no_semi.o(.text)
    __semihosting_library_function           0x000002f9   Thumb Code     0  indicate_semi.o(.text)
    Reset_Handler                            0x00000301   Thumb Code     8  startup_lpc11uxx.o(.text)
    HardFault_Handler                        0x00000309   Thumb Code     2  startup_lpc11uxx.o(.text)
    SVC_Handler                              0x0000030b   Thumb Code     2  startup_lpc11uxx.o(.text)
    PendSV_Handler                           0x0000030d   Thumb Code     2  startup_lpc11uxx.o(.text)
    SysTick_Handler                          0x0000030f   Thumb Code     2  startup_lpc11uxx.o(.text)
となっていて、SysTick_HandlerとSysTick_Handler()が別々にあるのがわかります。
Read more →