senda

2007年度分

という名の自主課題覚え書きの転載

コメント


一覧

PSoC備忘録

※秋田先生の文章をそのまま(無断)転載したもの。

スイッチについて

(例)P1_4にスイッチをつけたいとき

  • プルダウン設定
    • device EditorのInterconnectViewでP1[4]を次のように設定(画面の左下らへん)
      • Drive -> Pull down
    • プログラムに次のように記述
      • 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"に設定する。他は、?のままでもよいが、適当に選んでおくとよい。
    • プログラム
      • 最初にスタートする: UART_1_Start(UART_PARITY_NONE);
      • 1バイト(d)送信: UART_1_PutChar(d);
      • 1バイト(d)受信: d = UART_1_cGetChar();
      • 例えば、次の関数で、「オウム返し」になる
        main()
        {
          BYTE d;
          UART_1_Start(UART_PARITY_NONE);
          while(1){
            d = UART_1_cGetChar();
            UART_1_PutChar(d);
          }
        }
  • PC側のはなし
    • 1バイト単位でデータを送受信するために、Acknowrich (http://www.vector.co.jp/soft/win95/prog/se089304.html) を入れておくと便利。
    • 使うCOMポートの番号(デバイスマネージャの「ポート」で確認できる)を選び、通信速度を、PSoC側にあわせる(例えば9600bps)。そのほかは、Parity=None, DataLength=8bit, StopBit=1bit にするのが一般的(デフォルトでそうなっているかもしれない)

-

センサ(?)

  • スイッチを使ってセンサを作成。

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)

-

