Hatena::ブログ(Diary)

aasoukai128の日記

2012-03-03

C言語でC++のclassっぽく関数を呼んでみた

Cのstructureに、関数ポインタを入れただけです。

元ネタはここです↓
http://blogs.wankuma.com/nagase/archive/2007/10/25/104031.aspx

こんな感じにソースを書いて、

/* funcptr.c */
#include <stdio.h>

typedef struct _SerialClass {
    int (*Write)(const char *, ...);
} Serial;

Serial s = {printf};

int main(void)
{
    s.Write("Hello World!!\n");
    return 0;
}

gccコンパイルして、ちゃんとHello Worldできました。

2012-02-05

PSoC1でコンパレータ割り込み

PSoC1のコンパレータの割り込みですが、COMPモジュールのデータシートにはっきりと書かれていなくて混乱したのでメモしておきます。
きっとチップのデータシートをちゃんと読めば分かるんでしょうけど、とりあえずこう設定したらこう動いたという点のみです。


コンパレータの出力で割り込みをかけたかった時に、データシートには割り込み許可の関数だけ書いてあって割り込みのソースがどこかは書いてなくて混乱していたのですが、
とりあえずCOMPモジュールのComparator Bus出力をEnableにして、Busの一番上についてるロジックをNOTにして動かしたところ、COMPに入れる電圧を下げていくときのみ割り込みがかかりました。

f:id:aasoukai128:20120206012508j:image

たぶんComparator Busの出力が割り込みソースになってて、ここでL→Hで割り込みがかかるんじゃないかと思います。

(ちゃんとデータシート読まないとだめですね...)

SDNで染める

東急ハンズSDNというプラスチック用の染料が買えて、いろんなプラスチックを染めることができるらしいです。
@HirakuTOIDAさんに少量分けていただいて、実験してみました。

(実際には1月の頭にやったんですが、書くのを忘れていましたw)

http://www.osaka-kaseihin.co.jp/sdn.htm
ここに、詳しい使い方が書かれているので、参考にしてやりました。
どのくらい染まるか試してみるということで、先日のMTM07で買ったArduinoエンクロージャを染めてみました。
f:id:aasoukai128:20120104112413j:image:w360

指示通りに、80℃くらいまで温めます。ビンに溶液を入れて湯煎し、弱火で湯気が立つくらいまで加熱しました。
濃度は20:1と書かれていましたが、透明のアクリルを薄く染めたかったので
40:1くらいで使用しました。
f:id:aasoukai128:20120104114517j:image:w360

湯気が立つと強烈なにおいがしてくるので、ラップでふたをしました。

ときどき割りばしでつまんで引き上げながら、染まり具合を確認しつつ...

20分ほどでいい感じの色に染まったので、水洗いして乾燥させます。
(このとき机に液滴を飛ばして、黒いしみを作ってしまいました)
f:id:aasoukai128:20120104124422j:image:w360

きれいに染まりました。
ただ、アクリルのふちは横からも染料がしみていくので、当然中央部より若干濃くなります。
emerge+と彫られているところの周りは複雑に入り組んで濃くなっています。
それ以外にも、アクリルに貼ってあった紙の接着剤が残っていて、その部分でむらができました。
他にも手の油のあとなんかが若干むらになって見えたので、浸ける前にアルコールか何かできれいに洗浄したほうが良さそうです。

組み立てるとこんな感じになりました。
f:id:aasoukai128:20120104132632j:image:w360

