迷走の果て・Tiny Objects

迷走する日々の覚え書きです。自分で分かってることは省略してますので、念のため。

PSoC Express World Tour

三月にまたセミナーがあるようです。
PSoC Express World Tour
一部引用します。

カスタマイズも可能な簡単設計ツールPSoC Expressのセミナーを開催!

PSoC Expressは、PSoCデバイスを使って、LED、スイッチ、センサー、ファン、シリアルインターフェース(SPI, I2C, UART, USB)、CapSenseなど様々なオブジェクトを組み合わせたエンベデッド アプリケーションの完成を画期的にスピードアップ及び簡素化させる設計ツールです。


PSoC Expressはほとんど使ったことがないので行ってみようかな。
只でもらえる開発キットが目的ではありません。
終了後の懇親会でたらふく飲み食いするのが目的だったりして(汗)、今回はあるのかな・・・。
スポンサーサイト

周波数カウンタの入力回路

dfreq070125_3
ちょっとした実験なので入力回路は図のようにしていた。
C=0.1μF、R1=R2=10KΩ。
これにカラーサブキャリア信号を入れたところ、カウント値がおかしい。
2Vp-pはあるので十分なはずなんだが。

そこでPSoCのデータシートからGPIOの直流特性を読んでみると
VIL(Input Low Level) 0.8 V max
VIH(Input High Level) 2.2V min
となっている、中間は1.5V、これはTTLレベルじゃないか。
てっきりVcc/2辺りと思っていたのだ。
そこでR1=20KΩにしてみたところ正常にカウントするようになった。
あくまで間に合わせなので大振幅の信号を入れるとポートがいかれるおそれがある。
2SK241でも使って簡単なアンプを作ってみようか。

デュアル周波数カウンタ・その後

クロックを秋月電子の超高精度クリスタルモジュールに変更。
dfreq070125_2

以前作ったカラーテレビ放送のサブキャリア信号を取り出す回路に接続してみた。
dfreq070125_1

表示は3.579548MHz、3.579545MHzとずれがある。
実は最初は3.579545MHzと表示していたのだけど、寒かったのでエアコンを入れたところ周波数が変動してしまった。エアコンの熱風吹き出し口直下、距離にして一メートルぐらいところに置いているのでかなり影響を受けたみたいだ。
このオシレータモジュールは±3ppm/℃だからこれぐらいの変動はやむをえないか。

【追記】
考えてみれば±3ppm/℃はおかしい、10℃の温度変化で±30ppm変化する事になるのだが。
秋月のサイトでは(今のところ)

◆温度特性:±3ppm/℃(-20~60℃)

となっている。
買ったときに付いてきたデータシートをみると

±3ppm(-20~60℃)

となっているではないか。
-20℃から60℃の温度変化で±3ppm、これならわかる。
なんだ、サイトのミスですな、こりゃ。

初めてのISSP

rangefinder070121_1
初めてのPSoCマイコン第八章の超音波距離計を作ってみた。
そのまま作るのも芸がない(汗)ので外部に32.768KHzのクリスタルをつけてみた。
rangefinder070121_2
DesignerのGlobal Resourcesで32K_SelectをExternalにする。
このままGenerate Apllicationを実行すると、以下の警告がでる。

Starting DRC...
Processing top level rules...
Level 2 Warning - Configuration usrange: When 32K_Select is set to external Crystal, Port_1_0 and Port_1_1 should be set to High Z.
Processing base device rules...
Base Device CY8C27000:
Processing part rules...
Processing user module rules...
Done

Port_1_0とPort_1_1の設定を変えてね、ってことですが、これは自動で設定して欲しいモンです。
rangefinder070121_3


今までは自作の実験ボードでプログラムしてからターゲットボードに移し替えていたけど、今回初めてISSPをやってみた。
注意する点はProgramming ModeをPower CycleではなくResetで行うこと。
rangefinder070121_4

PSoC ProgrammerのHelp→Selecting a Programming Modeから引用する。

Selecting a Programming Mode
Programming Mode determines how PSoC Programmable System on Chip Programmer acquires the device for programming. There are three modes:

Reset – Used for ISSP header programming on a self-powered target application board. In this case, the target board supplies the power and the programmer uses the reset pin to acquire.

Power Cycle – Used for programming when the programmer requires power. The programmer cycles power to acquire.

Power Detect* – Used for ISSP and MiniProg1 (support coming soon). The programmer detects when the target systems’ power is applied then acquires the device.

*Power Detect is not an enabled function on the current release of PSoC Programmer.

Click the Power Device checkbox if your target board is not self powered.


E2PROMのための覚え書き

次に試したいのが、E2PROM
そのための覚え書き。

int offset;
・・・・・・・・
E2PROM_1_E2Read(0,(char *)&offset,2);
・・・・・・・・
E2PROM_1_bE2Write(0,(char *)&offset,2,25);


float値をE2PROMで読み書きしたいのだけど、上記の
intをfloatに変えるだけでいいのかな?

