在進行MSP430ADC相關代碼操作的時候,遇到一個百思不得其解的問題,我們按照要求設置好ADC通道,ADC中斷,程序始終無法進入到ADC中斷中去,本人一次又一次確認通道選擇是否出錯,中斷是否設置,但是依然無法進入中斷,經過試驗和搜索,終于找到了問題所在。
MSP430的ADC12IE寄存器雖然是用來使能各個ADC中斷的,但是在單通道轉換模式下,無論你使用的是哪個ADC通道,ADC12IE對應的中斷只能是0x01,對應的中斷標志位為ADC12IFG0,并且只能在ADC12MEM0中讀取ADC的值。下面給出一個單通道轉換的實例:
#include "msp430x54x.h"
unsigned int adc;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
ADC12CTL0 = ADC12SHT02 + ADC12ON; // Sampling time, ADC12 on
ADC12CTL1 = ADC12SHP; // Use sampling timer
ADC12IE = 0x01; // Enable interrupt
ADC12MCTL0 |= ADC12INCH_4;
__delay_cycles(100);
ADC12CTL0 |= ADC12ENC;
P6SEL |= 0x10; // P6.4 ADC option select
while (1)
{
ADC12CTL0 |= ADC12SC; // Start sampling/conversion
__bis_SR_register(LPM0_bits + GIE); // LPM0, ADC12_ISR will force exit
__no_operation(); // For debugger
}
}
#pragma vector = ADC12_VECTOR
__interrupt void ADC12_ISR(void)
{
switch(__even_in_range(ADC12IV,34))
{
case 0: break; // Vector 0: No interrupt
case 2: break; // Vector 2: ADC overflow
case 4: break; // Vector 4: ADC timing overflow
case 6: // Vector 6: ADC12IFG0
adc = ADC12MEM0; // Read ADC12MEM
__bic_SR_register_on_exit(LPM0_bits); // Exit active CPU
break;
case 8: break; // Vector 8: ADC12IFG1
case 10: break; // Vector 10: ADC12IFG2
case 12: break; // Vector 12: ADC12IFG3
case 14: break; // Vector 14: ADC12IFG4
case 16: break; // Vector 16: ADC12IFG5
case 18: break; // Vector 18: ADC12IFG6
case 20: break; // Vector 20: ADC12IFG7
case 22: break; // Vector 22: ADC12IFG8
case 24: break; // Vector 24: ADC12IFG9
case 26: break; // Vector 26: ADC12IFG10
case 28: break; // Vector 28: ADC12IFG11
case 30: break; // Vector 30: ADC12IFG12
case 32: break; // Vector 32: ADC12IFG13
case 34: break; // Vector 34: ADC12IFG14
default: break;
}
}
在上面的事例中,我們使用的是MSP430的P6.4引腳,ADC通道4,因為使用的是單通道單次轉換模式,對應的中斷是ADC12IFG0,對應的值在ADC12MEM0中讀取,對于單通道多次轉換模式也適用。
對于序列通道轉換模式,ADC12IE的值取決于使用的ADC通道,ADC的值也從對應通道的ADC12MEM中讀取,下面是序列通道單次轉換的實例
#include "msp430x54x.h"
volatile unsigned int results[4]; // Needs to be global in this example
// Otherwise, the compiler removes it
// because it is not used for anything.
void main(void)
{
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
P6SEL = 0x0F; // Enable A/D channel inputs
ADC12CTL0 = ADC12ON+ADC12MSC+ADC12SHT0_2; // Turn on ADC12, set sampling time
ADC12CTL1 = ADC12SHP+ADC12CONSEQ_1; // Use sampling timer, single sequence
ADC12MCTL0 = ADC12INCH_0; // ref+=AVcc, channel = A0
ADC12MCTL1 = ADC12INCH_1; // ref+=AVcc, channel = A1
ADC12MCTL2 = ADC12INCH_2; // ref+=AVcc, channel = A2
ADC12MCTL3 = ADC12INCH_3+ADC12EOS; // ref+=AVcc, channel = A3, end seq.
ADC12IE = 0x08; // Enable ADC12IFG.3
ADC12CTL0 |= ADC12ENC; // Enable conversions
while(1)
{
ADC12CTL0 |= ADC12SC; // Start convn - software trigger
__bis_SR_register(LPM4_bits + GIE); // Enter LPM4, Enable interrupts
__no_operation(); // For debugger
}
}
#pragma vector=ADC12_VECTOR
__interrupt void ADC12ISR (void)
{
switch(__even_in_range(ADC12IV,34))
{
case 0: break; // Vector 0: No interrupt
case 2: break; // Vector 2: ADC overflow
case 4: break; // Vector 4: ADC timing overflow
case 6: break; // Vector 6: ADC12IFG0
case 8: break; // Vector 8: ADC12IFG1
case 10: break; // Vector 10: ADC12IFG2
case 12: // Vector 12: ADC12IFG3
results[0] = ADC12MEM0; // Move results, IFG is cleared
results[1] = ADC12MEM1; // Move results, IFG is cleared
results[2] = ADC12MEM2; // Move results, IFG is cleared
results[3] = ADC12MEM3; // Move results, IFG is cleared
__bic_SR_register_on_exit(LPM4_bits); // Exit active CPU, SET BREAKPOINT HERE
case 14: break; // Vector 14: ADC12IFG4
case 16: break; // Vector 16: ADC12IFG5
case 18: break; // Vector 18: ADC12IFG6
case 20: break; // Vector 20: ADC12IFG7
case 22: break; // Vector 22: ADC12IFG8
case 24: break; // Vector 24: ADC12IFG9
case 26: break; // Vector 26: ADC12IFG10
case 28: break; // Vector 28: ADC12IFG11
case 30: break; // Vector 30: ADC12IFG12
上一篇:基于MSP430內部10位ADC的模數轉化并通過串口發送
下一篇:最后一頁
推薦閱讀
史海拾趣
在電子行業快速發展的背景下,Carroll & Meynell Transformers Ltd公司始終堅持質量第一的原則。公司建立了嚴格的質量管理體系,從原材料采購到生產加工,再到產品出廠,每一個環節都經過嚴格的把控。這種對質量的執著追求使得公司的產品在市場上享有很高的聲譽。許多客戶因為信賴公司的產品質量,而與公司建立了長期穩定的合作關系。
EasySync公司成立于XXXX年,由一群熱衷于同步技術的電子工程師創立。在初創期,公司面臨著資金短缺、市場競爭激烈以及技術難題等挑戰。然而,創始人們憑借對技術的熱愛和對市場的敏銳洞察,不斷研發新產品,優化同步算法,逐漸在市場上獲得了認可。
隨著產品線的不斷豐富和技術實力的提升,Charcroft Electronics Ltd公司開始積極拓展國內外市場。公司加強與國際知名企業的合作,通過參加國際電子展會、舉辦技術研討會等方式,提升品牌知名度和影響力。同時,公司還針對不同地區的市場需求,推出定制化的產品和服務,進一步鞏固和擴大市場份額。
隨著技術的不斷進步,Altonics公司始終保持著對創新的熱情。公司加大研發投入,引進高端技術人才,不斷推出具有創新性和競爭力的新產品。其中,公司自主研發的一款智能傳感器,憑借其高精度、高穩定性的特點,迅速占領市場份額,成為工業自動化領域的明星產品。
然而,好景不長。奧斯汀公司在全力投入研發的WW1車系上遭遇了挫折,銷售不佳導致公司瀕臨破產。在這個關鍵時刻,奧斯汀汽車公司通過研發新的車型來尋求突破。1922年,Seven車系成功上市,憑借其卓越的性能和合理的價格,使得奧斯汀汽車轉危為安,重新獲得了市場的認可。
隨著汽車行業的競爭日益激烈,奧斯汀汽車開始尋求與其他公司的技術合作。1952年,奧斯汀與諾菲爾德車廠合并,組成了英國汽車公司(BMC),旗下包括莫里斯、沃爾斯利、萊利及MG等多個品牌。此外,奧斯汀汽車還積極與國際汽車公司展開合作,如與日產汽車在1952年簽署了技術合作協議,共同開發新的車型。這些合作使得奧斯汀汽車的技術水平得到了顯著提升,同時也推動了公司的國際化發展。
六、TMS320C2X/C5X C語言程序開發舉例本節我們以TMS320C2X為例,說明定點DSP芯片C程序的開發過程。軟件開發過程與浮點DSP芯片的開發過程相類似,主要分以下幾個步驟:1. 用編輯器(如EDIT、PE2等)編輯一個或多個C程序,如example1.c,e ...… 查看全部問答∨ |
|
在IEEE 754標準中,階碼是采用移碼表示還是補碼表示,尾數是用原碼表示還是用補碼表示,是IEEE 754中規定的嗎,如果是,用哪種形式表示,還是IEEE 754中沒有規定這些,懂的來答。 問題補充:將(100.25)10轉換成短浮點數格式 在一個課件上看到的 ...… 查看全部問答∨ |
|
千元征集優秀IT培訓教師線索 北京傳智播客教育科技有限公司是一家專門致力于高素質軟件開發人才培養的高科技公司,公司自成立以來,以其獨到的培訓理念和教學方式,取得了驕人的成績,迅速在IT培訓界獲得盛譽。為滿足社會快速膨脹的 ...… 查看全部問答∨ |
在硬件的GPIO引腳中,有部分引腳擁有第二套功能(表達可能不準),如:XXX_GPIO10_2_XXX這樣的引腳配置是否和XXX_GPIO10_XXX的方法相同,主要是方向和電平的配置。… 查看全部問答∨ |
單片機控制,74hc595驅動顯示20個4位數碼管顯示!問題求助。。。。 51單片機控制 74hc595驅動20個4位數碼管顯示不同數據?。。? 5959該怎么級聯,能是程序簡單控制顯示又能達到要求(用最少的IO口資源和最少的74hc595)...… 查看全部問答∨ |