PSoC/PSoC1/旧情報/発表会会場

Last-modified: 2010-08-24 (火) 14:53:22 (2407d)

PSoC発表会

何となくみんなに見せたくなった物の発表や、ファイル置き場等にご利用ください
新規ページ作成もどうぞ
自身のサイトで発表されているときはリンクページもあります

リングオシレータ!?

PSoC_ringosc.jpg
  • インターコネクトでループさせて、GIEからの入力はAsync にしてスルーさせる。
  • GOEへの出力は上からインバータ3段で、4回目はスルーしてます。周波数は約14.8MHzでした。
  • 4分周は実用で使えそうですが、これは一発芸みたいで、使い道は無さそうですけど。。

by K.I

AN2298-Example1

UARTバイナリ受信

  • TX8とRX8を内部で直結してとりあえず0x00~0x0Fを受け渡して液晶に出すだけ
    もうちょっと正しくやるなら最終バイトを送ってから送信完了を待つべきだけど、
    どうせ液晶表示なんて遅いし・・・ということで手抜き
    追記:
    ここでは楽するためにxxxint.asmに手を入れない方法で割り込みを扱っている。 「こんなことして大丈夫?」と思うかも知れないけど、実は大丈夫だったりする。

By JUNK-BOX

PSoCオルゴール

  • トラ技連載でMAC(積和演算器)のデモで作ったオルゴールの音とCY8C29466版のプロジェクト。
    PSoCの積和演算器の使い方のサンプル、矩形波とはまた一味違う感じの音のサンプルとして。
    ちょっと手抜きがあるので、良く聞くと「?」というところもあったりもするけどそこはご愛敬ってことで。
    • オルゴール音(エリーゼのために&ドレミ)

      以前のものがノイジーだったので、外部にCRのLPFを入れて「エリーゼのために」を再録音。今度はだいぶ綺麗に聞こえる・・はず。

  • CY8C29466版オルゴールプロジェクトファイル

    P0.3から音が出ますので、CY3210-MINIPROG1添付のボードでも大丈夫。(5kΩ+10μFくらいのCRなローパスフィルタを通してやるとシャーというノイズが消えて綺麗に聞こえる)
    P2.1はタイマ出力なので、MINIPROG1添付ボードのLEDが点灯する。
    By JUNK-BOX

E2PROMテスト

  • E2PROMのリード/ライト(27443用)
    最初は消去状態(30H)。二度目は31323334、三度目は32333435・・・と電源をOFF/ONするたびに変化するのをLCD表示。

I2CHWテスト

フォーラムの
http://www.pastelmagic.com/psocbbs/index.cgi?m=read&bnum=1130&num=1131

の回答用としてI2CHWを使って波形取りしたときのプログラム。コメント等は意味なし

PWMワンショット動作

フォーラムの
http://www.pastelmagic.com/psocbbs/index.cgi?m=read&bnum=1213&num=1213

の回答用として作ったPWMを使ったワンショット動作のサンプル。

デシメータ動作テスト

Type1デシメータの動作確認(Designer5.0使用)。P0.1から入ったデータをCounter16_1のクロックでサンプリング。Timer8_1によって256クロック毎にデシメータのデータから逆算した値を液晶に表示する。
Type1なので、27443で作成している。29466のType2デシメータはType1の上位互換なのでそのまま移植しても動くはず。Type2の機能を使えば、CPUでやってる引き算処理が不要になるので、もうちょっと楽ができる。
デューティ比によってF000H~1000Hの値を取る。符号付きなので50%で0000H、0%でF000、100%で1000Hになる
P0.5にデューティ16/256(=1/16)のパルスを出しているので、これをP0.1に繋ぐと液晶表示はF200Hになる。

ADCINCVRテスト

フォーラムの
http://www.pastelmagic.com/psocbbs/index.cgi?m=read&bnum=1393&num=1393

の回答用としてTimer出力をADCINCVRのクロックにしたプログラム。

Hi-TECH C用簡易printf

ImageCraft?用に作った簡易printfのpr.cをHi-TECH Cに対応させたもの。
ただし、Hi-TECH CのV9.61PL1の場合、

