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.
使用 CCSv10、为5529 Launch Pad 下载了四个 ADC 示例、它们(ADC_01、ADC_06、ADC_07、ADC_10) 在 LP 上都可以正常工作。
已复制 ADC_06并使用5638为我的定制 SBC 修改它。 我使用的是 MEM10、11、12和13、按顺序转换、 并希望为来自 MEM13的中断提供服务。
我无法通过设置 ADC12IE 将 ADC12IV 设置为大小写32。 如果我设置 ADC12IE = 0x001F、它与情况6匹配并在其下运行代码(切换 P8.4位)。 但我希望它与案例32匹配并处理来自这些通道的数据。 ADC12IE 的设置与 ADC12IV 的值之间似乎没有逻辑关系。
我缺少什么?
您实际上使用的是 MEM10-13还是(仅限) INCH_10-13?
如果前者:您是否还将 ADC12CSTARTADD=10设置为从 MEM10开始? 它在 MEM0上中断这一事实表明您没有。
如果是后者:IEn 编号与 MCTLn 编号绑定、而不是 INCH_m 编号。 如果您更改的只是英寸常量、您仍在使用 MCTL0-3。 与 原始示例一样、MCTL3使用 ADC12IE3=0x08 (ADC12IV=0x0C)。
感谢 Bruce、
这就是问题所在、现在运行正常。 但我不能离开 ISR、即使在索引计数器测试中有显式返回或中断、它也会保持循环。
这可能是一种幻想。 主函数写入 LPM、永远不会唤醒、因此唯一的活动是 ISR 中的活动。 您使用的是 CONSEQ=3和 MSC=1、因此转换连续(永久)运行。
在 SHT0=8 (256个 ADCCLK)的情况下使用 MEM0-3、您将得到一个大约每4 /(5MHz/256)=~200 uec 的新批次、如果您尝试使用调试器观察它、该批次已经非常快了。
如果您切换到 MEM10-13 并且没有设置 SHT1=8 (即左侧 SHT1=0)、这将会更加频繁:4/((5MHz/4)=~3usec。 当 MCLK = 1MHz 时、ISR 永远不会退出。
您发布代码可能会有所帮助、因此我们不会猜测太多内容。 (不要忘记代码标签(" "按钮)。)
感谢您的输入。 将代码转换为使用模式01正在工作的单个通道序列。 我需要对4个通道进行采样、但我要进行过采样和平均值计算。 因此、尝试在循环中调用 ISR、但它只会第一次通过循环并成功捕获第一组4个通道。 请参阅代码。
// ADC12-02.c //此文件使用模式01单序列通道 //在 ADC12CTL1 - ADC12CONSEQx -位2-1 #include 中设置的 ADC 转换序列模式 #define MAX_CHANNELS 4. //要转换 的 ADC 通道数#define MAX_COUNT 2. //要过采样和平均的 ADC 转换数 //每个循环10行4通道转换的2D 数组 // ISR 与连续通道一起工作,必须按此2D 顺序 //每个 ISR 运行处理4个通道 的 volatile unsigned int adc_results[MAX_COUNT][MAX_CHANNELS]; volatile unsigned int i; int main (void) { WDTCTL = WDTPW+WDTHOLD; //停止看门狗计时器 P7SEL |= BIT4 + BIT5; //我将切换一个位以使用示波器进行查看 P8OUT = 0x00; P8DIR |= 0x10; SPI1引脚1上的// P8.4输出、用于切换 ADC12CTL0 = ADC12ON + ADC12MSC + ADC12SHT1_8; // 1111 11. // MSB 5432 1098 7654 3210 lsb // 0000 0000 0001 0000 = 0x0010 ADC12ON 打开 ADC12 // 0000 0000 1000 0000 = 0x0080 ADC12MSC 可实现多采样转换 // 1000 0000 0000 0000 0000 = 0x8000 ADC12SHT1_8为了避免溢出(8*0x1000u)= 8000、将 SHT1x 用于 MEM8-MEM15 // -------------------- // 1000 0000 1001 0000 = 0x8090 总计= ADC12CTL0位设置 ADC12CTL1 = ADC12SHP + ADC12CONSEQ_1 + ADC12CSTARTADD_10; // 1111 11. // MSB 5432 1098 7654 3210 lsb // 0000 0010 0000 0000 = 0x0200 ADC12SHP 采样保持脉冲模式= ADC12MEM8至15和0至7的16个时钟周期 // 0000 0000 0000 0010 = 0x0002 ADC12CONSEQ_1转换序列选择:1 (1*2U)= 2 // 1010 0000 0000 0000 0000 = 0xA000 ADC12CSTARTADD_10设置转换开始地址= 1010b = Ah = ADC12MEM10 // -------------------- // 1010 0010 0000 0010 = 0xA202 Total = ADC12CTL1位设置 //设置 ADC12MCTLx 存储器控制= ADC12INCH_xx 输入通道 // ADC12EOS 设置顺序通道转换的结束、在最后一个通道上设置 默认情况下// ref+= AVCC、默认情况下 ref-= Avss ADC12MCTL10 = ADC12INCH_10; // ref+=AVcc、channel = A10 ADC12MCTL11 = ADC12INCH_11; // ref+=AVcc、channel = A11 ADC12MCTL12 = ADC12INCH_12; // ref+=AVcc、channel = A12 ADC12MCTL13 = ADC12INCH_13 + ADC12EOS;// ref+=AVcc、channel = A13、end seq ADC12IE = 0x2000; //对于 MEM13、ADC12IV = 32d = 20h // 1111 11. // MSB 5432 1098 7654 3210 lsb // 0010 0000 0000 0000 = 0x2000 启用中断 ADC12IFG13 ADC12CTL0 |= ADC12ENC; //启用转换 ADC12CTL0 |= ADC12SC; //开始转换-软件触发 //循环并运行 ISR MAX_COUNT 时间 for (i=0;i < MAX_COUNT;i++) { //使用 LPM0和 LPM4_BITS 进行测试 _bis_SR_register (LPM4_bits + GIE); //输入 LPM0、启用中断 __no_operation(); //对于调试器 } } #if defined (__TI_Compiler_version__)|| defined (__IAR_systems_icc_) #pragma vector=ADC12_vector __interrupt void ADC12ISR (void) #elif defined (__GNU__) void __attribute__((interrupt (ADC12_vector)))) ADC12ISR (void 编译器#error! #endif { //对 ADC12IV 进行分析并处理单个、正确的中断矢量、对序列使用最后一个通道 //第二个参数是范围、 十进制中的用例值 //用十进制的用例,中断矢量使用十六进制 //示例仅转到 ADC12IFG14的用例34,在此处更正 switch (__evo_in_range (ADC12IV,34) { 用例0:break; //向量0:无中断 情况2:中断; //向量2:ADC 溢出 情况4:中断; //向量4:ADC 时序溢出 情况6:中断; //向量6:ADC12IFG0 情况8:中断; //向量8:ADC12IFG1 大小写10:break; //向量10:ADC12IFG2 大小写12:break; //向量12:ADC12IFG3 case 14:break; //向量14:ADC12IFG4 情况16:中断; //向量16:ADC12IFG5 情况18:中断; //向量18:ADC12IFG6 案例20:中断; //向量20:ADC12IFG7 case 22:break; //向量22:ADC12IFG8 case 24:break; //向量24:ADC12IFG9 大小写26:break; //向量26:ADC12IFG10 case 28:break; //向量28:ADC12IFG11 case 30:break; //向量30:ADC12IFG12 大小写32: //向量32:ADC12IFG13 -对序列中的最后一个通道使用中断情况 ADC_Results[I][0]= ADC12MEM10; //移动 A10结果,IFG 被清除 ADC_Results[i][1]= ADC12MEM11; //移动 A11结果,IFG 被清除 ADC_Results[I][2]= ADC12MEM12; //移动 A12结果,IFG 被清除 ADC_Results[I][3]= ADC12MEM13; //移动 A13结果,IFG 被清除 //根据电压切换位的代码 IF (ADC12MEM11 >= 0x00F) // ADC12MEM = A11 > 0.5AVcc? = 1.65V 十进制计数= 2048 P8OUT |= BIT4; // P8.4 = 1 其他 P8OUT &=~BIT4; // P8.4 = 0 _BIC_SR_REGISTER_ON_EXIT (LPM4_BITS);//退出活动 CPU,在此处设置断点 中断; 案例34:中断; //向量34:ADC12IFG14 case 36:break; //向量36:ADC12IFG15 默认值:break; }
我很高兴您能正常工作。
我无法判断这里是否有问题。 如果您在 for 循环(LPM 行之前)内移动"ADC12CTL0 |= ADC12SC;"、我希望您将填充您的所有行。
它正在工作、还必须清除它、谢谢