| 2005/01/01? 〜 | |
| K.I | |
インベンションボード上の CY8C27443を使った方が簡単で良いんだけど、今度は手持ちのCY8C27443を単体で動かしたいので、PSoCライタを用意しよう。
インベンションボードを書込み機として使う。
書き込みに使用するport1-0とport1-1を使わないようにすれば、ライタを繋いだままでデバック出来るから凄く便利だ。
もちろん、InventionボードにはPSoCが載ってるから、Externalをチェックしなければ、そのまま書込み可能だ。
→訂正:本当は水晶の両端に付いてる容量はVcc側に接続します。
こう書くと、もしかすると実験基板は絶対必要と思っちゃうといけないので、一応書いておきます。
作成した実験基板で、はじめてのPSoCのサンプルを、ざっと試してみた。
この章はデザイナの使いかたの説明なので、
すんなり動きました。実験基板の配線は大丈夫だな。
この章は、BPFの設計が肝みたい。 これは、PSoC Designerと一緒にインストールされるExcelファイルで計算出来る。
この章はデジタル入出力と割り込みの説明。以前は結構苦労したけど。
一気に5章までのサンプルを作ってみて、 あらためてPSoCの能力と使いやすさを感じることが出来た。
欲を言えば、機能別に説明されたリファレンス的な本も欲しいかも。
サンプルだけ動かしていてもつまらないので、いろいろやってみよう。さて、何をしようかなぁ。
やってみましたが、どちらに回しても全然動かない。これは、まぁしょうが無いよね。
実はロータリーエンコーダは、最初うまく動作しなかった。つまらない失敗だったけど反省のために、記録。。。
いろんな方法で、やってみたんだけど、やっぱり安定動作にならない。この際、ディレイでも付けるかと思ったけど、秋月のキットではちゃんと動作してるんだよなぁ。どうしてるんだろ。
テストオシレータは、元々タイマ割込みでスイッチを読み込んでいる。
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);
}
}
cfreq = 0;
set_freq(cfreq);
psw = 0xff;
while(1) {
csw = PRT0DR; // get current SW
if ((csw & SW_UP) && (csw & SW_DOWN)) { // current SW all off?
if ((~psw & SW_UP) || (~psw & SW_DOWN)) {
if (~psw & SW_UP) { // past SW_UP on?
cfreq = (cfreq+1) % NUM_FREQ; // count up!
}
if (~psw & SW_DOWN) { // past SW_DOWN on?
cfreq = (cfreq-1+ NUM_FREQ) % NUM_FREQ; // count down!
}
set_freq(cfreq);
}
}
psw = csw; // save past SW
}
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割込み許可
結局、元々のオリジナルのタイマ割込みが一番良さそう。
PICだと、 最初にコンフィグレーションレジスタに発振回路の選択を書き込むだけなので簡単に考えていた。
英文マニュアルを読んで、自分なりに理解したこと。(間違ってるかも)
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
また何か間違ってるのかなぁ。。。
最初は見逃していたけど、 CY8C27XXXのpdfにもクロック系統の図があった。でも、 これを見てもいまいち分からない。というか疑問に思うことが多い。
もしかすると、 PSoCデザイナの設定では出来ないような接続が存在するのかなぁ。
うーん。分かんないことだらけだ。。。
32k_Selectと PLL_modeの設定と、水晶の組合せを調べ直してみた。
32k_Select PLL_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_Select PLL_mode 32kHz水晶 40kHz水晶 水晶なし
External
Ext_Lock 9.98〜10.02kHz 12.20〜12.23kHz 8.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