質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

2回答

2135閲覧

PICでSW入力時間を見て設定時間内と設定時間以上でLEDの点灯時間を変えたい

TypeR8373

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/07/01 06:59

前提・実現したいこと

PIC 12F683を使用し2つのSW入力(MODE選択,LED ON/OFF)でLEDの点灯時間(MODE1:1sec,MODE0:5sec)を変えていましたがMODE0の時に4.5sec以下の時間SW(ON/OFF)を押している間はLEDは押している間点灯するが4.6sec以上SWを押し続けてもLEDの点灯は5secで終了させて欲しいという要望が出て対応に苦慮しています。

発生している問題・エラーメッセージ

5sec点灯モードで5sec点灯しかしないかSWを押している間点灯し続けるという状況です。

該当のソースコード

新しい要望が出る以前に使用していたソースです。

#define MODE GP3 #define SW GP4 #define LED GP5 void main(void) { OSCCON=0b01100000;//内部4MHz ANSEL=0;//アナログ入力無効 CMCON0 = 0b00000111;//コンパレータ無効 TRISIO = 0b00011000 ;//GP3,GP4は入力 LED=1;//初期値として、LEDを消す while(1) { if(SW==1) { //SWが押されたら if (MODE == 1) { //モードが1なら LED = 0 ; // LEDをオン __delay_ms(1000) ;//1秒待って LED=1;//消灯 while(SW);//スイッチを押したままなら離すのを待つ __delay_ms(5);//チャタリング対策 } else { // モードが0なら LED = 0 ;// LEDをオン __delay_ms(5000);//5秒待って LED=1;//消灯 while(SW);//swを押したままなら離すのを待つ __delay_ms(5);//チャタリング対策 }

試したこと

ごく単純なSW入力によるLED点灯や、電源ONで各種LED点灯を行うだけのプログラムしか書いたことがないので
出力を3ポートにしてモードにより出力を選択しようとしたり、論理回路追加(AND)により制御出来ないかをやって
みましたがうまく行きません。MODE0で点灯しなかったり、5sec点灯が出来ずSW押している時間だけ点灯したりしてます。本業が光学設計なので本やネットで見てもこうすれば・・というのがピンと来ません。SWを押している時間を測りその時間によってLEDの点灯時間を変えてやれば良いかなと思っていますが、具体的にどう記述するかが分っていません。

補足情報(FW/ツールのバージョンなど)

コンパイラ XC8にpick kit3を組み合わせています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2020/07/01 11:21

「要望」が理解出来ないのですが、 4.5秒以下と4.6秒以上...とすると、4.55秒ではどうなるのですか? (これは4.5秒以下と4.5秒を超える場合、を言いたかったのだろうと想像はしますが。) > 4.5sec以下の時間SWを押している間はLEDは押している間点灯する これは、4.5秒以内にSWを離したらその途端に5秒を待たずにLEDが消灯する、ということを言っているのですか? > 4.6sec以上SWを押し続けてもLEDの点灯は5secで終了 4.6秒でSWを離してもLEDは5秒間点灯する、 8秒押し続けたときはLEDは5秒で点灯を終了し、3秒はSWが押されていても点灯しない状況になる、ということですか?
TypeR8373

2020/07/06 00:23

ご想像の通り4.5sec以下ではSWを離した瞬間に消灯、4.5sec以上ではどれだけSWを入れても5sec点灯した後消灯するという意味です。
guest

回答2

0

ベストアンサー

これは、他サイトで私が回答したやつですね。
https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q10227013470
といっても、4.5秒や4.6秒の話は出てこなかったですけど。

で、私の返信した分が修正されていませんけど?
っとよく見たら返信の方は
__delay(10);
と間違えがありますね。これは
__delay_ms(10);
です。

いずれにしても、判らない、もしくは出来なければちゃんと返信する事です。

もう向こうには返信できないようですからその部分を書いておきます。

if(SW==1) { //SWが押されたら if (MODE == 1) { //モードが1なら LED = 0 ; // LEDをオン __delay_ms(1000) ;//1秒待って LED=1;//消灯 while(SW);//スイッチを押したままなら離すのを待つ __delay_ms(5);//チャタリング対策 } else { // モードが0なら LED=0;//LEDオン __delay_ms(5);//チャタリング対策 for(int i=0; i<500 && SW==1; i++)__delay_ms(10); //点灯条件(10*500=5秒以内かつSWがオンの状態)なら待機 LED=1;//点灯条件が終了したので消灯 while(SW);//SWの押しっぱなしの可能性があるので離すのを待つ __delay_ms(5);//チャタリング対策 } }

投稿2020/07/02 16:21

nac_tnk

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TypeR8373

2020/07/06 06:29

コンパイルの問題解決したので早速やってみました。問題無く動作しました。有難うございました。
guest

0

点灯の時間間隔をdelayで時間待ちしているため、この待ちの間はなにも処理できなくなってしまうのがまずいですね

1ms程度のタイマ割り込みなどでタイマを実装して、これで時間計測及び待ち時間到達有無を判定するようにして処理を中断させないようにする必要があります

できればタイマ割り込み内でスイッチの入力&チャタリング除去もしてしまうのがベストですが。

投稿2020/07/01 07:15

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

TypeR8373

2020/07/06 06:28

タイマ割込みが必要かと思っておりましたが、Delay関数のままで出来ました。有難うございました。
y_waiwai

2020/07/06 06:29

まあ、それだけすればいいってんならそれでいいでしょうけどねー
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問