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

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

ただいまの
回答率

90.61%

  • C

    3568questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

マイコンで外部からスタートコマンドが入ってきたらストップコマンドが来るまで処理を繰り返したい

解決済

回答 3

投稿

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

sotooki

score 8

 前提・実現したいこと

マイコンであるdspicを利用し、UARTを用いて

①外部から'1'が受信されたら割り込み処理関数内のOnePoint()という関数が50msごとにループで動作し続ける
②'1'以外が受信されたらループが終了し、再度'1'が受信されるまで待機する

というプログラムを作成したい。

 発生している問題・エラーメッセージ

プログラムは動作するのですが、スタートコマンドである'1'を外部から取得し、割り込み処理関数内のOnePoint();が動作すると取得波形に影響が及んでしまいます。
計測画面
割り込みのタイミングが問題なのではと推測しておりますが、対処法が分かりません。

一方、外部のプログラムを用いて50ms毎に'1'を連続的に送り続け、送られてくるタイミングごとにOnePoint();を動作させた際には波形に影響が出ませんでした。

しかし、外部から50ms毎に'1'を連続的に送り続けるシステムは時間精度が低いため、マイコン内部でOnePoint();を動かしたいです。

 該当のソースコード(割り込み関数内でOnePoint();動作)

/***1point 関数***/
void OnePoint(void)
{
 Red=0;
 WriteUART1((unsigned int)(0x02));
 while(BusyUART1());
for(h=1; h<=2; h++)
 {
  WriteUART1((unsigned int)(0x41+((Vmin[h]>>12) & 0x000F)));
  while(BusyUART1());
  WriteUART1((unsigned int)(0x41+((Vmin[h]>>8) & 0x000F)));
  while(BusyUART1());
  WriteUART1((unsigned int)(0x41+((Vmin[h]>>4) & 0x000F)));
  while(BusyUART1());
  WriteUART1((unsigned int)(0x41+((fmin[h]>>8) & 0x000F)));
  while(BusyUART1());
  WriteUART1((unsigned int)(0x41+((fmin[h]>>4) & 0x000F)));
  while(BusyUART1());
  WriteUART1((unsigned int)(0x41+((fmin[h]>>0) & 0x000F)));
  while(BusyUART1());
 }
 WriteUART1((unsigned int)(0x03));
 while(BusyUART1());
 CRLF();
 Red=1;
}

/*** タイマ1 割り込み処理関数 ***/
void __attribute__((__interrupt__, __shadow__))_T1Interrupt(void)
{
 IFS0bits.T1IF=0;//割込みフラグクリア
if(cmnd =='1')
{OnePoint();}//1point送信
}

/*** メイン関数 ***/
void main(void)
{
//初期設定省略

///OnePoint();動作(0.05秒間隔)
OpenTimer1(T1_ON & T1_GATE_OFF & T1_PS_1_256 & T1_SOURCE_INT , 5769);//50ms毎
ConfigIntTimer1(T1_INT_PRIOR_3 & T1_INT_ON); 

    while(1)
    {
       while(!DataRdyUART1());
       cmnd = ReadUART1();
    } 
}

 該当のソースコード('1'が取得されるごとにOnePoint();動作)

/*** メイン関数 ***/
void main(void)
{
//初期設定省略

 while(1)
 {
  while(!DataRdyUART1());
  cmnd = ReadUART1();
  ///受信コマンドの処理
  switch(cmnd)
  {     
     case'1':
    ///1point measure
     OnePoint();
     break;

     case'2':
     break;
     default : break;
    }
 }

}

 補足情報(FW/ツールのバージョンなど)

dsPIC
MPLAB
c言語

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

0

ふつう、そういうコードを組む場合、タイマ割り込みで50msを生成して周期実行させ、シリアルの送受信動作も、それぞれ割り込み駆動させるようにして、わざわざビジーループを待つようなことはしません。

