タクトスイッチのチャタリングを回避し、奇数回めの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ミリ秒の間ループする
}
以上、宜しくお願い申し上げます。
No.2ベストアンサー
- 回答日時:
> 長すぎるというのは自分も悩みましたが、どこが悪さしているのか、また分析が
> どの部分は問題がなく、どの部分が悪いのか分からない為、多くを載せてしましました。
取り敢えず、どの処理まではちゃんと動作してるとか判ると良いのですが...
組み込みのプログラムは、デバイスの初期化や制御部分が上手くできていないと動作しません。
また、デバイス周りは問題なくとも、ロジックが間違っていても動作しません。
もし、デバッガーがあるのであれば、それらの切り分けを行い、問題点を絞り込んでみてはどうでしょうか。
絞り込めば、質問もシンプルになりますし、回答者の回答しやすいと思います。
もっと言えば、絞り込みが出来れば、自力で問題の解決も出来ちゃうかもしれないですね。
> 「※と、おっさんが絡んでます。」の意味はよく分かりません。
私があなたにイチャモンつけてますの意 ここは気にしなくていいトコです。
「初心者という言葉は免罪符ではないですよ。」って、昔はよく初心者が「初心者」だから許されると言わんばかりに、質問の丸投げをしたりしてると、この言葉で窘められてました。
アドバイス頂き有り難うございます。
スイッチの入力信号が適性に動作しているところは
事前に回路確認できていますが・・・・
デバッガーなどの取扱い含め、すぐすぐどうにもならない事情にあります。
絞り込みについては自分も留意しているところではありますが
専門の方から見れば、結果、留意できていないということになってしまってます。
ご指摘内容参考にさせていただきます。
No.1
- 回答日時:
うまくいきませんって何処まではできているとか無いんですか?
ソースの書き方も抜粋とかじゃないようですが、これだけ全部読む必要があるんですか?
ポート8がどうのこうのとか、LEDの赤と緑とか、ソースには書かれてるけど質問文には書かれてない情報がありますが何故ですか。
こういったことも、回答者に解析させるのが目的であれば、そういった質問にしてください。
初心者という言葉は免罪符ではないですよ。
※と、おっさんが絡んでます。
ご指摘頂き、有り難うございます。
スイッチでの入力を扱わず、電源ONで点滅するパターンではうまくいっていました。
そこに、スイッチ入力を付加させようとしたのですが、実際にはスイッチを押しても
初期のLED点灯もなされていない状況です。
回路図を載せることができていない為、さらに分かりにくい
質問になっているかもしれません。
長すぎるというのは自分も悩みましたが、どこが悪さしているのか、また分析が
どの部分は問題がなく、どの部分が悪いのか分からない為、多くを載せてしましました。
「※と、おっさんが絡んでます。」の意味はよく分かりません。
質問方法を洗練させる自信がなく、ご指摘内容を反省しまして、しばし後に質問を取りやめようと思います。
有り難うございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# leetcode 155 minstack 1 2022/05/07 16:43
- C言語・C++・C# カードシャッフルのブログラムを使ってc言語でブラックジャックをしたい 2 2022/04/12 15:13
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# プログラミング c言語 4 2023/03/07 01:05
- C言語・C++・C# c言語の問題です 課題1 (二分探索木とセット) 大きさ size の配列 array を考える。す 2 2023/01/10 21:08
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# C言語プログラム変更 2 2022/12/21 15:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
VC++でGetKeyboardStateがうま...
-
Notepad++の関数リスト表示の変...
-
C# KeyDownイベントでショート...
-
多重定義が起きている?--lnk20...
-
静的でないメンバ関数の呼び出...
-
既定のコンストラクタがありま...
-
戻り値を返す関数の前に(void)...
-
gcc: incompatible pointer type
-
クラス間でのクラスの共有?
-
アドレスを指定して関数を呼び...
-
スレッドの作成について(pthre...
-
コンパイルエラー: LNK2001
-
void*型の配列について
-
AKI-h8 3069f C言語 HEW マイ...
-
const_castのつかいどころを教...
-
static constメンバ変数(配列)...
-
ソケット通信時のWSACleanup処...
-
C言語 プロトタイプ宣言
-
‘*’をツリー状に表示しろという...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
【gcc・cygwin】multiple defin...
-
int main()、void main()、void...
-
戻り値を返す関数の前に(void)...
-
既定のコンストラクタがありま...
-
Notepad++の関数リスト表示の変...
-
ArduinoでMouse関数を使用して...
-
多重定義が起きている?--lnk20...
-
C++にてtemplateで受け取った任...
-
静的でないメンバ関数の呼び出...
-
C# Controls.Addで動的に配置し...
-
const_castのつかいどころを教...
-
(void)0 はどんな意味ですか
-
C# KeyDownイベントでショート...
-
gcc: incompatible pointer type
-
C#でラジオボタンを設定に記録...
-
VC++でGetKeyboardStateがうま...
-
C言語 ① 5秒間 1秒間隔で点滅を...
-
void*型の配列について
-
GDI+の使用方法について
-
DirectInput でのエラー
おすすめ情報