割り込み処理

  • とりあえず、プッシュボタンを押す(離す)と割り込み処理が行われるようにする。
  • プッシュボタンがつながったピン(P2[7])のInterruptをFallingEdgeに設定。
    • Drive=Pull Downなので、ボタンを押して離すと立下りになるはず。
  • いったんBuildすると、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
  • 「ljmp _GPIO_INT」という記述を追加。
  • このように書くと、割り込みが起こったときに、GPIO_INT()という関数が呼び出される。
  • main.cに、割り込み関数を追加。
    #pragma interrupt_handler GPIO_INT
    void GPIO_INT(void)
    {
    LED_1_Invert();
    }
  • 今回は、とりあえず割り込みが起こるとLEDがついたり消えたりするようにした。
  • さらに、main()関数の中に、割り込みを許可する記述を追加。
    M8C_EnableGInt;
    M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
    • 上の行は、I2Cの処理のためにすでに書いてあった。
  • 以上で、もう1回Build。
  • 割り込み処理成功。
    • ただ、チャタリング対策をしていないので、ときどきつかなかったり消えなかったりした。
  • 関係ないけど、整形済みテキストを記述するのに{を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とした。
  • P0[7]にTX、P0[5]にRXのピンを立てる
    • TXとSIN、RXとSBUSYを接続して通信。
  • 蛍光掲示板をつなぐと、miniProgでは電力不足になるようなので、ACアダプタから電源を供給するようにした。
    • が、外部から電源を供給していると、Programmerから書き込めないようだ。
      • 急場しのぎだが、スイッチをかませて、書き込むときだけ電源の供給をカットするようにした。
    • それでも、蛍光掲示板をつないだまま電源を入れてもマイコンが起動しない。
      • 面倒だが、スイッチOFF→書き込み→掲示板のコネクタ外す→スイッチON→コネクタ挿す
  • テスト用に、キーボードからの入力をそのまま蛍光掲示板に送るようにしてみた。
    while(1)
    	{
    	d1 = UART_1_cGetChar();
    	UART_1_PutChar(d1);
    	UART_2_PutChar(d1);
    	}
  • キャラクターコードをカタカナに設定。(0x1B7401)
    • どうやら、JIS X 0201というコードに従っているようだ。
      • 0x00〜0x7fまではASCIIコードと同様で、0xA1〜0xDFがカタカナ。コードでは未定義の0xE0〜0xFEには、記号や曜日・単位などの漢字が入っていた。
      • データシートからの情報と、実際やってみたのを絡めてメモ。
        上位\下位0123456789ABCDEF
        0BSHTLF※1※2CR
        1※3※4
        2空白!"#$%&'()*+,-./
        30123456789:;<=>?
        4@ABCDEFGHIJKLMNO
        5PQRSTUVWXYZ[\(BS)]^_
        6`abcdefghijklmno
        7pqrstuvwxyz{}~
        8
        9
        A
        B
        C
        D
        E※5※61/21/4
        F
      • ※1)HOM : ホームポジション(左上)に戻る。ASCIIではVT(垂直タブ)。
      • ※2)CLR : 表示をクリア。ASCIIではFF(改ページ)。
      • ※3)ESC : エスケープ。制御コマンド開始に使用。
      • ※4)US : ユニットセパレータ。制御コマンド開始に使用。
      • ※5)黒塗り三角形の左向き。
      • ※6)〃右向き。
      • 0x8Xと0x9Xはウムラウトなどがついたアルファベットとか。
      • 「年」、「月」、「日」、「分」があってなぜ「時」がない!(たぶん5x7ドットで表現しきれないから)

RTC

  • RTCからの時刻データは、BCD形式の1バイト2桁10進で記録されている。
    • これをUARTに乗せて蛍光掲示板で表示したいのだが、そのままでは1バイトの何かのコードとして認識されてしまうので、2バイトのASCIIコードに変換してやる必要がある。
    • たとえば、1バイトの0x24(0b00100100)を、2桁の10進数"24"として、2と4を表示させたい。
    • ASCIIコードの数字は、0x30〜0x39が0〜9に対応している。
      • 2桁目(一の位)は、0x24の下位4ビット(4)をそのままに、上位4ビットを0x3(0b0011)としてやればいい。→0x34(0b00110100)
      • 1桁目(十の位)は、0x24を右に4ビットシフトし(0x02)、上位4ビットを0x3としてやればいい。→0x32(0b00110010)
    • そのままUARTに送る関数とした。
      void UART_2_BCDWrite(BYTE bcd)
      {
      	BYTE n1,n2;
      	n1 = (bcd >> 4) & ~0xf0 | 0x30;
      	n2 = (bcd & ~0xf0) | 0x30; 
      	UART_2_PutChar(n1);
      	UART_2_PutChar(n2);
      }

(12/26)

07-12-21

計時機能

  • 計時動作を確認できた
    • UARTに送る関数がおかしかっただけだった。
  • 時計としての最低限の動作はしているので、あとはどんどん機能を追加していくぞと。
    • 表示デバイスがなくて時計として最低限の動作といえるのか?

アラーム&スヌーズ

  • アラーム設定のレジスタはサブアドレス09〜0C、フラグなどは01にある。
  • アラームフラグ(AF)、タイマフラグ(TF)のどちらかがHIになると、/INTがLOWになる
    • /INTで割り込みをかける。
      • どうやって?
  • 基盤にスイッチを追加した。(スヌーズコントロール用)
    • ONのときスヌーズON、OFFのときOFFにしたい。
  • 動作としては、
    • アラーム時刻になると、AF="1" → /INT="0"
    • /INT="0"をPSoCが検知、AF,TFをReadしてAFが立っていることを確認
    • ROMをRead、アラーム音を鳴らす
      • 現状ではLED_1を光らせることで確認しよう
    • プッシュスイッチを押すことで、AFをクリアし、アラーム音を停止させる
      • このとき、スヌーズ用スイッチがONならば、タイマをセット
      • OFFならば、アラーム動作はそこで終了
    • タイマが0になると、TF="1" → /INT="0"
    • /INT="0"をPSoCが検知、AF,TFをReadしてTFが立っていることを確認
    • ROMをRead、アラーム音を鳴らす(AFとTFで音を変えるとおもしろい?)
    • プッシュスイッチを押すことで、TFをクリアし、アラーム音を停止させる
      • このとき、スヌーズ用スイッチがONならば、再びタイマをセット
      • OFFならば終了
  • 以下繰り返し。
  • もう少し単純化できそうだ。

やるべきこと

  • 表示部
    • いい加減ちゃんと目で見える形にしなければ。
      • 蛍光表示板に決定。UARTで通信。
  • 外形
    • 実用的には、適当なケースに入れたいところ。
    • 見た目を気にするなら基板も作り直したいが…
  • 割り込み制御
    • /INTでアラームの割り込みをかける
    • CLKOUTで表示の割り込みをかける(?
      • タイマ割り込みでもいいかも。(1sくらい)
    • 音を鳴らすのもタイマ割り込みを使う。
      • 数バイトまとめてROMからデータを読んできて、バッファに保存。
      • タイマ割り込みで(T = 1/f = 1/4kHz)、読んだデータをD/A変換して出力。
      • ピンにはサンプリング周波数4kHzの音の波形が出るはず。

メモ

  • UART_2の設定、蛍光表示板用とする。
  • プッシュスイッチはアラーム停止用、トグルスイッチはスヌーズ判定用。

07-12-14

ワイヤレスマウス を てにいれた !

RTC

  • やっと動作を確認(CLKOUTに1HzでLEDチカチカ)
    • 原因は、よくわからず。
      • i2c.c辺り?
  • 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

基板

  • UART用にピンを立てた。

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いじり

  • LEDをホワホワ(正弦波駆動(偽))。

基板づくり

  • ICソケット、通信&電源用ピン、コンデンサ、LED、定電流ダイオード、プッシュスイッチ
  • 作成途中

PSoC関係

PWMの扱い

  • SysClk = 24MHz
    • VC1,2,3で分周
    • VC1=16, VC3 SourceをVC1にしてVC3 Dividerを100で、15kHz
    • PWM8のPeriod=250で60Hz,PulseWidth=125でデューティー比0.5
  • PWM8のClockSyncをSync to SysClkにする(デフォルトはUse SysClk Direct)
    • デフォルトのままでは24MHzが直で来る

EEPROMの扱い

  • AT24C1024を使用(音楽再生用(ROM))
  • I2Cというプロトコル(I2CHW)で通信
    • 2pin、P1[5]とP1[7]を使用

リアルタイムクロックモジュール

  • RTC-8564NB

07-10-26

テーマ確定

  • 『オートスヌーズOFF機能つきデジタル目覚まし電波時計(仮)の製作』

基本的構成

  • 基本的な時計としての機能はそういうICに丸投げで
  • スイッチで時刻設定
    • できれば+電波時計
  • スイッチでアラーム時刻設定
    • 設定をメモリーできるようにも
  • スヌーズOFFは簡単なスイッチ機構でなんとか
  • 表示部分に凝る
    • イメージLCDの使用でフォントを自在に表示
    • バーサライタ的な表示
      • &自律回転(モータで筐体ごと回転?)
    • →フルカラーLEDで色も文字も思いのままに(できたらいいなぁ
      • 虹色に表示、時刻によって色が変わる、など

PSoC開発環境の導入

PSoCいじり


トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-10-02 (日) 11:12:58