本日はこれまで、おやすみなさい。

発酵器の温度コントローラ

ようやく発酵器の温度コントローラが出来そうだ。heater070114_1

製作途中、真ん中の黒い箱はACアダプタ。トランスやダイオード、三端子レギュレータ使って電源を作るより楽だと思ったから。
heater070114_2

テスト中、ACアダプタ保持のためのネジが格好悪いかも。
ボタンで設定温度を上げ下げする、割り込みで処理している。
右は昔作ったアナログ式コントローラ。

解明

原因がわかった。
ポートをPull Upにして1を出力という、PSoCではよく使う手が今回はよくなかった。
昨日と同じくP_0_7にスイッチ、P_0_0にLEDをつなぐ、今回はユーザーモジュールLEDは使わず、ポートをビット操作する。
以下のプログラムを走らせてLCDの表示を見ていて気付いた。
// C main line
//----------------------------------------------------------------------------

#include <m8c.h> // part specific constants and macros
#include "PSoCAPI.h" // PSoC API definitions for all User Modules

#pragma interrupt_handler GPIO_INT

int flag=0;

void GPIO_INT()
{
flag=1;
}

void main()
{
M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
M8C_EnableGInt;
LCD_1_Start();
PRT0DR=0x80;
while(1){
LCD_1_Position(0, 0);
LCD_1_PrHexByte(PRT0DR);

if (flag==1){
PRT0DR^=0x01;
flag=0;
}
}
}
割り込みルーチンでflagをセットする。
メインルーチンではflagがセットされていたらP_0_0を反転させる。

スイッチが押されると割り込みが掛かりflagをセットしてすぐにメインルーチンにもどる。
スイッチを押して離す時間より割り込み処理の方がはるかにはやいので、メインルーチンにもどったときはスイッチはまだ押されたまま、すなわちP_0_7は0のままだ。ここで
PRT0DR^=0x01;
を実行すると、ポート0を読み取り、ビット0だけを反転させてポート0に書き込み直す。P_0_7は0のままだから結果P_0_7は0に上書きされてしまう。以後P_0_7は入力ポートとして機能しなくなる。
LED_1_Invert(); もポートを読んで、ビット操作をして、書き直すということをしているはずだ。

対策としては
(1)Pull UpをやめてHighZにし、プルアップ抵抗を外付けする。
(2)0に書き直されてしまったP_0_7を再度1にする。
(3)スイッチが離れるまで待つ、すなわちP_0_7が1になるまで待つ。

(3)はスイッチを押している間処理がとまるのでやりたくない。

いただいたコメントにあったように、同じポートを入力と出力の両方に使おうとすると気をつけないといけない。

また一つ勉強になりました。

割り込みで悩まされる

実は今までPSoCで自前の割り込み処理を書いたことがない。
そろそろやってみようかと思い、まずは一番簡単そうなGPIO割り込みを試すことにした。
interrupt070109
図のようにP_0_7にチャッタリングキャンセル用のCRをつけたスイッチをつなぐ。
PSoC Desingerで P_0_7をPull Up、InterruptはFallingEdgeにする。プログラム中でP_0_7に1を出力するようにしておくのを忘れないようにする。

ユーザーモジュールLEDをP_0_0にセットする。

割り込み処理は単純で
void GPIO_INT()
{
LED_1_Invert();
}
これだけ。
スイッチを押すとLEDがOn/Offを繰り返す、はずなのだが、動かない。
psocgpioint.asmには

PSoC_GPIO_ISR:


;@PSoC_UserCode_BODY@ (Do not change this line.)
;---------------------------------------------------
; Insert your custom code below this banner
;---------------------------------------------------
ljmp _GPIO_INT
;---------------------------------------------------
; Insert your custom code above this banner
;---------------------------------------------------
;@PSoC_UserCode_END@ (Do not change this line.)

reti

と書いたし、割り込み許可もしてるのに。

不審に思い、P_0_7の電圧を測ると、0.01V。
おかしい?プログラム中でちゃんとP_0_7に1を出力するようにしてるのに。

最初から電圧を測ってみる。
はじめはちゃんと5V近くあるが、スイッチを押して離すと0.01Vのまま。

思いたってLEDをP_2_0に変更したら、これがちゃんと動作するのだ。
スイッチとLEDを同じポートにするとなぜか動かず、異なるポートにすると動く。
ポートをあれこれ変えてみても同じだった。

割り込み処理を空っぽにすると、すなわち
void GPIO_INT()
{

}
としてみると、スイッチを押して離せば入力ポートの電圧は5Vになる。正常なようだ。

GPIO割り込みで使ってるポートをいじってはいけないんでしょうか?まさかね・・・。
原因不明、もうしばらくあれこれ試してみよう。

何かとんでもない見落とししてるのかも・・・。

サーミスタ温度計

以前試したサーミスタ温度計M.H.E.さんの基板で作ってみた。
使ったサーミスタは以前と同じく石塚電子の103AT-11
temp070106_1

