• ベストアンサー

PIC16F84AのデバイスでC言語を用いて音を出したい

PIC16F84AデバイスでCCS社のCコンパイラーを用いて音を出したいのですが、C言語の記述が分かりません。 音は、圧電ブザーで、Bポートの1つを使います。 Aポートの1つにスイッチを取り付け、スイッチが入ったら、音を鳴らしたいのですが、C言語で音階が記述できるんでしょうか? 簡単で良いので、C言語で、音を鳴らす記述を教えていただけないでしょうか?

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

  • ベストアンサー
  • zwi
  • ベストアンサー率56% (730/1282)
回答No.1

圧電ブザーは他励式だと仮定して書かせてもらいます。 音は、圧電ブザーのON/OFFで出すことが可能ですが、周波数(音階)は1秒間に何回ON/OFFを繰り返せるかで周波数が決まります。例えば、周波数800Hzは、1秒にONとOFFを1組として800組繰り返します。 ようは、ONとOFFの時間が可変長な関数を作ってやれば色々な周波数を出すことができます。 [参考関数] void sound( int time, int count ) { int loop; // 残り時間だけループを繰り返す。 for( ; time>0 ; time-=(count*2) ) { // 圧電ブザーをONにする。ON時間はcountで決まる。 for( loop=0 ; loop<count ; loop++ ) { 圧電ブサーのポートをONに。 } // 圧電ブザーをOFFにする。OFF時間はcountで決まる。 for( loop=0 ; loop<count ; loop++ ) { 圧電ブサーのポートをOFFに。 } } } [説明] timeでなり続ける時間を指定します。 countでON/OFFの周期を指定します。大きな数字ほど周波数が低くなります。0は音が鳴りません。 C言語だとアセンブラほど高速にON/OFFを繰り返せないので、アセンブラに比べると出せる周波数は低めになるかと思います。いろんな値を入れて実際にどんな音するか試してみてください。 それとこのプログラムはCPUを占有しますので、音を鳴らしながら平行して処理をしたい場合は、タイマー割り込みでブザーをON/OFFする方式に変更しないと実用性が低いかもしれません。

tsugurin
質問者

補足

対応ありがとうございます。 この記述は、CCS社のCコンパイラーに対応しているのでしょうか? PIC用に動かしたいのですが、上記の記述は音を鳴らすことが出来ますか?

その他の回答 (1)

  • zwi
  • ベストアンサー率56% (730/1282)
回答No.2

実はPICはアセンブラ専門でC言語もフリーの物しか使ったことがありません。CCS社のCコンパイラが使ったことが無いので断言は出来ませんが一般のC言語としては問題ない書き方をしました。 不安があるとすれば、intの値の範囲で十分に音階を制御できるかどうかですね。intで足りなければlongにする必要があります。 それとmain関数や圧電ブサーのポートをON/OFFの部分は書いてありませんので付け加えをお願いします。

関連するQ&A

  • PICマイコンでLEDの点滅をC言語で記述法を教えてください

    PICマイコン(PIC16F84A)にLEDを1個接続し点滅だけのプログラムをC言語で記述を書きたいのですが、教えていただけないでしょうか? CCS社のコンパイラを用いた時の記述の書き方を教えていただけないでしょうか? 条件は、 ・電池を繋げるとLEDが点滅、スイッチ素子は用いません。 ・LEDは1秒間隔で点滅し、永遠に点滅 ・LEDは、PICマイコン(PIC16F84A)の9番ピン(RB3に該当)に接続 ・水晶発振子は、10MHzを使用。 ・コンパイラは、CCS社を使用 私が分かる範囲は下記なのですが、これから先の記述方法が分かりません。 #include <16f84a.h> #fuses HS, NOWDT, NOPROTECT #use delay(clock=10000000) #byte port_b=6 main() { この中身の記述方法が分かりません。 教えていただけないでしょうか? } よろしくお願いします。

  • PICプログラム C言語とアセンブラ言語

    PIC18シリーズを使用して、プログラミングをしています。コンパイラはCCS-Cです。今まではすべてC言語で書いてきたのですが、アセンブラでしか設定ができない部分があり、今までのC言語のソースに加えてアセンブラを組み合わせようと思っているのですが、C言語とアセンブラを組み合わせることは可能なのでしょうか?

  • pic16FのコンパイルにCCSのCコンパイラ

    pic16FのコンパイルにCCSのCコンパイラをMPLABに統合した環境で使用しています。 大文字と小文字の区別をつけることは出来ないのでしょうか? 誰か教えてください。

  • PICの型番で最後にAがついている改良版について

    PICの型番で最後にAがついている改良版とついてない物は具体的にどのように違うのでしょうか? タイマーの精度だけなら、PICのCコンパイラでデバイス指定する時Aのついている物とついていない物、区別する必要ないじゃないですか?僕の持っているCCSのCコンパイラは古くてAのついていない物が沢山あります。メーカーに問い合わせたら古すぎて、アップデートは出来ないとのことです。 デバイス指定する時Aのついている物とそうでない物が存在する理由を教えてください。どうかよろしくお願いいたします。

  • MPLAB C18のC言語について

    趣味でPICをはじめて、いままではアセンブラ言語でプログラムを書いてきました。 こんどPIC18Fに挑戦しようと思っているんですが、PIC18FはC言語で書いた ほうがいいらしいですね。無料でMPLAB C18というC言語のコンパイラが使えるらしいですし。 C言語は勉強したことがないので、とりあえずC言語を勉強しなければならないんですが、 C言語っていろいろ種類があるんですね。C,C++,C#、あとvisual basic系のCとか。 なんだかさっぱりわかりません。 MPLAB C18のC言語にもっとも近いのはどれでしょうか。おしえてください。

  • PICのCコンパイラーについて

    PICのCコンパイラーでどれを使うかで迷っています。 高価なものでCCS社やmicrochipのものがいいかなと思うんですが、 やはり安く済まそうと思うとmikroCやBoostCがやすいかなって思います。安いにこしたことはないんですが、購入後に不便に感じて、あっちのコンパイラーをにしとけば良かったなどと後悔したくもありません。 実際、ある程度の経験がないとそれぞれの(コンパイラーの)長所と短所が見えてこない気がしましたので、お伺いします。 説明がわかりづらいかもしれませんが、よろしくお願いします。

  • PIC18FのUART通信について

    こんにちは ただいまGPSとSDカードを使ったロガーをPIC18F2550で作成しております。 GPSとSDを使うため、UARTのピンが2つ必要ですがPIC18F2550にはTX/RXは一つずつしかありません。 そこで,ソフトUARTで解決したいのですが, CCS Cコンパイラではソフトウェアシリアル通信の機能があるみたいのですが 現在自分が使っているC18だといくら探しても見つかりませんでした。 C18もソフトUART機能はあるのでしょうか?

  • PICのA/Dを使うプログラムについて質問です

    今、電子ドラムを作っているのですが、プログラムが上手く作動せず困っています。 知恵を貸していただけたら幸いです。 センサー部が叩かれると電圧が上昇するようにしてあるのですが、PICでHighと認識されるほど電圧が上がらないので、A/D変換を使い入力を判定しているのですが、2つ以上の入力のプログラムが上手く行きません。 Pinごとに順番にA/D変換し、一定値以上なら変数にpinごとに割り振った2進数を加算し、入力pinすべての判定が終わったときの変数の値別にswitch文で出力を変え、70ms出力するようなプログラムをつくりました。 入力が1pinだけの同様のプログラムは動くのですが、入力を複数にすると動きません。 このように複数のA/D変換をほぼ同時にする方法は無いでしょうか? デバイスは16F877/20-SP 言語はCでCCS-Cコンパイラーを使っています。 回答よろしくお願い致します。

  • マイクロチップ社PIC用の Cコンパイラについて

    今までPICのプログラムを作るのにマイクロチップ社のアッセンブル言語を使っていましたが、今後もう少し複雑なプログラミングをしようと思っているのでC言語のコンパイラを購入しようと思っています。 ここで結構迷いまして、どのメーカーのコンパイラがいいか色々な意見を聞きたいために書き込みをしました。 コストパフォーマンスで考えていた候補が CCS-CかMikroCです。 試しにMikroCを使ってみたところ確かにあっという間にちょっとしたプログラムが作れるので快適なのですが、ソフト上のシミュレーション機能で変数の変化を見ると時々挙動が変だったりするのが気になります。 (知っておくべき知識があるのかバグなのかはわかりません)。 また、CCS-Cは若干値段が高く癖のあるC言語ということを聞きますが、人気があるように思えます。私は癖があってもそれを覚えればいいと楽観的なのですが・・。 PIC用のCコンパイラに見識がある方がおられれば意見をお聞かせいただければと思います。 こういうところはかなり問題だとか、こういう機能はすごく便利だとか、こっちの方がこうだから絶対お勧めだとか、なんでもいいので教えていただければ幸いです。 よろしくお願いします。  

  • picの連射状態について

    閲覧ありがとうございます。 現在学校でPICマイコンを使った授業をしており、スイッチを押すと7セグLEDがカウントアップ されるものを作っているのですが、どう作っても連射状態(スイッチを押しっぱなしだと勝手に カウントアップされる)になるのですが、これをスイッチを押すたびにカウントアップするように するにはどうすれば良いのでしょうか? 言語はCで使用PICは16F84A、環境はMPLABでCCS-Cコンパイラを使用 しています。