作者deo2000 (800IM)
看板ASM
标题[问题] PC 收 51 传的0~255,有时会收到奇怪数字
时间Wed Jan 9 06:56:41 2013
有时候明明不是0,却经常收到0(波型位置越高,数值越小)
http://imgur.com/lPAPT,SFCKe#0
还会爆掉
http://imgur.com/lPAPT,SFCKe#1
#include "AT89X51.h"
/*
P2 读取ADC
P1,3,0 预留输出控制
*/
unsigned char ucADC0804;
unsigned char ucDigMSB,ucDigMID,ucDigLSB;
char code DEC[10]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
main()
{
IE=0x90; /* (中断Enable)EA=1,(串列中断)ES=1*/
P2=0xFF; /* P2为读取Port */
SCON=0x70; /*Serial Port mode1*/
TMOD=0x20; /*Timer mode1(Auto Load)*/
TH1=0xFD; /*
[email protected]*/
TR1=1; /*Timer1 启动!*/
TI=1; /*发射中断启动!*/
while(1)
{
ucADC0804=P2;
// 百 十 个
ucDigMSB=(ucADC0804/100);
ucDigMID=(ucADC0804%100)/10;
ucDigLSB=(ucADC0804%10);
}
}
void serial_INT(void) interrupt 4
{
if(RI&&'Q'==SBUF)// 如果收到请求,才发射ADC Value
{
// 送出三位数DEC
TI=0;
SBUF=DEC[ucDigMSB]; //百位
while(!TI);
TI=0;
SBUF=DEC[ucDigMID]; //十位
while(!TI);
TI=0;
SBUF=DEC[ucDigLSB]; //个为
while(!TI);
TI=0;
}
RI=0;
}
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.122.165.222
1F:推 hongsiangfu:会不会三位数转换到一半被串列中断,使数值错误? 01/09 09:57
2F:→ deo2000:极有可能! 感谢! 我再想想怎麽确保转换完成 01/09 12:45
我用2种方法确保三位数转换不会被中断,不过大约只有2%~5%的效果,想不通原因在哪?
1.转换前EA=ES=0,转换完EA=ES=1
2.三位数转换放在中断函式中
3F:推 cwl751005:中断程式里的第一个TI=0去掉看看 01/09 18:07
试了,没有改善
4F:→ cwl751005:当电脑传资料给51,传完後RI变为1产生中断,TI也是 01/09 18:14
5F:→ cwl751005:当你第一个TI=0出现时,可能把SBUF的资料传到电脑了 01/09 18:15
6F:→ cwl751005:基本上SBUF=XXX这行指令就会让TI=0了 01/09 18:16
7F:→ cwl751005:说错,是让资料传到电脑 01/09 18:18
※ 编辑: deo2000 来自: 140.122.165.222 (01/12 13:25)
※ 编辑: deo2000 来自: 140.122.165.222 (01/12 13:28)
8F:→ ksmrt0123:你0804的cs,rd,wr,intr怎麽接的? 01/13 01:11
没有接MCU,直接转换
※ 编辑: deo2000 来自: 140.122.136.12 (01/13 01:42)
9F:→ ksmrt0123:所以0804是接成free-running mode? 即使这样mcu还是需 01/13 14:25
10F:→ ksmrt0123:要跟0804沟通才能保证资料的正确性 01/13 14:26
11F:→ ksmrt0123:因mcu读的时候可能刚好是0804资料变化的时候 01/13 14:27
相同的ADC free-running 板子我在用0x378(LPT)收资料的时候,正确性是完全没问题的。
资料变化的时候没差,因为sensor感测对象是人体动作,我只要求巨观上整个资料序列都
是连续合理的就好,不必精密
※ 编辑: deo2000 来自: 140.122.165.222 (01/13 14:58)
12F:→ ksmrt0123:问题也可能只是还没发生/发现而已 01/13 15:18
13F:→ ksmrt0123:有些东西不容许发生一次错误 01/13 15:19
14F:→ ksmrt0123:有些产品量很大, 发生错误的机率就大多了 01/13 15:20
15F:→ ksmrt0123:重点是这种错误是完全可避免的 01/13 15:21
现在打算以後改用串列通讯ADC(ADC0832之类),所以应该就没这个问题了吧!
目前只是懒得重作板子
※ 编辑: deo2000 来自: 140.122.165.222 (01/13 15:29)