tutorial

2008年02月21日

<< チュートリアル目次

2進値→グレイコードへの変換をテーブルルックアップ関数で実装する例。
potをA2Dで読み込んで、上位4ビットをGray Codeに変換してLEDに表示する。

続きを読む

(23:37) Φ

<< チュートリアル目次


間接データアドレッシング

FSR (ファイル選択レジスタ) にファイルレジスタのアドレスを指定すると、INDF (間接ファイルレジスタ) への読み書きがそのレジスタへのアクセスになる。

続きを読む

(22:19) Φ

<< チュートリアル目次

周辺機器からの割込み:I/Oピンのstatusが変わるときに割り込むように設定できる。
割込みの仕組み:

  • 実行中のinstructionを完了する
  • 次の番地をストア
  • 割込みサービスルーチン(ISR)にジャンプ
  • 重複割込み防止の為、グローバル割込みイネーブル(GIE)ビットをクリア
割込みサービスルーチン(ISR)がやるべきこと:
  • プロセッサのcurrent contextをセーブ。(あとでリストア)
    • Wレジスタ、ステータスレジスタ等、ISR中で変更されうるSFRは全て保存すべし
      PIC16F690の各ファイルレジスタの最後の16バイトはbankされない(RP0/RP1の値に関わらず常にアクセス可)ので、コンテキスト保存に良い
  • 割込み主(ソース)の特定
    • 割込みフラグをチェック
  • ソースに応じたサービスを行う
  • コンテキストをリストア(ちょっとめんどい)。
  • メインプログラムをレジューム。
  • MOVF W_TEMP,wだとZフラグに影響してしまう。→SWAPFを利用する。
  • 最後にRETFIEで戻る。グローバル割込みイネーブル(GIE)ビットをセット。その後は割込み可

続きを読む

(21:07) Φ

<< チュートリアル目次

  • Timer0 ... プロセッサに実装されている8ビットカウンタ。prescaler有り
  • プロセッサのクロックサイクルや外部イベントをカウントする為に用いる
  • カウンタがrolloverした時にフラグを立てる:  時間待ちループにサイクルを浪費することからプロセッサを解放し、より意味のある仕事をさせるため。
  • Clock/4 または TOCKIピン → プリスケーラ(1/2〜1/256に分周)→ TMR0 → TOIF
  • TOIFは最初にクリアして使う。TMR0がオーバフローしたらsetされる
  • TMR0に書き込みを行うとprescalerはクリアされる。
  • プリスケーラの設定はOPTION_REGを通して行う。

続きを読む

(19:12) Φ

2008年02月20日

<< チュートリアル目次

関数の呼び出し:

  • 引数はどう渡す?
    • Wレジスタが便利
    • FSRも使える
    • 何バイトものデータの受け渡しはバッファをアロケートすべし

  • 返り値は?
    • RETLWでWレジスタに(定数値)を入れて返せる

  • 制限事項
    • (mid-rangeのPICmicro MCUデバイスでは)8つまでしかアドレスを保持できない。9回目のCALLで最初のを上書きしてしまい、戻って来られなくなる。

続きを読む

(23:07) Φ

<< チュートリアル目次

ボタン:ローテートの方向(左/右)をトグル 可変抵抗:ローテートの速度を調整 元:

  RRF    Display, f
  BTFSC  STATUS, C
  BSF    Display, 3
↓ 新
  BCF    STATUS, C
  BTFSS  Direction, 0
  GOTO   RotateLeft
RotateRight:
  RRF    Display, f
  BTFSC  STATUS, C
  BSC    Display, 3
  GOTO   MainLoop
RotateLeft:
  RLF    Display, f
  BTFSC  Display, 4
  BSF    Display, 0
  GOTO   MainLoop

続きを読む

(22:35) Φ

<< チュートリアル目次

チャタリングの防止(debounce)策について。ここでは

  1. RC回路によるフィルタリング
  2. シフトレジスタによるフィルタリング
  3. ソフトウェアによるフィルタリング
の 3. を実装する。

続きを読む

(21:53) Φ

<< チュートリアル目次

Lesson 3のLED ROTATEの速度を可変抵抗で調整する。

ボード上の可変抵抗(RP1)で変化させた電圧値(アナログ入力)を読み取ってデジタルに変換するところまでLesson 4と同じ。

変換した値をループ回数に反映させることでローテートの速度が変化する。

続きを読む

(20:59) Φ

2008年01月29日

<< チュートリアル目次

PIC16F690の内蔵A/Dコンバータ(以下ADC)を使ってみる演習。

ボード上の可変抵抗(RP1)で変化させた電圧値(アナログ入力)を読み取ってデジタルに変換し、上位4ビットをLEDで表示する。

続きを読む

(03:25) Φ

<< チュートリアル目次

LESSON 1のLED点灯、LESSON 2の遅延ループによる点滅に加え、今回ローテーションを行う。

DS4 → DS3 → DS2 → DS1 → DS4 → ... という順でLEDを点灯したい。

続きを読む

(03:00) Φ