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

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

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

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

Q&A

0回答

1737閲覧

dspicのタイマ割り込みによる動作の不具合

sotooki

総合スコア15

C

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

0グッド

0クリップ

投稿2017/10/13 10:08

編集2017/10/13 10:20

###前提・実現したいこと
現在、dspicを使っております。
uartで外部から最初に'1'が受信されたときにOnePoint();という関数がきっかり100msごとに動作するプログラムを作りたいです。

###発生している問題・エラーメッセージ
タイマの割り込みの影響で100msごとにOnePoint()関数が動作せず、
さらにOnePoint()関数に関連している割り込みもうまく割り込んでくれません

今までは外部から'1'が約100msごとに送られてくるたびにOnePoint()関数が動作するようにしており、その際は上手く動作しておりました。
しかし、100msの精度が低かったためpic内で直接100msごとに動作してほしいと思っています。

###該当のソースコード

/*** タイマ2 割り込み処理関数 ***/ void __attribute__((__interrupt__, __shadow__))_T2Interrupt(void) { IFS0bits.T2IF=0;//割込みフラグクリア dds_CTRL=1; delay_ns(200); dds_CTRL=0; SigIn[0] = ReadADC12(0);// Input to A/D converter () Data_new = SigIn[0]+0x8000;//0~FFFFで与える n=n+1; // 最大値検出(トーナメント) // if(Data_new > TopDataV) { TopDataV = Data_new; TopDataf = n; } /*** 掃引終了判定* **/ if(n>=4000) { Green=1; count=count+1; Vmin[count]=TopDataV; fmin[count]=TopDataf; TopDataV=0; TopDataf=0; // swiching // if(TX==1){TX3();TX=3;delay_ms(5);} else if(TX==3){TX5();TX=5;delay_ms(5);} else if(TX==5){TX7();TX=7;delay_ms(5);} else if(TX==7){TX1();TX=1;delay_ms(5);ftx=1;} if(ftx==1){ftx=0;count=0;} dds_Int=1; delay_ns(200); n=0; dds_Int=0; } } /*** メイン関数 ***/ 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); /**タイマ2設定,OPEN**/ Fs2=240000; SetTime2 = ((Fcy/Fs2)+1); /**((30MHz/240000) + 1)**/ OpenTimer2(T2_ON & T2_GATE_OFF & T2_PS_1_1 & T2_SOURCE_INT , SetTime2); ConfigIntTimer2(T2_INT_PRIOR_3 & T2_INT_ON); cmnd = 0; while(1) { if(DataRdyUART1()){ cmnd = ReadUART1(); } switch(cmnd) { case'1': OnePoint(); delay_ms(100); break; case'2': cmnd = 0; break; default: break; } } }

###試したこと
タイマのカウンタ(SetTime2)を変更して変化を見てみましたがうまくいきません。
割り込みとして利用せず、そのままmain()関数に挿入してみましたが動作してくれませんでした。

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

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問