senda
2007年度分†
という名の自主課題覚え書きの転載
コメント†
PSoC備忘録†
※秋田先生の文章をそのまま(無断)転載したもの。
スイッチについて†
(例)P1_4にスイッチをつけたいとき
- プルダウン設定
- device EditorのInterconnectViewでP1[4]を次のように設定(画面の左下らへん)
- プログラムに次のように記述
- PRT1DR&=~0x10; (PRT1DR=PRT1DR & 0xEFという意味)
- PRT1DRは、PORT1のDataRegistor,すなわちPORT1のPINの状態を表す8bitのレジスタ.PORT1はP1[0]〜P1[7]まであり、例えばP1_4は、PRT1DRの5bit目の値というふうにみる.
- PINの値を読む
- 次の記述でPINの値を判断.
- if((PRT1DR & 0x10)!=0x00)
I2C関連情報†
PSoCでI2Cを使うときの情報です
- 添付のi2c.c, i2hをダウンロードし、いま作っているProjectのディレクトリに置く
- i2c.cを、Projectに追加(Add)
- PSoCでI2Cを使う準備
- デバイスエディタで、I2CHWを配置。
- 使うピンとクロック周波数を設定。
- 関数の呼び出し
- i2c.hに、通信相手のI2Cスレーブデバイスのアドレスを設定
- まずは最初におまじない4つ。
- データを送るときの手順
- I2Cbuf[]に送りたいデータを設定
- I2Cwrite(n);でI2Cbufの内容をnバイト分書き込む
- データを読むときの手順
- I2Cbuf[]に、最初に送りたいデータを設定(データ長=nwとする)
- I2Cread(nw, nr);で、nwバイト送ったのち、I2Cスレーブデバイスからnrバイト読み出し、それがI2Cbuf[]に格納される
UART関連情報†
- 100milピンヘッダ, 4pin
- 1=GND, 2=VDD, 3=RX, 4=TX
- このとおり、マイコンの近くに4pinピンヘッダを立てる(例えばRXはマイコンのRX(UART受信)ピンへ)
- 各ピンが、PICマイコンのどのピンに対応するかは、データシート参照
- VDDは、3Vでも5VでもOK
- USB-UART変換機のドライバ: http://www.silabs.com/tgwWebApp/public/web_content/products/Microcontrollers/USB/en/mcu_vcp.htm から、"Download for Windows 2000/XP/Server 2003/Vista (v5.1)"
- PSoC側のはなし
- デバイスエディタ
- "UART"を配置。受信入力(RX)、送信出力(TX)を適当なピンに割り当て。(このピンが、↑の4ピンヘッダにつながる
- クロック源を適当に設定。一般には適当な分周比を設定したVC3あたりを、使いたい通信速度(とりあえずは9600bps(bit per sec)でいいでしょう)の「8倍」に設定。つまり9600bpsにするためには、9600*8=76,800Hzになるようにする。
- そのほかに設定するべきは、RXにつなぐピン、TXにつなぐピンのほか、ClockSyncを"Sync to SysClk*2"に設定する。他は、?のままでもよいが、適当に選んでおくとよい。
- プログラム
- PC側のはなし
センサ(?)†
08-01-11†
タイマ割り込み†
- 割り込み関数内で割り込みができないということで、I2Creadは使えない。
- スピーカーを接続。
- RTCのCLKOUT、/INTをP2[5]、P2[3]に接続。
タイマ割り込み†
- とりあえず、現状では割り込み関数内でIC2readが使えない。
- 割り込み関数内ではリロードのフラグを立てるだけにして、mainのループで判別してreadすることにした。
- ”分”のデータを保存しておいて、readしたら比較する。変わっていたら蛍光掲示板の表示を更新。
- 内部計時と4秒くらいの誤差が出るけどまぁいいか…。
- ふと、外部電源からの電圧を、蛍光掲示板にはスイッチに関わらず常に与えておけばいいんじゃないかと思い立ち、はんだ付け。
タイマ割り込み†
- RTCのCLKOUTで割り込みをかけて表示させようと思っていたけど、外部I/Oからの割り込み処理が煩雑になりそう。
- デジタル時計だからといって、別に秒まで表示しなくてもいいか。
- CLKOUTでLEDをチカチカさせれば秒針を刻んでる雰囲気は出る。
- →タイマ割り込みで表示を更新することにする。
- Timer16でクロックにCPU_32kHzを使えば、Periodを最大値(65535)にすると約2秒ごとにタイマ割り込みが発生する。
- 割り込みが発生したらRTCのminutesを読み、変数に保存しておく。割り込みごとに比較し、変わっていたら表示を更新する。
- →割り込み関数内でI2Creadを呼び出すと、戻ってこれない(割り込み関数が終了しない)。
- 時間がかかりすぎる?でも使えないとかなり不便なのだが…
(1/9)
割り込み処理†
- とりあえず、プッシュボタンを押す(離す)と割り込み処理が行われるようにする。
- 「ljmp _GPIO_INT」という記述を追加。
- このように書くと、割り込みが起こったときに、GPIO_INT()という関数が呼び出される。
- 今回は、とりあえず割り込みが起こるとLEDがついたり消えたりするようにした。
- 割り込み処理成功。
- ただ、チャタリング対策をしていないので、ときどきつかなかったり消えなかったりした。
- 関係ないけど、整形済みテキストを記述するのに{を3つ使って囲むと、#で始まる行が表示されなくなるようだ。(Wikiの仕様?)
(12/29)
蛍光掲示板†
- UART2を設置
- ジャンパの設定をデフォルトのまま使いたいので、38400bps→307,200Hzとしたい
- 梶村君の設定を参考に、分周比VC1=6、VC2=13で、VC2を307,692Hzとした。
- UART1はPC(Acknowrich)との通信用なので、76,800Hzを維持したい
- VC1=6なので、VC3SourceをVC1、VC3Dividerを52で、VC3を76,923Hzとした。
- 蛍光掲示板をつなぐと、miniProgでは電力不足になるようなので、ACアダプタから電源を供給するようにした。
- が、外部から電源を供給していると、Programmerから書き込めないようだ。
- 急場しのぎだが、スイッチをかませて、書き込むときだけ電源の供給をカットするようにした。
- それでも、蛍光掲示板をつないだまま電源を入れてもマイコンが起動しない。
- 面倒だが、スイッチOFF→書き込み→掲示板のコネクタ外す→スイッチON→コネクタ挿す
RTC†
- RTCからの時刻データは、BCD形式の1バイト2桁10進で記録されている。
(12/26)
07-12-21†
計時機能†
- 計時動作を確認できた
- 時計としての最低限の動作はしているので、あとはどんどん機能を追加していくぞと。
- 表示デバイスがなくて時計として最低限の動作といえるのか?
アラーム&スヌーズ†
- アラーム設定のレジスタはサブアドレス09〜0C、フラグなどは01にある。
- アラームフラグ(AF)、タイマフラグ(TF)のどちらかがHIになると、/INTがLOWになる
- 基盤にスイッチを追加した。(スヌーズコントロール用)
- ONのときスヌーズON、OFFのときOFFにしたい。
- 動作としては、
- アラーム時刻になると、AF="1" → /INT="0"
- /INT="0"をPSoCが検知、AF,TFをReadしてAFが立っていることを確認
- ROMをRead、アラーム音を鳴らす
- プッシュスイッチを押すことで、AFをクリアし、アラーム音を停止させる
- このとき、スヌーズ用スイッチがONならば、タイマをセット
- OFFならば、アラーム動作はそこで終了
- タイマが0になると、TF="1" → /INT="0"
- /INT="0"をPSoCが検知、AF,TFをReadしてTFが立っていることを確認
- ROMをRead、アラーム音を鳴らす(AFとTFで音を変えるとおもしろい?)
- プッシュスイッチを押すことで、TFをクリアし、アラーム音を停止させる
- このとき、スヌーズ用スイッチがONならば、再びタイマをセット
- OFFならば終了
- 以下繰り返し。
- もう少し単純化できそうだ。
やるべきこと†
- 外形
- 実用的には、適当なケースに入れたいところ。
- 見た目を気にするなら基板も作り直したいが…
- 割り込み制御
- /INTでアラームの割り込みをかける
- CLKOUTで表示の割り込みをかける(?
- 音を鳴らすのもタイマ割り込みを使う。
- 数バイトまとめてROMからデータを読んできて、バッファに保存。
- タイマ割り込みで(T = 1/f = 1/4kHz)、読んだデータをD/A変換して出力。
- ピンにはサンプリング周波数4kHzの音の波形が出るはず。
- UART_2の設定、蛍光表示板用とする。
- プッシュスイッチはアラーム停止用、トグルスイッチはスヌーズ判定用。
07-12-14†
ワイヤレスマウス を てにいれた !
RTC†
- やっと動作を確認(CLKOUTに1HzでLEDチカチカ)
- UARTで計時の動作を確認したい
- 0x00で初期化したはずのI2CBufRd[]が0x30で返ってくる?
- I2CBufRd[]のどこに時分秒のデータがあるのかも、なんか違ってるような感じ。
- UARTで、16進じゃなく10進で表示させるには?
- I2Cwrite(i2c_slv_addr, nw) の仕様まとめ
- まず、I2CBufWr[]に、書き込む情報を記憶しておく。(RTCのとき、I2CBufWr[0]はサブアドレス)
- i2c_slv_addr にスレーブアドレス(RTCの場合0x51 : #defineでSLAVE_ADDRESS_RTCとして定義済み)を指定
- n に、(書き込む先頭の)サブアドレスを含めて何バイト送るか(RTCの場合、max=16)を指定
- I2Cread(i2c_slv_addr, nw, nr) の仕様まとめ
- まず、I2CBufWr[]に、書き込むサブアドレスを記憶しておく。(RTCのとき、I2CBufWr[0])
- i2c_slv_addr にスレーブアドレスを指定
- nw に、(読み込む先頭の)サブアドレスのサイズ(RTCの場合、1)を指定
- nr に、読み込むサイズを指定
- → I2CufRd[] に、読み込んだデータが記憶される
07-12-07†
- RTCのCLKOUT端子に1kΩの抵抗とLEDをつけた(動作確認用)
- RTCのSCL,SDA端子のプルアップ抵抗をはんだショート。
PSoC†
- RTCとの通信
- 用意していただいたi2c.h、i2c.c辺りがどうにもビルドできないので、Webの諸先輩方を参考にいろいろ書いてみる。
- →ビルドはできたものの、動作が確認できず。
- とりあえずCLKOUTに1Hzを出したいのだが…。(LEDはつきっぱなしになった)
- *おもしろくないけど* 表示をとりあえずLCDに任せ、時計としての動作を作りこんでいくのも手か。
- 何はともあれ、さっさと動作確認だけでもしなければ。
I2C(RTC)関係†
- デバイス(RTCとか)を指定するのはスレーブアドレス(RTCは0x51)。
- RTCと通信するとき、まず(内部)開始アドレスを指定してやる必要がある。→データシート
- 0x00 (Control1) 〜 0x0f (Timer Data)
- そこから、書き込みのときはnバイト、読み込みのときはnrバイト通信。
07-11-30†
PSoC†
- UARTでPCと通信。
- Acknowrichのインストール。
- オウム返しのプログラムは動作した。
- RTCの動作確認もこれでできるのでは。
- I2CでRTCと通信。
- 書き込みは、I2Cwrite(I2C_SLAVE_ADDRESS, n)
- 読み出しは、I2Cread(I2C_SLAVE_ADDRESS, nw, nr)
- プルアップ抵抗?
- 動作確認はまだ。
#今度からマウスを持参しよう…。
07-11-16†
続続・PSoCいじり†
- スイッチを離すとLEDが点灯・押すと消灯するプログラム
- スイッチの実装は、PSoC備忘録参照
- P2_7に接続したので、PRT1DRをPRT2DR、0x10を0x80にそれぞれ読み替える
- I2C関係の設定
- とりあえず基板にRTCはつないだが、どうやって動作確認しよう…
- →CLKOUT端子に 1Hzの信号を出力させて、LEDを光らせる
- →あるいは、LCDでもつなげれば…
続・基板づくり†
- PSoCまわりの最低限の接続、LED、プッシュスイッチの実装
- リアルタイムクロックモジュールの実装(未確認)
07-11-09†
続・PSoCいじり†
基板づくり†
- ICソケット、通信&電源用ピン、コンデンサ、LED、定電流ダイオード、プッシュスイッチ
- 作成途中
PSoC関係†
PWMの扱い
EEPROMの扱い
- AT24C1024を使用(音楽再生用(ROM))
- I2Cというプロトコル(I2CHW)で通信
リアルタイムクロックモジュール
07-10-26†
テーマ確定
- 『オートスヌーズOFF機能つきデジタル目覚まし電波時計(仮)の製作』
基本的構成
- 基本的な時計としての機能はそういうICに丸投げで
- スイッチで時刻設定
- スイッチでアラーム時刻設定
- スヌーズOFFは簡単なスイッチ機構でなんとか
- 表示部分に凝る
- イメージLCDの使用でフォントを自在に表示
- バーサライタ的な表示
- →フルカラーLEDで色も文字も思いのままに(できたらいいなぁ
PSoC開発環境の導入
PSoCいじり†
|