[[作業日誌]] 目次 #contents(); 過去の日記 -[[./自主課題]] -[[./マイコンペ]] -[[./2009年度]] [[つくったもの>./つくったもの]] *ご意見 [#y42b8a4b] - main.lisはデマングル化されたシンボルを出してると思われまする。 -- [[nishino]] &new{2010-06-11 (金) 00:40:32}; - PSoCについてるのCコンパイラだから、デマングルなんかあるわけないじゃんorz というわけで見たところ、main.lisはmain.oのアセンブリでした。(プロジェクト名).lstは実行可能ファイルのアセンブリでした。 -- [[nishino]] &new{2010-06-14 (月) 01:32:05}; - なるほど。てことはmain.cで書いた部分がどうアセンブリになってるのかな〜って思ったらmain.lisをみればいいのね。 -- [[komatsubara]] &new{2010-06-17 (木) 21:03:45}; - フラグの反転(6/10)って、flg=1-flg じゃだめでしょうか?私はいつもこうやってます。 -- [[akita]] &new{2010-06-29 (火) 23:04:26}; - ↑その発想はなかったです フラグ処理ならその方がスマートで理解しやすいですね。 -- [[komatsubara]] &new{2010-07-02 (金) 00:27:43}; - 俺、昇天なう。反応が悪いならCdsとトランジスタで作るという手も。 -- [[nishino]] &new{2010-07-11 (日) 20:09:16}; #comment(); *7月11日 脈拍 [#e412c529] 秋月パルスを%%ぱくtt%%参考に、脈拍を測ってみた。 フォトリフレクタにはPRP-220、アンプの増幅率は8倍。 &ref(myaku.jpg); 逆算するに、脈波形は50mVp-pぐらい? 指の当てる場所、当てる強さがすごい難しくて、なれないときれいな脈波形が出てこない。 オシロ見ながらじゃなきゃ無理・・ マイコンぺには難しいかなぁ・・ *7月1日 [#t8b2b6d9] ** PSoC低消費電力化 [#n845bc70] アナログブロックを使っていない時、 global resoureceの、analog powerを、All Offにすると、 スイッチドキャパシタをやリファレンス電圧源の電源を落とす(?)のでその分消費電流が減るらしい。 要実測 http://dr.matrix.jp/psoc3.html **パスコン [#p40d6a8c] マイコンの横にはパスコンが必要!ってことで盲目的に0.1uFをつないでいたけど、 その詳細な理由は、 -電源電圧の瞬発的な変化を吸収する --ICに瞬時的に電流が流れた時、電源ラインからの供給では間に合わないので、パスコンから供給する --電源ラインに電圧変動があった場合、変動≒交流成分をコンデンサでGNDに落とす -http://www.geocities.co.jp/HeartLand-Tachibana/9059/otasuke/pascon.htm なぜ0.1uFなの? -単に安くて容量があり周波数特性に優れているのは積層セラミックの0.1u らしい -みんな使っているからデファクトスタンダードになった? --もちろんもっと高い/低い周波数のために、いろいろなコンデンサを並列に繋ぐことにこしたことはない --電源に10uFの電界コンデンサを置くのも王道 -http://oshiete.goo.ne.jp/qa/1108642.html?order=asc *6月25日 驚愕の事実の事実@SPI [#h5be481b] SPIMのクロックの上限より大きな周波数で通信しようとした、のは間違い(ぁ データシートを確かめたら、SPIMモジュールのクロックの半分の周波数が通信の周波数になるよう。 つまり8MHzをクロックに入れていたけど、実際の通信速度は4MHzで上限に収まっていた。 ということで、勘違いしていたけど、結果として上限に収まる値になっていた。 ・・・当時なぜ気づかなかった〜〜 *6月21日 驚愕の事実@SPI [#h5be481a] PSoCのSPIMのクロックの上限は4MHz。なのに、今作っている(使っている)プログラムは、8MHzで通信させようとしていた。(オーバクロック!) ・・・当時俺はなぜ気付かなかったんだろう? ・・・そして、なぜ動いてたんだろう? ・・・卒研発表これでやったよ たまに素直に動かなくなったのもこれが原因なのだろうか・・? とりあえずしっかり確認しながら設計をやっていきますorz #通信速度を落としたときに、処理時間がデッドラインを超えないかが怖い・・ [[6月25日>#h5be481b]]の日記へ続きます。 *6月17日 [#ned44e01] **ECOの周波数 [#w8bcddad] アプリケーションノートのAN32200によると、ECO(32.768kHz)は732倍されて、23.986MHzとしてIMO(=Sys Clock)の周波数になるようだ。 つまり純粋な24MHzではない。 そのことを考慮すると、[[6月3日の日記>#jc39eab7]]は考え方が違ってて、動作自体は正しかったことになる。 23.986M/12/200=9994.167Hz で、もう一度計算してみると、23.986MHz / 11 / 218 = 10.0026kHz 実測は10.0024kHzだった。前回より10kHzに近い値になった。 **分周計算スクリプト [#w65405fa] クロック周波数から、ほしいタイマの周波数を計算するのは大変なので、スクリプトを作ってみました。 すごいやっつけなので、使えないかもですが[[一応公開>http://merl.ec.t.kanazawa-u.ac.jp/micon-bu/index.php?plugin=attach&pcmd=open&file=clock.html&refer=komatsubara]] *6月10日 [#t0c0c94c] ** PSoCのコンパイル結果 [#p11e1e04] PSoCでc言語で開発して、コンパイルした結果のアセンブラファイルについて。 コンパイルすると色々なファイルが出てくるけどそのなかに、"main.lis"っていうのと、"(プロジェクト名).lst"っていうファイルが2個ある。 両方とも中身はアセンブラっぽいんだけど、それぞれどういう意味なんだろう・・? **フラグの処理 [#r5fff154] 割り込みでフラグを処理したいっていう場面はよくある。 //それぞれ、flgの値が0なら1に、1なら0にする処理 flg = ++flg % 0x02; flg = ++flg & 0x01; それぞれアセンブラで見てみると、 flg = ++flg&0x01; -------- add [_flg],1 and [_flg],1 flg = ++flg%0x02; -------- mov A,[_flg] add A,1 mov [__r0],A mov [_flg],A mov A,2 push A mov A,[__r0] push A xcall __divmodu_8X8_8 add SP,-1 pop A mov [_flg],A と、全然変わってきていた。 タイマ割り込み数をカウントするときとかも(2のべき乗の時だけだけど)後者が使えそう。 *6月8日 [#q2a741c3] ** _BV() [#n6770bba] AVRマイコンのC言語の方言(?)に、_BV(bit)っていうマクロがある。 これは、 #define _BV(bit) (1 << (bit)) という風に定義されている。 これ、実はすっごい便利。PSoCではデフォルトで定義されてないので、俺は自分で定義して使ってる。 PRT1DR |= 0x82; って書いてあるとなんのこっちゃ?って混乱してしまう。だけど、 PRT1DR |= _BV(7)|_BV(1); って書くと、あぁ、1ビット目と7ビット目を1にしたいんだな。ってぱっと見てわかる。 ほかにも、 #define LED_blue 3 ... PRT1DR |= _BV(LED_blue); PRT1DR &= ~_BV(LED_blue); とか書くと、あぁ、青色LEDを付けたい/消したいんだなってすぐわかる。 PSoCは2進数が使えるけど、他のマイコンでは使えなかったり、2進数でも8ケタになると読みにくいから、あまり使ってない・・ 他にも、AVRにはビット操作をするのに楽なマクロがいろいろある。 http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Started+Notes+-+Ports#p9 ** Timerの周期 [#yc76b746] dataseetによると、 OutputPeriod = sourceClockPeriod x (periodRegisterValue + 1) となっている。 今たとえば、Sysclockを24MHz、sourceClockPeriod(VC1の値)を12のとき、 10kHzがほしい時は、periodRegisterValueを199にしなければならない。 今まで200を入れていたけど、厳密には間違いだったようだ・・orz 実測してみると、 |period|frequancy[kHz]| |200|9.94438| |199|9.99410| 約50Hzずれている。(10kHz/200= 50Hz) *6月3日 PSoCで水晶を使う [#jc39eab7] PSoC内蔵のクロックだけ(ILO)だと、最大+/-2.5%ずれる精度(accuracy) ここで、外付けの水晶を使うと、さらに高精度(accuracy)になる、はず。 やり方はTechnical Reference Manual(http://www.cypress.com/?rID=3208 )に書いてあるけど、 Application NoteのAN2027(http://jp.cypress.com/?id=1029&rtID=5&rID=26009 )の方が詳しい。 #というか最初TRMだけ見てたらハマった・・ **手順 [#y2c6589f] P1[0]とP1[1]の間に水晶を置き、それぞれの端子からコンデンサを付けてVddに繋ぐ。 Designerで、それぞれのピンの設定を以下のようにする。 | |Select|Drive| |P1[0]|XtalOut|Hight Z| |P1[1]|XtalIn|Hight Z| グローバルリソースを変更 |32k_Select|External| |PLL_Mode|Ext_Lock| 結論から言うと、P1[1]側に12pF、P1[2]側に100pFをつなげる(20 Pin SSOPの場合)。 PLLを使わない時は、TRMに書いてあるようにC1とC2(≒20pF)でいいんだけど、 実際使うときはPLLモードで使う(らしい)。 #ここは読んでてもなんとなくしか理解できなかった・・ **注意点 [#o8370c9a] P1[0]とP1[1]は、プログラムを書き込むピンでもある。水晶をつなげたままでもプラグラムは書き込める。 ただし!実行させるときはMiniProgは外さないといけない。MiniProg容量負荷が大きすぎる?のか水晶がしっかり発振できない。 &ref(miniprog.jpg,,50%); **結果 [#r6ebc1b1] 10kHzごとにパルスを出してみた。オシロスコープの周波数カウンタの表示。 |ILO(内蔵)|10.07kHz| |ECO(水晶)|9.94434kHz| -Accuracyは大体同じ値になった。 --#水晶〜端子間の基板レイアウトをうまくすればもっといい値が出た? -Precisionは違いが出てきた。 --ILOが10.070kHz〜10.074kHzの値をうろうろしていたのに対し、ECOは9.94434kHzでずっと一定だった。 追記→[[6月17日の日記へ>#ned44e01]] 考え方が違ってて、動作自体は正しいです。 **参考 [#w4bda9c7] ここのサイトがすごくまとまってました。http://bluefish.orz.hm/sdoc/psoc3.html *6月1日 [#u830c0a1] **オシロスコープ(TDS2024B)のUSBへのデータの保存 [#tfd4027e] 先生のページ(http://akita11.jp/plan/osc/ → Know-hows / Tips)に書いてあった。 手持ちの、Trancend 2GBではちゃんと波形を保存できました! **PSoC timer8の割り込み周期 [#md49642f] グローバルリソース SysClk 24MHz CPU_Clock CycClk/1 //割り込み関数 #pragma interrupt_handler Timer8_ISR void Timer8_ISR(){ //LEDモジュール LED_On(); LED_Off(); } 上の条件の時、タイマ割り込みの周期の上限は約46kHzだった。 これ以上の周期で割り込みをかけようと思っても、46kHzで頭打ち。留意しましょう。