Re: AD中斷?
|
||||
---|---|---|---|---|
版主
|
你的 AD 轉換程序的邏輯很亂而且程序也不對。
依你的功能需求,只要在AD中斷發生後將ADIF清零,並將AD Result的值讀到一個Buffer裡,剩下的判斷部分在交給主程式裡的另外的一個函數判斷,main函數只用來啟動AD的轉換。 當然你的動作不用中斷方式處理是會比較簡單的。
發表於: 2005/3/4 15:25
|
|||
|
Re: AD中斷?
|
||||
---|---|---|---|---|
高級會員
|
想麻煩各位幫我DEBUG一下,AD中斷一直觸發不了,以下是我AD中斷的程式:依照AD轉換的電壓值做燈號的變換,SW1,SW2,SW3,SW4是燈號顯示
中斷程式: #pragma code High_Interrupt_Vector=0x08 void High_INT_VEC (void) { _asm goto High_INT_SER _endasm } #pragma code #pragma interrupt High_INT_SER void High_INT_SER (void) { int sw_num=nothing,T_ADresult; if (PIR1bits.ADIF=1) { PIR1bits.ADIF=0; ConvertADC (); while ( ! BusyADC() ); T_ADresult= ReadADC() ; if(T_ADresult>=200) sw_num=sw4; else if(T_ADresult>=110) sw_num=sw3; else if(T_ADresult>=85) sw_num=sw2; else if(T_ADresult>=70) sw_num=sw1; else sw_num=nothing; while(1) { switch ( sw_num ) { case sw1: PORTD=1; SetDCPWM1(1000); break; case sw2: PORTD=2; SetDCPWM1(800); break; case sw3: PORTD=4; SetDCPWM1(500); break; case sw4: PORTD=8; SetDCPWM1(200); break; case nothing: PORTD=255; SetDCPWM1(0); break; default: break; } } } } 主程式: void main (void) { TRISD = 0; OpenADC ( ADC_FOSC_2 &ADC_3ANA_0REF, ADC_CH3 & ADC_INT_ON ); PIR1bits.ADIF=0; PIE1bits.ADIE=1; INTCONbits.PEIE = 1; INTCONbits.GIEH = 1; while(1)//等待中斷 { PIR1bits.ADIF=1; } }
發表於: 2005/3/2 21:26
|
|||
|
Re: AD中斷?
|
||||
---|---|---|---|---|
高級會員
|
謝謝版主的回答
發表於: 2005/3/2 19:21
|
|||
|
Re: AD中斷?
|
||||
---|---|---|---|---|
版主
|
不一定,這還要看你有沒有enable AD 的中斷位元 ADIE, 還有 GIEH 或 GIEL是否也是打開的。
ADIF位元主要是反映AD轉換完成的動作,如果有中斷致能那他就是AD中斷的旗號了。
發表於: 2005/3/2 16:55
|
|||
|
Re: AD中斷?
|
||||
---|---|---|---|---|
高級會員
|
若是使用PICC可以參考右邊的 Hi-TECH C 的 Workshop 範例
若是C18也是可以參考右邊 W401 或是 APP002 的範例
發表於: 2005/3/2 9:32
|
|||
人生最長久的擁有是珍惜 但是大都在失去後才發現
|
||||
|
Re: AD中斷?
|
||||
---|---|---|---|---|
高級會員
|
謝謝各位的回覆,想再請問一下:在主程式裡ConvertADC(),AD轉換完成後,會使得PIR1bits.ADIF=1,以產生AD中斷
不知道這樣對不對,還是各位有沒有關於AD中斷的程式不吝惜讓我參考一下....苦惱中
發表於: 2005/3/1 22:31
|
|||
|
Re: AD中斷?
|
||||
---|---|---|---|---|
管理員
|
因為 AD 可以藉由 TAD 的設定來達到不同的轉換率. 以迎合各種應用下的需求. 一般而言 , 在 PIC16 & PIC18 的 ADC , 最小的 TAD = 1.6 us. 以轉換速度為 (n+2) * TAD 的公式來計算, 10 bit ADC 的最快的轉換時間為 12*1.6 = 19.2 us !
若 PIC16F877A 的頻率為 20 Mhz , 19.2 us 可以執行約 100 個指令. 若再回圈中乾等 , 則浪費 CPU 資源 . 若是下次再回來檢查 , 則效率不彰. 所以要比較有效率就要使用中斷啦 ! 用中斷的代價就是比較多的旗標檢測與資源的衝突解決. 若可以不用就避免. 但要效率的話就 K 一下中斷吧 !
發表於: 2005/3/1 18:59
|
|||
|
Re: AD中斷?
|
||||
---|---|---|---|---|
高級會員
|
中斷的使用是為了讓程式更有效率
因為事件一產生就會打斷目前的動作而進行所謂的中斷 就這樣
發表於: 2005/3/1 18:58
|
|||
|
AD中斷?怎麼觸發中斷
|
||||
---|---|---|---|---|
高級會員
|
想請問各位一個觀念:使用AD中斷和不使用中斷差別在哪裡,AD中斷有它的必要性嗎?
發表於: 2005/3/1 18:13
|
|||
|