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

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

ただいまの
回答率

87.80%

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

受付中

回答 0

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,196

score 15

前提・実現したいこと

現在、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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

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

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

関連した質問

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