我编写了一个程序来将游戏手柄与 ADC10连接。 在调试期间、发现 ADC10MEM 的内容不会改变(常量0x0006)、这意味着它在某个位置读取一个无效值、但我不能确定代码的错误位置。 可以有人帮我解决这个问题吗? 谢谢你。
代码就在这里。
本视频中复制了整个过程(抱歉、是因为质量较低。 我自己动手):
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.
我编写了一个程序来将游戏手柄与 ADC10连接。 在调试期间、发现 ADC10MEM 的内容不会改变(常量0x0006)、这意味着它在某个位置读取一个无效值、但我不能确定代码的错误位置。 可以有人帮我解决这个问题吗? 谢谢你。
代码就在这里。
本视频中复制了整个过程(抱歉、是因为质量较低。 我自己动手):
萧生、您好、
遗憾的是、我现在没有时间查看您的固件、但我们在 http://dev.ti.com/tirex/explore/node?node=ALFfIDtjUH-HwRytz.WJPQ__IOGqZri__LATEST 上提供了一组 MSP430F2553的 ADC 示例
我将按原样测试示例、以查看 ADC 是否正常工作、然后将其与您的固件进行比较。
祝您好运!
JD
感谢您的回复。 X_Y[]的内容也是持续的{0x0006、0}、这可以在视频中看到:LED 按0b00000110、0b00000000序列点亮。
我已经检查了我的代码、等待 BUSY 位的方式与您在示例中所示的方式相同:
while (ADC10CTL1和 ADC10BUSY);//等待 ADC10内核处于活动状态
和... 我不在 ADC10AE 中启用 BIT0、只有 BIT7和 BIT6被启用。 我甚至不知道0x0006来自哪里。
我遵循的是示例 ADC10_10.c 和此 链接。 除了 LPM0模式、其余所有模式都是相同的。 但是、ADC10中断似乎不是很必要、它无法进入 LPM0、因为 SPI 无法工作、这是我的经验、即使只使用 SPI 也是如此。
对于 CONSEQ=1、ADC10始终从 INCH 向下计数至0 [参考 UG (SLAU144J)图22-6]。 ADC10AE 只是调节引脚电路。 如果 A0结果恰好与 A7结果匹配,我会说这是巧合;当输入实际为0V 时,我通常会看到小整数(>0)--可能是热噪声。
你有一个 ADC10BUSY 的旋转等待、但是在设置 ADCSC 和获取结果(X_Y)之间没有一个、所以你在获取结果之前获取结果。 (如果您在那里等待、则不需要上面有 clear-ENC-and-wait。)
--------
您的 SPI Rx ISR 仅有条件地获取 RXBUF。 如果它没有读取 RXBUF、RXIFG 将保持有效、并且 ISR 将被反复调用。 我建议您(无条件)将 RXBUF 读取为一个临时变量、然后决定如何处理它。
嗯、我找到了它显示0x0006的原因。 有跳线可将 TXD 和 RXD (P1.6和 P1.7)连接到评估板上的调试器。 现在我将其删除、现在它显示常量{0、0}。
我实际上执行了你所说的操作(即使它与给出的示例 ADC10_10.c 不同)。 它仍然显示相同的结果(常数{6、0}、之后是{0、0})。 我发现 ADC 在 ADCSC 置1后读取并移动值、无论在何处放置等待循环、这意味着数据已被正确转换并放入数组。
我甚至还会做进一步的研究:
X_Y[]初始化为8元素数组并进行 DTC 8转换,但它仍然是{6,0,0,...} (之后在{0、0、...}上)、这意味着只有 A7被读取到存储器中并传输到 X_Y[]、而其余的读取为0。
2.我拔下操纵杆的插头-- ADC10读不出任何内容,应该为0。 但它仍然是{6、0}(之后是{0、0})。
我开始想:我的代码有什么问题吗? 还是序列转换只能从英寸到 A0?
> 还是序列转换只能从英寸到 A0?
CONSEQ=1始终从 INCH 变为 A0。 如果 DTC 计数小于该值、则会停止、但 ADC 会继续。
> ADC 在 ADCSC 置1后立即读取并移动该值、无论在何处放置等待循环
是的。 部分幻想是,在16MHz 时,CPU 运行得非常快(与 ADC 相比),以至于在原始代码中,ADC 在设置 ENC=0时没有完成,所以忙回路就是它完成的地方。 例如、MCLK = 1MHz 时、您会看到不同的症状。