单片机也不简单

来源:互联网 发布:销售开票软件 编辑:程序博客网 时间:2024/05/18 00:02

最近再做一个激光检测系统,用mega8。一切都很简单,硬件电路瞬间就搞出来了,但是没想到程序搞了两三天。

全力搞的就一天,这一天,时间都浪费在非常简单的地方,浅水浸死人!自己疏忽的结果,想当然地把代码敲完,或者是copy完,就开始debug,结果是满目疮痍,更何况debug的时候还要考虑硬件电路可能存在问题,实在是费时费力!以后,要先检查好代码,每一句实现什么功能,脑袋里先模拟一次,是不是可以实现功能;不要在板子上跑啊跑,到最后还没定位到问题所在。其实,最重要还是自己不熟悉,连个取寄存器某一位、某一位置一置零这些基本操作都不熟悉的,毕竟近一年来都在搞软件上的东西。

这次困住我的就两点,查错查了整整一天!

其一,变量没有赋初值,导致变量不稳定,在接下来的程序中造成数据混乱。这里是一个控制LED阵列显示的数组,如1101,对应比特位上的值为1,那个LED就点亮;程序每次循环都要更新这个值,但更新的时候要保留之前的值,就是说以前点亮了的LED灯要继续保持点亮状态。好了,我没有初始化这个数组,导致,第一次更新值之后,很多个LED都亮了,本来应该就一个LED亮的。我反复折腾了很久,还曾经一度怀疑LED显示函数、更新函数出现问题了,把这些函数单独拿出来debug,用板上的指示灯试验了很久,发现都没有问题,但一旦跑大程序,就出问题了。后来,偶然发现这个显示数据不对劲,才想到变量没有赋初值。但其实,在我脑海里,C中定义一个变量的时候就会默认赋0的,这一点在我脑里是根深蒂固的,没想到今日被它害了。在单片机、DSP这些硬件平台上就不是这样的。

其二,读引脚的数据寄存器。AVR里面,一旦引脚设置为输入态,就可以通过PINx读取引脚的电平值。一组引脚包括8个,就是说PINx有8个比特。读引脚某一位的经典操作时这样的:

PINC & (1 << PC1)  //读取PC1脚的电平

但经典归经典,在实际使用过程中,要注意细节。这里读取到的是一个8比特的数据,而不是只有PC1所在的那个比特。我就一直人为这一句就返回一个比特,然后我读取几个引脚的值,直接对其用 或 操作合并起来,得到的值老是有问题。

encval = (datad & (1 << PD1))|(datad & (1 << PD2))|(datad & (1 << PD0))|(datac & (1 << PC5))|(datac & (1 << PC4))| //16-4编码值和GS信号 (datac & (1 << PC3))|(datac & (1 << PC2))|(datac & (1 << PC1))|(datac & (1 << PC0)); //8-3编码值和GS信号  */
以上是有问题的语句,我想把PD2、PD1、PD0、PC5、PC4、PC3、PC2、PC1、PC0这9个引脚的值合成一个int,但是忽略了不同名称的引脚它们可能对应同样的bit位,例如,PD2是PORTD的第3个bit,而PC2同样是PORTC的第3个bit,直接或运算,这两位就重叠了,而我的本意是得到的int每一个bit代表一个引脚,PD2应该是第9个bit才对。所以,上面的语句要修改为:

encval =(!((datad & (1 << PD1))==0)) <<8 |(!((datad & (1 << PD2))==0)) <<7 | (!((datad & (1 << PD0))==0)) <<6 |(!((datac & (1 << PC5))==0)) <<5 |(!((datac & (1 << PC4))==0)) <<4 | (!((datac & (1 << PC3))==0)) <<3 |(!((datac & (1 << PC2))==0)) <<2 |(!((datac & (1 << PC1))==0)) <<1 | (!((datac & (1 << PC0))==0)) ;
这样子,取完对应位之后判断是否全0,因为只有改位有值,其它位都与运算为0了,所以判断全0就是该位为0,逻辑1取反得到该位是1,反之则为0,得到一个位的值后,还要把其左移到设想的位置上。

看来,这次是被软件害惨了!以前做东西,硬件老是出问题,我就认为,软件上怎么调都不通,肯定是硬件出了问题!这次刚好给我狠狠地打了一次脸,程序调不通?其实是你的程序欠缺严谨!

还有一点要总结的是,单片机的程序烧写问题。板子很快焊接完了,程序也写得差不多了,就要烧进单片机里,但下载器死活连接不成功。换了几个下载器,不行。什么驱动也装过了,免驱的也试过了,就是不行。最后被我在淘宝上找到一家可以用的,发现跟之前那些失败品比较,PC端那个下载界面做得非常完美,LOG里面各种提示,还配有单片机锁死的自动解决方案。下载器,可不要疏忽了,没了它,程序写得再好,板子画得更美,也是白做的,特别是赶时间出成品的时候,那老死用不了的下载器简直把你活活急死。

作为一个混了那么久的非菜鸟,这次真心被一个小小的mega8狠狠的打击了一回,不能轻视任何技术问题啊!


0 0
原创粉丝点击