他にも、LEDとか基板とかコネクタとかを染めてみました。
LEDはメーカーによって染まり方が違ったので、適当に放り込んだら染まりすぎてほとんど光ってるのが見えなくなってしまったものもできました(笑
基板はこんな感じです。紙フェノールです。
f:id:aasoukai128:20120104150913j:image:medium

写真はないですが、コネクタは非常にきれいに染まりました。

もともと板厚の薄いスモーク透明のアクリル板を手に入れるために考えていた方法なので、今回の結果は満足でした。
スモーク透明はLEDの上に重ねると黒いフェイスできれいに仕上げることができて結構好きなんですが、ホームセンターに行くと扱ってるのがブラウンスモーク透明ばかりでなかなか自由に選べなくて困っていました。
この方法なら手軽で、濃さも板厚も自由にできて良さそうです。

2011-12-31

PSoC1のRX8モジュール

RX8モジュールで2回も同じミスをしたのでメモしておくことにします。

RX8モジュールの"RX8_iReadChar()"という関数を使って受信したデータをポーリングするプログラムを書いていたのですが、このRX8_iReadCharは、上位バイトにステータス、下位バイトにデータを返すようになっています。
上位バイトの戻り値については、データシートには下のように書いてあります。
f:id:aasoukai128:20111231105610p:image:w360

これを見て、上位バイトに0x0eが入っていれば下位バイトには正常に受信されたデータが入っているんだろうと思って、
if(RX8_iReadChar() == 0x0e30) { ... }
のようなコードを書いていたのですが、これでは動きませんでした。

結局これは勘違いで、データシートの直前に"If the MSB is non-zero, an error has occurred."と書いてあり、正常に受信された時は上位バイトは0になっているとのことです。
コードは
if(RX8_iReadChar() == 0x0030) { ... }
と変更して、問題なく動くようになりました。


実はこれ半年前にも1回やっていて、そのことをすっかり忘れてまたやってしまいました。

2011-12-07

Creator 2.0でUSB

Creator 2.0でUSBを使うプロジェクトをビルドしようとしたら、CyDsFitが
USBを使うためにはIMOは24MHzのXTALでなければならない」
と言って来ました。
例のPSoC5基板にはXTALを載せるためのパターンがないですね。


これをかいくぐる方法が思いつかないので、しばらくはCreator 1.0で開発して、ブートローダだけ2.0付属のものを使っていこうかと思います。

手元の基板、XTALが載るように改造しようかな...

Creator 2.0付属のブートローダ

Creator 2.0になってブートローダも新しいものが付属しているはずだ、と思い実験しました。

起動してみます。1.0のときよりウィンドウが大きくなりました。
f:id:aasoukai128:20111207160438j:image:w360
昨日書いたとおり、USBの入ったプログラムを書きこんでみると、正常に書き込みができました。
ブートローダとしての機能に問題はないようです(笑

本題はここからです。
USBの入っていないプログラム(書き込むと2秒で切断となり、場合によってはデバイスドライバインストールできなくなるもの)を書き込み、その後デバイスマネージャを開いてドライバを一旦削除します。
f:id:aasoukai128:20111207160443j:image:w360


この状態でリセットを押すと、再度ドライバインストールが始まります。
f:id:aasoukai128:20111207160439j:image:w360

案の定、インストールに失敗しました(デバイスが接続されていません)となりました。
f:id:aasoukai128:20111207160440j:image:w360

2.0のブートローダを起動して、プログラムを書きこむと
f:id:aasoukai128:20111207160441j:image:w360
あれ、書けました。

心配なのでもう一度ドライバを削除し、こんどは1.0のブートローダで書き込みます。
f:id:aasoukai128:20111207160442j:image:w360
ちゃんと失敗しています。
これを閉じて2.0のブートローダで書き込むと、今度も書けました。
その後何度かドライバの再インストールを繰り返し、何度か再起動もしましたが、書き込みには失敗しません。

結論:
Creator 2.0のブートローダでは、何を書きこんでも問題ない。
というわけで、昨日書いた内容は1日でお役ごめんとなりました。


追記:
これらは全部Windows7 32bit上で実験したものです。他のOSだと違う振る舞いをするかもしれません。

PSoC Creator 2.0リリース

PSoC Creator 2.0がリリースされたようです。
http://www.cypress.com/?id=2494&source=header
ここから、ダウンロードできるようになっています。

リリースノートによれば、1.0から変わった点は、
・PSoC5のProduction版のデバイスに対応した(CY8C5568AXI-060がリストに追加されました。それに伴い、今までの5588はES1品のみ対応になったみたいです)
・CANとか、LINとか、S/PDIFとか、EMIFとかのインターフェイスが追加された(でもEMIFはPSoC3のみで、5のほうでは使えないんだとか...)
・サンプル&ホールドモジュールが使えるようになった
くらいです。

まだ余りいじってないですが、PSoC5のリリースにあわせてちょっと改善したくらいかな、という印象で、操作感はほとんど変わりません。
暇なときにいろいろいじってみます。

2011-12-06

Bootloader Hostの使い方

Bootloadableなプログラムができたら、書き込みです。
PSoC Creatorで
Tools->Bootloader Hostを起動します。
前述のエラーが起こらず正常にインストールされていれば、リセットを押して少しの間はPortsUSB Human Interface Deviceが見えるはずです。これが見えている間に書きこみボタン(ツールバーの左から二つ目)を押すと、プログラムが書きこまれます。
f:id:aasoukai128:20111206142421j:image:w360

デバイスドライバが正常にインストールされないと、ポートが見えていてもProgramを押したときに例外が発生してエラーになります。
デバイスマネージャからドライバを削除して挿しなおすことをやっているとうまくいくときもありましたが、どうしてもできなければご連絡ください

ブートローダブルプロジェクトの作成(その2)

前の記事の続きですが、ブートローダの重大な欠陥が分かったので、プロジェクトの作成方法と欠陥の対処法をあわせて書きます。

PSoC5基板に書き込まれているブートローダですが、HIDデバイスとして認識され(デバイスマネージャでは、USB入力デバイスと表示されました)、電源ONから2秒強の時間はUSBからのコマンドに反応し、それ以降はブートローダの後に書かれているプログラムに処理を移すようになっています。
ブートローダの後に何かしらのプログラムが入っているときは、新しくコンフィギュレーションがロードされるのですが、そこでUSBを使わないプログラムだと、PCからは挿して2秒強で基板が抜かれたように見えます。
ここで問題なのですが、こういう状況になったとき「2秒の間にWindowsデバイスドライバインストールし終わらない」状況が頻発するようです。
インストールが正常に終わる場合もあるようですが、失敗すると「デバイスドライバインストールに失敗しました(デバイスが接続されていません)」と出て、ブートローダで書き込もうとしても例外が発生してエラーとなります。

というわけで、その対処法です。
とりあえずはブートローダから抜けても、USBデバイスとして認識されるようにすれば良いわけです。そのためにBootloadableプロジェクトにUSBモジュールを配置し、ちゃんとUSBコンフィギュレーションがロードされるようにしておきます。

1.プロジェクトの設定
ここでもサンプルの設定を変えて使います。
型番の設定は、Bootloaderと同じにしてください。(CY8C5588AXI-060にします)
クロックの設定は、PLL_OUTを36MHzにするのに加えて、USBを使うためにいくつか設定します。Edit Clockからダイアログを開いて、
USBのところにチェックをいれ、ソースをIMO×2にする
・IMOを24MHzにする(これでUSBは48MHzになります)
ILOを100kHzにする
の3つです。(この設定が違うとエラーになります)
f:id:aasoukai128:20111206135430j:image:w640
この設定がすんだら、Bootloaderプロジェクトのcyschファイル(回路図)を開いてUSB_Bootloaderモジュールをコピーし、Bootloadableプロジェクトのcyschにペーストします。
Bootloadableプロジェクトのmain.cを開き、以下のようにコードを追加します。
f:id:aasoukai128:20111206135431j:image:w640

とりあえずこの状態でビルドが成功すれば、処理が移ってからもUSBデバイスとして認識されます。
こちらで作成したプロジェクトをGoogle Docsにアップしたのでご利用ください。
USBFS_Bootloaderがブートローダ、boottest01がUSBを入れたbootloadableです。
https://docs.google.com/open?id=0B-rZZgNwXPU4ZDI5MjRhYTItNzYyMC00MWY2LThhYzAtMWI4MDJmYjk5Mzli
機能を追加していくときは、このプロジェクトをベースにしていくと良いと思います。


【重要】PSoC5基板を購入された方で、デバイスドライバインストールに何度も失敗して困っている方は、yline5050hs@gmail.comまでご連絡ください。対処いたします

ブートローダブルプロジェクトの作成

前の記事に続いて、ブートローダで書き込みが可能なプロジェクトを作成します。
PSoC Creatorに入っているサンプルプロジェクトを基本にして、ちょこちょこいじります。

1.サンプルプロジェクトの読み込み
PSoC Creatorを起動し、
File->Open->Example Projectで、サンプルプロジェクトのダイアログが出ます。
f:id:aasoukai128:20111206115115j:image:w360
これでUSBFS_Bootloaderを選び、Add Example Project to New Workspace(これがデフォルト)として、OKします。

これでBootloaderとBootloadable projectの2つが入ったworkspaceができるので、これをいじって行きます。

2.チップの変更
元になるBootloaderプロジェクトをボードにあわせて変更を加えます。
デフォルトではPSoC3のCY8C3866AXIになっているはずですので、これをCY8C5568に変更します。
Project->Device Selectorからダイアログが出るので、CY8C5588AXI-060を選択します。(5568がダイアログに出ないので、代わりに最高動作周波数が違う5588にしておきます。詳細はデータシートの12.1 Part Numbering Conventionsあたりに書いてあるようです)
f:id:aasoukai128:20111206115116j:image:w360
クロックの設定を変えるため、Workspace Explorerからcydwrファイルを開き、その中のClocksタブに切り替えて、Edit Clockからダイアログを開きます。
ここで、PLL_OUTを24MHzから36MHzなどにします。
f:id:aasoukai128:20111206115118j:image:w360
この状態で、一旦ビルドし(Build->Build USBFS_Bootloader)、エラーが出なければ成功です。(Miniprog3を持っていればこれを書き込んでブートローダになります)

3.ブートローダブルプロジェクトの作成
注意点があります。少し長くなりそうなので次の記事に分けます。