printf("%f%cC %03dm/s\n",temp,0xdf,sspeed);

のように書いたときに何故か書式文字列よりも先にtempをスタックに積むという奇妙なコードを吐くため、表示がおかしくなるという現象が発生する。表示したい数値が1つだけなら大丈夫なようなので、動作が怪しいときには複数のprintfに分割してみると良いかもしれない。

Cypress PSoC Sensor Workshop (2008/9) の Lab 2 についての検討

by ectoyfan

2008年9月に大阪と東京で開催された Cypress PSoC Sensor Workshop では
CY3210-PSoC Eval1 (チップは27443)と追加のセンサーボード(サーミスタ,赤外線(PIR)センサ,
ショックセンサ,CRフィルタ),開発に PSoC Designer 5 を使って,以下の4つの
課題について,実習が行われました.

  • Lab 1: ADCの使い方
    • Lab 1-1: ADCとVR (P0[1]をEval1のVR につないで抵抗値(電圧値)を読み取る)
    • Lab 1-2: ADCとサーミスタ(P0[6]につながれたサーミスタの抵抗値を読み取る)
  • Lab 2: 光センサ(P0[0]をEval1のLED1につないで,点灯させるとともに,消灯時の 電圧を読み取って光センサとして用いる)
  • Lab 3: PIRセンサ(P0[5]につながれたPIRセンサ(+CRフィルタ)で,物体がセンサを横切る向き(左から右か,右から左か)を読み取る)
  • Lab 4: ショックセンサ(P0[7]につながれたショックセンサーを読み取って,振動を検知する)


このうち,Lab 2 の「LEDを光センサに」のネタは 2004 年ごろネット上で話題になりまして,たとえば,

などで情報を得ることができます.興味深く実習に臨んだのですが,どうも動きが
すっきりしません.そこでいろいろ調べてみて,一応の結果を得ることができたので
リポートします.

まず,セミナー会場での指示どおりに作ったプロジェクト.(Designer 5,チップは27443,以下同じ)

手をかざすとLEDが点灯し,LCDのバーグラフが短くなって,光センサとして
機能していることがわかります.ただし,光があたっている状態ではADCINCの
出力値は0xFFすなわち飽和状態になっています.LEDが暗い時の電圧もどうも
高めです.LEDの電圧値を受けるPGAのゲインが,もともと用意していたプロジェクト

では2.667倍だったのを,会場で8倍に修正したのです.(LPF2のパラメタもいじって
いますが,こちらは目立った効果はないと思われます.)
さて,ふと思い立って,LEDを消してみたらどうなるだろう?と思いやってみました.
PGAのゲインは 2.667に戻してあります.おそらくこれがLEDの電圧の測定値から
割り出した妥当なゲインだと思われます.

いかかでしょう.非常にバーグラフがスムーズに動くと思います.これが本来の
LEDの光センサとしての能力です.LEDを点灯したために,この出力が正しく
受け取れなくなっていることがわかります.
最初,LEDにたまっている電荷を放電しないからではないかと思いましたが,
えるむさんのレポート を読む限り,放電は短時間で済むらしく,
プログラムからLEDにLを出していますのでどうも違うらしいことがわかりました.
うまくいかないなあ,とTable Talkで ぼやぼやっとぼやいたら,JUNK-BOX さん
からアドバイスをもらいました.
PGAに入る電圧は,P0[0]をHi-Z AnalogにセットときはLEDの電圧になりますが,
P0[0]をStrong にすると,LED点灯で5V,消灯で0VがPGAにかかることになります.
PGAの後ろにはコーナー周波数30HzのLPFがあるので,LED点灯時の影響がなくなって,
LEDの電圧が正しくADCINCで検出されるようになるには,コーナー周波数に対して
十分長い時間,たとえば1周期分(1/30=33.3ms)程度の時間が必要ではないかと
いうことです.
それをやってみたのが次のプロジェクトです.

