###前提・実現したいこと
現在、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
あなたの回答
tips
プレビュー