ボタン(IO)状態の読み取り
IOの読み出し
下記のコードが参考になります。
const uint32 u32btn_mask = ((1 << 9) | (1 << 10)); // DIO9,10を読み取り対象に。 uint32 u32read_io; vAHI_DioSetDirection(u32btn_mask, 0); // IOを読み取りモードに //vAHI_DioSetPullup(u32btn_mask, 0); // プルアップの設定(デフォルトで設定されている) u32read_io = (u32AHI_DioReadInput() & u32btn_mask) ^ u32btn_mask; // ボタン押下時は LO になるのでXORでビット反転する。
※ 内部プルアップを設定していれば(デフォルト)、ボタンをIOに接続する際、プルアップ抵抗を省略できます。が、通常はプルアップ抵抗追加を推奨します。
※ u32read_io には読み取ったボタンのビットが設定されます。(DIO9なら 1<<9 のビットが立ちます)
※ チャタリングの考慮は別途行う必要があります。
割り込み
以下の例では DIO9, DIO10 の変化により割り込みハンドラーが呼び出されます。割り込みは E_AHI_DEVICE_SYSCTRL イベントとして伝えられます。
const uint32 u32btn_mask = ((1 << 9) | (1 << 10)); // DIO9,10 void vInitFunc() { ... vAHI_DioInterruptEnable(u32btn_mask, 0); // 割り込みの登録 } /* AppQAPI による割り込み遅延実行のハンドラ */
PRIVATE void vProcessIncomingHwEvent(AppQApiHwInd_s *psAHI_Ind)
{
switch (psAHI_Ind-u32DeviceId) {
case E_AHI_DEVICE_SYSCTRL:
if (psAHI_Ind-u32ItemBitmap & u32btn_mask) {
... 割り込み源が指定したボタンであった ...
}
break;
}
}
※ 割り込みハンドラの詳細についてはタイマー割り込みを参照ください。
ウェイクアップ
スリープの起床に DIO の割り込みを利用できます。以下の例では、vDoSleep() がスリープ手続きを行っています。AppWarmStart の先頭(ウォームスタート直後)に u32AHI_DioWakeStatus() を用いれば、DIO割り込みによる起床かどうか判定できます。
const uint32 u32btn_mask = ((1 << 9) | (1 << 10)); // DIO9,10 void vDoSleep() { ... // 事前に通常割り込みを禁止する vAHI_DioInterruptEnable(0, u32btn_mask); ... // 割り込みハンドラの登録 vAHI_DioWakeEnable(u32btn_mask, 0); vAHI_DioWakeEdge(0, u32btn_mask); // 立下り検出 // 内蔵フラッシュの停止 vAHI_FlashPowerDown(); // スリープ vAHI_Sleep(E_AHI_SLEEP_OSCON_RAMON); // 他のコードが実行されないようにブロック while(1); } PUBLIC void AppWarmStart(void) { // 起床要因のチェック (u32AHI_Init の前に呼ぶ) if(u32AHI_DioWakeStatus() & u32btn_mask) { // この場合、ボタンによる起床であった } // initialize AHI (void)u32AHI_Init(); ... }
※ 事前に通常の割り込みは禁止します。ほぼ同時に通常のDIO割り込みが発生しても何も実行しないようにします。
※ チャタリングの禁止などの処理を行う場合に必要な時計には、2系統ある wakeup timer のカウント値を利用することも出来ます。