Timer16を使って0.1ms単位の時間待ち関数を作りました.待ち時間を短くすると,
出力が正しくなくなっていくことがわかります.夜の室内だと,たとえばこんな
挙動になると思います.

  • リセット直後は比較的高い値.
  • 手をかざして暗くすると数値が下がる.
  • 手をどけてもとに戻しても,もとの数値にもどっていかない.
  • 強い光を(懐中電灯などで)当てていったん飽和させると元に戻る.

さて,これでいちおう動くのですが,LEDが暗いですね.30msも消灯しているので
さすがにちらちらしてしまいます.そこで,消灯時間をなんとか短くできないか
チャレンジしてみます.つまり,LEDを付ける直前にPGAに来ていた電圧をどこか
に記録して,LEDをつけている間は,その電圧がPGAにかかるようにしてやればいい
と考えました.SCBLOCKでサンプル&ホールドができるというApplication Note
(AN2350,「PSoCマイコン・トレーニングキット」のCD-ROMに収録されている)も
読みましたが,結局,ええい,DAC8 で作っちゃえ(笑),と.なんとももったい
ないというか何と言うか,まあでもPSoCでないとできない芸当ではあると(笑).

DAC8の出力をP0[4]に出しておき,AMUX4を使ってPGAの入力を切り替えます.
あと,光電流によりLEDの電圧が上がってくるまで数ms単位でかかるようで,
暗いほど時間がかかるようなので,そのための時間を見てから,AD変換を
行うことにしました.
努力した割にはあまりぱっとしないのですが,そもそもこのサンプルプロ
ジェクトが実際の場面にどう結びつくのかはっきりしていない,すなわち
仕様が明瞭に定まっていないので無理もないなあ,と思います.会場で質
問した(おそらく日本サイプレスの技術の)人は,光通信に使える(一つ
のデバイスで送信も受信もできる)といっていましたが,いやそれだった
らLEDの制御を変えないと(電圧モードでなくて電流モードでやらないと)
いけないんじゃないかな~,と思ったことでした.ただ何となく動けば
いい,という課題の作り方では,参加者を惑わせるだけじゃないのかな,
と考えます.(だからゲインをいじってなんとか動かしてお茶を濁す
ことになってしまうんだと思うよ…ぶつぶつ…)

自己停止カウンタ

by JUNK-BOX

ネーミングのセンスが無いのはご勘弁.PSoCフォーラムへの回答として作っもの.
24ビットカウンタのTC出力をEnableに戻して,TCが出たらカウンタを停止させる.
実験にはCY3210-MINIEval1基板(CY3210-MINIPROG1などに付属)を使ったたので
P20とP21にLED('H'で点灯),P14はプルダウンでVddとの間にスイッチ.
電源を入れると0.5秒後にP20のLEDが,1秒後にP21のLEDが点灯する.
スイッチを押すと両方とも消灯,スイッチを離すと再び0.5秒後,1秒後に点灯する.

PSoCオペアンプ

by JUNK-BOX

フォーラムにあったPSoCのCTブロックを単体オペアンプとして使えないかという質問を受けてちょっと試してみた。PSoCのPGAは増幅やコンパレータとして動作させるのが基本だけど,単体のオペアンプ製品のように+とー入力の両方を持たせてみようというもの。 仕掛けは単純で、PGAを二つ用意して、一方をコンパレータとして動作させる。この-入力側にPGAによるボルテージホロワ(要するに増幅率1.0のPGA)をつけることで,二つで一つのオペアンプのようにしようという考えで,要するにこんな感じ。

OpAMP_s.PNG

サンプルではPGA_1側(ACB00に配置した)を+入力と出力用にして,PGA_2(ACB01)を-入力用とした。やることは

  • PGA_2のゲインを1.000にする
  • ACB00CR1のNMuxを"000"にしてACB01を選択

というだけ。 (サンプルではついでにPGA_2側のTestMux?を弄ってP0[5]ピンにAGNDを出力してみた)

E2PROMライブラリソースコード

by JUNK-BOX

E2PROMユーザモジュールのソースではSROM操作のためのライブラリを呼んでいるのだが このライブラリのアセンブリ言語のソースファイルが見当たらない模様なので, .lstファイルから切り出してみた.解読は・・・そのうち暇があればということでとりあえずアップだけ.