发 帖  
原厂入驻New
[问答] 乘法除法后的ADC不工作怎么回事
97 adc
分享
我是电子技术员,努力学习PIC的C编程。我已经用XC8编译器为pic16f676编写了简单的程序,以便理解ADC。当我直接比较adc结果(0到1023)时,当我像下面的程序那样对adc结果进行乘法和除法时,程序运行良好,为什么它不工作呢?如何解决这个问题?
0
2020-4-23 06:15:39   评论 分享淘帖 邀请回答
19个回答
对于“ADCML结果”,您使用的是未签名的int。因此,如果原始adc_result大于13(13*5000=65000),则当10位结果乘以5000时,您的代码:将导致溢出。对adc_result使用无符号长字符。由于读取/修改/写入(RMW)现象,您也有可能错误写入LED管脚。PIC16F66没有LATX寄存器,所以建议使用一个阴影寄存器定义为这样的东西:
2020-4-23 06:22:44 评论

举报

adc_result=((无符号长int)adc_result*5000)/1023;或adc_result=(adc_result*5000ul)/1023;如前所述,您有溢出。铸造是另一种选择。或者告诉编译器const是一个未签名的long。编译器将用这两个变量的最大类型进行数学运算。
2020-4-23 06:35:14 评论

举报

我同意前面的评论。对您的代码再多一些注释。[1]所需的“获取时间”是20微秒,而不是20毫秒。您等待的时间长并不重要,但是不是必需的。然后比较毫伏,但如果你想让你的代码运行得更快,最好把所有的常数转换回10位的ADC读数,然后对这些值进行比较。这样可以节省编译器做许多多字节的乘法和除法。FYI除以1024是很快的。除以1023是缓慢的。
2020-4-23 06:42:40 评论

举报

感谢所有的帮助答复,转换后的LeETONOW程序正在工作
2020-4-23 07:02:14 评论

举报

用1023代替1024,它甚至可以正常工作,而且快得多。
2020-4-23 07:17:02 评论

举报

我也要说同样的话,但实际上我已经失去了意志
2020-4-23 07:23:41 评论

举报

我已经把它说回来了:4)
2020-4-23 07:31:47 评论

举报

但你没有正确使用关键词
2020-4-23 07:39:25 评论

举报

HTTP://FUMU.ALLABOUTROUNTS.COM/THEADS/WHY-ADC-1024 IS-ECHECTON-ADC-1023-IS-JUST-PROTER EUROL。
2020-4-23 07:57:10 评论

举报

亲爱的PStechPaul,我尝试过你的代码可以正常工作,但是当我调用下面的代码时,它正常工作,但是RC4也受到影响,并且停止闪烁?
2020-4-23 08:04:34 评论

举报

2020-4-23 08:20:18 评论

举报

2020-4-23 08:32:04 评论

举报

将来,为了排除这些问题,我将把操作分解成单独的操作,以帮助精确地缩小问题的范围。代替adc_result=(adc_result*5000)/1023;tryadc_result=adc_result*5000;adc_result=adc_result/1023;尽管每个行都有IILVER,所以在调试时,以前的结果不会被覆盖。
2020-4-23 08:51:18 评论

举报

嗨,好吧,嗯…嗯…1023, 1024,…1023, 1024,…102x…现在定义什么?-HTTP://www. McCHIP.COM/FUMMS/FUNDPOST/969425GEALALD-
2020-4-23 09:01:22 评论

举报

只有编译器发现了优化。我不相信XC8免费模式这样做,没有测试。
2020-4-23 09:17:16 评论

举报

谢谢你的回复,CinziaG;你说得对,这个操作符[/code]而且这个行在将代码更改为小于它正在模拟的OK之后正在引起问题[/code]
2020-4-23 09:34:58 评论

举报

感谢PrimyCyZig;你是正确的这个操作符[字体]!而且这一行也引起了问题[lt;字体] PORTC=LATC;在更改代码ToOW之后,它可以模拟OK。
2020-4-23 09:45:43 评论

举报

2020-4-23 10:04:31 评论

举报

嗨,为了处理消息#2中建议的影子寄存器,对于硬件中没有LAT寄存器的PIC芯片,所有的PORT操作都应该使用相同的影子寄存器变量:LATA和LATC。这意味着LED4上的操作也应该通过调用setled(led)和clrl来完成。然后,除了建议的模板代码之外,还需要定义LED4:并添加到setled函数中:并添加到clrled函数中:如果调用相同的乐趣,您将了解如何对端口AThere上的LED号码2进行类似的添加。在主线代码和中断代码中都执行,链接器通过复制可执行代码和任何本地变量来避免这种情况。在主线代码和中断代码中可以更新的变量应该用关键字C2像这样:Btw.:我认为8位变量足以为影子寄存器:问候,Mysil
2020-4-23 10:15:58 评论

举报

只有小组成员才能发言,加入小组>>

108个成员聚集在这个小组

加入小组

创建小组步骤

关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表