それよりも、その入力波形に影響を及ぼしてるのは何かを特定することでしょうね
#A/D入力がバッファリングされてるdsPICの上位CPUに換装する、という選択肢はないんでしょうか

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/06/11 22:05

    すみません、上段に関して具体的にはどのようにプログラムを書き換えればよいのでしょうか。

    キャンセル

  • 2018/06/11 22:15

    1バイト受信した場合に割り込みをかけることができるので、割り込みルーチン内で受信データを読み出し、予め確保しているバッファにためていきます
    また、送信レジスタが空いた場合に割り込みをかけることができるので、予めバッファに展開しておいたデータ列を送信割り込みで順番に送信レジスタに設定していきます

    キャンセル

  • 2018/06/11 22:30

    いわんとすることは理解できるのですが、現状知識不足のためプログラムに書き起こすのが困難です。
    もう少し学んでいきたいと思います。

    キャンセル

  • 2018/06/11 22:31

    いつもご回答ありがとうございます

    キャンセル

  • 2018/06/11 22:53

    CPUのデータシートやハードウエアマニュアルを擦り切れるほど「読む」ことですねー

    キャンセル

0

前回の質問からすると、やりたいことがそもそも、
周波数を電圧に変換するシステムがあって、
入力周波数をスイープして対応する出力電圧を求め、
電圧が最大になる周波数を求めたい。
ということかと思います。

となるとそもそもAD変換を一定間隔で行う必要もないので

  • 周波数を設定してAD変換する
  • これを必要な回数繰り返したら最大値などをシリアル送信する
  • 送信が終わったらまた最初に戻る

だけでいいです。割り込みとか必要ないです。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

OnPaint処理が50ms以上かかっているため、タイマー割込みが重なり、OnPaintが同時に2個以上実行されることはないでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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

関連した質問

  • 受付中

    10進数から16進数に変換

    10進数を入力すれば16進数に変換されるというプログラムを作っているのですがいまいちうまくいきませんどこがまちがっているのでしょうか? import java.io.IOExce

  • 受付中

    社員情報のプログラム

    社員情報のプログラム (JAVA) プログラの機能 (1)社員情報の追加 入力項目としては、社員番号、氏名(性、名)、生年月日(年、月、日) (3)で読み込んだ情報を追加する仕

  • 受付中

    マイコンでのドットマトリクスLEDの制御

    前提・実現したいこと Atmel社のAVRマイコンを用いて、配列に格納された任意のパターンを縦・横それぞれで表示していく   ・・・  該当のソースコードの部分にはled[0]

  • 解決済

    C言語 簡易関数電卓作成 エラーばかり

    プログラミング初心者です。 c言語で電卓を作成してみましたが、うまく動いてくれません。 コンパイルできない。 エラー個所をコメントアウトして実行すると、一文字入力後操作を受

  • 解決済

    Unityでの乱数を重複なく複数回表示

    Unityでtetrisを作っています。 unity初心者なのでいろんなサイトを見て頑張っているのですが、 一つだけどこを探してもわからないことがあります。 それは 乱数を重複なく

  • 解決済

    c言語 リスト構造について...

    前提・実現したいこと 最近C言語でリスト構造を勉強したので自己流でリスト構造のプログラムを作成したのですが正常に作動しません。どなたか解決法を教えてください。 説明不足だったの

  • 解決済

    再帰を使わずに再帰のようなことを実現したい

    [1,1,1,1,1] [1,1,1,1,2] ... [1,1,1,1,9] [1,1,1,2,2] [1,1,1,2,3] ... [8,9,9,9,9] [9,9,9,9,9

  • 解決済

    ListView ヘッダ部の背景色の指定

    C#(visual studio 2010)にて、ListViewをつかった表を作成しております。 ヘッダ部およびデータ部へ情報の表示はできたのですが、 ListViewヘッダ部の

同じタグがついた質問を見る

  • C

    3568questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

  • トップ
  • Cに関する質問
  • マイコンで外部からスタートコマンドが入ってきたらストップコマンドが来るまで処理を繰り返したい