temp070106_2

temp070106_3

消費電流は36mA、ちょっと多いような。
ガスファンヒーターの温風というか熱風吹き出し口にサーミスタを差し込んで測定したら100度を超えてしまった。
103AT-11の使用温度範囲は105度までだけど、大丈夫かな。

腋の下にはさんで体温を測定したら36.6度と出た。
103AT-11の熱時定数が75sと大きいためか、安定するには時間がかかる。

Internal Low Speed Oscillator

SleepTimerのクロックはInternal Low Speed Oscillator(ILO)だけど、これどのぐらい正確なんだろうか?
Technical Reference Manualの109ページから一部引用する

The Internal Low Speed Oscillator (ILO) is an oscillator with a nominal frequency of 32 kHz.
It is used to generate Sleep Wake-up interrupts and watchdog resets.
This oscillator can also be used as a clocking source for the digital PSoC blocks.
The oscillator operates in three modes: normal power, low power, and off.
The Normal Power mode consumes more current to produce a more accurate frequency.
The Low Power mode is always used when the part is in a power down (sleep) state.
Low Power mode can be selected when the device is not asleep, but the oscillator’s output frequency is less accurate.
The Off mode turns the oscillator off.


スリープ時はローパワーモードになるが、周波数の精度は落ちる、ということか。
あまり違ってるのも困るのでタイマを200秒にして実際の時間をストップウオッチで計ってみた。
数回試していずれも3分22秒、すなわち202秒だった、1%の誤差。おそらく温度や電源電圧にも影響されるだろうけど、これなら今回の目的には十分だろう。
timer070105

続きを読む »

SleepTimerを使う

16時間タイマだがPSoCのSleepTimerを使ってみた。
SleepTimerを1秒にセットしてスリープから復帰するたびにカウンタ(最初に57600=16*60*60をセット)の値を減らしていく。ゼロになったらおしまい、というプログラムを書いてみた。
27143-24PIでやってみるとあっさり動作してしまった。
実験ではカウンタの値は10ぐらいにしておく。
Global ResourcesでAnalog PowerはAll Offにしておくと消費電流は4μA程度、スリープから復帰するたびに一瞬だが電流が増える、それでも30μA程度。

16時間タイマ

16時間のタイマが必要になった。
ラッチングリレーを使ってタイマがオンしている間無駄に電流が流れないようにしたい。

まずスタートすると一秒だけパルスを出す方法を考えた。
VC3=400Hzである。
oneshot070103_1

invertEnableをinvertにしておく。
oneshot070103_2

一秒経過するとEnableがHになるが、invertEnableがinvertになっているので、カウンタは停止する。一秒間Hが出力される。
この出力でラッチングリレーのセットコイルをオンにする。

 | HOME | 

文字サイズの変更

プロフィール

edy

最新記事一覧(サムネイル画像付き)

BME280モジュールを使った温度・湿度・気圧計(2)DSO Shellを使って動作電流を測る Apr 23, 2017
BME280モジュールを使った温度・湿度・気圧計 Apr 23, 2017
DSO Shell(2)電源 Apr 16, 2017
小学一年生5月号付録 ドラえもん こえピアノ Apr 14, 2017
DSO Shell(1) Apr 13, 2017
非接触温度センサMLX90614を試す(6)プラケースに入れる Apr 03, 2017
アナログフィルタ Mar 28, 2017
非接触温度センサMLX90614を試す(5)Arduino pro miniを使ってみる Mar 19, 2017
非接触温度センサMLX90614を試す(4)耳内温を測ってみる。 Mar 12, 2017
非接触温度センサMLX90614を試す(3) Mar 11, 2017

全記事表示リンク

全ての記事を表示する

ブログリンク

リンク

このブログをリンクに追加する

月別アーカイブ

04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  03  02  12  11  10  09  07  05  04  03  04  03  01  12  11  10  08  07  06  05  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  04  02  01  12  10  09  08  07  06  05  04  03  02  01  12  11  10  09  08  07  06  05  03  02  01  12  11  10  09  08  07  06  05  04  03  02  01  12  10  09  08  07  06  05  04  03  02  01 

カテゴリ

プログラミング (0)
freescale (1)
AVR (3)
テルミン (16)
緊急警報放送 (3)
78K (1)
PSoC (295)
地上デジタル放送 (2)
電子工作 (390)
HX711 (2)
ACS712 (6)
数学 (6)
パソコン (12)
PLC (14)
未分類 (39)
ブログ関係 (20)
スカイプ (37)
ロボット (1)
LTSpice (8)
OCXO (0)
arduino (28)
maxima (1)
フランクリン発振回路 (3)
GPS (3)
DTMF (1)
Linux (1)
KOMAINO (7)

タグリスト

最近のコメント

最近のトラックバック

メールフォーム

名前:
メール:
件名:
本文:

検索フォーム

アクセス

RSSリンクの表示

フリーエリア

FC2Ad

まとめ

Template by たけやん