Re: PIC16F1823 中斷應用
|
||||
---|---|---|---|---|
新會員
|
回復dginlon
先謝謝您的意見 "ADC 不是也有中斷 ?" "用ADC 中斷去做你想做的行為不就好了?" ->是,但我從規格書看來ADC中斷是當我轉換完成後才會觸發,那假設我一直沒去讀取並做轉換的話是否就不會中斷了?所以無法滿足我1us的動作 如果在規格書上我有誤解的話,請協助糾正 ------------------------------------------------------------------------------------------------------------------------------ 回復Ryang 謝謝您的回答 會用到1us的應用是因為我拿來做high power的Over Voltage Protection機制,反應不夠快的話擔心後面的連鎖效應,所以必須在產生OVP後立刻做動 我也認為1us 的中斷似乎太快了,那如果我換成用comparator module會比較好嗎? 其餘您提到的我會再去做些功課,謝謝
發表於: 2021/7/30 16:37
|
|||
|
PIC16F1823 中斷應用
|
||||
---|---|---|---|---|
新會員
|
各位好,我剛入門C也是第一次用PIC16F1823,開發環境為 MPLAB X IDE 5.50+XC8 2.31+MCC 4.2.3
我有一個功能是藉由ADC轉換後再針對其值判斷而做不同的行為,但我需要每1us就去偵測判斷 所以我想到了使用中斷執行。如果我用timr0去做1us的時間中斷,再去讀取ADC(使用MCC產生的ADC_GetConversion函式) 但是我在主程式中也有用到ADC_GetConversion這個函式,假如我進入中斷前剛好在執行這個ADC_GetConversion函式,會不會影響我中斷執行時的轉換?是否需要在另外寫一個給中斷使用? 另外,因為我怕中斷程式時間太長導致又觸發中斷,所以我想在中斷產生一個旗標,然後在結束中斷後直接跳去該旗標的地方執行其他程式,請問該怎麼去寫這段? 還是我只要將ISR中INTCONbits.TMR0IF = 0;移到中斷程式的最後一步就可以等全部都做完後再開始重新計數timer0? 如下為兩個用到的函式 ----------------------------------------------------------------------------------------------------------- MCC ADC 函式: adc_result_t ADC_GetConversion(adc_channel_t channel) { // select the A/D channel ADCON0bits.CHS = channel; // Turn on the ADC module ADCON0bits.ADON = 1; // Acquisition time delay __delay_us(ACQ_US_DELAY); // Start the conversion ADCON0bits.GO_nDONE = 1; // Wait for the conversion to finish while (ADCON0bits.GO_nDONE) { } // Conversion finished, return the result return ((adc_result_t)((ADRESH << 8) + ADRESL)); } ----------------------------------------------------------------------------------------------------------- timer0 isr void TMR0_ISR(void) { uint16_t ADC_OVP; // Clear the TMR0 interrupt flag INTCONbits.TMR0IF = 0; TMR0 = timer0ReloadVal; if(TMR0_InterruptHandler) { TMR0_InterruptHandler(); } // add your TMR0 interrupt custom code ADC_OVP = ADC_GetConversion(channel_AN5); ............. ............. ............. }
發表於: 2021/7/29 11:51
|
|||
|