为了应付自己开的那坑爹的题目,用上次做测距留下的430的小片子继续焊了块DDS信号信号源的板子,快焊完了,一看,真是个水,居然连电源和地的引出端口都没几个,供电从外部来,USB下载电路也没有,用BSL下载,用了下BSL居然刚开始下载不进去,后来才发现,软件设置有问题。再然后,程序显示下载进去了,但是最简单的LED点亮都没运行,既然软件上显示程序可以下载进去,至少应该不是芯片的问题吧。。。 然后昨晚上继续纠结,好像还是没运行,就直接把BSL下载线拔了,这下灯居然亮了(还没查具体这是什么问题,先不管它)。下面就可以调试程序了。
下面说说程序和硬件上的一些问题:
(1):封装与焊接问题
(2):程序设计中的问题
这里面问题就很多了。
现在我要实现的功能是,用430单片机控制DDS芯片AD9833产生频率、相位、周期数、波形模式(正弦、三角、矩形波)等参数可调的信号,调整部分通过外部按键输入控制,然后调整信息通过外部的5110液晶显示出来。功能比较简单,无非就是几个按键、一个DDS芯片AD9833和液晶的控制,一搜索淘宝上卖的很多。但是我这毕竟还是从上次导波测距那过来的水平,中间出了不少错。
(a):程序能下载,调整完了最简单的LED之后,调整下按键吧。
好了,程序里面我用按键中断的方式检测外部的按键输入,而且程序里面也是用P2口去做的按键中断检测,但是硬件上可能是后面为了PCB连线方便,我居然把6个按键引脚中的5个放到了P3口,而430单片机处理P1P2口的IO口是没有外部中断的,程序里面还是用的P2口,而且也没进行中断IO口的初始化设置,难怪没报错。
硬件修改和软件修改一定要对应起来。。。
那么因为P2口中只有一个P2.7连接上了按键,还是可以处理。很无奈在程序中用轮转查询的方式检测P3口其它5个按键的输入,还要将信息显示到5110液晶上,这就不方便了吧(5110的液晶扫描是需要时间的,这就有可能漏掉前面的按键检测,按键不用中断处理不能得到及时的响应,但是这里功能简单,没太大问题)。。。P2.7口作为信号输出的确认按键,按下之后推出轮转查询其它按键的状态。
(b):单片机程序结构
在初学单片机的时候,很多实验只要实现很单一的功能,所以程序基本都写在了一个main函数里面,从上往下执行就可以。但是这样功能一旦太多了,复杂了,单一的顺序执行就可能会阻塞,不能满足实时响应的要求。
为了能及时响应外部设备或一些事件的发生,我们把这部分需要及时响应的放到中断里面来处理,而一些时间响应不需要那么紧凑的部分放到main函数的while(1)大循环里面去处理,这样就构成了我们常见的前后台程序结构。中断部分构成前台,超级循环部分构成后台处理,以匹配快速与慢速之间的差别。
前后台程序结构是单片机中应用最为广泛的程序结构。前台程序应该尽量的短小,获得必要的信息,传送给后台,繁杂的处理留给后台程序,这样才能及时的退出中断以便可以继续响应外部中断请求。所以从这一点上看,过去写的很多程序就很有问题,比如第一个项目里面,把一些浮点计算放到中断里面去做,很费资源和时间。等等。。。
当程序进一步复杂,为了更好的实现多任务的调度,那就只能带上操作系统了。
(c)
按键部分测试后,至少保证硬件上没有问题,程序上进行一些修改就可以了。
好了,P3口的不能用中断,没办法,只能查询了那就。好,对P3.0口按键查询检测:
if(P3IN|0xfe==0xfe)
{ delay_ms(10);
if(P3IN|0xfe==0xfe)
{P2OUT|=BIT4;}//点亮LED
}
居然灯开始就是亮的,按个键没效果?!这么简单的程序也会有错吗。。。
后来发现了,P3IN|0xfe两边加上个括号。。。
if((P3IN|0xfe)==0xfe)
{ delay_ms(10);
if((P3IN|0xfe)==0xfe)
{P2OUT|=BIT4;}//点亮LED
}
一查==的优先级比|要高,不加括号就是一直为真了。。。
C学的也不行,看书再多也是不够的,还得实践出真知。为了防错,必要的地方加上括号。
对于按键检测,
状态机编程问题
编程规范问题,如函数的命名、变量的命名
注释问题,一段时间之后之前写的代码什么意思已经忘了。。。到底按键是什么意思也不知道。。。
程序的思路问题。。。
(d)继续调试
文章评论(0条评论)
登录后参与讨论