一个应用是用MSP430G2453做的。过程大概如下:上位机发一个指令,MCU进行一次ADC,然后将ADC结果返回上位机。最初是单字节指令,一切正常。后来改为两字节,三字节以后,回传数据周期性地出错,ADC转换值周期性的出错,而且还是错误相同。特别是三字节指令,每隔六到七次正常回传后就有一次无响应,继续发指令后,是一到两次的错误回传后,又可以正常回数据。这是可以不断重复的现象。不知是什么问题?如何解决?
下面的添加附件上不去,无法上串程序。
紧急!!!!
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.
一个应用是用MSP430G2453做的。过程大概如下:上位机发一个指令,MCU进行一次ADC,然后将ADC结果返回上位机。最初是单字节指令,一切正常。后来改为两字节,三字节以后,回传数据周期性地出错,ADC转换值周期性的出错,而且还是错误相同。特别是三字节指令,每隔六到七次正常回传后就有一次无响应,继续发指令后,是一到两次的错误回传后,又可以正常回数据。这是可以不断重复的现象。不知是什么问题?如何解决?
下面的添加附件上不去,无法上串程序。
紧急!!!!
Songlin Qin, 我简单看了看你的程序,请问你想实现使用ADC10依次采样P1.4, 1.5, 1.6, 1.7 上面的电压吗?P1.4, 1.5, 1.6, 1.7应该对应的是ADC10的通道A4, A5, A6, A7. 但是程序中如下面所示,ADC配置你选的是INCH_10,为通道10,是Temperature sensor。另外ADC10AE0也需要把要测的4个通道都使能了。
建议你把P1.4, 1.5, 1.6, 1.7接上不同的电压值,然后调试ADC10, 看看每个通道采回来的结果都正确了,再进行下一步。
void ADC_Initial() //ADC 初始化
{
ADC10CTL0=SREF_1+ADC10SHT_1+MSC+REFON+REF2_5V+ADC10ON+ ADC10IE;//ENC
ADC10CTL1=INCH_10+CONSEQ_1+ADC10SSEL_0+ADC10DIV_3; // single sample multiple channel INCH7 maximum channel number
ADC10AE0|=BIT7;//+BIT5+BIT6+BIT7;// P1.4,5,6,7 ADC option select
ADC10SA = 0x0200; //DTC set the result starting address
ADC10DTC1 = 0x04; // 16 conversions
}
附件是一个串口调试程序的接收数据框的截图,图中00 83 2C xx 两个数据是错误的响应,在这之前还有一次停止响应。程序已改为单字节运行,在单字节指令下,程序可以正确运行,连续很长时间的运行还是可以保持正确的响应。但是加上两个无效字节形成三字节后,也能正确响应,就是每隔几次正确响应会有一次停止响应何一次错误响应,附件就是这个运行的记录。只加一个无效字节也可以运行,但出错机会小一点,可以每隔十几次正确响应后来一次停顿和一次错误响应。所以我认为可能是UCA0RXBUF的问题。
Songlin Qin,
关于你描述的这个问题,我认为你应该逐步定位。先定位问题究竟是从哪里引入的,是ADC采样错误了,还是UART发送出来的数据时错误的?
故你可以在线调试,当MSP430发送出错误数据时,查看一下tmphigh 和 tmplow,或者你可以写个数组,存多组发送出去的ADC数据,看看本身采回来的ADC数据是否一直正确,如果ADC是正确的话,那么就是UART出错了。然后再分别看看,是UART发送出错了,还是接收命令时出错了。逐步定位问题。
我不理解你所说的单字节指令和多字节指令的含义,若方便的话,可否解释一下,程序的工作流程和字节的含义。O(∩_∩)O~
串口通讯一次只发送一个8BIT的字符,所谓单字节就是上位机只发送一个字符,例如:上位机向下发送30(hex),下位机,标号为30(hex)的MSP430MCU就会作出响应。三字节指令,则MSP430需要连续接收三个字节后,对这三个字符进行判别确认后才作出响应与否。前面进行实验的是伪三字节指令,连续下发的三个字符中有一个是正确指令。因为有一个是正确的所以还是会有正确响应。在连续多次后会有一次拒绝响应,下一次接收后就给了一次错误的响应(ADC数据错误),再下一次就恢复正常。所谓ADC数据的正确是与外部电压确认过得。最有趣的是这个现象是周期性,循环往复可重复。连ADC的数据也重复。这种多字节的指令我在51中是多次使用了。看到别人在430F系列中也使用的。
程序流程如下:初始化以后,进入LPM3,当有一个UCAORXBUF中断,读接收字符并判别,如正确;就执行ADC,然后再上传数据;为了简化现在只有温度和P1.7两个数据。另外还有一个进程,如果P1.3有电压跳变也会有一个中断响应,并对事件计数,然后存入flash中永久保存。这个数不会出错,因为它在flash中。个人以为错误可能是在UCAORXBUF与RAM之间产生。