• slider image 442
  • slider image 483
  • slider image 484
  • slider image 485
  • slider image 486
  • slider image 487
:::

論壇索引


Board index » All Posts (Jeremytsai)




ADC conversion and EUSART
#1
新會員
新會員


各位好,我在使用PIC16F1823的ADC和EUSART發現了一個奇怪的情況
開發環境為 MPLAB X IDE 5.50+XC8 2.31+MCC 4.2.3, debugger tool is PICKit3,使用C語言

程式內容大概如下
我在protect_status(void)中去讀取ADC,並將轉換值和預設值做比較
比較完回傳一個unsigned char到main,然後將其從EUSART輸出

然後問題就發生了,在我正常送電開機時
3組ADC輸入理應尚未有電壓進來,值應該是趨近於0,亦不會大於參考值,對應bit也會是0
所以protect輸出會是0才對,但EUSART讀出來的protect卻是0x02,04,08,0E....等亂跳,跳了幾次之後才能持續讀到0

可我使用debug mode用breakpoint設在EUSART_Write這行去看,不管怎麼跳怎麼看protect在debug mode裡面一直都是0x00沒有其他亂跳的值

原本我以為是我EUSART設置的問題,但程式跑出來卻是正確的,例如EUSART丟0x02(先假設EUSRT是對的)出來便是跳至portect是0x02的程式執行指令,丟0x04做0x04的指令....等等,所以算是排除EUSART錯誤
後來甚至將3組ADC輸入直接接地讓input = 0後也是如此,所以就變成我接上tool去debug mode看都正常,拿掉tool直接勾EUSART然後用正常開機的方式去讀EUSART都會看到他在亂跳,以至於我不知道是什麼問題造成的

程式如下,不知道是不是我設置上面的問題還是程式有錯誤
---------------------------------------------------------------------------------------------------
main
{
...........//省略
while(1)
{
...........//省略
protect = protect_status();
EUSART_Write(protect);
...........//省略
} ​
}


uint8_t protect_status(void)
{
​...........//省略 設定變數;

​ADC_OTP=ADC_GetConversion(AN4);
​ADC_OVP=ADC_GetConversion(AN5);
​ADC_OCP=ADC_GetConversion(AN6);

​...........//​省略部分指令,指令內容如下敘述

​分別針對三個ADC抓取參數和reference做比較
​大於reference分給給應變數(OVP,OCP,OTP)1否則0;

​...........//省略部分指令,指令內容如上敘述

​//set ovp at protect[3], ocp at protect[2], otp at protect[1], protect[1] is 0
​protect=OVP+OCP+OTP
​return protect
}

發表於: 2021/8/6 10:22
頂部


Re: PIC16F1823 中斷應用
#2
新會員
新會員


回復dginlon
先謝謝您的意見
"ADC 不是也有中斷 ?"
"用ADC 中斷去做你想做的行為不就好了?"

->是,但我從規格書看來ADC中斷是當我轉換完成後才會觸發,那假設我一直沒去讀取並做轉換的話是否就不會中斷了?所以無法滿足我1us的動作

如果在規格書上我有誤解的話,請協助糾正
------------------------------------------------------------------------------------------------------------------------------
回復Ryang
謝謝您的回答
會用到1us的應用是因為我拿來做high power的Over Voltage Protection機制,反應不夠快的話擔心後面的連鎖效應,所以必須在產生OVP後立刻做動
我也認為1us 的中斷似乎太快了,那如果我換成用comparator module會比較好嗎?
其餘您提到的我會再去做些功課,謝謝

發表於: 2021/7/30 16:37
頂部


PIC16F1823 中斷應用
#3
新會員
新會員


各位好,我剛入門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
頂部






:::

Microchip連結

https://www.facebook.com/microchiptechnologytaiwan/
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=13
https://mu.microchip.com/page/tmu
http://elearning.microchip.com.tw/modules/tad_link/index.php?cate_sn=1
https://page.microchip.com/APAC-PrefCenters-TW.html
http://www.microchip.com/
http://www.microchip.com/treelink
http://www.microchipdirect.com/
http://www.microchip.com.cn/newcommunity/index.php?m=Video&a=index&id=103
http://www.microchip.com.tw/modules/tad_uploader/index.php?of_cat_sn=2
http://www.microchip.com.tw/Data_CD/eLearning/index.html
http://www.microchip.com.tw/RTC/RTC_DVD/
https://www.microchip.com/development-tools/
https://www.youtube.com/user/MicrochipTechnology
[ more... ]

教育訓練中心

!開發工具購買
辦法說明 [業界客戶] [教育單位]
----------------------------------
!校園樣品申請
辦法說明 [教師資格] [學生資格]
----------------------------------