• ベストアンサー

PICマイコンのLED制御

PICマイコンのLED制御 pic12Fを使って、LEDのPWM制御を行おうと考えていますが、うまくいかないので知恵をおかしください。 それぞれの出力端子に3色のLEDをつけて、順にだんだん明るくなってから、だんだん消灯してゆくプログラムを考えましたが、 最初のLEDが消える前に、2番目のLEDをゆっくり点灯させたいと思っていますが、うまくいきません 少しだけ同時点灯するには、どのような考えをすればいいのでしょうか。だんだん消えていく中で、点灯を始める処理がわかりません。よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • anicicle
  • ベストアンサー率36% (129/356)
回答No.3

No.2です。 基本的には、マイコンはイマ割り込みを使用した制御を行うことが理想です。 単純ループでは、処理内容によって一周の時間が変わってしまう為、あまりよくはありません。 また、タイマ割り込みでカウンタを加算(減算)していき、そのカウンタを別の処理で参照することで時間の経過等も確認できます。 (もしくは、タイマ割り込みでカウントした値になったらフラグをONにし、そのフラグを使用する) 1ms毎のタイマ割り込みなら、10回で10msec、1000回で1Sec経過と判断することができます。 問題箇所を特定できないので適切な回答をできないのはNo.2に書いたとおりですが、 例えば、2つのLEDを10段階に明るさを変化させると仮定した場合、 「10 - LED1の明るさ = LEDの明るさ」 のような制御処理が必要になりますよ。 それと、同時出力制御に問題ありでしょうね。

laiec83
質問者

お礼

ありがとうございます。 何となく、理解できそうになってきました。 もう少しがんばってみます。

その他の回答 (3)

  • kringon
  • ベストアンサー率55% (29/52)
回答No.4

