Panic的小屋

国破山河在,城春草木深。
随笔 - 152, 评论 - 1764, 引用 - 25, 文章 - 0

导航

公告

<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

留言簿(336)

随笔分类

随笔档案

文章档案

相册

国外好站推荐

工具网页

我的其他网页

我的网友

户外运动

美女的空间

搜索

最新评论

阅读排行榜

评论排行榜

单板机开发手记

Posted on 2006-04-26 22:09 Panic 阅读(8913) 评论(12)  编辑 收藏

单板机开发手记

作者: Panic 2006年4月26日

前一段时间想要DIY个自行车灯,寻找合适的集成电路,发现只有美信(MAXIM)有合适的产品,但是价格太贵了($1.6左右),而且罕见零售。

最后在肉丝的推荐下,使用8位单板机模拟集成电路的功能。

考虑到需要结构简单价格便宜,选用了ATMELATtiny13

由于对单板机完全没有概念,所以一上手就没有什么进展,连单板机的频率一类的都搞不清楚。

注册了几个单板机论坛,提了些问题,回复甚少,而且也罕见有实质意义的答案。

最后没办法,只好苦啃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

如果有人有这方面的网上零售或者邮购渠道,请在本博客留言。谢谢。

Feedback

# re: 单板机开发手记

2006-04-26 22:17 by 一笑
进步的好快啊,不愧为小神童!:p 

写死循环不正是你擅长的嘛!

# re: 一笑

2006-04-26 22:23 by Panic
汗汗,都一个多月了,才搞成这样。。。

# re: 单板机开发手记

2006-04-27 09:33 by HateMath
关注.
小鸟进步还是蛮快的.
能否知道你的东西有哪些功能?
还有就是不大理解为什么都要贴片的呢?可否考虑通过优化PCB电路板设计来弥补空间要求?

# re: HateMath

2006-04-27 09:59 by pAnic
我在做的是一个LED车灯的控制器。用贴片就是为了节省空间。因为主要逻辑都在单片机内部处理了,外部电路比较简单,优化的空间比较少。

# re: 单板机开发手记

2006-04-27 14:15 by HateMath
就是装在你那个宝贝bycle上的吧。
设想中的车灯有什么特色,说来偶听听?

# re: HateMath

2006-04-27 14:22 by pAnic
其实是非常简单的。
2AA~3AA输入电压。
驱动1W/3W白光LED
支持常开和闪光两种模式。
输出功率自动根据电池电压调节。

# re: 单板机开发手记

2006-04-27 21:15 by HateMath
听起来不错,我想起了《霹雳游侠》里的那种来回闪光的车灯。
支持!

# re: 单板机开发手记

2006-08-22 10:34 by Leeman
用winavr的话得到的hex文件的体积应该不可能小于1k吧?
我也是tiny13, 实现ir解码和按键处理和电压检测, 用winavr, 大小是3k多, 正郁闷着呢:
Size after:
main.elf  :
section           size      addr
.text              974         0
.data                0   8388704
.bss                17   8388704
.noinit              0   8388721
.eeprom              0   8454144
.stab              852         0
.stabstr           132         0
.debug_aranges      20         0
.debug_pubnames     78         0
.debug_info        478         0
.debug_abbrev      247         0
.debug_line        685         0
.debug_str         265         0
Total             3748

# re: 单板机开发手记

2007-01-26 18:02 by 小张
要用单片机做小系统,建议用汇编啊。另外外围可不用贴片听你说的那功能应该也用不了多大的体积啊。

# re: 单板机开发手记

2007-04-04 21:28 by me
这年头还有人叫单板机的,笑死人了

# re: 单板机开发手记

2007-09-18 16:06 by 同声传译翻译官
大家一起交流吗,不要笑人家啊。

# re: 单板机开发手记

2009-12-25 10:59 by hATEmATH的网上田园
我又来了,问一下你的tiny13编程器是自己做的吗?我现有maga8的编程器,不知道和tiny系列的是否通用
标题  
姓名  
主页
验证码 *
内容   
  登录  使用高级评论  Top
[使用Ctrl+Enter键可以直接提交]