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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

1回答

1493閲覧

dspicの処理に関して

sotooki

総合スコア15

C

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

0グッド

0クリップ

投稿2017/10/13 03:44

###前提・実現したいこと
現在dspicにプログラムをしております。
uartを用いて
①'1'が受信されたらOnePoint()という関数が100msごとにループで動作し続け
②'2'が受信されたらループが終了し、再度'1'が受信されるまで待機する
プログラムを作成したいのですが作り方が分かりません。

###発生している問題・エラーメッセージ
現在、'1'が受信されたらOnePoint()関数が1回動作することはできております。しかし、その場合OnePoint()関数を動作させるために毎回'1'を受信する必要があり実現したいプログラムと異なっております。

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

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

}

###該当のソースコード
/*** メイン関数 ***/
void main(void)
{
/// UART初期設定
OpenUART1(UMODEValue,USTAValue,ubrg);
IPC2bits.U1TXIP=5;
IPC2bits.U1RXIP=6;

/// PORT初期設定
ADPCFG=0xFFFF;//アナログなし
TRISB=0x0007;//0,1,2入力用,他出力用
TRISF=0x0000;//RF(2,3,6)SPI出力用
TRISD=0x0000;//RD8-SPI出力,RD9-INT0入力用
TRISC=0x1000;//UARTRX用(RC13=High)
PORTB=0xFFFF;//all LED off
PORTF=0xFFFF;//RF3=High
PORTD=0xFFFF;//RD8=High

/// 初期動作
LEDON(); delay_ms(200);
LEDOFF(); delay_ms(200);
LEDON(); delay_ms(200);
LEDOFF(); delay_ms(200);
LEDON(); delay_ms(200);
LEDOFF();

/// Open SPI クロック 30MHz/1=30MHz(33ns)
OpenSPI1(SPICONValue,SPISTATValue);
INTCON1bits.NSTDIS=1;//多重割り込み禁止
SPI_CS=1;
dds_CTRL=1;

/** DDSの初期設定 **/
DDSset();
dds_Int=0;
CloseSPI1();

///初期ch定義
TX1();TX=1;

/// ADC初期設定
OpenADC12(Config1,Config2,Config3,ConfigPort,ConfigScan);
SetChanADC12(Channel0);

///DDS tart
//タイマ2設定,OPEN
Fs2=240000;
SetTime2 = ((Fcy/Fs2)+1);//Fcy = 30MHz
OpenTimer2(T2_ON & T2_GATE_OFF & T2_PS_1_1 & T2_SOURCE_INT , SetTime2);
ConfigIntTimer2(T2_INT_PRIOR_3 & T2_INT_ON);

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

///1point measure OnePoint(); break; case'2': break; default : break; }

}
}

###試したこと
uartを割り込み処理する必要があるような気がするのですが、dspic初心者でよく分かっていないのが現状です。

###補足情報(言語/FW/ツール等のバージョンなど)
言語:c言語
マイコン:dspic
ツール:MPLAB IDE

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

dspicは使ったことないですが、whileループの箇所を次のようにしてみてはいかがでしょうか。
100ms待つ処理は何の関数を使うとかわからないので、日本語で書いておきます。

c

1 cmnd = 0; 2 while(1) 3 { 4 if(DataRdyUART1()){ 5 cmnd = ReadUART1(); 6 } 7 switch(cmnd) 8 { 9 case'1': 10 OnePoint(); 11 100msウェイト; 12 break; 13 case'2': 14 cmnd = 0; 15 break; 16 default: 17 cmnd = 0; 18 break; 19 } 20 } 21

投稿2017/10/13 04:53

ttyp03

総合スコア16998

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sotooki

2017/10/13 08:05

きちんと理想の動作をするようになりました!! ありがとうございます。 一つこのプログラムに関する質問なのですが、 while(1)の前にcmnd=0; を入れる理由は何でしょうか?
ttyp03

2017/10/13 08:08

初期化です。 cmndが設定されるのは、DataRdyUART1()が有効なときのみなので、何も受信していないときはswitchで無処理にする必要があります。 そのための初期化です。
sotooki

2017/10/13 10:10

納得しました! ありがとうございました!
ttyp03

2017/10/16 23:35

とりあえず解決したようなら、質問は閉じてくださいね。 よろしくお願いします。
sotooki

2017/10/17 02:48

時間を空けてしまい申し訳ありませんでした。 失礼いたしました。 質問を閉じさせていただきます。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問