パララックスPropellerの使い方(その2):オブジェクトライブラリーの使い方、周波数カウンタの作り方
15-March-'08 06:11
Age: 2 yrs



Category: PSoC



Propellerツールマニュアルの第3章チュートリアルでSpin言語の簡単な文法を理解してから、前回紹介したSpin_Code_Examples.pdfから例を拾ってテレビ表示オブジェクトとキーボードオブジェクトの使い方を勉強してみました。最後に周波数カウンタの例をテレビ表示するようにしてみました。(補足:pdfファイルからソースコードをコピペする場合には、Spin言語の特徴であるインデントを正しく修正しないとコンパイルしなくなります。)

1)オブジェクトTV_terminal.spinの使い方 例9(デバッグ用の情報をテレビに表示)

OBJでこのオブジェクトをインクルードします。オブジェクトにニックネームを付けます。オブジェクト内の関数を参照するには”ニックネーム.関数名”というようにピリオドを使って参照します(オブジェクト指向)。

OBJ

   Display: "TV_terminal"

VAR

   Word Value

' それからこのオブジェクトを初期化しておきます。デモボードではビデオポートはピン12~15に繋がっています。

PUB Start

   Display.start(12)

' 表示を濃紺の背景で白の文字に設定します。

   Display.out(3)
   Display.out(5)

' 次は文字列を表示してから改行します。

   Display.str(string(" Propeller Debug Info"))
   Display.out(13)

' 次は10進数を表示します。

   Value := 500
   Display.dec(Value)
   Display.out(13)

' 次は16進数を2桁で表示します。

   Value := $FF
   Display.hex(Value,2)
   Display.out(13)

' 次は2進数を8桁で表示します。

   Value := %0001_0001
   Display.bin(Value,8)
   Display.out(13)

' 次はPropellerのピン1の状態を2進数1桁で連続してモニターします。

   Repeat
      Display.bin(InA[1],1)
      Display.out(13)


2)オブジェクトkeyboard.spinの使い方(右上の写真) 例8(キーボードの入力キーをテレビに表示;例8では別なオブジェクトkeyborad_iso.spinが使われています)

CON   ' 設定用の定数をCONで定義しておきます。

   _clkmode = xtal1 + pll16x                  'Xtal=5MHz, Clock=16x5MHz=80MHz
   _xinfreq = 5_000_000
   NewLine = 13
   PS2_dpin = 26                                   'data pin on PS/2 jack
   PS2_cpin = 27                                   'clock pin on PS/2 jack
   TV_fpin = 12                                        'first pin on Video port

OBJ   ' オブジェクトをインクルードしておきます。

   Display: "TV_terminal"
   KB: "Keyboard"

PUB Start   ' 各オブジェクトを初期化します。

   Display.start(TV_fpin)
   KB.start(PS2_dpin, PS2_cpin)
   WaitCnt(160_000_000 + Cnt)              'Wait for 2 sec (2x80MHz)

' キーボードの接続は2秒後に確認します。確認できたらキーが押される毎に押されたキャラクタをテレビに表示します。これを繰り返します。

   If KB.present 
      Display.str(string("Keyboard Connected"))
      Display.out(NewLine)
      Repeat
         Display.out(KB.GetKey)
   Else
      Display.str(string("Error: Keyboard Not Connected")


3)周波数カウンタの作り方 例14の周波数カウンターはキャラクタ表示用のシリアルLCDを使っていたのでテレビに表示するように改変してみました。以下のコードは毎回画面をクリアしてカーソル位置をホームに戻しています。画面をクリアせずに周波数の行だけを書き換えるようにカーソルを行頭に戻すにはASCIIコードのLF(=10)とCR(=13)を区別して使えるようにTV_terminal.spinを書き直す必要があります。以前のニュース(2007年6月16日)で報告したようにPSoCでも周波数カウンタを作りましたが、Propellerでは更に簡単に出来てしまうことが分かりました。但し、Propellerでアナログ信号や微小信号を増幅する場合には他のマイコンチップ同様に外付け回路が必要です。

'-------------------------------------------------------------------------------------------------------
' Propeller Frequency Counter, Input = Pin 5, Video Port = Pin 12-15
'-------------------------------------------------------------------------------------------------------
CON

  _clkmode = xtal1 + pll16x                               'Clock mode (80MHz)
  _xinfreq = 5_000_000                                     'Xin frequency
  In = %0
  NewLine = 13
  Home = 0

VAR                                                                    ' グローバル変数の定義

  Long Frequency

OBJ ' ここでライブラリをインクルードします(TV_terminal.spin);ニックネームを付けます

  Display: "TV_terminal"

PUB Start                                                           ' メインルーチン

  Display.start(12)                                              'Video port is on Pin 12-15
  Repeat
      MeasureFrequency
      DisplayFrequency

PRI MeasureFrequency | Pin                               ' 周波数計測

  Pin := 5                                                            'Pulses are sampled on Pin 5.
  DirA[Pin] := In                                                  'Set Pin 5 to input
  CTRA := 0                                                         'Clear Counter A settings
  CTRA := (%01010 << 26) | (%001 << 23) | (0 << 9) | (Pin)  'Trigger to count rising edge on Pin 5
  FRQA := 1000                                                   'Count 1000 pulses on each trigger
  PHSA := 0                                                         'Clear accumulated value
  WaitCNT( 80_000_000 + CNT )                         'Wait for 1 second
  Frequency := PHSA / 1000                                'Calculate Freq from duration (1000ms)

PRI DisplayFrequency                                          ' 周波数をディスプレイに表示

  Display.out(Home)                                            'Clear screen and move cursor to home
  Display.out(NewLine)
  Display.str(string(" FREQ:"))                             'Display string
  Display.dec(Frequency)                                     'Display Freq. as a decimal.
  Display.str(string(" Hz"))                                   'Display string
'-------------------------------------------------------------------------------------------------------

補足(3/17/2008):カウンタは信号パルスが来る毎にFRQAの値をPHSAに蓄積して行きます。ので、FRQA := 1としてFrequency := PHSA と書き換えても同じ結果が得られます。








<- Back to: メイン ・セクション

サイト内のページ検索

Searchword:

Search in:


(上のページ検索は通常ページのみでブログ風ニュースの内容は検索できません)