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

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

ただいまの
回答率

89.10%

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 119

TypeR8373

score 1

前提・実現したいこと

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を組み合わせています。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • thkana

    2020/07/01 20: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 09:23

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

    キャンセル

回答 2

checkベストアンサー

+1

これは、他サイトで私が回答したやつですね。
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/06 15:29

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

    キャンセル

0

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/07/06 15:28

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

    キャンセル

  • 2020/07/06 15:29

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

    キャンセル

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

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる