Re: dsPIC30F6010A的Timer1無法中斷
|
||||
---|---|---|---|---|
新會員
|
我改寫了這個程式的一部分,主要目的就是在Timer1的中斷負程式中進行類比電壓取樣轉換的動作,然後再跳回無窮迴圈繼續計數,然後在取樣前讓RE5輸出高電位,取樣轉換後輸出低電位。這樣我就可以用示波器偵測RE5的訊號來知道取樣轉換以及每次相隔的取樣時間。我的問題是:
我用ICD2讓程式RUN的時候,他大部分都會自己停止,然後在output視窗中寫Reset memory,照理說不是要一直執行程式才對嗎? 再來就是不管程式是跑一下就停止還是程式還在跑,示波器的波形雖然有出現方波,不過都一下子就消失變成0伏特。 麻煩各位幫我解答=_=謝謝
發表於: 2009/5/16 14:59
|
|||
|
Re: dsPIC30F6010A的Timer1無法中斷
|
||||
---|---|---|---|---|
新會員
|
摁摁@@~我在測試看看
謝謝大大好心的解答
發表於: 2009/5/14 5:59
|
|||
|
Re: dsPIC30F6010A的Timer1無法中斷
|
||||
---|---|---|---|---|
版主
|
參照:
觀念正確,就是這樣算的。你可以用 MPLAB SIM 的方式暫設好頻率為 8MHz 後再利用 Stopwatch 的計時功能來得知多久會中斷一次。 硬體的量測,yiming 的建議式很好的方法,找隻沒用的輸出腳在中斷裡做 XOR 的反向動作,示波器一量就知道中斷時間了。
發表於: 2009/5/13 9:14
|
|||
|
Re: dsPIC30F6010A的Timer1無法中斷
|
||||
---|---|---|---|---|
資深會員
|
你可以在中斷副程式找一支沒用到的IO,做反向的動作,那麼你就知道中斷一次是多少時間了..
發表於: 2009/5/13 8:37
|
|||
|
Re: dsPIC30F6010A的Timer1無法中斷
|
||||
---|---|---|---|---|
新會員
|
那我可以請問我定時器用內頻的話,內頻是8M嗎?
然後一個Tcy會讓TMR+1,而一個Tcy是4個時脈,所以一個Tcy代表0.5u秒,所以PR1設200,也就是200Tcy,代表0.1m(sec)就產生中斷,跳到中斷副程式。請問這個觀念有錯嗎?第一次使用不太了解謝謝幫我解答。
發表於: 2009/5/13 2:28
|
|||
|
Re: dsPIC30F6010A的Timer1無法中斷
|
||||
---|---|---|---|---|
版主
|
你一定是用 ICD2 來除錯吧! 別忘了 ICD2 需要內部監督程式的執行再加上更新 Watch Window 的動作,程式早不知已執行了數百千個指令了,所以 Timer 的值也會跟著增加,造成你所看到的 Timer 值的錯亂。其實 Timer 沒有錯只是 ICD2 除錯上的一些限制,如果你使用高價的 ICD2000 或 ICE4000 的除錯工具就不會有此問題,不過要先花七萬台幣的入會費。
如過你要看 Timer 與指令的變化關係,如果沒有 Real-Time ICE 的話那就建議使用 MPLAB SIM 來看,這樣就不會有誤導的現象。
發表於: 2009/5/12 12:52
|
|||
|
Re: dsPIC30F6010A的Timer1無法中斷
|
||||
---|---|---|---|---|
新會員
|
她現在有辦法中斷了,可是當我用watch看TMR1值的時候,覺得她增加沒有一定的規則,而且有時候值還會減少= =
可以跟我解釋當使用內頻時脈的時候,TMR1的值增加的規則是怎麼樣的嗎??我是按F7去觀察TMR1的變化,覺得無法理解。
發表於: 2009/5/12 2:47
|
|||
|
Re: dsPIC30F6010A的Timer1無法中斷
|
||||
---|---|---|---|---|
版主
|
沒有細看程式,大略看一下:
void InitTMR1(); void InitADC10(); //void __attribute__((__interrupt__)) _T1Interrupt(); 這行不用宣告。 int Voltage[167],Time[167],ADCvalue=0,i=0,j=0,samp=0; void __attribute__((interrupt)) _T1Interrupt(void) { TMR1=0; IFS0bits.T1IF=0; Time[i]=i*0.0001; samp=1; i++; } 或改成 : void _ISR _T1Interrupt(void) _ISR 的定義在H 檔的最後,不要理會PSV 的警告。
發表於: 2009/5/7 12:29
|
|||
|
dsPIC30F6010A的Timer1無法中斷
|
||||
---|---|---|---|---|
新會員
|
我想利用Timer1的計時功能來做ADC轉換每次取樣的相隔時間
,我將PR1設定為0x00c8,也就是每隔0.1m(sec)取樣一次, 但當我執行程式時,利用watch觀察,可以看到TMR1一直增加,並沒在0x00c8時產生中斷,不知道為什麼。 還有我用了兩個陣列去儲存每次取樣的時間以及轉換化的數位電壓值,把數位值乘以解析度之後,再利用excel把時間以及電壓大小畫成圖,在和原波型比較,想請問還有沒有更好的辦法可以觀察有沒有轉換成功的。 問題有點長,謝謝各位幫我解答 以下是我的程式碼: #include <p30f6010A.h> #include <adc10.h> #include <timer.h> void InitTMR1(); void InitADC10(); void __attribute__((__interrupt__)) _T1Interrupt(); int Voltage[167],Time[167],ADCvalue=0,i=0,j=0,samp=0; int main() { void InitTMR1(); void InitADC10(); ADCON1bits.ADON=1; //turn on the A/D converter T1CONbits.TON=1; //turn on the Timer while(1) { if(samp == 1) { ADCON1bits.SAMP=1; while(ADCON1bits.DONE == 1) //等待取樣換 { ADCvalue=ADCBUF0; ADCvalue=ADCvalue-0x019A; //減掉直流準2V Voltage[j]=ADCvalue; j++; ADCON1bits.DONE=0; //執行一次跳出迴圈 } samp=0; //取樣一次就跳出 } } } void InitTMR1() //Timer1初始化副程式 { IEC0bits.T1IE=1; IFS0bits.T1IF=0; TMR1=0; T1CON=0x0000; PR1=0x00c8; } void InitADC10() //設定啟動ADC副程式 { ADPCFG=0xFFF7; ADCHS=0x0003; IEC0bits.ADIE=0; IFS0bits.ADIF=0; ADCON1=0x00E0; ADCON2=0x0000; ADCON3=0x1F3F; ADCSSL=0x0000; } void __attribute__((__interrupt__)) _T1Interrupt() { TMR1=0; IFS0bits.T1IF=0; Time[i]=i*0.0001; samp=1; i++; }
發表於: 2009/5/6 19:50
|
|||
|