RL78ブザーと可変抵抗の数値取得方法

おはようございます

今学校(自習)でSunHayato RL78/G14 を触っていますが、ブザーを鳴らすのに必要なソースコードと可変抵抗の数値取得ソースコードがわかりません(ó﹏ò。)

LEDや7セグはつけれましたが詰んでいます(ó﹏ò。)

追記:ブザーを鳴らせました!ありがとうございます。

可変抵抗の値取得はまだですがコツコツ頑張ります!

Parents
  • たくさんの返信ありがとうございます。

    ソースコードでCubeSuite+を使っています。
    ポート解放や命令文がわかりません。

    ブザーは圧電ブザーだと思います。

    可変抵抗は抵抗数値によってLEDの点滅速度を変えたりしたいと思います。

    ちなみにボードはSunhayato MT-LR78を使っています。
  • チョコです。

    >ちなみにボードはSunhayato MT-LR78を使っています。

    このボードの取扱説明書を見ると,ANI18に接続されているようです。

    そこで,コード生成で「A/Dコンバータ」を選んで,「A/Dコンバータ動作設定」を「使用する」,「コンパレータ動作設定」を「許可」に設定します。

    スクロールして,下の方も設定します。

    「ソフトウェア・トリガ・モード」が通常の使い方になります。「連続セレクト・モード」で「変換開始チャネル設定」を「ANI18」に設定します。

    「変換時間設定」は,一番遅くしておけばいいと思います。これで,「コード生成」すると,初期設定と処理関数が生成されます。

    main関数でR_ADC_Start関数を呼びだすことでA/D変換が起動します。変換が完了すると,INTAD割り込みが発生するので,

    r_cg_adc_user.cのr_adc_interrupt関数に変換結果を読み出す処理(r_cg_sdc.cのR_ADC_Get_Result関数等)を組み

    変換結果をどこかの変数に格納して,使用してください。

  • チョコさんが丁寧に対応されてますがheroabeさんの問題は解決したのでしょうか。
    書き込みから授業あるいは独学で初めてマイコンに挑戦されていると思われます。
    授業ならフェイストゥフェイスでアドバイスが得られるので心配無用ですが、独学で始めたとすれば志が折れていない事を期待します。

    LEDを点灯させることができているので、同様にP01ポートをトグルさせるのはいかがでしょうか。クロックが32MHzとすればfor文を3万回ぐらい回せば可聴範囲内になると思います。私は、通常、コンパイルリストとソフトウエアマニュアルで時間を算出するのですが、現状の私のPCでCS+が起動できないので適当な数字です。どなたかチェックをお願いします。
    続いて、チョコさんの10月4日8時6分のアドバイスに従って、ADCでボリューム抵抗値を読み込み、例えば、forループにその値を入れることでピッチが変わります。
    私の経験からタイマと割り込みはハードルが高いのでこの後に10月4日3時52分のチョコさんのアドバイスのタイマを試すのが良いと思います。

    サンハヤトのMT-RL78マイコントレーニングボードは低価格で大変良いのですが、"ボリューム抵抗"はチョットと思います。やっぱり可変抵抗器ですよね。これでは「ボリューム(音量)でピッチ(音の高低)を変化させる」になってしまいます。
    heroabeさんの"積"も"詰"だと思いますが、短文だからこそ誤字には注意が必要です。インターネットの掲示板の場合は、単語を辞書やインターネットで調べて質問を2~3回は読み直さして投稿しないと的確な答えが得られないです。
  • 丁寧な説明ありがとうございました。
    ブザーを鳴らす事ができました!

    引き続き可変抵抗の値を取得しようとしていますが。。。

    説明だと R_ADC_Get_Result が変換結果(値)を持っていて、R_ADC_Get_Result を他の変数に格納して使うってことですか?

    値が100 > の 時にLEDを消すというプログラムを組もうと思いましたが動きませんでした。

    void main(void)
    {
    /* Start user code. Do not edit comment generated here */
    R_ADC_Start();

    while (1U)
    {
    unsigned char *adc_value;
    R_ADC_Set_OperationOn();
    R_ADC_Start();
    R_ADC_Get_Result(&adc_value);
    R_ADC_Stop();

    if(adc_value > 100){
    P1.1 = 1;
    }
    else P1.1 = 0;
    /* End user code. Do not edit comment generated here */
    }
    }

    素人ですみません(汗)
  • チョコです。

    >素人ですみません(汗)

    誰でも,最初は素人です。

    A/Dの制御方法を基本的に間違えています。A/D変換を開始してもすぐには結果は得られません。

    また,変換結果は10ビットになるので,これを以下のように8ビットに変更する必要があります。

     

    CS+のコード生成を使っていれば,main関数がスタートした時点ではA/Dの初期設定は完了しています。

     

    A/D変換を開始(R_ADC_Start関数を呼び出す)したら,変換完了を待つ必要があります。完了を待つには,

    ベクタ割り込み(INTAD)を使って,r_cg_adc_user.cの中の割り込み関数r_adc_interruptの中で変換結果を

    ADCRHレジスタから読み出すか,ベクタ割り込みを禁止して,割り込み要求フラグ(ADIF)をポーリングすることで

    A/D変換完了(ADIF=1)を待ち,ADIFが1になったら,ADCRHレジスタを読み出します。(8ビットモードなら,結果を

    シフトする必要がなく,ADCRHレジスタを読み出すだけです。)

     

    main関数の中だけで処理をクロ-ズさせるのであれば,ベクタ割り込みは禁止しておき,A/D変換を開始し,

    A/D変換完了を割り込み要求フラグ(ADIF)をポーリングすることで待ちます。

    この部分は以下のようになります。ここでは,adc_valueはポインタではなく,変数にしています。

    これで,変換結果がadc_valueに入るので,後は変換結果を使った処理を記述ればできるはずです。

    A/D変換は連続して行われるので,whileループで変換完了待ちから繰り返すだけで十分です。

     

  • チョットつけたし、

    動作に問題はないと思いますが、while文の内に変数の定義があるのは良くないと思います。
    使う時に宣言できるのがC言語の優れているポイントとされているので私だけが感じる事かもしれません。

    >adc_valueはポインタではなく,変数にしています。
    の補足です。
    unsigned char *adc_value; でadc_valueは、char型の変数を入れるエリアのポインタになります。
    &adc_value は、adc_valueと言う変数のポインタを指してます。
    heroabeさんのソースコードでは、ポインタのポインタをR_ADC_Get_Resultに渡してます。
    R_ADC_Get_Resultを呼び出す必要がなさそうなので、一応です。

    短いelseはバグの素と言われてます。複文でないのも危険な臭いがします。
    else
    {
    P1.1 = 0;
    }
    の方が良いです。また、シンボリックデバッガはソースコードの行単位でブレークポイントを設定します。行替えを考えておかないとバグ探しに苦労します。

    C言語に限らずインデントはコーディングに大きな助けになります。私は、使うべきだと思ってます。
  • チョコです。
    kijoさん,補足ありがとうございます。

    宣言がwhile文の中にあるのは気になったのですが,{}の中の頭で宣言していれば問題ないはずだったので,
    あえては変更しませんでした。(実際に展開されたコードを見ると単純にAレジスタが使われているだけでした。)
    これから,色々と覚えていくことを期待です。
  • かふぇルネではインデントが無くなってしまうようですね!!
Reply Children
  • こんにちは。NoMaYです。

    私は、もっぱら、リプライする時でも"Use rich formatting"モードに切り替えて入力しています。(新規投稿時に入力しているのが、実は、このモードですね。) このモードではコピペした場合でもインデントが保持されています。

    この"Use rich formatting"モードで慣れが必要かと思うのは、キーボードの単体のEnterキーの入力が『行を改める』ではなく『段落を改める』という意味になることです。他方、コピペしたテキストに含まれる改行は、普通に改行として扱われることです。テキストをコピペして、そのテキストを修正しようとした時に改行を入れなければならなくなった時には、Shift+Enterキーを入力します。(もっとも、これは新規投稿時の入力でも同じですが、、、)

  • NoMaYさん、

     ご教授ありがとうございます。
     もとのテーマとはずれてますがheroabeさんにも参考になったのではないでしょうか?

    これは練習ついでに"Use rich formatting"モードで書き込んでます。