アプリ版:「スタンプのみでお礼する」機能のリリースについて

タクトスイッチのチャタリングを回避し、奇数回めのONで LEDの交互点灯を(タイマを使って)

やろうとしていますが、なかなかうまくいきません。

入門者でお恥ずかしいですが、下記コードの誤りをご指摘頂けませんでしょうか?

宜しくお願い致します。

以下、コード。


#include <3664.h>

//プロトタイプ宣言

void main(void);
int SW_Read(void); // 入力SWの状態読み込み 関数
void wait(int); // nミリ秒待つウエイト 関数
void wait1ms(void); // 1ミリ秒待つウエイト 関数
void IOinit(void); // I/O の初期化 関数

void main(void)
{
if (SW_Read()==1)
{
IO.PDR8.BIT.B0 = 1; // ポート8のビット0を出力ON
IO.PDR8.BIT.B1 = 0; // ポート8のビット1を出力OFF

DI; // 割り込み禁止
TA.TMA.BYTE = 0x0A; // タイマーA、低速発信・0.25sec設定(タイマーのカウント開始)
IRR1.BIT.IRRTA = 0; // タイマーA 検知フラグをゼロクリア
IENR1.BIT.IENTA =1; // 割り込み許可
EI; // 割り込み許可
}
else
{
}
while(1)
{

}

}

/////////////////// I/Oの初期化
void IOinit(void)
{
IO.PCR8 = 0x03; // ポートコントロールレジスタ: ポート8のビット0・1を出力に設定
// その他のビットは入力に設定
IO.PDR8.BIT.B0 = 0; // ポート8のビット0を出力OFF
IO.PDR8.BIT.B1 = 0; // ポート8のビット1を出力OFF

IO.PCR1 = 0x00; // ポートコントロールレジスタ: ポート1を全ビット0とし、入力に設定
}

/////////////////// タイマーA関数

void int_timera (void) // タイマーA関数
{
IO.PDR8.BIT.B0 = ~IO.PDR8.BIT.B0; // ポート8のビット0を反転して出力(赤)LED用
IO.PDR8.BIT.B1 = ~IO.PDR8.BIT.B1; // ポート8のビット1を反転して出力(緑)LED用

IRR1.BIT.IRRTA = 0; // タイマーA検知フラグをゼロクリア
}

/////////////////// スイッチの状態読み込み

int SW_Read(void)
{
int sw1; //スイッチ状態読み込み1回目
int sw2; //スイッチ状態読み込み2回目
int val; //スイッチの状態判定値の入力値
int memval; //入力信号の全回の値
int numcnt; //奇数偶数判定ループ用カウンタ

while(1) //モニタリング
{
sw1 = IO.PDR1.BIT.B7; // スイッチの状態読み込み1回目
wait(10); // 10mS待つ
sw2 = IO.PDR1.BIT.B7; // スイッチの状態読み込み2回目
memval=val; //現行のスイッチ状態判定値をメモリに入れ替える

if(sw1==1 & sw2==1) // スイッチ読み込み1回目と2回目共にONだったら
{ //スイッチ状態判定を<押した>と見なして、
val=1;
}
else
{
val=0;
}
if(memval==0 & val==1) //パルスの前後状態を比較し、新規に立ち上がりONであれば、
{
numcnt=++numcnt;
if(numcnt%2!=0) //ループカウンタが奇数だったら
{
return(1); // 1を返す
}
else
{

}
}
else
{
}

}


}

//////////////////// nミリ秒待つウェイト関数

void wait(int time)
{
int i; // ループカウンタ
for(i = 0 ; i < time ; i++) // time回数分ループ
wait1ms(); // 1ミリ秒のウェイト関数を呼び出す
}

//////////////////// 1ミリ秒待つウェイト関数

void wait1ms(void)
{
int i; // ループカウンタ
for(i = 0 ; i < 2662 ; i++); // 1ミリ秒の間ループする
}



以上、宜しくお願い申し上げます。

A 回答 (2件)

> 長すぎるというのは自分も悩みましたが、どこが悪さしているのか、また分析が


> どの部分は問題がなく、どの部分が悪いのか分からない為、多くを載せてしましました。

取り敢えず、どの処理まではちゃんと動作してるとか判ると良いのですが...
組み込みのプログラムは、デバイスの初期化や制御部分が上手くできていないと動作しません。
また、デバイス周りは問題なくとも、ロジックが間違っていても動作しません。

もし、デバッガーがあるのであれば、それらの切り分けを行い、問題点を絞り込んでみてはどうでしょうか。

絞り込めば、質問もシンプルになりますし、回答者の回答しやすいと思います。
もっと言えば、絞り込みが出来れば、自力で問題の解決も出来ちゃうかもしれないですね。

> 「※と、おっさんが絡んでます。」の意味はよく分かりません。
私があなたにイチャモンつけてますの意 ここは気にしなくていいトコです。
「初心者という言葉は免罪符ではないですよ。」って、昔はよく初心者が「初心者」だから許されると言わんばかりに、質問の丸投げをしたりしてると、この言葉で窘められてました。
    • good
    • 0
この回答へのお礼

アドバイス頂き有り難うございます。
スイッチの入力信号が適性に動作しているところは
事前に回路確認できていますが・・・・

デバッガーなどの取扱い含め、すぐすぐどうにもならない事情にあります。
絞り込みについては自分も留意しているところではありますが
専門の方から見れば、結果、留意できていないということになってしまってます。

ご指摘内容参考にさせていただきます。

お礼日時:2012/05/07 12:54

うまくいきませんって何処まではできているとか無いんですか?


ソースの書き方も抜粋とかじゃないようですが、これだけ全部読む必要があるんですか?
ポート8がどうのこうのとか、LEDの赤と緑とか、ソースには書かれてるけど質問文には書かれてない情報がありますが何故ですか。

こういったことも、回答者に解析させるのが目的であれば、そういった質問にしてください。

初心者という言葉は免罪符ではないですよ。
※と、おっさんが絡んでます。
    • good
    • 0
この回答へのお礼

ご指摘頂き、有り難うございます。

スイッチでの入力を扱わず、電源ONで点滅するパターンではうまくいっていました。
そこに、スイッチ入力を付加させようとしたのですが、実際にはスイッチを押しても
初期のLED点灯もなされていない状況です。

回路図を載せることができていない為、さらに分かりにくい
質問になっているかもしれません。

長すぎるというのは自分も悩みましたが、どこが悪さしているのか、また分析が
どの部分は問題がなく、どの部分が悪いのか分からない為、多くを載せてしましました。

「※と、おっさんが絡んでます。」の意味はよく分かりません。

質問方法を洗練させる自信がなく、ご指摘内容を反省しまして、しばし後に質問を取りやめようと思います。

有り難うございました。

お礼日時:2012/05/03 07:04

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!