|
#include <t_services.h>
#include "kernel_id.h"
#include "ex3-4.h"
#define PB_DDR (*(volatile unsigned char *)0xFFFFD4) //
アドレス0xFFFFD4へのポインタを定義
#define PB_DR (*(volatile unsigned char *)0xFFFFD6) //
アドレス0xFFFFD6へのポインタを定義
#define PA_DDR (*(volatile unsigned char *)0xFFFFD1) //
アドレス0xFFFFD1へのポインタを定義
#define PA_DR (*(volatile unsigned char *)0xFFFFD3) //
アドレス0xFFFFD3へのポインタを定義
#define PTN (FLGPTN)0x07
#define S0 0
#define S1 1
#define S2 2
#define S3 3
// スイッチの指定
#define SW_PA0 0
#define SW_PA1 1
#define SW_PA2 2
#define SW_PA3 3
// スイッチON/OFF 判定
#define SW_ON(bit) (!(PA_DR & (0x1 << bit)))
#define SW_OFF(bit) (PA_DR & (0x1 << bit))
int detect_switch_on(int sw_no)
{
static int status[4] = {S0};
long int w;
switch(status[sw_no])
{
case S0 :
if (SW_ON(sw_no)) { // bitが0だったら、スイッチPA0が押されたと判断
status[sw_no] = S1;
}
break;
case S1 :
for (w=0; w<9999; w++); // チャタリング対策のwaitを追加
status[sw_no] = S2;
break;
case S2 :
if (SW_OFF(sw_no))
{
status[sw_no] = S3;
}
break;
case S3 :
for (w=0; w<9999; w++); // チャタリング対策のwaitを追加
status[sw_no] = S0;
return TRUE;
break;
default :
status[sw_no] = S0;
break;
}
return FALSE;
}
void main_task(VP_INT exinf) // メインタスク
{
int sw = 0;
PA_DDR = 0x00; // Aポートを入力に設定
PB_DDR = 0xFF; // Bポートを出力に設定
PB_DR = 0xFF; // LEDを全消灯
act_tsk(TASK1); // タスクの起動
while (1) {
if (detect_switch_on(SW_PA0)) {
set_flg(FLAG_ID1, 0x1);
syslog(LOG_NOTICE, "0");
}
if (detect_switch_on(SW_PA1)) {
set_flg(FLAG_ID1, 0x2);
syslog(LOG_NOTICE, "1");
}
if (detect_switch_on(SW_PA2)) {
set_flg(FLAG_ID1, 0x4);
syslog(LOG_NOTICE, "2");
}
}
}
void task1(VP_INT exinf) // LED点滅タスク1
{
int i;
FLGPTN flgptn;
while(1)
{
for(i=0; i<3; i++)
{
PB_DR &= ~0x1; // LED PB0 点灯
dly_tsk(100); // 0.1秒待ち
PB_DR |= 0x1; // LED PB0 消灯
dly_tsk(100); // 0.1秒待ち
}
wai_flg(FLAG_ID1, PTN, TWF_ANDW, &flgptn); // イベントフラグPTN2待ち
}
}
|