// SOUND関数によるサウンド発生
void INIT_88JITSU(); //関数定義
void main()
{
INIT_88JITSU(); // 設定
//------------------------------
SOUND_Init(&PORTB,7); //Bポートのビット7に
SOUND_Play(1000,500); //周波数1000Hzの音を
//500mS間鳴動させる
}
void INIT_88JITSU(){ //関数本体部分
//レジスタの設定---------------------------
ANSEL=0; //アナデジポートをすべてデジタルに設定
OSCCON=0x70; //内部発振器の発振周波数8MHzに設定
TRISA=0; //Aポートを出力に設定
TRISB=0; //Bポートを出力に設定
}
↑のプログラムから音階を作りたいんですけどわかりません><
よければプログラムを教えてくれませんか?
(参)
ド : 1000Hz レ : 1122Hz ミ : 1260Hz ファ : 1335Hz
ソ : 1498Hz ラ : 1682Hz シ : 1888Hz ド : 2000Hz
PIC16F88について教えてください
-
marikoa
PIC16F88について教えてください
Re: PIC16F88について教えてください
marikoaさんの使っているコンパイラの名前を書いて下さい。
それから、SOUND_Init関数とSOUND_Play関数の中身が分かりませんので示して下さい。
それから、SOUND_Init関数とSOUND_Play関数の中身が分かりませんので示して下さい。
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 15年前
- 住所: 東海地方
- 連絡を取る:
Re: PIC16F88について教えてください
mikroCにその名前の関数があるので、たぶんmikroCじゃないかと思いますが微妙に名前が違うんですよね。
MikroCマニュアル(英語) 427ページ(2.14MB)
http://www.mikroe.com/pdf/mikroc/mikroc_manual.pdf
MikroCマニュアル(英語) 427ページ(2.14MB)
http://www.mikroe.com/pdf/mikroc/mikroc_manual.pdf
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。
Re: PIC16F88について教えてください
MicroCだとするとSound_Init、Sound_Playという関数名ですね。大文字、小文字の違いです。
で、この2つの関数の説明を読みましたが、Sound_Play(a, b)とすると、aにはサイクル数を10で割った値を入れるらしいです。
4MHzの発振子の場合、命令クロックは1MHzですから、1KHzの音を鳴らす場合は1000サイクルということで、
1000を10で割った100という値をaに指定します。
bは命令クロック単位の値を指定するらしいので、500msec鳴らしたい場合は
500 * 1000を指定しなければなりません。(命令クロックが1MHzですから、1 * 1000 * 1000 (Hz) * 0.5 (sec) = 500 * 1000)
しかし、恐らくMicroCの場合は500 * 1000という数値はunsigned int型に入れようとするとオーバーフローしますから、
もっと短い時間(例えば50 * 1000)を指定して10回ループするなどの対策が必要かと思います。
で、この2つの関数の説明を読みましたが、Sound_Play(a, b)とすると、aにはサイクル数を10で割った値を入れるらしいです。
4MHzの発振子の場合、命令クロックは1MHzですから、1KHzの音を鳴らす場合は1000サイクルということで、
1000を10で割った100という値をaに指定します。
bは命令クロック単位の値を指定するらしいので、500msec鳴らしたい場合は
500 * 1000を指定しなければなりません。(命令クロックが1MHzですから、1 * 1000 * 1000 (Hz) * 0.5 (sec) = 500 * 1000)
しかし、恐らくMicroCの場合は500 * 1000という数値はunsigned int型に入れようとするとオーバーフローしますから、
もっと短い時間(例えば50 * 1000)を指定して10回ループするなどの対策が必要かと思います。