會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





Early Interrupt的問題
新會員
註冊日期:
5月21日 11:28:35
所屬群組:
註冊會員
文章: 2
等級: 1; EXP: 2
HP : 0 / 0
MP : 0 / 0
離線
最近在研究dspic33CK系列的ADC專章的early interrupt,看完說明與專章的範例(example 5.5)之後仍不太瞭解

Early interrupt是在conversion ready之前就進入ADC ISR,而在範例裡面又ISR裡面直接讀取ADC buffer。但當下應該還沒conversion ready,請問這樣讀取會得到即時的ADC數值嗎?

以下是專章example

// These variables will keep the conversion result.
volatile unsigned short dataAN0; // dedicated core
volatile unsigned short dataAN2; // shared core
int main()
{
// ADC INITIALIZATION
// Configure the I/O pins to be used as analog inputs.
ANSELAbits.ANSA0 = 1; TRISAbits.TRISA0 = 1; // AN0/RA0 connected the dedicated core 0
ANSELAbits.ANSA2 = 1; TRISAbits.TRISA2 = 1; // AN2/RA2 connected the shared core
// Configure the common ADC clock.
ADCON3Hbits.CLKSEL = 2; // clock from FRC oscillator
ADCON3Hbits.CLKDIV = 0; // no clock divider (1:1)
// Configure the cores’ ADC clock.
ADCORE0Hbits.ADCS = 0; // dedicated core clock divider (1:2)
ADCON2Lbits.SHRADCS = 0; // shared core clock divider (1:2)
// Configure sample time for shared core.
ADCON2Hbits.SHRSAMC = 10; // 12 TAD sample time
// Configure the ADC reference sources.
ADCON3Lbits.REFSEL = 0; // AVdd as voltage reference
// Configure the integer of fractional output format.
ADCON1Hbits.FORM = 0; // integer format
// Select single-ended input configuration and unsigned output format.
ADMOD0Lbits.SIGN0 = 0; // AN0/RA0
ADMOD0Lbits.DIFF0 = 0; // AN0/RA0
ADMOD0Lbits.SIGN2 = 0; // AN2/RA2
// Enable and calibrate the module.
EnableAndCalibrate(); // See Example 5-1
// Configure and enable early ADC interrupts.
ADCORE0Hbits.EISEL = 0; // early interrupt is generated 1 TADCORE clock prior
// to when the data is ready
ADCORE1Hbits.EISEL = 3; // early interrupt is generated 4 TADCORE clocks prior
// to when the data is ready
ADCON2Lbits.EIEN = 1; // enable early interrupts for ALL inputs
ADEIELbits.EIEN0 = 1; // enable interrupt for AN0
ADEIELbits.EIEN2 = 1; // enable interrupt for AN2
_ADCAN0IF = 0; // clear interrupt flag for AN0
_ADCAN0IE = 1; // enable interrupt for AN0
_ADCAN2IF = 0; // clear interrupt flag for AN2
_ADCAN2IE = 1; // enable interrupt for AN2
// Set same trigger source for all inputs to sample signals simultaneously.
ADTRIG0Lbits.TRGSRC0 = 13; // timer 2 for AN0
ADTRIG0Hbits.TRGSRC2 = 13; // timer 2 for AN2
// TIMER 2 INITIALIZATION (TIMER IS USED AS A TRIGGER SOURCE FOR ALL CHANNELS).
T2CONbits.TCS = 0; // clock from peripheral clock
T2CONbits.TCKPS = 0; // 1:1 prescale
PR2 = 0x8000; // rollover every 0x8000 clocks
T2CONbits.TON = 1; // start timer to generate ADC triggers
while(1);
return
1;
}
// ADC AN0 ISR (DEDICATED CORE)
void __attribute__((interrupt, no_auto_psv)) _ADCAN0Interrupt(void)
{
dataAN0 = ADCBUF0; // read conversion result
_ADCAN0IF = 0; // clear interrupt flag
}
// ADC AN2 ISR (SHARED CORE)
void __attribute__((interrupt, no_auto_psv)) _ADCAN2Interrupt(void)
{
dataAN2 = ADCBUF2; // read conversion result
_ADCAN2IF = 0; // clear interrupt flag
}

5月21日 15:05:43
轉換PDF檔 列印


Re: Early Interrupt的問題
管理員
註冊日期:
2010/06/30 16:18
來自 CAE, Microchip Technology Inc.
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 1661
等級: 34; EXP: 39
HP : 0 / 834
MP : 553 / 24186
離線
這個概念其實就是賺時間差而已, 目的是在進一步縮短中斷響應時間.
在短短的幾個Clock間, 讓ADC的中斷先偷跑, 由於進中斷也需要時間.

進中斷的時間跟ADC轉換同時進行, 前提是時間要抓好, 跑太快資料就錯了.

5月22日 10:53:04
轉換PDF檔 列印


Re: Early Interrupt的問題
新會員
註冊日期:
5月21日 11:28:35
所屬群組:
註冊會員
文章: 2
等級: 1; EXP: 2
HP : 0 / 0
MP : 0 / 0
離線
謝謝你的回答,這樣我瞭解了

5月22日 13:49:29
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project