以前PIC12F675を使った経験があります。 自分のようなドジを踏んでいるとは思えませんが、もしかしたらということで書き込みました。 (失礼覚悟で) PIC12F675のGP3は入力端子として使えますが、出力設定はできません。 自分は、このことに気付かず丸一日も無駄な時間を過ごしました(汗 PS 複数のLEDをPWMを使って複雑に制御するというのは、難しそうな予感。 しかも3つとなると大変そうですね。 ハードルが高いので、自分なら個数分のCPUで誤魔化します(汗 自作でLED発光制御コマンドを作ったとしても、LEDは応答性能が早いため、徐々に発光とか減光という動作は、(アナログ的な動作は)タイミング取りが無つかしそうですね。 さらに今回のようにシフトが複雑な場合は、プログラムと実験の闘いいなりそう。 応答性の悪い豆電球であれば多少タイミングがズレてもバレそうもありませんが。 ※LED光拡散キャプなどを使えば多少ギクシャクしてもアナログ的に見えるかな??

laiec83
質問者

お礼

初めてのマイコンプログラミングで、とにかくつまずいています。回答いただけるだけありがたいです。 確かに、多少のタイミングのずれは仕方ないかもしれません。それにしても、複雑な操作は、頭が混乱して、うまくプログラムできないのが、実情です。 しばらくがんばってみます。ありがとうございます。

  • anicicle
  • ベストアンサー率36% (129/356)
回答No.2

まず確認、LEDの輝度制御はどうやって行っていますか? (電圧制御/パルス制御/他) ちなみに、Outputは2つ以上駆動できるだけの出力は確保していますか? それと、ソースや回路図が無いと、何がどうおかしいのか第三者が特定するのは難しいですよ。

laiec83
質問者

補足

ありがとうございます。 本を買って勉強中なのですが、カウンタを使って、ON時間とOFFの時間を制御し、ループさせることによって1個のLEDを制御することはできました。それをつなげて3色のLEDを制御すると、最初のLEDが消灯してから、2個目のLEDがだんだんつきます。 同時に2つのLEDを制御したいと思っているのですが、こういった場合は、タイマー割り込みを使うのが一般的なのでしょうか?

  • aokii
  • ベストアンサー率23% (5210/22062)
回答No.1

パルス幅制御。

関連するQ&A

  • PICマイコン 4つのLEDを点滅させたいのですが

    マイコンのプログラミングはこれから勉強 という所ですが、PICKit3は持っていて、過去に プログラムを作ってもらい、PICに書き込み、 基盤を組んで動作させた事はあります。 本題です。4つのLEDを点滅させたいのですが、 マイコンはPIC10F200で可能だと思います。 ですが、当方やってみたいのが同時点滅でも 順次点灯でもなく、1個1個のLEDの点灯時間を ずらしたいんです。イメージは昔ながらの クリスマスツリーで、バイメタル球の点灯時間が 個体によりばらつきがある、というのをLEDで 再現したいと思ったのですが、PIC10F200で可能 でしょうか? 宜しくお願いします。

  • LED点灯制御についてです

     こんにちは、はじめまして。早速ですが、質問させていただきたいと思います。  LEDの点灯を制御したいと考えています。それに当り、ある点灯パターンに制御する方法を教えていただきたいのです。  その点灯パターンとは、10個のLEDが横一列に並んでいるとします。それらのLEDを点灯させるのですが、全てのLEDを一斉に点灯させるのではなく、左から順に点灯させていくと言うものです。そして全てが点灯した後に、消灯させます。  このような点灯パターンは、やはりマイコンで制御するしかないのでしょうか?  どなたか、ご教授をお願いいたします。  それでは、失礼いたします。

  • PICマイコンの発熱

    PICマイコン16F84AでLEDを点灯させる回路を組みました。 PWM制御でLEDの明るさが変化するようにプログラムしたのですが、動作させるとプログラム通りに動いているのにマイコン本体が以上に発熱しました。 正確に測っていませんが、長時間触っていると低温やけどしそうなくらいなので50~60℃位にはなっているようです。 配線は、間違っていません。電圧も3Vで規定値内です。 最初は表面実装タイプの16F84Aを使用したので、半田こての当てすぎかと思ったのですが、ICソケットを使用した同様の回路でDIP品の16F84Aを使用した場合でも同じく以上に発熱した事がありました(その時は新品のマイコンに交換したら発熱しませんでした)。 一体何なのでしょう? マイコンは大量生産品なので新品でも不良品は結構ある物なのでしょうか? 同じような経験のある方おられませんか?

  • PICによるLED制御について

    大学の講義でPICのLED制御の課題がよくわかりません。 どなたか教えていただけないでしょうか? [問]  PIC16F84Aにおいて、動作を実現するプログラムを示せ。  メインルーチンでLED出力の点燈箇所を1秒ごとに巡回させる。   RA3=Low(OFF)のとき、左向きに巡回シフト(RLF命令)させる。   RA3=High(ON)のとき、右向きに巡回シフト(RRF命令)させる。  また割り込みルーチンによって、RA0~RA2の3ビットの値に応じて  点灯速度を変化させる(値が大きいほど速く)  ただし、ポートAは全て入力モード、ポートBはRB0以外を出力モードとし(RB0は割り込み用)、ポートBの初期出力を0000100*(LED出力の初期点燈位置は第3ビットのみ)とせよ。

  • PIC16f88でLEDの点灯をしたいのですが、

    PIC16f88でLEDの点灯をしたいのですが、 9番ピン(RB3)だけLEDが点灯しません。 #include<htc.h> __CONFIG(UNPROTECT & DEBUGEN & MCLRDIS & PWRTEN & WDTDIS & HS); void main() { PORTB = 0xff; TRISB = 0x00; } 上記のプログラムでBポートをすべて出力にしてLEDを光らせているつもりです。 書き込みを行い試してみたところ、6,7,8番は点灯してくれました。 いろいろと調べてみたのですが、PWM設定(CCP1)と関係があるのでしょうか? また何かしらの設定が必要でしたら、教えていただけると助かります。

  • PIC初心者ですが、16F88のLED点滅制御です。 

    PIC初心者ですが、16F88のLED点滅制御です。  マイナスコントロールの回路ですが車のウインカーでスモール点灯時は今まではウインカー消灯。ウインカーを出した時に点滅でした。これをスモール点灯時にウインカーが点滅ではなく常時点灯に。ウインカーを出した時に点滅に変わるようにしたいんですが、どんなプログラムにすればいいんでしょうか?

  • マイコンのプログラミングについて

    H8マイコン内で周期の異なるPWM波形(PWM1、PWM2)を発生させ、PWM1とPWM2を論理演算した波形(例えばVout = PWM1 & PWM2)を出力端子に出力したいと考えています。この際、同時に通信プログラムも走らせるつもりです。タイマ関数を使えばVoutの生成は一応実現できそうなのですが、待ち時間によって通信プログラムに影響がでるため別の方法を模索しています。 当方、マイコン、プログラミングともに初心者なため、そもそもこのような並列処理ができるのかすら分かっていません。何か良いアドバイスがあればよろしくお願いします。

  • PICを同期させて制御する方法を教えてください。

    PICを同期させて制御する方法を教えてください。 PIC16F84Aを使用して、複数個をLEDを制御したいと考えています。 LEDの制御基盤を複数作り、同じプログラムを入れてもLEDの点灯タイミングが 同期して動きません。 複数個のPICを同期させて制御するにはどうしたらいいのですか? 5個以上のPICを使用したいと考えています。 教えてください。 よろしくお願いします。

  • H8マイコンでled制御

    H8/3052FのマイコンとAKI-H8-USBのキットを使用しています。 ledを制御する際に、通常はportのデータレジスタの該当ビットをlow(0)にしたときに消灯、high(1)に点灯となると思うのですが、 なぜか逆になります。つまりlowレベルのとき点灯します。 他に接続しているスイッチも逆になっているみたいです。 回路の組み立てがおかしいのでしょうか? 理由が分からず悩んでいました。 よろしくお願いします。

  • C言語でプログラミングし、PICマイコンでLEDを制御する

    現在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秒待つ }

専門家に質問してみよう