フォト
2018年6月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
無料ブログはココログ

« ルミちゃんの毛づくろい | トップページ | 豊四季Tiny BASIC for micro:bit をV0.05に更新しました »

2018年1月12日 (金)

micro:bitをArduino環境で使う (5) PPIを使ったLチカ

今回はPPI(Programmable Peripheral Interconnect)を使ったLチカを実装してみました。

micro:bitをArduino環境で使う (2)GPIOTEを使ったLチカ」では、
タイマー割り込みを使って、タスク(GPIOEを使って定義したLEDをトグルでON・OFF)を
実行していました。

今回はPPIを使って、イベント(カウンター値がコンパレーターと一致)発生時に
タスク(GPIOEを使って定義したLEDをトグルでON・OFF)を自動で実行させます。

この方法により、CPUが介在することなく、LEDを点滅させることが出来ます。

micro:bitをArduino環境で使う (2)GPIOTEを使ったLチカ」のスケッチの
割り込み処理部分をPPIに置き換えたスケッチを下記に示します。

スケッチ

//
// micro:bit PPIを使ったLチカ by たま吉さん
//

#include "nrf.h"

const int COL1 = 3;         // Column #1 control
const int LED = 26;         // 'row 1' led
uint8_t sw =0;

/*
extern "C" void TIMER2_IRQHandler(void) {
    NRF_TIMER2->EVENTS_COMPARE[0] = 0;  // 割り込みイベントクリア
    NRF_GPIOTE->TASKS_OUT[0] = 1;       // タスク実行
    //sw =!sw;
    //digitalWrite(LED, sw);
}
*/

void setup() {
  uint32_t ulPin;
  Serial.begin(115200); 
  Serial.println("microbit is ready!");
  
  // GPIOピンの設定
  pinMode(COL1, OUTPUT);  digitalWrite(COL1, LOW);   // COL1ピンの設定
  //pinMode(LED, OUTPUT);                            // LEDピンの設定

  // GPIOTEの設定:LEDピン・トグルタスクを定義する
  ulPin = g_ADigitalPinMap[LED];  // LEDの実ピン番号の取得 
  NRF_GPIOTE->CONFIG[0] =         // チャネル0に機能設定
    (GPIOTE_CONFIG_MODE_Task << GPIOTE_CONFIG_MODE_Pos) |            // タスクモード
    (ulPin << GPIOTE_CONFIG_PSEL_Pos) |                              // ピン番号設定
    (GPIOTE_CONFIG_POLARITY_Toggle << GPIOTE_CONFIG_POLARITY_Pos) |  // 動作指定:トグル
    (GPIOTE_CONFIG_OUTINIT_Low << GPIOTE_CONFIG_OUTINIT_Pos);        // ピン出力初期値
  NRF_GPIOTE->POWER = 1;                                             // GPIOTE有効
    
  //タイマ設定
  NRF_TIMER2->TASKS_STOP = 1;                          // タイマストップ
  NRF_TIMER2->TASKS_CLEAR = 1;                         // カウンタクリア
  NRF_TIMER2->MODE = TIMER_MODE_MODE_Timer;            // モード設定:タイマモード
  NRF_TIMER2->PRESCALER   = 8;                         // プリスケーラ設定:128分周(125KHz)
  NRF_TIMER2->BITMODE = TIMER_BITMODE_BITMODE_16Bit;   // カウンタ長設定:16ビット長指定
  NRF_TIMER2->CC[0] = 62500/2;                         // コンパレータ0の設定:0.5秒周期

/*
  NRF_TIMER2->INTENSET =                               // 割り込み設定:コンパレータ0と比較
      (TIMER_INTENSET_COMPARE0_Enabled << TIMER_INTENSET_COMPARE0_Pos);
*/

  NRF_TIMER2->SHORTS =                                 // ショートカット設定:クリアタスク指定
      (TIMER_SHORTS_COMPARE0_CLEAR_Enabled << TIMER_SHORTS_COMPARE0_CLEAR_Pos);

/*
  // タイマ割り込み設定
  NVIC_SetPriority(TIMER2_IRQn, 3);   // 割り込み優先度設定
  NVIC_ClearPendingIRQ(TIMER2_IRQn);  // 保留割り込みクリア
  NVIC_EnableIRQ(TIMER2_IRQn);        // 割り込み許可
*/  

  // PPIの設定(チャネル0を利用)
  //   TIMER2 コンパレータ0一致イベント と GPIOTE(ch0)LEDピン・トグルタスク を結び付ける
  NRF_PPI->CH[0].TEP  = (uint32_t)&NRF_GPIOTE->TASKS_OUT[0];       // PPI.ch0 にLEDピン・トグルタスク設定
  NRF_PPI->CH[0].EEP  = (uint32_t)&NRF_TIMER2->EVENTS_COMPARE[0];  // PPI ch0 にコンパレータ0一致イベント設定  
  NRF_PPI->CHENSET   |= PPI_CHENSET_CH0_Enabled;                   // PPI ch0 有効

  NRF_TIMER2->TASKS_START = 1;   // タイマスタート
  
}

void loop(){
    __SEV();
    __WFE();
    __WFE();
}


前回からの修正は、
・ 割り込み関数 TIMER2_IRQHandler(void) のコメントアウト
・ タイマー割り込み設定、割り込み関数登録のコメントアウト
・ PPI設定の追加
を行っています。

PPIの設定は簡単です(下記3行で設定)。
  // PPIの設定(チャネル0を利用)
  //   TIMER2 コンパレータ0一致イベント と GPIOTE(ch0)LEDピン・トグルタスク を結び付ける
  NRF_PPI->CH[0].TEP  = (uint32_t)&NRF_GPIOTE->TASKS_OUT[0];       // PPI.ch0 にLEDピン・トグルタスク設定
  NRF_PPI->CH[0].EEP  = (uint32_t)&NRF_TIMER2->EVENTS_COMPARE[0];  // PPI ch0 にコンパレータ0一致イベント設定  
  NRF_PPI->CHENSET   |= PPI_CHENSET_CH0_Enabled;                   // PPI ch0 有効

PPIのチャネル0~15のうち、今回はチャネル0を利用しています。
CH[0].TEPにタスク、CH[0].EEPにイベントのレジスタのアドレスを登録しています。
これにより、タスクとイベントを結び付けることが出来ます。

タイマーのカウンターが指定した値になったら、指定したタスクを実行します。

PPIは、周辺機器の様々なイベント(状態変化)発生のタイミングで、指定したタスクを
実行することが出来る機構です。

micro:bitに採用されているMCU: Nordic nRF51822 ARM Cortex-M0 は、
ハードウェアによる直接PWMを生成する機能は無いのですが
PPIを使うことで、同様のことを行うことが出来ます(たぶん)。
(PWMのHIGH期間、LOW期間の調整はコンパレータを2つ用いて出来ると思います)

« ルミちゃんの毛づくろい | トップページ | 豊四季Tiny BASIC for micro:bit をV0.05に更新しました »

arduino」カテゴリの記事

ARM」カテゴリの記事

micro:bit」カテゴリの記事

コメント

コメントを書く

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/571408/66270656

この記事へのトラックバック一覧です: micro:bitをArduino環境で使う (5) PPIを使ったLチカ:

« ルミちゃんの毛づくろい | トップページ | 豊四季Tiny BASIC for micro:bit をV0.05に更新しました »