現在PICを使ってLEDを制御する事を勉強しています。
3つのLEDを3秒間隔で点灯させ、それを無限に繰り返すプログラムを考えてみました。LEDは一つのポートに一つのLEDを割り振るのではなく、ICを使って制御しています。
これを発展させ、待ち時間の3秒間にRA2ポートに入力があるとLEDの点灯をその場所で停止させ、もう一度RA2ポートに入力するとループが再開するといった内容にしようと考えていますが、調べてもどうすればいいのか分かりません、分かる方は教えて頂けないでしょうか
# include <16f84a.h>
# fuses HS, NOWDT, NOPROTECT
# use delay(clock=20000000)
int flag, sec, count;
main()//main関数の開始宣言
{
set_tris_a(0x10);
set_tris_b(0x10);
#use fast_io(a)//port_aの高速処理を行う設定
#use fast_io(b)//port_bの高速処理を行う設定
while(1){//無限ループのwhile文の宣言
output_low(PIN_A0);//RA0の出力
output_low(PIN_B5);//RB5の出力
output_low(PIN_B6);//RB6の出力
output_low(PIN_B7);//RB7の出力
//LED1が点灯
delay_ms( 3000 ) ;//3秒待つ
output_high(PIN_A0);//RA0の出力
output_low(PIN_B5);//RB5の出力
output_low(PIN_B6);//RB6の出力
output_low(PIN_B7);//RB7の出力
//LED2が点灯
delat_ms( 3000 ) ;//3秒待つ
output_low(PIN_A0);//RA0の出力
output_high(PIN_B5);//RB5の出力
output_low(PIN_B6);//RB6の出力
output_low(PIN_B7);//RB7の出力
//LED3が点灯
delay_ms( 3000 ) ;//3秒待つ
}
No.2ベストアンサー
- 回答日時:
★回答ではないが気になったので。
>main() //main関数の開始宣言
↑
main関数の定義です。開始の宣言ではないです。記述の開始かな。
>while(1){ //無限ループのwhile文の宣言
↑
while文の宣言という表現はおかしいね。
ちなみに無限ループなら for( ; ; ){ … } でも出来ます。
本題:
・LED の点灯と停止の方法
RA2ポートの入力状態のチェック方法
の2つを教えて下さい。
・考え方としては delay_ms() 関数の部分にRA2ポートの入力状態をチェックしてその場で
停止したり、再開させたりすれば良いと思います。つまり、delay_ms() 関数で 3 秒間
のループを作ってそのループ内でRA2ポートの入力状態から停止、再開を出来るように
記述するわけです。
while (1){
// LED1の点灯
for ( int i = 0 ; i < 3000 ; ){
/*
RA2ポートの入力状態を読み出す
例えば flag 変数に停止なら 0、再開なら 1 を入れるとする
*/
if ( flag ){ // 再開の時に処理
i++; // ここでインクリメント
}
delat_ms( 1 ); // 1ms待つ
}
// LED2の点灯
for ( int i = 0 ; i < 3000 ; ){
:
上と同じ処理
:
}
// LED3の点灯
for ( int i = 0 ; i < 3000 ; ){
:
上と同じ処理
:
}
}
最後に:
・for 文のループは関数にして3箇所に記述したほうが便利です。
・以上。
詳しい回答有難うございます
確かに日本語表現もおかしい所がありました、これでは分かり難くなってしまいますね。
for文でループを作るというのは考え付きませんでした!
確かにこれであれば【3秒間の間に信号を入れる→LED停止】という形になりそうです。
非常に参考になりました。
No.4
- 回答日時:
>つまりこの反転処理というのはflag変数を反転させるための処理ということなのですね。
その通りです。
チャタリングに関しては、ここが参考になるかと。
http://www.picgames.org/modules/tinyd1/index.php …
高度な処理としては、チャタリングの処理をタイマー割り込みで処理させるとメインループがシンプルになるので、勉強が進んだら挑戦してみてください。
それとbeforeRA2はRA1の値を代入してからループに入るようにしてください。そうしないと、何も変化していないのにトリガ反転する恐れがあります。
おまけで、このプログラムをアセンブラのテクニックで書くとこんな感じにも書けます。参考まで。
int i;
while( 1 ) {
for( i=0 ; i<3 ; i++ ) {
// PIN_A,PIN_Bは、ポートのレジスタを8bitでアクセスします。
PIN_A = (PIN_A & 0xfe) | (i & 0x01);
PIN_B = (PIN_B & 0x1f) | ((i & 0x0e)<<4);
delay_ms( 3000 ) ; //3秒待つ
}
}
チャダリングについて理解できました!
これを知らないでプログラムをしたらおかしな動作をしそうです(汗
プログラムというのは奥が深いですね、今回は非常に参考になりました、ありがとうございます。
No.3
- 回答日時:
ANo.2の方の答えで、ほぼ問題ないと思います。
ただし、RA2の入力がSWからの場合はチャタリング対策処理されていることが必要です。そこは大丈夫ですか?
それと、トリガ反転するプログラムも組む必要があります。使われているのはCCS Cだと思うのですが使った事が無いので、それっぽくイメージで書かせてもらいます。
// トリガ反転処理。
if( RA2 != beforeRA2 ) { //1回前のRA2と状態が違う場合
beforeRA2 = RA2; //状態を保存する。
if( RA2 == 1 ) { //SWが1ならトリガ反転する。
flag ^= 1; //フラグの状態を反転する。
}
}
間違いに気づきました、入力はRA2でなくRA1でした、申し訳ありません。
チャダリング処理、トリガ反転・・・全く意識していませんでした
まだまだ勉強不足な事が多いようです。
つまりこの反転処理というのはflag変数を反転させるための処理ということなのですね。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 コードを書いたのですが上手く実行出来なかったです。どこが間違ってますか? 【作成したいもの】 1 2022/05/04 11:36
- C言語・C++・C# C言語 ① 5秒間 1秒間隔で点滅を繰り返す ② 3秒間 0.5秒間隔で点滅を繰り返す ①→②→①→ 5 2022/05/03 23:37
- 高校 物理の問題の解説お願いします。 1 2023/03/04 16:42
- Windows 10 windows10 PINコード エラーについて 4 2022/10/04 05:55
- その他(動画サービス) TVerでPINコードを求められてログイン出来ない。 AndroidTVであらかじめスマホアプリやP 2 2023/07/17 13:33
- その他(プログラミング・Web制作) micropythonコード 修正 1 2023/06/13 17:22
- Windows 8 win11の立ち上がりのpinを省略してすぐ対応したい 5 2023/06/29 17:55
- Microsoft ASP LEDで電光掲示板に「A B C D E」と表示したいのですが・・・ 1 2023/07/04 07:37
- Windows 7 更新プログラムを入れたら操作出来なくなりました(泣) 1 2023/02/26 11:04
- Windows 10 PCのスリープ復帰時のPIN 入力を省略 したい 4 2023/01/10 09:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
【ExcelVBA】最終行の取得で困...
-
アクセスでエクセルに出力する...
-
コンセントの電力は入力と出力...
-
MMDでavi出力が出来ない
-
COBOLのMOVEで桁数が異なる場合
-
ACCESS クエリ→フォーム...
-
cout と cerrの違い
-
【PowerPoint VBAの高速化】
-
プログラムについての質問です...
-
VBAのExecメソッドで画面を非表...
-
CrystalReportの文字列の折返し...
-
1〜50まで順に数字を入力し、3...
-
センサーのタンパー出力について
-
Accessのテーブルからcsv出力す...
-
海外の110Vの電気製品を日本で...
-
KEYENCEのシーケンスプログラム...
-
エクセルで英字と数字を組み合...
-
RS232cデーターをエクセルに落とす
-
printfとputcharの違いは
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PS4コントローラーをPCでゲーム...
-
4Kの外部モニターに出力すると...
-
プログラムについての質問です...
-
printfとputcharの違いは
-
cout と cerrの違い
-
COBOLのMOVEで桁数が異なる場合
-
テキストファイルから特定の文...
-
MMDでavi出力が出来ない
-
コンセントの電力は入力と出力...
-
アクセスでエクセルに出力する...
-
OBS配信すると、マイクが途切れ...
-
coutで出力した文字を消去する...
-
CRC16計算について
-
VBA レジストリの値の読み方に...
-
ACCESS クエリ→フォーム...
-
printfの書式%.*s
-
VBAで有効数字の設定
-
VBAでテキスト出力時のスペース...
-
VBAのExecメソッドで画面を非表...
-
makeで文字化けする。migwのmak...
おすすめ情報