This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
工具/软件:Code Composer Studio
大家好、我能够对由具有1个模拟输入的计时器 CC ISR 触发的 ADC ISR 进行编码。
我已经尝试为2个引脚编写 ADC 代码数天了、但到目前为止还不能。
定时器 ISR 由捕捉比较模式触发。
在我的定时器 ISR 内部、我想制作一个 A3引脚的 ADC 并将其保存到可变温度1中。
在第1个 ADC 之后、我尝试将通道切换为 A4、但通道永远不会切换。
我还尝试切换 ADC 中断中的通道、但这也不起作用。
这是我的代码:(我希望有人能帮我)
#include #include long temp1; long temp2; void main (void){ __ENABLE_INTERRUPT (); WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 TACTL = tassel_1 + MC_1;// ACLK-CLOCK+ tempup模式 CCTL0 = CCIE;// CCR0中断使能 CCR0 = ADC104 = ADC10_INCH;// ADC104 = ADC10_INCH;ADC10_CCTL1 = ADC10_INCH;ADC10_CCTL1//通道选择 A4+转换序列模式选择=>通道序列+ ACLK -时钟(无输入 div) ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON + ADC10IE;// REF = VCC & VSS + ADC SampleAndHoldTime 16 x ADC10CLK +// ADC10AE3 + ADC100 | BIT4//这些位启用相应的模拟输入 P1SEL 引脚|= BIT3 + BIT4;//ADC 输入选择模式 P1.4 P1DIR |= 0x00;// ADC 输入 P1.3 P2DIR |=(BIT0 + BIT1 + BIT2)+(BIT3 + BIT4 + BIT2);//引脚作为输出// A3的 P2.0-2+A4 P2OUT = 0x00的 P2.3-5;//所有引脚设置为低电平(输入)//端口2 } #pragma vector = TIMER0_A0_vector; __interrupt void 计时器(void){ ADC10CTL1 = INCH_3;//为 ADC 选择通道 A3; ADC10ENSC = ADC10EN0 | ADC10ENC// ADC10SC =0 >>无样本启动会话+ ENC == EnableConversation temp1 = ADC10MEM;//将 ADC 测量值保存在第1个温度变量 中 while (!ADC10BUSY)//等待 ADC 不再繁忙 { ADC10CTL0 &=~ENC;//禁用会话 } ADC10CTL0 &=~ADC10IFG;//删除下一个对话的 ADC10CTL1 = INCH_4;//选择通道 A4作为输入 ADC10CTL0 |= ADC10SC + ENC; if (ADC10CTL1 =INCH_4) temp2 = ADC10MEM;//在第2个温度变量中保存 ADC 测量 ,而(!ADC10BUSY) { 和 ADC10CTL= ENC 标志};//删除 ADC10CTL=~~TACF (当 cotinues 模式达到0xFFFFFFx 时、计时器将自动设置) } #define A0 0x00 #define A1 BIT0 #define A2 BIT0 + BIT1 #define A3 BIT0 + BIT1 + BIT2 #define B0 0x00 #define B1 BIT3 #define B2 BIT3 + BIT4 #define B3 BIT3 + BIT4 + BIT4 + BIT4 #pragma vector = ADC10_vector; _interrupt void ADC (void){ const int output1[4]={A0、A1、A2、A3}; const int output2[4]={B0、B1、B2、B3}; if (temp1 >= 0 & temp1 <= 50) p2OUT = output1[0]; 否则 if (1 >= 50)<= p2150;out1 = 1 = 1 = 1 = 1 = 400;out1 = 1 = 1 = 1 = 1 = 1 = 400;out1 = 1 = 1 = 1 = 1 = 1 = 1 = 1 = 400;out1 = 1 = 1 = 1 = 1 else P2OUT = output1[3]; if (temp2 >=0 && temp2 <= 50) P2OUT |= output2[0]; 否则、if (temp2 >=50 && temp2 <= 400) P2OUT |= output2[1]; 否则(temp2 >=400 &temp2 <= 750) P2A4 |=output2 ;= output2[INCH}/ADC102]/ INCH = output2[INCH;选择 output2]/ output2[INCH
我刚刚认识到、由于存在冗余 while 环路、ENC 永远不会被重置。
usersguid 告诉您,必须重新对编码进行处理才能在 ADC 中进行任何注册表更改。
因此、我重新计算了代码、现在能够在通道之间切换。
它运行良好、但仅在调试 Mide 中、当我逐行调试时。
当我不设置断点时、我的 ADC10MEM 中的温度值会达到1023、但我不知道为什么。
以下是我的更新代码:
#include #include long temp1; long temp2; void main (void){ __ENABLE_INTERRUPT (); WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 TACTL = tassel_1 + MC_1;// ACLK-CLOCK+ tempup模式 CCTL0 = CCIE;// CCR0中断使能 CCR0 = ADC10_1 ;// ADC10L1 = ADC10_INCH = ADC1050;ADC10_CCTL1 = ADC10_CCTR1;//通道选择 A4+转换序列模式选择=>通道序列+ ACLK -时钟(无输入 div) ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON + ADC10IE;// REF = VCC & VSS + ADC SampleAndHoldTime 16 x ADC10CLK +// ADC10AE3 + ADC100 | BIT4//这些位启用相应的模拟输入 P1SEL 引脚|= BIT3 + BIT4;//ADC 输入选择模式 P1.4 P1DIR |= 0x00;// ADC 输入 P1.3 P2DIR |=(BIT0 + BIT1 + BIT2)+(BIT3 + BIT4 + BIT2);//引脚作为输出// A3的 P2.0-2+A4 P2OUT = 0x00的 P2.3-5;//所有引脚设置为低电平(输入)//端口2 } #pragma vector = TIMER0_A0_vector; __interrupt void 计时器(void){ ADC10CTL1 = INCH_3;//为 ADC 选择通道 A3; ADC10ENSC = ADC10EN0 | ADC10ENC// ADC10SC =0 >>无样本启动会话+ ENC == EnableConversation temp1 = ADC10MEM;//将 ADC 测量值保存在第一个温度变量 中 while (ADC10CTL1 & ADC10BUSY); ADC10CTL0 &=~ENC;//禁用对话 ADC10CTL0 &=~ADC10IFG = ADC10CL4 INCH;/ ADC10CTL4 INCH =下一个会话中断//选择通道 A4作为输入 ADC10CTL0 |= ADC10SC + ENC; if (ADC10CTL1 =INCH_4) temp2 = ADC10MEM;//在 (ADC10CTL1 & ADC10BUSY)期间将 ADC 测量值保存在第二个温度变量中; ADC10CTL0 &=~ENC; //TACTL &=~TAG/标志删除 (当 cotinues 模式达到0xFFFFFFx 时、计时器将自动设置) } #define A0 0x00 #define A1 BIT0 #define A2 BIT0 + BIT1 #define A3 BIT0 + BIT1 + BIT2 #define B0 0x00 #define B1 BIT3 #define B2 BIT3 + BIT4 #define B3 BIT3 + BIT4 + BIT4 + BIT4 #pragma vector = ADC10_vector; _interrupt void ADC (void){ const int output1[4]={A0、A1、A2、A3}; const int output2[4]={B0、B1、B2、B3}; if (temp1 >= 0 & temp1 <= 50) p2OUT = output1[0]; 否则 if (1 >= 50)<= p2150;out1 = 1 = 1 = 1 = 1 = 400;out1 = 1 = 1 = 1 = 1 = 1 = 400;out1 = 1 = 1 = 1 = 1 = 1 = 1 = 1 = 400;out1 = 1 = 1 = 1 = 1 else P2OUT = output1[3]; if (temp2 >=0 && temp2 <= 50) P2OUT |= output2[0]; 否则、if (temp2 >=50 && temp2 <= 400) P2OUT |= output2[1]; 否则(temp2 >=400 &temp2 <= 750) P2A4 |=output2 ;= output2[INCH}/ADC102]/ INCH = output2[INCH;选择 output2]/ output2[INCH
// // // MSP430x5xx // -------- // /|\| XIN|- // || | // -|RST XOUT|- // | | // ADC->|P1.3 P1.0|->LED (红色)<- von ADC P1.3 //|P2.1|->LED(红色) //|P2.2|->LED (红色) //|-----| //ADC->P1.4P2.3|->LED (绿色)<- von ADC P1.4 //|->LED(绿色) //||->LED (绿色) /*** #include #include void main (void){ __ENABLE_INTERRUPT (); WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 TACTL |=(tassel_2 + ID_3 + MC_2 + TAIE);// ACLK-CLOCK+CCR UP 模式 // CCTL0 = CCIE;// CCR0 = ADC1050 = ADC101;ADC101 = ADC1000;ADC10_INCH = ADC1000;ADC100 = ADC100 = ADC100 = ADC101//通道选择 A4+转换序列模式选择=>通道序列+ ACLK -时钟(无输入 div) ADC10CTL0 = SREF_0 + ADC10SHT_2 + ADC10ON + ADC10IE;// REF = VCC & VSS + ADC SampleAndHoldTime 16 x ADC10CLK +// ADC10AE3 + ADC100 | BIT4//这些位启用相应的模拟输入 P1SEL 引脚|= BIT3 + BIT4;//ADC 输入选择模式 P1.4 P1DIR |= 0x00;// ADC 输入 P1.3 P2DIR |=(BIT0 + BIT1 + BIT2)+(BIT3 + BIT4 + BIT2);//引脚作为输出// A3的 P2.0-2+A4 P2OUT = 0x00的 P2.3-5;//所有引脚设置为低电平(输入)//端口2 } volatile long temp1; volatile long temp2; #pragma vector = TIMER0_A1_vector; __interrupt void 计时器(void){ ADC10CTL1 = INCH_3;//为 ADC ADC10CTL0选择通道 A3 |= ADC10SC + ENC;// ADC10SC ==0 >>无采样开始会话+ ENC == EnableConversation temp1 = ADC10MEM;//将 ADC 测量值保存在第1个温度变量 中,同时(ADC10CTL1 & ADC10BUSY); ADC10CTL0 & ADC10IFG ~0 & ADC10ENC conversation = ADC100;//禁用 ADC10IFG ~//删除下一个对话的 ADC10CTL1 = INCH_4;//选择通道 A4作为输入 ADC10CTL0 |= ADC10SC + ENC; temp2 = ADC10MEM;//在第2个温度变量中保存 ADC 测量 值,同时(ADC10CTL1 & ADC10BUSY); ADC10CTL0 &=~ ~ENC;//删除 TACFG 标志 (当 cotinues 模式达到0xFFFFFFx 时、计时器将自动设置) } #define A0 0x00 #define A1 BIT0 #define A2 BIT0 + BIT1 #define A3 BIT0 + BIT1 + BIT2 #define B0 0x00 #define B1 BIT3 #define B2 BIT3 + BIT4 #define B3 BIT3 + BIT4 + BIT4 + BIT4 const int output1[4]={A0、A3}; const int output2[4]={B0、B1、B2、B3}; #pragma vector = ADC10_vector; __interrupt void ADC (void){ if (temp1 >= 0 && temp1 <= 50) P2OUT = output1[0]; 否则(temp1 >=50 && temp1 <= 400) ;如果(temp2out1 = output1[0]);否则(temp2out1 = out1 = 400)=output1[p2[1];如果 temp2out1 = out1 = out1 = output1[0];否则= out1 = out1 = out1 = out1;如果 temp2[p2]] if (temp2 >= 0 && temp2 <= 50) P2OUT |= output2[0]; 否则 if (temp2 >=50 && temp2 <= 400) P2OUT |= output2[1]; 否则 if (temp2 >=400 && temp2 <= 750) P2OUT |= output2[2]; else = output2[1] ;output2|out2
好的、我已经解决了这个问题。
我将代码重新考虑在内、并使用计时器继续模式 ISR、现在它可以正常工作。
我的捕获比较中断在 ADC 转换完成后执行得更快吗?
下面是工作代码: