单板机开发手记
作者: Panic 2006年4月26日
前一段时间想要DIY个自行车灯,寻找合适的集成电路,发现只有美信(MAXIM)有合适的产品,但是价格太贵了($1.6左右),而且罕见零售。
最后在肉丝的推荐下,使用8位单板机模拟集成电路的功能。
考虑到需要结构简单价格便宜,选用了ATMEL的ATtiny13。
由于对单板机完全没有概念,所以一上手就没有什么进展,连单板机的频率一类的都搞不清楚。
注册了几个单板机论坛,提了些问题,回复甚少,而且也罕见有实质意义的答案。
最后没办法,只好苦啃datasheet,然后根据提供的例程和开发工具自带的例子,开始了艰难的单板机之旅。
单板机和PC相比,有如下特点:
一,对外部设备依赖性极强。
单板机的外部设备,根据应用千差万别,没有什么通用的环境,换一个应用就换一个环境,而不同应用的例子代码几乎没法参考,最有价值的参考代码还是库函数和datasheet的例子。
二,低端单板机,资源极端匮乏。
我选用的ATtiny13,只有1k flash,32个8位寄存器,64字节SRAM(内存),64字节EEPROM。而在极限状态,主频只有20M,我实际使用的是9.6M主频。
在这种空间内写程序真的是一种考验。
三,难以调试。
多数时候,程序都是在模拟器上面跑。烧录到芯片后,实际工作状态还受外围电路的影响,任何环节出错都会导致错误的结果,而最郁闷的是在芯片上面跑的程序出错,还没法得到错误状态。
四,对开发者的电路知识要求高。
写PC软件几乎不需要什么电路知识,但是单板机不同,虽然有很多现成的试验板,但是这些试验板根本没法针对特定的应用做开发,充其量只能算例子。
自己需要的电路只能自己设计(当然,如果你要做一件已经有成熟电路的产品,就无所谓了),自己购买元件,自己焊接。最后还要自己检查和验证电路的正确性。
经过努力,我的电路终于可以工作,而且程序也即将完工了,只是现在还有部分元器件没有买到。
这个过程中,没有很系统的经验,只有一些教训和细节和大家分享。
1,首次烧写程序的时候,芯片没有加电,烧写没有成功--b。
2,编译器没有开启优化,导致少量功能就占据了巨大的空间(1.67k),我添加新函数的时候,居然提示我已经超出器件的flash容量。
后来开启了优化选项,算是解决了这个问题。hex文件的体积从1.67k 降低到了814字节。(hex文件的体积大概相当于实际flash占用的2倍)
3,进一步的优化。
我对存在的代码又做了一次优化,把多数函数调用都改成了宏。
因为函数调用是开销很大的行为,当函数内容比较短小的时候,调用本身的体积和速度开销远远超过了函数执行体,这时候用宏替代函数就是最直接的优化方法。
只有当函数体很长,并且调用比较多的时候,用函数形式才比较有价值。
基本的原则是:只在一个地方调用的函数,全部改成宏;调用开销大于函数体开销的函数,全部改成宏。调用开销小于函数体开销,但是希望执行速度快的函数,可以考虑改成宏。
函数改写为宏,用如下手法:
/*函数形式*/
void f(char a)
{
/*函数体*/
}
/*宏形式*/
#define f(a)\
do{\
/*函数体*/\
}while(0)
对于void类型返回值的函数,这样做就足够了,调用的地方完全不需要修改。如果需要处理返回值,可以使用其他形式,不过个人更习惯用一个全局变量接受返回值。
4,尽量避免使用多字节的数据类型。
借助库函数,8位的单板机可以完整支持short,long甚至float,double一类的多字节类型,但是对这些类型的操作导致代码体积的膨胀是很恐怖的,除非万不得已,否则坚决避免。
5,尽量避免使用芯片不直接支持的操作。
ATtiny13不支持乘法和除法,尽量避免使用需要这类运算的算法和逻辑。原因同4。
6,输出调试信息和中间值。
没有PC开发中那些printf,cout,TRACE,OutputDebugString之类的功能可用,更不能用messagebox报错和中断程序执行。
我迄今为止能想到的保存并提取错误信息的方法就只有使用EEPROM。
利用烧写器可以读取EEPROM的内容,我正在考虑把运行中的数据写入这个空间,然后读取以得到程序的状态和错误信息。
因为程序功能基本实现并且目前还没有什么错误,所以这个功能现在仍在构造中。
7,除了完全依赖中断运行的单板机之外,单板机主要的流程就是一个死循环,我没有看过其他人是怎么处理主流程,以我个人的经验,主流程是一个类似下面的结构:
while(1) /*死循环*/
{
switch(state)
{
case INIT: /*初始化状态*/
break;
case WORK: /*工作状态*/
break;
/*其他状态类似处理*/
}
}
依靠切换状态来实现不同功能的切换。这个和windows的消息循环很相似。
8,中断的处理
如果是用C开发,则编译器会自动帮你做现场保护和调用返回的工作(汇编的话,有些东西要自己处理)。中断和主流程之间的数据传递也几乎只能依靠全局变量进行。
9,感觉。
除了对C语言有少许要求之外,单板机开发几乎是完全面向应用的,没有太多现成的东西可用,除了要熟读芯片的datasheet之外,最重要的事情恐怕就是要对周边的电路和设备有比较清晰的认识。
10,一些免费单板机开发软件下载:
双龙的下载器,支持的芯片种类多,运行也很可靠。
小马下载器,老外的产品,国内做了汉化
ATMEL官方的相关开发工具。
WinAVR,我目前使用的AVR C编译器,GCC核心。
我的程序最近就可以搞定了,只是需要的配件不知道什么时候才能买到,我现在需要的配件清单如下:
1,贴片功率电感,最大电流1A,直流电阻尽量小。电感值
33uH
100uH
330uH
接近即可,不需要完全相同。
2,贴片场效应管,型号有下面的任何一种都可以。
IRF7210
IRF7220
IRF7233
IRF7410
IRF7420
IRF7433
IRF7702
IRF7425
IRF7707
3,贴片肖特基二极管,最大电流1A
4,贴片电阻,1/8~1/16W,阻值
10k
60k
5,贴片电容,耐压16V即可,容量
1uF
10uF
6,贴片稳压管,15~20V
如果有人有这方面的网上零售或者邮购渠道,请在本博客留言。谢谢。