PSoCをはじめよう

by K.I
2005/01/01? 〜

Index


概要


[top]

PSoCライタ

インベンションボード上のCY8C27443を使った方が簡単で良いんだけど、今度は手持ちのCY8C27443を単体で動かしたいので、PSoCライタを用意しよう。 →10Pのフラットケーブルの片側だけ使って接続する。

書込み方法

インベンションボードを書込み機として使う。 書き込みに使用するport1-0とport1-1を使わないようにすれば、ライタを繋いだままでデバック出来るから凄く便利だ。 もちろん、InventionボードにはPSoCが載ってるから、Externalをチェックしなければ、そのまま書込み可能だ。
1実は以前はこれを知らなかったので、いちいちUSBケーブル抜いてました。。。

[top]

実験基板について

→訂正:本当は水晶の両端に付いてる容量はVcc側に接続します。

インベンションボードだけでも大丈夫

こう書くと、もしかすると実験基板は絶対必要と思っちゃうといけないので、一応書いておきます。
[top]

サンプルを動かしてみよう

作成した実験基板で、はじめてのPSoCのサンプルを、ざっと試してみた。

LED点滅

この章はデザイナの使いかたの説明なので、 すんなり動きました。実験基板の配線は大丈夫だな。

LED正弦波ドライブ

この章は、BPFの設計が肝みたい。これは、PSoC Designerと一緒にインストールされるExcelファイルで計算出来る。

GPIO

この章はデジタル入出力と割り込みの説明。以前は結構苦労したけど。

温度計

テストオシレータ

感想

一気に5章までのサンプルを作ってみて、あらためてPSoCの能力と使いやすさを感じることが出来た。 欲を言えば、機能別に説明されたリファレンス的な本も欲しいかも。
[top]

ロータリーエンコーダ

サンプルだけ動かしていてもつまらないので、いろいろやってみよう。 さて、何をしようかなぁ。 やってみましたが、どちらに回しても全然動かない。これは、まぁしょうが無いよね。

おかしなロータリーエンコーダ

実はロータリーエンコーダは、最初うまく動作しなかった。つまらない失敗だったけど反省のために、記録。。。

あぁ、勘違い

いろんな方法で、やってみたんだけど、やっぱり安定動作にならない。 この際、ディレイでも付けるかと思ったけど、秋月のキットではちゃんと動作してるんだよなぁ。どうしてるんだろ。

タイマ割込みで

テストオシレータは、元々タイマ割込みでスイッチを読み込んでいる。
        cfreq = 0;
        set_freq(cfreq);
        psw = pdat;
        while(1) {
                csw = pdat;                     // スイッチ情報取得
                onsw = ((psw ^ csw) & ~csw);    // '1'から'0'に変化したものを抽出s
                psw = csw;
                if (onsw & (SW_UP | SW_DOWN)) { // UP/DOWNスイッチのいずれかが押された
                    if ((onsw & SW_UP) && (csw & SW_DOWN)) {
                        cfreq = (cfreq+1) % NUM_FREQ;           // count up!
                    }
                    if ((onsw & SW_DOWN) && (csw & SW_UP)) {
                        cfreq = (cfreq-1+ NUM_FREQ) % NUM_FREQ; // count down!
                    }
                    set_freq(cfreq);
                }
        }

割り込みなしで

I/Oの割り込みで動かす

set_freq内で、LCD表示せずmainで表示するようにして3、以下のようにI/O割り込みで動かしてみる。
        #pragma interrupt_handler PSoC_GPIO_ISR()       →boot.asmにも割込みベクタが必要

        void PSoC_GPIO_ISR()
        {
                unsigned char cdat;
        
                cdat = PRT0DR;
        
                if ((~cdat & SW_DOWN) && (cdat & SW_UP)) {
                  cfreq = (cfreq-1+ NUM_FREQ) % NUM_FREQ;        // count down!
                }
                if ((~cdat & SW_UP) && (cdat & SW_DOWN)) {
                  cfreq = (cfreq+1) % NUM_FREQ;                  // count up!
                }
                set_freq(cfreq);
        }

                :
                略
                :
        INT_MSK0=INT_MSK0_GPIO;        // I/O割込み許可
結局、元々のオリジナルのタイマ割込みが一番良さそう。
2if文以外は、オリジナルのままです。カウントUPDOWNのやり方は自分流に書き換えたけど。まぁ意味なし。
3LCD表示は時間が掛かるから、速く回した時に、追い付かなくなる。

[top]

外部水晶発振

PICだと、最初にコンフィグレーションレジスタに発振回路の選択を書き込むだけなので簡単に考えていた。 英文マニュアルを読んで、自分なりに理解したこと。(間違ってるかも)

ECOの起動手順

ECOの起動手順としては、

水晶の接続

AN2027には、他にもいろいろ書いてあるので、良く読んだ方が良さそうだ。 AN2014をみると、とりあえずは、水晶を接続したままでも書き込めそうな気がする。→いや、実際書き込めてるんですが。

動かしてみよう

また、テストオシレータの回路で、試してみることにした。
        CPU_SCR1  |=  0x04;     // ECO_Ex
        OSC_CR0   |=  0x40;     // PLL_Mode
        OSC_CR0   |=  0x80;     // 32K_Select
PSoCデザイナで設定すれば、そんなことしなくても良いみたい。
Global Resource
32K_Select External
PLL_Mode Ext Lock
X'talの接続されている端子は以下のように設定。
Port Select Drive
P1[0] XtalOut High Z
P1[1] XtalIn High Z
また何か間違ってるのかなぁ。。。

PSoCのクロックってどうなってるの?

最初は見逃していたけど、CY8C27XXXのpdfにもクロック系統の図があった。 でも、これを見てもいまいち分からない。というか疑問に思うことが多い。 もしかすると、PSoCデザイナの設定では出来ないような接続が存在するのかなぁ。 うーん。分かんないことだらけだ。。。

水晶を付け替えてみる

32k_SelectとPLL_modeの設定と、水晶の組合せを調べ直してみた。
32k_SelectPLL_mode 32kHz水晶 40kHz水晶 水晶なし
External Ext_Lock 8.51kHz 8.51kHz 8.51kHz
Disable 10.05kHz 10.05kHz 10.04kHz
Internal Ext_Lock 8.51kHz 8.51kHz 8.51kHz
Disable 10.04kHz 10.04kHz 10.05kHz
水晶発振の接続自体は簡単なので、間違いなさそうなんだけど、、、

もしかすると

ここまで書いてみて、ちょっと大事なことに気が付いた。
32k_SelectPLL_mode 32kHz水晶 40kHz水晶 水晶なし
External Ext_Lock9.98〜10.02kHz12.20〜12.23kHz8.92〜9.07kHz
Disable 10.08kHz 10.07kHz 10.08kHz
Internal Ext_Lock 8.53kHz 8.54kHz 8.54kHz
Disable 10.08kHz 10.08kHz 10.08kHz

4古い仕様の方が読み易いんじゃないかなぁ。新しい仕様は回りくどい書き方のような。。。
5じゃ、32k_Select→external、PLL_mode→Disableは意味あるのかなぁ。


comments powered by Disqus