EDN首页   博客首页 用户登陆  |  注册
aaa
发表于 2009/12/8 16:26:16

0

关于投票

飞思卡尔为便携式设备市场注入活力

飞思卡尔为便携式设备市场注入活力

“飞思卡尔充电吧”分享低功耗、化繁为简的嵌入式应用开发技术

 

11月底“飞思卡尔充电吧”举行的LCD单片机在线研讨会上,飞思卡尔半导体全球产品经理谢晓东先生详细介绍了其全球领先的低功耗LCD单片机——MC9S08LL64,用实例讲解和分析如何利用飞思卡尔低功耗单片机实现领先同行的电子设计,并就飞思卡尔的低功耗LCD单片机的技术创新以及研发心得与工程师们进行了深入讨论。

面对竞争激烈的便携式设备市场,只有创新才能推动技术进步,为此全球半导体领导厂商飞思卡尔正在扩展8 位微控制器 (MCU) 系列,新推出的器件要求低功率操作和高级显示功能。其液晶显示器 (LCD) S08LL MCU系列的扩展性,让工程师能够快速开发可靠、灵活和低成本的医疗、工业及消费电子产品。

全球医疗市场对便携式电子设备的需求不断加大,便携式产品也日益普及。为此,飞思卡尔半导体已推出用于个人诊断和便携式医疗产品开发的新器件,便于工程师在此基础上开发更多便捷的医疗电子产品,呵护人类健康。

   益普及S08LL64 MCU具备一流的待机功耗,非常适用于血糖仪和脉搏血氧计等应用让它们能够使用两节AAA电池持续工作约六年。同时,飞思卡尔广泛的软件可配置 LCD 器件提供引脚兼容性选项和共享外设,以增加设计灵活性。这些优异的产品特性,无疑为便携式市场注入了新的活力。

“带有LCD 显示器的便携式应用不断增加,推动了对更长的电池寿命和更多的存储选项的需求。”飞思卡尔工业和多市场微控制器部总监 Aiden Mitchell 表示:“飞思卡尔的 LL64 MCU 系列满足了这种需要,并在飞思卡尔广泛的 LCD MCU 系列之内扩展了经济高效的、超低功率解决方案,向客户提供更多选择自由以满足更广泛的应用需求。”

模块化、经济高效的飞思卡尔Tower 系统开发平台提供了综合、可定制的嵌入式设计环境。模块化设计缩减了总成本,同时提供了一个低成本接入点。Tower 系统的核心特性体现在四个方面:带有易于使用、可重新配置的、开源硬件的模块化评估平台;单 MCU/MPU 模块作为主控板和功能开发板;插入主板板卡的模块;所有模块上的连接都通过 PCB 边缘连接器。

飞思卡尔让LCD 设计变得更加简单,旗下 S08LL 系列 MCU 拥有由开发工具、参考设计、应用指南、软件示例和网上演示组成的综合的生态系统支持。 S08LL 系列器件由CodeWarrior? Development Studio for Microcontroller v6.3 免费版本支持。它是一个集成工具套件,支持针对飞思卡尔 8 位或 32 MCU 的软件开发。

为帮助开发人员探索S08LL 系列的卓越特性,飞思卡尔还提供首个 8 Tower 系统TWR-SO8LL64 TWR-SO8LL64-KIT 评估系统。其中,S08LL16 S08LL64 MCU 包括在飞思卡尔product longevity计划中,保证最少供应 15 年。

据悉,下一期“飞思卡尔充电吧”活动将于125(上午10:00-12:00)如期举办,届时飞思卡尔半导体应用处理器与消费产品亚太区市场经理蒋宏先生将做主题为“采用飞思卡尔i.MX多媒体应用处理器建构安防系统”的在线互动访谈,与大家分享关于i.MX258产品的各种功能(包括软件及开发工具)及如何将这些设计元素融入到客户系统中,同时深入了解i.MX258的安全特性。

即将举办的“飞思卡尔充电吧”在线座谈时间表

主题

时间

采用飞思卡尔i.MX多媒体应用处理器建构安防系统

2009129, 10:00-12:00

更智能的触摸 飞思卡尔为您的设计提供最佳的触摸传感解决方案

20091223, 10:00-12:00

飞思卡尔汽车仪表完整解决方案

201016, 10:00-12:00

飞思卡尔汽车电子中电机控制方案

2010120, 10:00-12:00

 

 

系统分类: 商务交流  |  用户分类: 网络酷文转载  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(503) | 回复(1)

发表于 2009/12/8 16:25:07

0

关于投票

以领先的电表参考设计方案推进电网智能化发展

以领先的电表参考设计方案推进电网智能化发展

—— “飞思卡尔充电吧”分享智能计量

今年10月上线的“飞思卡尔充电吧”获得全国各地开发工程师的高度认可和一致好评。本月,“飞思卡尔充电吧”举行的一次“智能电表,轻松创造”——飞思卡尔电表解决方案在线研讨会,再度吸引开发工程师的高度关注。

在此次电表解决方案研讨会上,飞思卡尔半导体微控制器产品技术销售经理张明峰对智能电表领域的现况做了深入分析,并围绕电网和电表最新技术的发展全面介绍了飞思卡尔各类芯片产品,为工程师在此领域从事产品开发提供帮助。工程师们则在此次“飞思卡尔充电吧”上充分了解了飞思卡尔全球领先的智能电表解决方案,并分享了研发心得,让技术创新灵感得到进一步激发。

点击看大图

智能电网作为下一代电网的基本模式,在全球范围内的关注度已迅速升温。在智能计量已取得一系列重大进展的背景下,全球领先的经济体正通过新建智能电网来改进电能分配和节约电能,大刀阔斧地改造过时的电网系统。2010年,伴随智能电网规划和相关标准的相继推出和一些试点项目的陆续完成,预计中国智能电网市场将迎来井喷式发展。飞思卡尔对此早有先见之明,不仅意识到嵌入式控制和集成的连接接口将成为未来智能电网的中心,并已开发出专供智能电网应用的新一代智能微控制器。这一前瞻性的创新技术,正可以帮助中国的电能管理行业从容应对革新变局。

凭借多年对智能电网行业的关注和研究,飞思卡尔在整合全球研发力量的基础上,不断推出能够促进电能管理行业发展的各种创新技术,坚持以开放的视野支持电能管理部门应对电网改造给行业带来的挑战。飞思卡尔此次推出的“电表参考设计”完整解决方案,基于专为用电计量市场量身定制的先进微控制器(MCU),可为开发者提供完整的即插即用解决方案,不仅能降低成本和加快面市时间,更将加速一体化智能电网的建设。

飞思卡尔在“电表参考设计”解决方案中应用的MCF51EM 32ColdFire MCU是一款高度集成的具有高性能外设的单芯片器件。这款多相电表参考设计就是基于EM家族最高端的MCF51EM256设计的,并面向成本优化的单相或三相智能电表。参考设计中包含必要的硬件和软件使智能电表的开发变得更迅速、便捷。目前,全球各地的政府和企业都在大力推动家用和工业用节能型智能计量系统,飞思卡尔特别开发MCF51EM家族MCU,正可以帮助开发者在大量住宅和工业应用中缩减成本,降低电表设计的复杂性。凭借丰富的集成外设,它能支持大量不同的显示面板,不仅可以降低整体系统成本和功耗,同时还可以通过远程固件更新减少维护成本,从而轻松确保电表安全。

点击看大图

多相软件块设计图表

系统分类: 商务交流  |  用户分类: 网络酷文转载  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(233) | 回复(0)

发表于 2009/12/8 16:22:59

0

关于投票

邀开发工程师上网,轻松充电星期三

邀开发工程师上网,轻松充电星期三

--{0>Freescale energizes MeteringChina conference with advanced smart metering technology<}0{>飞思卡尔充电吧”正式启动

{0>BEIJING (MeteringChina Conference and Exhibition) – May 26, 2009 – Imagine a self-healing electrical grid that is as intelligent and interactive as the Internet.<}0{>2009119,北京--飞思卡尔半导体近日推出全新的在线座谈和互动平台—“飞思卡尔充电吧”。从10月底开始,隔一周的星期三,飞思卡尔将开展在线交流活动定期向遍布全国的开发工程师介绍半导体行业最新动态并向他们传递公司最新产品、技术和解决方案。结合飞思卡尔其它在线资源,“飞思卡尔充电吧”可提供资料下载、信息共享、在线商店等,给迫切需要行业资源的专业人士搭建起一站式平台,从而实现开发工作的与时俱进。

 “飞思卡尔充电吧”的一站式内容包括:每两周的星期三,进行一次“在线座谈”,由飞思卡尔的资深技术专家与注册工程师进行在线互动交流,并有录播板块供工程师随时回顾精彩内容;“新闻”栏目时时更新,提供行业最新动态;“新技术文章”板块,提供广受欢迎的飞思卡尔的最新技术解决方案和应用案例;“e-shop”专区,可为参与者提供网上购买半导体元器件的便利;“研讨会视频”分享,则可以让大家了解到更多丰富多彩的技术交流活动。

 “飞思卡尔充电吧”突破传统的在线座谈会的展示方式,采用了最新多媒体技术实现在线运行。它在业内率先采用“同步交互流媒体技术”,可以为注册参加者提供界面友好的视听体验,参与者不仅能在线收看主讲人的演讲视频,还能同步观看演示幻灯和实时提问,实现直观生动的交流方式。

 “飞思卡尔充电吧”的“在线座谈”内容涉及汽车、消费、工业、网络等领域的前沿半导体技术。对于从事嵌入式产品开发的工程师、电子专业的在校学生以及技术发烧友们来说,上“飞思卡尔充电吧”与行业专家深度互动,与同行伙伴深入交流,在互动交流中增进技术理解和提高应用能力,无疑是他们寻求开发指导和探索开发捷径的难得机会。

飞思卡尔副总裁兼亚太区总经理汪凯博士表示:“飞思卡尔一向致力于推动技术开发产业链上的价值共享,此次推出‘飞思卡尔充电吧’,我们希望将它打造成为工程师繁忙工作的加油站,我们愿与业内开发工程师分享飞思卡尔的领先技术和丰富经验,从而使工程师的开发工作变得更轻松和高效,实现多方共赢。”

刚刚结束的两场充电吧在线座谈主题分别为“用飞思卡尔i.MX51迎接移动互联网的来临”以及“飞思卡尔车身电子产品及解决方案”,注册参与者热情高涨、人数众多、反响热烈。秉承“轻松充电星期三”的创办理念,“飞思卡尔充电吧”将成为嵌入式半导体行业开发人员便捷和常态化的在线网络交流平台,让设计工程师的灵感自由释放,并不断迎接新的挑战。{0>For more information about Freescale’s smart metering solutions, visit www.freescale.com/files/pr/smartmeter.html.<}0{>有关飞思卡尔充电吧的更多信息,请访问 http://seminar.eccn.com/Freescale/

即将举办的“飞思卡尔充电吧”在线座谈时间表

主题

时间

智能电表,轻松创造 - 飞思卡尔电表解决方案研讨

20091111, 10:00-12:00

介绍MC9S08LL64 它延长电池寿命,简化开发流程,减少总体成本

20091125, 10:00-12:00

采用飞思卡尔 i.MX多媒体应用处理器建构安防系统

2009129, 10:00-12:00

更智能的触摸 飞思卡尔为您的设计提供最佳的触摸传感解决方案

20091223, 10:00-12:00

飞思卡尔汽车仪表完整解决方案

201016, 10:00-12:00

飞思卡尔汽车电子中电机控制方案

2010120, 10:00-12:00

 

关于飞思卡尔半导体

飞思卡尔半导体是全球领先的半导体公司,为汽车、消费、工业、网络市场设计并制造嵌入式半导体产品。这家私营企业总部位于德州奥斯汀,在全球拥有设计、研发、制造和销售机构。如需了解其它信息,请访问www.freescale.com.

# # #

飞思卡尔媒体联络人:

刘之琳

电话:86-10-5879 8078

电邮:juliet.liu@freescale.com

 

林瑞玫

电话:852-2666 8994

电邮:dawn.lam@freescale.com

 

飞思卡尔读者咨询:

Freescale Semiconductor

P.O. Box 17927

Denver, CO 80217 USA

 

Freescale Freescale标识是飞思卡尔半导体公司在美国和其他国家的商标或注册商标。所有其它产品和服务的名称均为各自所有者的财产。?飞思卡尔半导体公司2009年版权所有。

系统分类: 商务交流  |  用户分类: 网络酷文转载  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(282) | 回复(2)

发表于 2009/6/30 14:11:31

1

关于投票

经典到让人叹为观止的50句话

1 人生的最大遗憾莫过于错误地坚持了不该坚持的,轻易地放弃了不该放弃的……

2 新式morning call——生前何必久睡,死后自会长眠

3 使你疲劳的不是远方的高山,而且是你鞋里面的一粒砂子

4 有时在饭堂排队打饭时最大的欣慰不是前面的人越来越少而是后面等的人越来越多

5 逆风的方向,更适合飞翔。我不怕万人阻挡,只怕自己投降

6 酒,装在瓶里像水,喝到肚里闹鬼,说起话来走嘴,走起路来闪腿,半夜起来找水,早上起来后悔,中午酒杯一端还是挺美。

7 你要不理我我就成包子了而且还是天津最有名的嘿嘿

8 妈妈说人最好不要错过两样东西,最后一班回家的车和一个深爱你的人

9 我问一个在深圳工作了二十年的朋友:如果你死后,你的墓志铭打算写点啥?他说:我解决了住房问题!

10 那天看到一位大妈在烧纸,边烧边嘟囔着:收到了全都买基金吧~~

11 学问之美,在于使人一头雾水;诗歌之美,在于煽动男女出轨;女人之美,在于蠢得无怨无悔;男人之美,在于说谎说得白日见鬼

12 如果你看到面前的阴影,别怕,那是因为你的背后有阳光

13 诸葛亮出山前,也没带过兵!凭啥我就要工作经验?

14 本人made in china,出厂日期1986728日,长176cm,净重50kg。采用人工智能,各部分零件齐全,运转稳定,经二十多年的运行,属信得过产品。该产品手续齐全,无限期包退包换。现因发展需要,诚招志同道合者共同研制开发第二代产品,有意者请联系本人!

15 干掉熊猫,我就是国宝!

16 我能容忍身材是假的,脸是假的,胸是假的,臀是假的!!!但就是不容忍钱是假的!!!!

17 脱机的人永远不知道联机的人等了她多久……

18 紧 急 通 知:请准备一寸彩照,身份证复印件,学历复印件,个人简历,送到国家航天局,据可靠消息,为庆祝中秋,要招聘嫦娥!(自带兔子)

19 命运负责洗牌,但是玩牌的是我们自己!

20 问世间情为何物,不过一物降一物~

21 如果中了一千万,我就去买30套房子租给别人,每天都去收一次房租。哇咔咔~~充实! (说这句话的人估计忘了不是没个月都是30天的~~~~~~~~

22 上帝欲使人灭亡,必先使其疯狂;上帝欲使 人疯狂,必先使其买房

23 我们走得太快,灵魂都跟不上了……

24问:你喜欢我哪一点?答:我喜欢你离我远一点!

25 你看得见我打在屏幕上的字,却看不到我掉在键盘上的泪

26 大师兄,你知道吗?二师兄的肉现在比师傅的都贵了 (猪肉涨价啊~妈啊~~

27很久很久以前,谎言和真实在河边洗澡,谎言先洗好,穿了真实的衣服离开,真实却不肯穿谎言的衣服。后来,在人们的眼里,只有穿着真实衣服的谎言,却很难接受赤裸裸的真实

28 忙碌是一种幸福,让我们没时间体会痛苦,奔波是一种快乐,让我们真实的感受生活,疲惫是一种享受,让我们无暇空虚,愿你的生活多姿多彩,永远开心!

29 在非洲,瞪羚每天早上醒来时,他知道自己必须跑的比最快的狮子还快,否则就会被吃掉.狮子每天早上醒来时,他知道自己必须追上跑得最慢的瞪羚,否则就会被饿死.不管你是狮子还是瞪羚,当太阳升起时,你最好开始奔跑

30 任盈盈教令狐冲弹琴,后来她爱上了令狐冲;岳灵珊教林平之武功,后来她爱上了林平之;小龙女教杨过武功,后来她爱上了杨过;老顽童教瑛姑武功,后来他爱上了瑛姑;但是,怎么没有一个教我课的女老师或是女助教爱上我呢?

31 听说女人如衣服,兄弟如手足,回想起来,我竟然七手八脚地裸奔了19年! (相当适合某些人~哈哈)

32 骑白马的不一定是王子,他可能是唐僧;带翅膀的也不一定是天使——妈妈说,那是鸟人

33 爱一个人就是在拔通电话时,忽然不知道说什么好,原来只是想听听那熟悉的声音,原来真正想拔动的只是自已心底深处的一根弦

34 老虎不发威,你当我是hello kitty啊!小驴不发威,你以为我是史努比啊!

35 怀才就像怀孕,时间长了才能看出来

36 来瓶82年的矿泉水

37 过错是暂时的遗憾,而错过则是永远的遗憾!

38 小时候我以为自己长大后可以拯救整个世界,等长大后才发现整个世界都拯救不了我.......

39 跌倒了,爬起来再哭~~~ (太适合自己了~~~~

40 上联:忆往昔,红米饭,南瓜汤,老婆一个,小孩一帮.下联:看今朝,白米饭,王八汤,小孩一个,老婆 一帮

41 这世上最累的事情,莫过于眼睁睁看着自己的心碎了,还得自己动手把它粘起来

42 事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的

43 学士上面是硕士,硕士之后是博士,博士后面还有博士后,那博士后后面呢?如果你够勇敢再读两年那就是勇士,再读5年是壮士,再读7年是烈士,烈士以后呢?教育部会推出圣斗士,读满2年是青铜的 5年是白银的 7年是黄金的。毕业后愿意再读上去的女孩,有机会考出雅典娜!!!

44 好的爱情是你透过一个男人看到世界,坏的爱情是你为了一个人舍弃世界

45 今天你醒来,枕边躺着一只蚊子,旁边有一封遗嘱:我奋斗了一晚,你的脸皮厚的让我无颜活在这个世上。主啊!宽恕他吧,我是自杀的!

46 上班无聊吗?抛硬币玩吧,正面就上网,反面就睡觉,竖起就工作,倾斜就努力工作,摔粉碎了就申请加班,如果摔出两枚,那就天天摔!

47 同志们:别炒股,风险太大了,还是做豆腐最安全!做硬了是豆腐干,做稀了是豆腐脑,做薄了是豆腐皮,做没了是豆浆,放臭了是臭豆腐!稳赚不亏呀

48 我终究没能飙得过那辆宝马,只能眼看着它在夕阳中绝尘而去,不是我的引擎不好,而是我的车链子掉了

49 通知:近来秋寒已至,请同志们做好防御工作,有老公的抱老公 ,有老婆的抱老婆,暂时没有的请抱暖水瓶,实在没有暖水瓶的,请抱煤气罐(注意要点燃)。请勿乱抱鸡鸭等动物,以防禽流感。该南飞的南飞,该换毛的换毛,实在不行的就冬眠

50 还能冲动,表示你还对生活有激情,总是冲动,表示你还不懂.

系统分类: 自由话题  |  用户分类: 网络酷文转载  |  标签: 人生 生活  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(375) | 回复(0)

发表于 2008/8/26 20:34:07

1

关于投票

《匠人手记》网络书评:由读《匠人手记》想到的

《匠人手记》网络书评:由读《匠人手记》想到的

原文连接:http://ldkceo.blog.163.com/blog/static/196728412008714952766/#comment=fks_084074082095085066083083094095085095087068086094082066

  早上,利用上班前的闲暇翻读《匠人手记——一个单片机工作者的实践与思考》一书。这本书是我弟弟今年7月大学毕业后从学校带回来的,我们俩所学的专业都是自动化。熟悉自动化专业的人都知道,单片机技术是这个专业的重头戏,也是一个较好的出路。我本人虽然学艺不精,但一直有着浓浓的单片机情结。当我看到这本书的时候,浅浅的翻了几页,就已经爱不释手了。更何况弟弟还严重推荐——“这是一本介绍单片机编程思想的好书!”这让我不由带到办公室来看。

  本书的作者张俊是一位研发主管,其是国内非常有名的21IC中国电子网论坛管理员(站长)。书本主要是作者在从事单片机开发与应用的过程中,将实际经验教训和心得感悟加以总结,整理而成的工作手记。每篇手记论述一个专题,独立成篇,同时又相互关联。全书内容包含入门基础、经验技巧、设计案例、网络杂文等四个部分。

  书中将网络中自由的语言艺术与现实中严谨的科学技术相结合。全书的风格以轻松诙谐的笔调为主。作者力图摆脱传统技术类书籍说教式的表述形式,让读者耳目一新,在轻松的交流过程中获得共鸣。

  前段时间读之,常常为作者的思想拍案叫绝,他所提炼出来的精华:“技术源于积累,成功源于执着。放下浮躁,才能摆脱困扰。”更是深刻地改变了我的固有思维,给我带来了很多的启发。

  今天早上,再次读之,收获却又有了不同。我不由想起已经在华润集团工作的弟弟,现在他的主要工作就是协助总工程师通过仪表来监控流水线中机器的运转情况,确保生产正常。或者因为受我对单片机的大力吹捧的影响,他非常爱好单片机,而且小有所成,参加过全国、全区的电子设计大赛并获奖,毕业设计获系优(可以参加院优评比,但是他没有去),这些都记录着他在单片机这条道路上的点点滴滴。作为一个过来人,我知道一个单片机爱好者,为编出一个程序或者解决一个难题,需要怎样的长夜孤灯、需要怎样的搜肠刮肚和冥思苦想。大学四年,弟弟带着对单片机的执着和挚爱终于走了过来了!很不容易!他是一个勤奋、踏实而又不轻言放弃的人,每每想及,我总会握紧拳头挥舞不已,我是在为他骄傲啊!

  但现实是残酷的。走上工作岗位后的弟弟做的工作所用却与当年默默追求的单片机技术相去甚远,虽然说“三百六十行,行行出状元”,但为免有点可惜了!至此,我不由有几句话要对弟弟说:“不管在什么岗位,千万不要放弃了对单片机技术的热爱,不能放弃了对单片机技术的追求。闲暇的时候,还是要看单片机的书,还是要跟踪学习最新的单片机技术,以不致于落后。”

  记得有人说过“有一技之长足可立于世而不败。”但当今世界,竞争前所未有的激烈,国内许多人没有找到工作,并非说明企业、单位对人才没有需求或者说是人才已经饱和,只是人才还没有达到企业、单位所设定的标准而已。同时,摩尔定律说明了知识更新是非常快的,唯有无止境的学习,活到老,学到老才能适应时代的发展。从这两个方面来说,有一技之长已难以适应当前经济社会发展的需要,而应该有两技之长甚至是多技之长。诚然,弟弟现在的工作很不错,但是谁又能说,未来的时期,弟弟他们这一帮人就不会被迫跳槽?因此,我又想对弟弟说:“任何时候都应该有危机感,都应该自强不息,应该有多技之长,在关键时候能拿的出。建议把单片机作为另一门谋生本领去经营。”

  此时,我不由想到了自己,我懂的叫弟弟去学他热爱的单片机,不至于荒废,同时也是有备无患,而我呢?作为一位国家公务员,倘有一天失业了,我能做些什么呢?我有什么特长谋生呢?更何况到得将来我背负的已经不仅仅是我个人的成败,而是整个家庭的兴衰了啊!想到这里,我不禁生出了许多冷汗!“预则立,不预则废”真的不能再做一天和尚,撞一天钟地过日子了!其实,每个人都应该规划一下自己未来的道路,作一些最坏的打算,采取一些实在的行动,这样才会更加稳健。经过一番思考,我决定从今天开始,重新学习英语。王蒙在《我的人生哲学》中提到他几十岁了依然能把英语学好,我要向他学习,好好学英语,好好把英语学好,权把英语当成另一门实在的谋生本领来下功夫吧!

  在这样一个静悄悄的早上,再次翻读眼前这本已经翻读数次《匠人手记——一个单片机工作者的实践与思考》,我想到了这些。仅此而已。

 

 

                      于千年古邑玉林

                      2008年8月14日

系统分类: 单片机  |  用户分类: 网络酷文转载  |  标签: 匠人手记 书评  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(853) | 回复(2)

发表于 2008/4/22 16:27:00

3

关于投票

IIR滤波器零相位数字滤波及其应用

IIR滤波器零相位数字滤波及其应用
作者姓名: 樊新海 安钢 张传清
所属杂志:《国外电子测量技术》杂志
所属期号: 2005第8期
摘要: 本文介绍了一种利用Delphi7实现数字滤波器零相位滤波的方法,与一般差分滤波方法相比,该方法不仅可以避免相移,而且还能改善起始部分的波形畸变,这一点在信号处理中具有重要的应用价值。
关键词: 虚拟仪器信号处理零相位数字滤波

Zerophase Digital Filter and Application
Fan Xinhai  An Gang  Zhang Chuanqing

Abstract: This paper introduces a method to realize zerophase filtering for digital filters using Delphi7. Comparing with general difference filter, the zerophase digital filter can not only avoid phaseshifting, but also improve the wave aberration of section start. This method has important practical value in signal processing.
Keywords: virtual instrument, signal processing, zerophase digital filtering.

0引言
在动态测试信号处理过程中,滤波器是常用的测试仪器之一。它常被用于抗混滤波,以避免傅立叶变换时在频域产生混叠,或从具有多种频率成分的复杂信号中,将感兴趣的频率成分提取出来,而将不感兴趣的频率成分衰减掉。在传统测试仪器中,滤波器的功能通常需要依靠硬件系统来实现。
随着数字信号处理技术的不断完善,计算机硬件技术的日新月异以及软件技术飞速发展,测试仪器系统的设计思想发生了重大改变。部分传统的专用测试设备会逐步被以计算机和应用软件为核心的虚拟仪器所代替\[1\]。虚拟仪器的出现标志着“软件即仪器(The soft is the instrument)”时代的到来。在计算机辅助测试系统(CAT,Computer Aided Test)中,以往模拟滤波器(AF,Analog Filter)的功能,可用数字滤波器(DF,Digital Filter)来替代。数字滤波器的实现不但比模拟滤波器容易的多,而且还能获得较理想的滤波器性能。

2数字滤波器的时域描述与分类
对于一个线性移不变(LSI,Linear Shift Invariant)离散时间系统,如图1所示,可用如下差分方程表示:y(n)+∑Nk=1a(k)y(n-k)=∑Mr=0b(r)x(n-r)(1)式中a(k),b(r)为方程系数。

图1LSI系统
如果a(k),k=1,2,Λ,N不全为零,该系统为无限冲击响应(IIR)系统。若a(k)均为零,并令b(0)=1,则y(n)=∑Nr=1b(r)x(n-r)+x(n)(2)该系统为有限冲击响应(FIR)系统。
由此,数字滤波器在从实现方法上,有IIR滤波器和FIR滤波器之分。这两类滤波器无论在性能上,还是在设计方法上都有着很大的区别。IIR数字滤波器与FIR滤波器相比,前者保留了模拟滤波器的优点,幅频特性较好,但存在相位失真。后者相频特性较好,可实现线性相位,但在相同指标要求下要比前者的阶数高的多。

3差分数字滤波及其存在的问题
IIR数字滤波器的设计方法主要有双线性Z变换法和冲激响应不变法;FIR数字滤波器的设计方法主要有窗函数法、频率抽样法和切比雪夫逼近法等。有关数字滤波器设计的详细方法见文献\[2\],这里就不再赘述。
对于设计好的滤波器,确定出滤波器的系数,通过对差分方程式(1)或式(2)的叠代算法,可以实现IIR滤波器或FIR滤波器的数字滤波。考虑到程序的通用性,这里就按式(1)编写一个差分滤波函数DiffFilter(b,a,x),调用参数为三个数组,b用于存放滤波器的系数b(r)(r=0,1,…,M);a用于存放滤波器的系数a(k)(k=0,1,…,N),且a(0)=1;x用于存放输入信号,返回后用于存放滤波后的输出信号。如果将调用参数a均赋零值,则可实现FIR滤波器的数字滤波。
在此,用一实例进行说明。图2为某型坦克发动机转速1000rpm时,在排气口测得的噪声信号(采样点数1024,采样频率4KHz)。从信号的波形可以看出,它具有一定的周期性,主要是以发动机周期性排气产生的噪声为主。

图2某型坦克发动机噪声信号
采用窗函数(Hanning窗)法设计出某200阶FIR低通滤波器,截止频率为200Hz,分析频率为2KHz,其幅频曲线及相频曲线如图3所示。

图3低通滤波器的幅频特性和相频特性
利用该FIR低通数字滤波器对图2所示发动机噪声信号进行差分滤波,滤波后的波形如图4所示。

图4差分滤波后的发动机噪声信号
对比图3和图4所示波形可以看出,差分滤波后,信号变得“光滑”了许多,原来的“毛刺”被滤掉了。但同时也可以看出差分滤波方法存在两个问题:一是滤波后的信号相对与原信号而言,发生了相移;二是滤波后的信号在起始部分,波形畸变较为严重。在信号处理中,如果对信号的相位有特殊的要求,相移问题需要引起高度的注意。而起始部分的畸变是由于叠代过程中,没有考虑滤波器的初始条件,刚开始点数少,没能用到滤波器全部系数的缘故。大多情况下,这种畸变可以接受,但当数据较短,而滤波器的阶数又较高时,这种畸变会带来较大的负面影响。
如果输入信号为一单位脉冲信号,即
x(n)=1,n=1
0,n≠1
那么,滤波器的输出为其脉冲响应。本文所用200阶FIR低通数字滤波器的脉冲响应如图5所示。

图5滤波器的脉冲响应3零相位数字滤波算法及其实现
3.1零相位数字滤波的算法
为了克服差分数字滤波中存在的上述两个问题,可以采用一种零相位滤波的方法,该方法的基本思路是:先确定出滤波器的初始条件,然后将原序列的首尾进行扩展,把扩展后序列通过滤波器,将所得结果反转后再次通过滤波器,最后将所得结果再反转,并去掉首尾的扩展部分,即可得到零相位滤波后的输出序列\[3\]。本文采用四次差分滤波方式给出一种便于实现的详细算法,假设输入信号为x(n),n=0,1,…,P。
(1) 编写差分滤波函数DiffFilter(b,a,x),调用参数如前所述。
(2) 对于IIR滤波器通常有M=N,求滤波器的初始条件e(q),q=0,1,…,N-1,这里记E=[e(0),e(1),…,e(N-1)]T,则有
E=1+a(1)1-1…0
a(2)01…0
MMMOM
a(N)00…-11× b(1)-b(0)a(0)
b(2)-b(0)a(1)
M
b(Nn)-b(0)a(N)(3)
(3) 对原输入序列x(n)的首尾进行扩展,在x(n)的前面添加3N个数,在后面添加3N个数,扩展后的序列记为x′(n),n=0,1,…,P+6N。
x′(n)=2x(0)-x(3N-n)
x(n-3N)
2x(P)-x(P-1-(n-P-3N-n))
n<3N
3Nn<P+3N
P+3NnP+6N(4)
(4) 进行正向滤波:先用b,a和x′(n)调用DiffFilter(b,a,x)函数,计算x′(n)通过
H(z)=∑Mm=0b(m)z-m/(1+∑Mm=1a(m)z-m)(5)
的输出y′(n),然后生成一长度为P+6N+1的单位脉冲信号h(n),用z,a和h(n)调用DiffFilter(b,a,x)函数,计算h(n)通过
H(z)=∑M-1m=0y′(0)e(m)z-m/(1+∑Mm=1a(m)z-m)(6)
的输出y′(n),并记y(n)=y′(n)+y″(n)。
(5) 进行反向滤波:将正向滤波结果反转,记x′(n)=y(P+6N-n),重复步骤4°,得到反向滤波后的结果。
(6) 将反向滤波的结果反转,并删除首尾的扩展部分,即可得到最后的滤波结果。
3.2零相位数字滤波的实现
Borland公司推出的Delphi编程语言,具有合理的单元化结构、优化的编译环境,开发速度快、编程效率高。在实现同样功能的情况下与其它语言相比,不仅编写的代码量少、程序可移植性强,而且还有许多优秀的组件包可供使用。最为方便的是可以使用动态数组,随时能够改变数组的长度,这一点非常适合数字信号处理。
作者利用Delphi7编写了利用双线性Z变换法设计Butterworth型IIR滤波器和利用窗函数法设计FIR滤波器,以及差分数字滤波算法和零相位数字滤波算法应用程序,并作为集成测试软件平台的一个虚拟仪器。其中零相位数字滤波算法程序设计流程如图6所示。

图6零相位数字滤波算法的流程图
图7所示为图2所示信号零相位数字滤波后的波形,通过与原信号(图2)和差分滤波后的信号(图4)对比不难看出:零相位数字滤波后的输出与原信号中的相位基本一致,并且起始部分没有畸变。但不可否认,零相位数字滤波算法相对于普通差分滤波算法计算量要大许多,但以目前计算机的运算能力,计算量稍大并不是什么主要问题。

                                     图7零相位滤波后的波形

4结束语
本文介绍了一种利用四次差分滤波算法,实现零相位数字滤波的方法,并利用Delphi7编写了应用软件。通过与普通差分滤波器的实例对比分析,说明零相位数字滤波不仅能够避免相移,而且还能改善差分滤波起始部分的波形畸变。这一点在数字信号处理中具有重要的应用价值。
参考文献
\[1\] 程 虎. 虚拟仪器的现状和发展趋势.现代科学仪器,1999(4):6~9
\[2\] 胡广书编.数字信号处理—理论、算法与实现.清华大学出版社,1997
\[3\] 纪跃波,秦树人,汤宝平.零相位数字滤波器.重庆大学学报,2000.23(6):4

系统分类: 单片机  |  用户分类: 网络酷文转载  |  标签: 无标签  |  来源: 无分类  | 

点击查看原文

发表评论 阅读全文(1270) | 回复(1)

发表于 2008/4/22 16:25:00

3

关于投票

FIR 滤波器FAQ

Part 1: Basics

1.1 什么是FIR滤波器?

  FIR 滤波器是在数字信号处理(DSP)中经常使用的两种基本的滤波器之一,另一个为IIR滤波器.

1.2 FIR代表什么?

  FIR是有限冲激响应(Finite Impulse Response)的简称.

1.3 FIR(有限冲激响应)中的有限该如何理解?

  冲激响应是有限的意味着在滤波器中没有发反馈.

1.4 FIR 怎么发音?

  有些人直接读字母音 F-I-R; 也有人发做fir的音[:], fir是冷杉树.

1.5 FIR 滤波器外有什么其他选择?

  DSP滤波器还有一类: IIR(无限冲激响应,Infinite Impulse Response).IIR滤波器使用反馈,因此当信号输入后,输出是根据算法循环的.

1.6 FIR滤波器与IIR滤波器比较?

   每一种都有优缺点.但总得来说, FIR滤波器的优点远大于缺点,因此在实际运用中,FIR滤波器比IIR滤波器使用的比较多.

1.6.1 相对于IIR滤波器, FIR滤波器有什么优点?

  相较于IIR滤波器, FIR滤波器有以下的优点:

  * 可以很容易地设计线性相位的滤波器. 线性相位滤波器延时输入信号,却并不扭曲其相位.

  * 实现简单. 在大多数DSP处理器, 只需要对一个指令积习循环就可以完成FIR计算.

  * 适合于多采样率转换,它包括抽取(降低采样率), 插值(增加采样率)操作. 无论是抽取或者插值, 运用FIR滤波器可以省去一些计算, 提高计算效率. 相反,如果使用IIR滤波器,每个输出都要逐一计算,不能省略,即使输出要丢弃.

  * 具有理想的数字特性. 在实际中,所有的DSP滤波器必须用有限精度(有限bit数目)实现,而在IIR滤波器中使用有限精度会产生很大的问题,由于采用的是反馈电路,因此IIR通常用非常少的bit实现,设计者就能解决更少的与非理想算术有关的问题。

  * 可以用小数实现. 不像IIR滤波器,FIR滤波器通常可能用小于1的系数来实现。(如果需要,FIR滤波器的总的增益可以在输出调整)。当使用定点DSP的时候,这也是一个考虑因素,它能使得实现更加地简单。

1.6.2 相较于IIR滤波器, FIR滤波器的缺点是什么?

  相比较于IIR滤波器, 有时FIR滤波器为了得到一个给定的滤波响应特性,需要花费更多的存储器或者计算. 当然,用FIR滤波器去实现某些响应也是不实际的.

1.7 在描述FIR滤波器的时候,都要提到什么术语?

  * 冲激响应 - FIR滤波器的冲激响应实际上是FIR的系数.

  * 抽头(Tap) - FIR的抽头是系数或者延时对.FIR抽头的个数(通常用N来表示)意味着:1)实现滤波器所需要的存储空间, 2) 需要计算的数目, 3) 滤波器能滤掉的数量, 实际上,越多的抽头意味着有更多的阻带衰减, 更少的波纹,更窄的滤波等等.

  * 乘累加 (MAC) - 在FIR方面考虑,MAC是指把延时的数据采样与相应的系数相乘,然后累加结果。通常,FIR每一个抽头都需要一个MAC。大多数DSP微处理器实现MAC操作都是单指令周期。

  * 跃迁带(Transition Band) -在通带和阻带边沿之间的频带。跃迁带越窄,需要更多的抽头去实现滤波器。也有说,小的跃迁带就是一个sharp滤波器。

  * 延时线- 一组存储器单元,实现在FIR计算中的Z^-1延时。

  * 环形缓存 - 一个特殊的缓存,是首尾相连的。通常由DSP微处理器实现。


Part 2: Properties

2.1 线性相位

2.1.1 FIR滤波器和线性相位之间有什么关系?

  大多数的FIR滤波器是线性相位滤波器. 当需要设计线性相位滤波器时, 通常使用FIR滤波器.

2.1.2 什么是线性相位滤波器?

  线性相位是指滤波器的相位响应是频率的线性函数(在+/-180度)。因此滤波器的延时后,所有的频率相位相同。因而滤波器不会产生相位和延迟扭曲。在某些领域,比如数字解调器,没有相位或者延迟扭曲是FIR滤波器相对于其他IIR和模拟滤波器的一个关键优点

2.1.3 线性滤波器的条件是什么?

  FIR滤波器经常被设计成为线性相位的,当然不是必须要这么做。如果滤波器的系数是关于中心系数对称的,也就是说第一个系数和最后一个系数相同,第二个系数和倒数第二个相同,那么FIR滤波器就是线性的。有奇数个系数的FIR滤波器,中心单独的系数没有对应的。

2.1.4 什么是线性相位FIR滤波器的延时?

  非常简单的公式: 给定FIR滤波器有N个抽头,那么延时是(N - 1) / (2 * Fs), 这里Fs是采样频率. 比如, 21抽头的线性相位滤波器运行在1kHz, 那么延时就是(21 - 1) / (2 * 1 kHz)=10 微秒.

2.1.4 除了线性相位,还可以选择什么?

  当然是非线性的了。实际上,最流行的选择是最小相位滤波器。小相位滤波器,也叫最小延时滤波器,比线性相位滤波器具有更少的延时,当两者的幅度响应相同时以非线性相位特性。低通滤波器在它的冲击响应中心有最大的系数。而最小相位滤波器的最大系数在开始部分。

2.2 频率响应

2.2.1 什么是FIR滤波器的Z变换r?

  对于N抽头的滤波器, 系数为h(k), 那么输出由:        

  y(n)=h(0)x(n) + h(1)x(n-1) + h(2)x(n-2) + ... h(N-1)x(n-N-1),

滤波器的z变换就是:       

  H(z)=h(0)z-0 + h(1)z-1 + h(2)z-2 + ... h(N-1)z-(N-1) , or

        http://blog

2.2.2 FIR滤波器的频率响应公式是什么?

  H(z)中的变量z为连续的复数变量,可以描述为 z="r"·ejw,这里r是幅度,w是z的角度。如果令r=1,H(z)就变成了滤波器频率响应H(jw)。这也就意味着替代z为ejw,得到了滤波器频率响应H(w)。       

  H(jw)=h(0)e-j0w + h(1)e-j1w + h(2)e-j2w + ... h(N-1)e-j(N-1)w , or

使用欧拉公式, e-ja=cos(a) - jsin(a), 我们可以把H(jw)写成矩形表示:      

  H(jw)=h(0)[cos(0w) - jsin(0w)] + h(1)[cos(1w) - jsin(1w)] + ... h(N-1)[cos((N-1)w) - jsin((N-1)w)] , or

   http://blog

2.2.3 能用离散傅立叶变换(DFT)来计算FIR的频率响应么?

  可以。对于N抽头的FIR,可以得到N  evenly-spaced points of the frequency response by doing a DFT on the filter coefficients.但是,为了得到任意频率的频率响应,需要使用上边的公式。

2.2.4 FIR滤波器的DC增益指的是什么?

  DC(0 Hz)输入信号包含每个采样都为1.0。通过延时线后,输出是所有系数的和。因而,在DC处滤波器的增益就是所有系数之和。  

  可以通过上边的公式进行验证。问我们设w为0, cos项就一直为1,而sin项则一直为0。因此频率响应就变成了:

       http://blog

2.2.5 如何调整FIR滤波器的增益?

  简单地在系数上乘上因子.

2.3 数字性质

2.3.1 FIR滤波器是固有稳定的?

  是的,因为没有反馈,任何有限的输入产生有限的输出。

2.3.2 什么使FIR滤波器的数字性质变好?

  缺少反馈是关键。在计算机中实现FIR滤波器时,每个计算都产生数字错误。由于FIR滤波器没有反馈,因此不能够记住以前的错误。相反,IIR滤波器的反馈可能导致错误的积累。这个实际的影响就是,可以用更少的bit去实现与IIR滤波器相同精度的滤波器。比如,FIR滤波器通常用16位来实现的话,IIR滤波器就通常需要32位,或者更多。

2.4 为什么通常在多采样率系统中采用FIR滤波器而不采用IIR滤波器?

  因为只有一小部分的计算需要用减采样或者插值滤波器来实现。

  由于FIR滤波器不使用反馈,因而只有那些实际需要使用的输出才需要计算。比如,在减采样的时候(N个输出中只有一个有效),那么其他的N-1输出就不会进行计算。类似的,对于插值滤波器(在采样点中插入0来提高采样率),你不必实际地用FIR滤波器乘以系数,求和得到,你只需要忽略和这些值有关的乘加(因为它们不会改变结果)。

  相反,因为IIR滤波器使用反馈,每个输入都必须使用,每个输入必须计算,因为所有的输入和输出对滤波器的反馈都有影响。

2.5 有哪些特殊的FIR滤波器?

  Aside from "regular" and "extra crispy" there are:

  *  矩形 -矩形 FIR 滤波器是每个系数都是1.0的简单的滤波器。因而对于N个抽头的矩形滤波器,它的输出仅仅是过去N个采样之和。由于矩形FIR只能实现加法,因此当乘法器实现比较昂贵时,在硬件实现中会考虑。         

  * 希尔伯特变换(Hilbert Transformer) - 希尔伯特变换是把信号相移90度。它们经常被用在给定实数部分,产生虚数部分。  

   * 差分(Differentiator) -差分器的幅度响应是频率的线性函数。现在已经不流行了,但是以前曾经在FM解调器上使用过。 

  *  Lth-Band - 也叫做“Nyquist"滤波器,这些滤波器是在多速率应用中特殊的一类滤波器。主要的卖点是,每L个系数有一个为0,那么就将减少乘累加操作的实现(著名的半带滤波器就是这一种)。 

   * Raised-Cosine - 这是一种特殊类型的滤波器,有时会用在数字数据应用方面。(通带上的频率响应是被上移一个常数的cos形状)。


Part 3: Design

3.1 有哪些设计FIR滤波器的方法?

三种最流行的设计方法:

  • Parks-McClellan: Parks-McClellan 方法( MATLAB里用Remez)是设计FIR滤波器中可能是使用最光的.method (inaccurately called "Remez" by Matlab) is probably the most widely used FIR filter design method. It is an iteration algorithm that accepts filter specifications in terms of passband and stopband frequencies, passband ripple, and stopband attenuation. The fact that you can directly specify all the important filter parameters is what makes this method so popular. The PM method can design not only FIR  "filters" but also FIR "differentiators" and FIR "Hilbert transformers".
  •  Windowing:. In the windowing method, an initial impulse response is derived by taking the Inverse Discrete Fourier Transform (IDFT) of the desired frequency response. Then, the impulse response is refined by applying a data window to it.
  •  Direct Calculation: The impulse responses of certain types of FIR filters (e.g. Raised Cosine and Windowed Sinc) can be calculated directly from formulas.

3.2 如何实际地设计FIR滤波器?

  当然是用FIR设计程序呀. 虽然可以使用手工亲自的方法进行设计滤波器,但是使用FIR滤波器程序比较简单.


Part 4: Implementation

4.1 实现FIR滤波器基本的方法是什么?

  FIR滤波器的结构上包含两个东西:一个是采样点延迟线,一个是系数. 可以由以下方法实现FIR滤波器:

  1. 把输入的采样点放入到延迟线中.

  2. 把延迟线中的数与相应的系数相乘并累加.

  3. 移位, 使下一个输入采样能进入延迟线.

4.2 用C语言如何实现FIR滤波器?

  为了展示众多的方法和技巧,这里提供用C语言实现的FIR滤波器算法。

http://blog fir_algs_1-0.c C 源码

http://blog fir_algs_1-0.zip C 源码( MS Visual C++ 6.0 工程文件)


包括以下功能模块:

  1. fir_basic: 实现基本的FIR滤波器

  2. fir_circular: 说明环行buffer是如何实现FIR的。

  3. fir_shuffle: 一些TI的处理器上使用的shuffle down技巧

  4. fir_split: 把FIR滤波器展开为两块,避免使用环行缓存。

  5. fir_double_z: 使用双精度的延迟线,使可以使用一个flat buffer。

  6. fir_double_h: 使用双精度的系数,使可以使用一个flat buffer。

4.3 用汇编如何实现FIR滤波器?

  FIR滤波器的汇编算法是跟处理器对应的,但是大多数普通的系统会使用一个DSP处理器提供的环行缓存。

  1. 配置环行缓存。加载系数和延迟线指针。然后对每个采样点执行以下操作:

  2. Store the incoming data in the delay line; increment the delay-line pointer.Digital

  3. Clear the multiplier-accumulator.

  4. Loop over all coefficients/delays; accumulate the values obtained by multiplying the coefficients by the delayed samples.

  5. Round or truncate the result as the FIR output.   

  Alternatively, a "shuffle down" method is used in Texas Instruments' older fixed-point processors to implement circular buffers. The processor literally moves each sample delay values by one slot during each multiply-accumulate (via the "MACD" instruction).    

  Each DSP microprocessor manufacturer provides example FIR assembly code in its data books or its application handbooks, so be sure to look at those before you "reinvent the circular buffer".

4.4 如何测试以及实现的FIR滤波器? 

  Here are a few methods:

  •  Impulse Test: A very simple and effective test is to put an impulse into it (which is just a "1" sample followed by at lest N - 1 zeroes.) You can also put in an "impulse train", with the "1" samples spaced at least N samples apart. If all the coefficients of the filter come out in the proper order, there is a good chance your filter is working correctly. (You might want to test with non-linear phase coefficients so you can see the order they come out.) We recommend you do this test whenever you write a new FIR filter routine.
  •  Step Test: Input N or more "1" samples. The output after N samples, should be the sum (DC gain) of the FIR filter.
  •  Sine Test: Input a sine wave at one or more frequencies and see if the output sine has the expected amplitude.
  •  Swept FM Test: From Eric Jacobsen: "My favorite test after an impulse train is to take two identical instances of the filter under test, use them as I and Q filters and put a complex FM linear sweep through them from DC to Fs/2. You can do an FFT on the result and see the complete frequency response of the filter, make sure the phase is nice and continuous everywhere, and match the response to what you'd expect from the coefficient set, the precision, etc."

4.5 在实现FIR滤波器的过程中有什么有用的技巧?   

  FIR tricks center on two things 1) not calculating things that don't need to be calculated, and 2) "faking" circular buffers in software.

4.5.1 如何跳过不必要的计算?   

  First, if your filter has zero-valued coefficients, you don't actually have to calculate those taps; you can leave them out. A common case of this is "half-band" filter, which have the property that every-other coefficient is zero.   

  Second, if your filter is "symmetric" (linear phase), you can "pre-add" the samples which will be multiplied by the same coefficient value, prior to doing the multiply. Since this technique essentially trades an add for a multiply, it isn't really useful in DSP microprocessors which can do a multiply in a single instruction cycle. However, it is useful in ASIC implementations (in which addition is usually much less expensive than multiplication); also, some newer DSP processors now offer special hardware and instructions to make use of this trick.

4.5.2 How do I fake circular buffers in software?   

  When hardware support for circular buffers isn't available, you have to "fake" them. Also, since ANSI C has no construct to describe circular buffers, most C compilers can't generate code to use them, even if the target processor has them.   

  You can always implement a circular buffer by duplicating the logic of a circular buffer in software (and many have), but the overhead can be prohibitive; the circular-fake might take several instructions to implement, compared to just a single instruction to do the multiply-accumulate operation. Therefore you need to fake it.   

  Here are several basic techniques to fake circular buffers:      

  1. Split the calculation: You can split any FIR calculation into its "pre-wrap" and "post-wrap" parts. By splitting the calculation into these two parts, you essentially can do the circular logic only once, rather than once per tap. (See fir_double_z in FirAlgs.c above.)      

  2. Duplicate the delay line: For a FIR with N taps, use a delay line of size 2N. Copy each sample to its proper location, as well as at location-plus-N. Therefore, the FIR calculation's MAC loop can be done on a flat buffer of N points, starting anywhere within the first set of N points. The second set of N delayed samples provides the "wrap around" comparable to a true circular buffer. (See fir_double_z in FirAlgs.c above.)      

  3. Duplicate the coefficients: This is similar to the above, except that the duplication occurs in terms of the coefficients, not the delay line. Compared to the previous method, this has a calculation advantage of not having to store each incoming sample twice, and it also has a memory advantage when the same coefficient set will be used on multiple delay lines. (See fir_double_h in FirAlgs.c above.)      

  4. Use block processing: In block processing, you use a delay line which is a multiple of the number of taps. You therefore only have to move the data once per block to implement the delay-line mechanism. When the block size becomes "large", the overhead of a moving the delay line once per block becomes negligible.

系统分类: 单片机  |  用户分类: 网络酷文转载  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(1476) | 回复(0)

发表于 2008/4/22 10:15:00

3

关于投票

PIC单片机引脚中断程序的设计技巧

1 简 述
    所有的中档系列PIC单片机,PORTB端口最高的4个引脚(RB7~RB4)在设为输入模式时,当输入电平由高到低或由低到高发生变化时,可以让单片机产生中断。这就是通常所说的引脚状态变化中断。

    在设计引脚中断程序时,有三个需要特别注意的地方。一是,在清除P0RTB中断标志位RBIF之前,必须安排一条必不可少的,以PORTB端口数据寄存器PORTB为源寄存器的读操作指令。放置这一指令的目的有时并不只是为了读取有用的数据,而是为了取消状态变化的硬件信号,以便顺利清除RBIF标志位,为下一次中断做好准备。二是,由于端口PORTB是引脚电子变化中断,即无论引脚出现上升沿还是下降沿都会产生中断请求,所以必须处理好不需要的虚假中断。三是,一般都利用PIC单片机的引脚功能来检测按键,所以必须处理好按键消抖的问題。

2 引脚中断程序设计
    在主程序里先设置有关的寄存器。
    ◇设置TRISB寄存器,使RB7~RB4相关的引脚处于输入状态;
    ◇如果需要弱上拉,通过OPTION_REG的第7位设置;
    ◇RBIF=O;
    ◇RBIE=1;
    ◇GIF=1。

    响应状态变化后的中断服务程序。
    ◇检查RBIF是否为l,为l则是引脚变化引起的中断;
    ◇调用延时程序,延时20~30 ms,目的是为了按键去抖;
    ◇判断是引脚出现上升沿还是下降沿引起的中断;
    ◇调用按键处理程序;
    ◇读PORTB口的值,取消状态变化的硬件信号;
    ◇清除RBIF标志。

    笔者认为上面程序设计最大的问题是在中断程序里调用延时程序。大家知道,中档PIC单片机只有8层深度的硬件堆栈,在中断里调用于程序出现极易堆栈溢出的情况。另外,PIC单片机中断程序人口只有一个,在响应中断的请求时,PIC单片机就会自动把全局中断的使能位(INTCON的第7位GIF)清除,这样其他中断就暂时不能被响应(此时,如果别的中断发出的中断请求,标志位将一直保留着),直到这个中断程序退出后才会得到响应。这就要求我们设计中断程序的时候必须尽量短,避免调用子程序,更不要在中断里进行复杂的运算。

    下面给出笔者设计程序时的思路。

    当引脚状态变化引起中断时,在中断子程序里首先判断引起中断的原因是不是我们需要的变化引起的中断。如果是,不要在这里延时,而是设置一个标志位,接着清除中断标志,退出中断。中断程序如下:
else if((RBIE&RBlF)==1){ //如果引脚变化引起中断
    if(RB4==0){ //RB4上的按钮接地
    key="1"; //按键标志位置位
    }
    RBIF="0"; //清除引脚中断标志位
    }

    其中,if(RB4==0)语句相当于读取了PORTB端口数据寄存器,取消了状态变化的硬件信号。

    下面详细介绍怎么样进行按键去抖。

    首先,在定时器中断里设置一个lms的时间基准标志位“SYSlms”,每到lms,“SYSlms”便置位。程序如下:
    unsigned char count;
    if((ToIE&TOIF)==1){ //定时器中断
    TMRO+=0x09; //每250μs中断一次
    if(count==4){
    count="0";
    SYSlms="l"; //系统时间标志
    couot++;
    }    

    T0IF=0; //清除时钟中断标志位
    }

    有了这个时间基准,便可以在主程序里进行按键去抖处理了。为了更好地利用这个时间基准,定义一个消息标志SYSTime,笔者把它称作时间消息。为了让这个消息有自我发布和自我消失的功能.定义了如下一个宏:
    bit SYSTime;
    #defincTimeEnahle()SYSTime=0,if(SYSlms){SYSTime=l;SYSlms=0;)

    可以把TimeEnable()放到主程序死循环的任何地方,每当程序执行这个宏,SYSTime就会清零,这就是标志位的自我消失.如果在定时器时间基准标志位SYSlms已经置位的话,SYSTime就会置1,这样别的程序就可以利用这个时间消息了,这就是消息的自我发布。下面就是利用这个时间消息来进行按键延时去抖的,首先看一下按键扫描子程序;
    void seaakey(){
    unsigned char KeyTime,KeyTask;//定义任务时间参数、
    //任务参数
    switch(KeyTask){
    case0:if(key){
    KeyTime="30"; //准备延时30 ms
    KeyTask++; //准备好下一个任务
    kcy="0";
    }
    break;
    case I:KeyTime--; //延时30 ms
    if(KeyTime==0)Key+ask++;
    break;
    case2;if(RB4==o){
    //调按键处理程序
    KeyTask="0";
    }
    else KeyTask="0";//退出任务
    break;
    }
}

    在主程序的死循环中这样用:
    while(1){
    TimeEnable();
    If(SYSTime==1){scankey();)
    //在此可以添加其他程序

    只有有时问消息的时候才执行按键扫描程序。可以看到,进入扫描程序执行第一次的时候,程序首先判断按键标志位有没有置位,置位的话(也就是有按键按下的话),任务时间参数(KeyTime)赋值为30,这是延时30ms,去抖,当然你也可以设置为其他的时间值;同时任务参数 (KeyTask)加1。1ms后,再进入扫描程序,这个时候扫描程序执行casel的语句,这样30次后(延时了30ms),任务参数(KeyTask)加1,值为2。lms后,再进入扫描程序,将执行case 2的语句,首先在这里再次判断是不是按键还在按下,如果是就调按键的处理程序,如果不是。就退出按键扫描程序。在这里,还可以加入按键是否抬起的判断程序。

    这样设计的引脚变化程序,CPU开销小,效率高,不会出现堆浅溢出的问题,提高了系统的实时性。

系统分类: 单片机  |  用户分类: 网络酷文转载  |  标签: pic  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(756) | 回复(0)

发表于 2008/4/22 10:14:00

3

关于投票

PIC中档单片机的中断总结

与51或者其他系列的单片机相比,PIC单片机的中断机制有其特殊之处,针对我们一些初学者存在的一些问题和疑惑,我在此做一个个人总结,不当的地方,请站友们指正。sO100
     先摘引三个对PIC中断理解的回帖,然后我再对中断活动的过程、应该注意的事项、及一个疑惑进行较详细的总结和解释。
     ---------------
     johnfrank:关于pic中断有些不明白的地方
     借用大虾的程序;
     ;********************中断服务代码
     btfssINTCON,T0IE;判断是否为T0中断
     gotoother_int
     btfssINTCON,T0IF;it’sthetimeofT0int
     gotoother_int
     bcfINTCON,T0IF;是T0中断,清除中断标志
     movlw0x10;微秒的高位字节加上定时时间256x16分频=4096=0x1000的高位(0x10)
     addwfus+1
     gotoend_int
     other_int;可添加其他中断服务代码
     nop;otherisrcodecanbeadded
     ;**********************************
     end_int;恢复现场
     =================
     假如又有新的中断正好在这段程序中间产生
     btfssINTCON,T0IF
     gotoother_int
     bcfINTCON,T0IF
     程序岂不是要出错跑飞了
     johnfrank:
     谢谢你的关注。
     我讲一下自己的理解,权做回答,不当之处,还请站友们指点。
     pic中档单片机系列没有“硬件中断优先级别”(请允许我这样说),含义是指:当内核正在处理当前的中断服务A时,在这个期间里,其他任何中断的产生,只能使其标志位xxIF置1,不能剥夺当前中断服务对CPU的占用权(反应在PC指针不能被新的中断改变指向),必须等到当前中断服务处理A完毕,然后,根据gotoother_int语句的转向,依次判断。若新发生的中断处理代码在中断服务A之后(前、后指代码在ROM中地址顺序,越大越后),则进行新发生的中断处理;若恰好新发生的中断服务代码在刚被处理完毕的中断服务A代码之前,则将不予理会,(即程序指针PC不会在中断处理代码空间中又返回到0004H的入口),等到执行到retfie后返回主程序,然后再次进入中断入口0004H...
     之所以说其无“硬件中断优先级别”是与“软件中断优先级别”对应的,通过中断服务代码对中断标志和IE的检测的先后,可设立优先级。
     当然,准确地说,这是一种顺序,而非级别,呵呵。
     如果了解一下51的中断系统,相信你能更好地理解PIC的中断的级别:
     将会出现你说的情况,当优先级更高的中断来临时,内核将暂时停止当前中断服务,保存当前中断服务的现场,执行优先级更高的中断服务,处理完成后,恢复现场,执行未处理完成的中断服务....,最后,返回主程序。
     小弟讲得有点烦琐,并不形象,可能还有纰漏和谬误之处,请大家指正,相信johnfrank在仔细看书之后,应该可以形成自己的正确看法。
     zdtdl:小弟说两句~~
     简单地说,当系统响应一个中断时,GIE位将被自动清零以禁止其他的中断,在执行中断返回指令RETFIE后系统再自动置GIE位1开放中断。只要不在中断程序中对GIE置1,就不会产生反复进入中断的现象,靠查询方式决定响应谁。PIC也有中断嵌套,可以形成多级嵌套,甚至自身嵌套,不过嵌套的级数绝对不能超过硬件堆栈的深度。
     -------------------------
     PIC中档单片机的中断总结正文
     一、中断活动的过程
     对于PIC单片机来说,一次中断的过程大致有下列阶段:
     为了使得说明形象和直观,本文采用一些诙谐的语句来比喻说明:
     中断请求---------比喻成申请买经济适用房的请求
     中断标志-------一份申请书
     本中断使能xxIE-----本单位领导
     PEIE-------------户口办公室主任
     GIE--------------银行的管理信贷的科长
     1.中断请求:房子太少,儿子要结婚了,得买房了,可资源和财力有限,不能卖商品房,只好按特殊情况处理,写一份申请书(中断标志位IF置1);
     2.本单位领导xxIE看了之后,如果给你盖了一个戳:(即该中断使能位IE=1),那么恭喜你,这份申请书可以提交到更高一级的部门;如果没盖(xxIE=0),那么对不起,先放我这里吧,等我们研究研究好后再说。如果你不开心,要拿回申请书撕掉,呵呵,那么IF=0;你的购房请求之梦破灭;
     3.xxIE领导将根据户口,将这些请求书给分类,一类是外地迁来的户口,提交给户口办公室PEIE主任审查,PEIE主任如果给你盖了个戳(PEIE=1),那么,他将会把申请书提交给银行的GIE科长批准,否则就是放在这里再研究研究或者你要回来撕毁;一类是本地户口,可直接提交给银行的GIE科长批准,然后你将申请书带到GIE科长的办公室。
     4. GIE科长盖了章之后(GIE=1),然后,你就可以拿着申请书去找房地产商要房子了(此时PC指针=0004H),因为GIE科长有很多事情要做,所以他每盖了一次戳之后(注意是一次不是一个,因为也许有多个中断同时发生,也就是说有其他地方的人来请GIE盖戳),就在办公室门外挂了个牌子:请勿打扰。他自己则休息去了,直到接到RETFIE的电话或者有人打他的手机。

  5. 房地产商准备给房子了,不过你最好得先把各项手续给填好,叫5w押金,另外协议阿,合同阿,都得自己搞定,这叫“保护现场”。

  6. 房地产商开始上班了,于是挨个查“申请书”是谁提交的,以便给你安排你预定的房子。这个叫“中断查询”。

  7. 查到是你的后,然后打电话让你过来,带你去看房子,把钥匙给你。这个交“中断处理”。

  8. 钥匙交给你之后,房子你是到手了,不过这份申请书就失效了,房地产商将该申请书销毁。这个叫“清除中断标志”。

  9. 好啦,现在你可以去房地产商自己去要回以前交的押金,身份证啊等等。这个叫“恢复现场”。

  10. 最后,房地产商办完了,让RETFIE小姐打个电话给GIE科长(执行RETFIE指令),GIE科长才起来,把“请勿打扰”的牌子取下,让其他的带着申请书的人进来。当然,如果你的事情还没搞定,GIE科长的关系户打了他的手机(你在办事时-处理中断时,若有GIE被置1),他也会开门取下“请勿打扰”的牌子,让关系户进来,给他盖好章。这下就对不起了,人家有关系,所以你的事情要马上停下来,先等关系户办完他的事情之后,再给你办你的事情。这个叫“中断嵌套”,要注意GIE科长有8个关系户(硬件堆栈的深度为8级)哦。


二、需要注意的问题:


1. 中断现场的保护(可以参考以前的帖子,在xieyubing版主的指点下,有恰当的例子);

2. 初次上电复位、电源跌落复位和其他情况下的复位,均使得全局中断位GIE和其他中断使能位xxIE=0;

3. 中断标志位的状态与该中断源是否被屏蔽无关,与全局中断使能位GIE也无关。
4. 当开放某一中断源时,该中断源就是通过中断标志向CPU申请中断的,无论什么原因,只要标志位IF置1(可以用软件强行置1),均会产生中断请求。

5. 当中断标志位为1,如果该中断被屏蔽或者被禁止了,只要不清除标志位,那么该中断请求会被潜伏下来,一旦屏蔽解除,立即产生中断响应。反之,如果在屏蔽/禁止条件解除之前清除了该标志位,那么则无中断请求。

6. 当CPU响应任一中断时,全局中断使能位GIE会自动清零;当中断返回时,它有自动置1。如果在中断处理期间,用软件将已经清零的GIE位又重新置位,这个时候若再出现中断请求,就可以形成了中断嵌套。即:在处理某一中断期间又响应了其他中断请求,就形成了中断嵌套,此时,前一中断处理过程会被暂停而进入新的中断处理,当新中断处理完毕后,才会继续处理前一个被搁置的中断。此方式可以形成多级嵌套,但不能超过硬件堆栈的深度8级,以免造成堆栈溢出而不能正常返回。

7. 如果同时发生多个中断请求,则中断处理的顺序取决于中断程序中的检查中断源的顺序。

8. 若要防止中断请求被丢失:则要注意下面两种情况:如果同一中断源的中断发生间隔时间大于该中断服务的处理时间,则可能出现中断事件被忽略(体现在中断服务的过程中,标志位被连续发生来两次置位),例如:中断事件发生的时间间隔为30ms,中断服务处理加上跳转判断的时间为50ms,则情况将会如下所示:

   [中断次数----------1][中断次数----------2][中断次数----------3][中断次数----------4]
   [处理次数------------------------1][处理次数------------------------2][处理次数------------------------4]
如果在中断处理一开始就清除IF,那么如上图所示,中断事件3、4 在处理次数2的过程中发生来两次,那么即使IF清除发生在中断次数3发生之前,也将丢失第三次中断。


另外,即使中断出现的时间间隔大于中断服务的时间间隔,如果清除中断标志位的指令安排在中断服务子程序的尾部,就有可能造成丢失该中断请求(即两次中断标志置位的事件只对应一条清除指令和一次中断处理。

9. 在进行查表操作时必须禁止CPU响应中断,以避免中断返回时跳转到不希望的地址上去。

三、一个疑惑


一个疑问:一些书上提到:如果对寄存器INTCON进行“读-改-写”操作的时候,要事先将GIE清0,再对INTCON进行操作,然后将GIE恢复为1
即BCF INTCON,GIE
  BSF INTCON,XX
  BSF INTCON,GIE
所提到的理由是:当CPU正在执行一条对INTCON寄存器进行“读-改-写”操作的指令时,如果恰好发生了中断请求,则中断服务程序会被执行两次。这是因为当中断请求发生后INTCON寄存器的GIE寄存器会被硬件自动清零(屏蔽所有中断),并且程序转入中断例程入口(0004h)。当GIE被清零后,这时如果CPU正在执行一条对INTCON“读-改-写”的指令时,则GIE位还会被写会操作重新置1,这样就会造成CPU两次进入中断服务程序。


该段解释晦涩难懂,根据中断发生过程的时序(PICmicro中档单片机系列参考手册的第8-2页):在第n个指令周期里,CPU检测到IF标志位为1,则在n+1个周期内将自动使得GIE=0,该周期内既不取指也不执行指令,然后在n+2个指令周期里,0004h指针装入PC指针,该周期也不运行其他指令,只完成0004H->(PC)的取指过程,第n+3个指令周期里,CPU执行0004h地址的指令码,并同时取0005h的指令码。

显然,作者提到的“当GIE被清零后,这时如果CPU正在执行一条对INTCON“读-改-写”的指令时,则GIE位还会被写会操作重新置1,这样就会造成CPU两次进入中断服务程序。”的解释存在下面的问题:GIE被硬件自动清零时的那个周期,是一个空运行周期,CPU并不执行指令,下一个周期也是空运行周期,不过是完成将0004h地址中的代码取指操作。然后就开始了0004h地址的代码的执行操作和0005h地址代码的取指过程。那么GIE在被硬件自动清零后要想置会1,只有两种方法:RETFIE指令使GIE自动置1;通过软件指令对GIE人为置1。显然,如果对GIE人为置1的指令执行在对该标志位清零前,那么会出现前文所述的中断嵌套(设该中断为A),如果没有其他中断发生且执行顺序先于中断A且对中断A的标志清零的话,那么中断A的嵌套是一个死循环。就不是执行两次的问题了----因为同一个中断嵌套时,GIE在自动清零被软件置一永远都发生在清除IF之前,那么IF一直得不到清除,而GIE又几乎一直都是1。


作者所说的情况似乎是这样的:读改写INTCON指令按如下过程分解:读INTCON的时候,GIE先是为1的,此时发生了中断,GIE被硬件清零,开始执行中断服务程序,然后再IF标志没有清除之前,执行INTCON的其他位的修改和写回操作,也将中断发生前的GIE读为1的信息写回GIE,这样,CPU被迫发生了第二次中断。显然,这样是将BSF  INTCON, XX指令分解得支离破碎---本来一个指令周期可以完成的指令被跨了多个指令周期;而且一个指令周期的指令被CPU在不同地址处分解执行读改写过程。

如果不是这样的话,那么作者的解释就自相矛盾:“当CPU正在执行一条对INTCON寄存器的‘读-改-写’操作的指令时,如果恰好发生了中断请求  ”与“当GIE被清零后,这是如果CPU正在执行一条对INTCON‘读-改-写’的指令时”相互矛盾。

总之,我对这里的理解存在一些疑惑,请斑竹及各位前辈指点。

系统分类: 单片机  |  用户分类: 网络酷文转载  |  标签: pic  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(589) | 回复(0)

发表于 2008/4/22 10:13:00

3

关于投票

PIC基础知识

振荡器类型

       LP方式:低功耗晶体振荡器方式

XT方式:晶体/陶瓷振荡器方式

HS方式:高速晶体/陶瓷振荡器方式     High-Speed Crystal/Resonator

HS4方式:带有PLL使能的高速晶体/陶瓷振荡方式

RC方式:阻容振荡方式

RCIO方式:带有I/O引脚使能的外部阻容振荡方式

EC方式:外部时钟方式                           External Clock with FOSC/4 Output

ECIO方式:带有I/O引脚使能的外部时钟方式

复位方式

       上电复位(POR)

       在正常工作状态下通过在外部MCLR引脚上加低电平复位

       在休眠状态下通过在外部MCLR引脚上加低电平复位

       在正常工作状态下监视定时器WDT超时溢出复位

       可编程的掉电锁定复位(PBOR)

       RESET指令复位

       堆栈满(上溢出)复位

堆栈满(下溢出)复位

extern volatile near unsigned char PORTB; 

// PORTB是一个字节(unsigned char)。由于变量是在寄存器中定义的,因此需要extern 修饰符。 volatile 修饰符告知编译器不能假定PORTB能保留赋给它的值。 near 修饰符指定了端口位于存取RAM 中。

 

系统分类: 单片机  |  用户分类: 网络酷文转载  |  标签: pic  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(606) | 回复(0)

发表于 2008/4/22 10:11:00

5

关于投票

I2C 24LC02 C读写例程(PIC单片机)

1   I2C总线特点
   I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。

2   I2C总线工作原理
I2C总线上的数据稳定规则,SCL为高电平时SDA上的数据保持稳定,SCL为低电平时允许SDA变化。如果SCL处于高电平时,SDA上产生下降沿,则认为是起始位,SDA上的上升沿认为是停止位。通信速率分为常规模式(时钟频率100kHz)和快速模式(时钟频率400kHz)。同一总线上可以连接多个带有I2C接口的器件,每个器件都有一个唯一的地址,既可以是单接收的器件,也可以是能够接收发送的器件。

每次数据传输都是以一个起始位开始,而以停止位结束。传输的字节数没有限制。最高有效位将首先被传输,接收方收到第8位数据后会发出应答位。数据传输通常分为两种:主设备发送从设备接收和从设备发送主设备接收。这两种模式都需要主机发送起始位和停止位,应答位由接收方产生。从设备地址一般是1或2个字节,用于区分连接在同一I2C上的不同器件。

I2C总线在传送数据过程中共有三种类型信号, 它们分别是:开始信号、结束信号和应答信号。
   开始信号:SCL为高电平时,SDA由高电平向低电平跳变,开始传送数据。
   结束信号:SCL为高电平时,SDA由低电平向高电平跳变,结束传送数据。
   应答信号:接收数据的IC在接收到8bit数据后,向发送数据的IC发出特定的低电平脉冲,表示已收到数据。CPU向受控单元发出一个信号后,等待受控单元发出一个应答信号,CPU接收到应答信号后,根据实际情况作出是否继续传递信号的判断。若未收到应答信号,由判断为受控单元出现故障。

在I2C总线中只有主发送和主接收两种操作方式。在系统初始化时,由指令控制CPU送出相关的数据,经接口送到I2C寄存器内。通过初始化这些寄存器,可以实现I2C总线的主模式控制,以及实现I2C总线上的从设备读写。

      当主设备和其中的一个从设备交换数据时,主设备首先发出一个启动Start信号,这个信号被所有的从设备接收。即从设备准备接收CPU的信号,然后主设备再发出它要通信的从设备地址。接下来,所有的从设备将收到的这个地址和它们自己的地址进行比较。

如果收到的地址和它们自己的地址不同,则什么都不做,只是等待主设备发出停止stop信号;如果收到的地址和它自己的地址相同,它就发出一个信号给主设备,这个信号称为应答Acknowledge信号。当主设备收到应答信号后,它就开始向从设备发送数据或者从从设备接收数据。当所有操作都进行完毕时,主设备发出一个Stop信号,通信完毕,释放I2C总线;然后所有的从设备都等待下一次Start信号的到来。

3   总线基本操作
   I2C规程运用主/从双向通讯。器件发送数据到总线上,则定义为发送器,器件接收数据则定义为接收器。主器件和从器件都可以工作于接收和发送状态。 总线必须由主器件(通常为微控制器)控制,主器件产生串行时钟(SCL)控制总线的传输方向,并产生起始和停止条件。SDA线上的数据状态仅在SCL为低电平的期间才能改变,SCL为高电平的期间,SDA状态的改变被用来表示起始和停止条件。
3.1 控制字节
   在起始条件之后,必须是器件的控制字节,其中高四位为器件类型识别符(不同的芯片类型有不同的定义,EEPROM一般应为1010),接着三位为片选,最后一位为读写位,当为1时为读操作,为0时为写操作。

1.写过程

(1)上电后等待一个延时(1ms)。

(2)器件寻址,给一个起始信号(SCL为高电平时SDA给一个下降沿)。发送从器件地址,高5位为10110,然后根据A1/A0(如果和器件的地址相同则那个器件会应答)进行读/写控制(O为读)。

(3)应答,器件在SCL的第9个周期时SDA给出一个低电平,作为应答信号。

(4)开始写有两种模式:字节写模式和页写模式。

·字节模式:给出A15~A8应答,给出A7~A0应答;然后给出DATA和停止信号     (SCL为高电平时,SDA给出一个上升沿),接着要等待一个擦写时间。

·页写模式:给出地址以后连续给出64个数据。如果多于64个数据,则地址计数器自动翻转。(如果少于64昵,估计是没有问题的,但是需要实验验证。)

(5)判断擦写操作是否完毕的一个方法(应答查询),如果器件还处于擦写状态,则不会应答器件寻址;如果有应答,则说明擦写完毕。

2.读过程

(1)上电以后等待一个延时(lms)。

(2)器件寻址。

(3)应答。

(4)开始读有三种模式:立即当前地址读、选择/随机读、连续读。

·立即当前地址读:如果上次读/写的操作地址为N,则现在是N+1。不需要ACK,但是需要Stop信号。

·选择/随机读:先伪写(用于给出一个地址),然后再次启动,读取数据。

·连续读:读取一个以后给一个应答,这样器件会再给出下一个地址的数据内容。

(5)开始数据传输Start后、停止数据传输Stop前,SCL高电平期间,SDA上为有效数据。

/*******************************************************************
一、程序说明:
1, 24LC02器件地址是1010000R/W.
2, 数组写入24LC02采取页写方式.
3, 数组code从24LC02读出时采取自由读方式.
4, 采用4.00M晶体。
5,采用软件I2C。

二、硬件连接:
1, SDA------->23 pin.(当然你可以任意选择脚位)
2, SCL------->18 Pin.(当然你可以任意选择脚位)
3, PORTD----->外接8个LED,显示读出的数据,在这里,读出的刚好是一个闪动的流水灯状态。

*******************************************************************/
#i nclude "pic.h"

#define uchar unsigned char
#define nop() asm("nop"
#define SCL TRISC3
#define SDA TRISC4

void start_i2c();
void stop_i2c();
void send_byte(uchar c);
uchar receive_byte();
void I_send_str(uchar sla,uchar suba,uchar *s,uchar no);
void delay_250ms();
void i2c_error ();

uchar code[]={0x00,0x01,0x03,0x07,0x0f,0x1f,0x3f,0x7f,0xff};
uchar no,ack,c,data;


void main(void)
{
uchar i;
TRISC=0Xff; //C口设为输入 RC3为SCL线,RC4为SDA线。
PORTC=0X00;
TRISD=0X00; //D口为输出,显示IC24LC02中读出的内容
PORTD=0X00; //初始显示全亮

I_send_str(0xa0,0x00,code,9); //页写入code数组到24LC02,器件地址为0Xa0,子地址为0X00,共9个数。

delay_250ms();


///////////开始读出到D口进行显示,根据Random read时序图。
while (1)
{
for (i=0x00;i<0x09;i++)
{
start_i2c();
send_byte(0xa0); //发送器件地址,即DEVICE ADDRESS。
if (ack==0) i2c_error(); //如果24LC02无应答。则进入I2C ERROR错误指示。
send_byte(i); //发送字地址,即WORD ADDRESS。D口显示数组。
if (ack==0) i2c_error();
start_i2c(); //重新启动总线。
send_byte(0xa1); //发送读命令和器件地址DEVICE ADDRESS。
if (ack==0) i2c_error();
data=receive_byte();
stop_i2c();
PORTD=data;
delay_250ms();
}
}
}


/*******************************************************************
起动总线函数
函数原型: void start_i2c();
Function: start on the I2C bus
*******************************************************************/
void start_i2c()
{
SDA=1; //发送启始条件的数据信号
nop();
SCL=1;
nop();nop();nop();nop();nop(); //24LC02要求建立时间大于4,7S
SDA=0; //发送起始信号
nop();nop();nop();nop();nop();
SCL=0; //钳住I2C总线,准备发送数据或接收数据
nop();nop();
}


/*******************************************************************
停止总线函数
函数原型: void stop_i2c();
Function: stop the I2C bus
*******************************************************************/
void stop_i2c()
{

SDA=0; //发送结束条件的数据信号
nop();
SCL=1;
nop();nop();nop();nop();nop();
SDA=1;
nop();nop();nop();nop();
}

/*=================================================================
字节数据传送函数
函数原型: void send_byte(uchar c);
Function: 将数据C发送出去,可以是地址,也可以是数据,发完后等待回应,并对此状态
位进行操作(不应答或非应答都使ack=0 ),发送数据正常,ack=1;ack=0
表示被控器无应答或损坏。
==================================================================*/
void send_byte(uchar c)
{
uchar bit_count;
for (bit_count=0;bit_count<8;bit_count++)
{
if ((c<else {SDA=0;}
nop();
SCL=1;
nop();nop();nop();nop();nop();
SCL=0;
}
nop();nop();
SDA=1;
nop();nop();
SCL=1;
nop();nop();nop();
if (RC4==1) ack="0";
else ack="1"; //用ASK=1为有应答信号
SCL=0;
nop();nop();
}

/*==================================================================
字节数据接收函数
函数原型:uchar receive_byte();
FUNCTION: 用来接收从器件传来的数据,并判断总线错误(不发应答信号),
发完后请用应答函数。
===================================================================*/
uchar receive_byte()
{
uchar retc,bit_count;
retc=0;
SDA=1;
for (bit_count=0;bit_count<8;bit_count++)
{
nop();
SCL=0;
nop();nop();nop();nop();nop();
SCL=1;
nop();nop();
retc=retc<<1;
if (RC4==1) retc="retc"+1;
nop();nop();
}
SCL=0;
nop();nop();
return (retc);
}


/*================================================================
向有子地址器件发送多字节数据函数
函数原型: bit I_send_str(uchar sla,uchar suba,uchar *s,uchar no);
Function: 从启动总线到发送地址,数据,结束总线的全过程,从器件地址sla。如果
返回1表示操作成功,否则操作有误。
=================================================================*/
void I_send_str(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
start_i2c();
send_byte(sla);
if (ack==0) i2c_error();
send_byte(suba);
if (ack==0) i2c_error();
for (i=0;i{
send_byte(*s);
if (ack==0) i2c_error();
s++;
}
stop_i2c();
// return(1);
}

/*****************************************************************
延时函数
函数原型: void delay_250ms();
FUNCTION: 延明250ms
*****************************************************************/
void delay_250ms()
{
unsigned int d="24999";
while (--d);
}

/*****************************************************************
总线错误函数
函数原型: void i2c_error();
Function: 通过RD7闪动8次表示总线操作失败一次报警。
*****************************************************************/
void i2c_error ()
{
uchar i;
for (i=0;i<8;i++)
{
RD7=0;
delay_250ms();
RD7=1;
delay_250ms();
}

}
/**********END**************/

系统分类: 单片机  |  用户分类: 网络酷文转载  |  标签: pic  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(1970) | 回复(0)

发表于 2008/4/22 10:10:00

3

关于投票

PIC结构体,定义位元结构

PIC结构体,定义位元结构
extern volatile near unsigned char PORTB;   // PORTB是一个字节(unsigned char)。由于变量是在寄存器中定义的,因此需要extern 修饰符。 volatile 修饰符告知编译器不能假定PORTB能保留赋给它的值。 near 修饰符指定了端口位于存取RAM 中。
extern volatile near union   {     // 定义PORTBbits为一位元结构的联合体(union)变量。指定 PORTBbits 是可位寻址的匿名结构的联合。特殊功能寄存器中的每一位可能有不只一种功能,因此联合中对于同一个寄存器有多个结构定义。struct {     // 地址在Access RAM
       unsigned RB0:1;     // 定义PORTB的标准功能
       unsigned RB1:1;
       unsigned RB2:1;
       unsigned RB3:1;
       unsigned RB4:1;
       unsigned RB5:1;
       unsigned RB6:1;
       unsigned RB7:1;
} ;
struct {
       unsigned INT0:1;     // 定义PORTB的另外功能
       unsigned INT1:1;
       unsigned INT2:1;
       unsigned CCP2:1;
} ;
} PORTBbits ;                                         //这里定义了一个结构联合体变量 PORTBbits

//然后就可以用了。
PORTB=0x35;       // PORTB 与 PORTBbits 地址一样。
//等同于 PORTBbits = 0x35;    
PORTBbits.RB7=1;        // RB7 输出高电平

系统分类: 单片机  |  用户分类: 网络酷文转载  |  标签: pic  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(748) | 回复(0)

发表于 2008/4/22 9:50:00

3

关于投票

ICD2调试器常见问题

ICD2调试器常见问题

ICD2 调试时出现“ICD0083: Debug: Unable to enter debug mode. Please double click this message for more information.”

通常这说明ICD2不能和调试执行程序通讯,这有可能是目标时钟或电源问题使得ICD2不能和调试执行程序通讯,保证晶振的管脚和OSCKI/OSCKO充分接近,4MHz以上晶振推荐使用HS模式,如果是外部32K低频晶振,重新“connect”一下可执行调试指令,也有可能内部或外部晶振使能了PLL功能而进不了Debug模式的,关掉PLL即可;再还有可能是配置位设置不当引起的,查看Config>Configuration Bits,确保看门狗被禁止,代码保护、掉电检测等被关闭


--------------------------------------------------------------------------------

连接ICD2时显示“ICD0021: Unable to connect with MPLAB ICD 2”?

请检查一下ICD2与电脑连接的通讯口是否设置正确(USB or COM)。


--------------------------------------------------------------------------------

连接ICD2时显示“ICD0286: Unable to communicate with ICD
ICD0082: Failed MPLAB ICD 2 operation”

这可能是操作系统有误,此时手动下载操作系统即可。


--------------------------------------------------------------------------------

连接ICD2时显示“ICD0019: Communications: Failed to open port: (Windows::GetLastError() = 0x2, '系统找不到指定的文件。') ICD0021: Unable to connect with MCU.”

通常是ICD2驱动找不到,需重装。如果MPLAB IDE V7.0以上版本,重装前要先运行C:\Program Files\Microchip\MPLAB IDE\Utilities\MPUsbClean下的MPUsbClean.exe 彻底删除


--------------------------------------------------------------------------------

ICD2自检不通过提示“... Failed Self Test. See ICD2 Settings (status tab) for details”

ICD2自检主要是对Target Vdd、Target Vpp、MCLR GND、MCLR Vdd MCLR Vpp六个管脚电压进行检测,任何的一项不正常都会通不过。出错具体情况可在ICD2 的status栏进行查看,找出出错的项,再检查该项的相关硬件连接。若是PIC18J、PIC24、dsPIC30、dsPIC33系列的器件,是无法从ICD2供电给它们的,要求目标板外接电源,且要注意它们的电压范围。

注:可能有些芯片会提示Vpp High 从而导致自检通不过,这是ICD2的固件中检测Vpp电压时所设的上限阈值偏小所致,通常可忽略,ICD2还是能正常编程和调试的


--------------------------------------------------------------------------------

ICD2自检通过,但提示没找到目标ID,读到的ID是‘0’,显示“ICDWarn0020: Invalid target device id (expected=0x89, read="0")”

此时首要任务是检查硬件连接,PGC/PGD有无接错,或PGD/PGC上有容性负载或感性负载。若是PIC18J器件,请确认vddcore是使能且该脚接了0.1-10uF的低ESR电容。注:ICD2到目标板的连接线如果是一端水晶头,一端插针的,要注意白色才是第一根,蓝色一般是不用的。


--------------------------------------------------------------------------------

ICD2自检通过,但提示没找到目标ID,读到的ID不是‘0’,但和期望的不符合,显示“ICDWarn0020: Invalid target device id (expected=0x89, read="0x71")”

首先检查芯片型号选择是否正确;如果是Debug模式下出现该提示,要先确认所选的MCU是否需要header才可通过ICD2调试。如果用了header出现该提示,那么检查header上用来设置ADC的enable/disable的跳线,这个跳线也会影响目标device的ID。


--------------------------------------------------------------------------------

ICD2编程时提示编程成功但校验失败

首先检查PGC/PGD有无外电路干扰,再看看Vdd有没有达到4.5V以上(PIC18J/PIC24/dsPIC33F系列除外),ICD2对芯片编程时首先要全擦,对大部分PIC来说执行“Bulk Erase”时Vdd最小电压是4.5V。这就要求即使是LF版的PIC在用ICD2编程时Vdd至少是4.5V,当然编完程后还是可以在低电压下(3V)使用ICD2调试的。

如果芯片有AVdd和AVss脚, 请在ICSP编程时分别接到Vdd和Vss, 否则也会出现这样的错误。

有些芯片使用时用到了内部晶振和内部复位,如PIC16F630/690等,用ICD2编程时一旦使能内部晶振和内部复位会有警告信息:

ICDWarn0033: You have selected Internal MCLR and Internal Oscillator in your configuration settings. If your code makes use of port pins that correspond to Clock and Data pins in programming mode, you may not be able to reprogram your device. See on-line help for this warning for more information. (OK/Cancel)

忽略该信息,初次ICD2可以成功编程该芯片。但如果芯片中已有配置字是内部晶振和内部复位的程序,且程序中有对ICSPCLK和ICSPDAT管脚的操作,再次编程就会有校验失败的错误提示。这是因为当使用内部晶振和内部复位时, ICD2一旦和目标板相连,目标芯片即已工作,ICD2对ICSPCLK和ICSPDAT的控制被目标芯片对这两脚的操作打乱,故而进不了编程模式。这时该考虑其他编程工具,或者在程序开头加2ms以上延时,保证芯片在真正执行程序前进入编程模式。 也有可能是ICD2占用了部分资源引起的。


--------------------------------------------------------------------------------

用ICD2调试或烧写PIC16F630/676,PIC12F629/675等带内部RC的器件,连接ICD2时警告“ICDwarn0044:Target has an invalid calibration memory value (Value). Continue?”

这是这些器件的程序存储器最后一个单元上的内部RC校准值(retlw xx)被修改了,可用PICkit 1重新生成一个值;也可在MPLAB IDE的Programmer--settings--calibration memory选项卡里把Allow ICD2 to program calibration memory 前的勾打上再填一个新的值,烧写后再次连接就没问题了。


--------------------------------------------------------------------------------

为什么在配置锁相环(PLL)振荡器时有问题,ICD2被挂起?

这是PICmicro单片机所要求的。在对PLL振荡器的配置位编程后,电源需要断开然后再加到目标板上。如果没有这样做,目标PICmicro单片机将没有时钟。没有时钟,调试模式将不能工作。同样,如果在切换到PLL模式时,电源没有被断开再连接,器件可能会运行,但没有使用PLL。


--------------------------------------------------------------------------------

ICD2在调试PIC12F629/675或PIC16F630/676时,为什么会有Invalid target device id警告?

在使用MPLAB ICD2和ICD2 仿真头调试这些器件过程中,这些器件的GP1/RA1 引脚不能被拉高,否则会警告Invalid target device id。参见MPLAB ICD 2 Header文档。


--------------------------------------------------------------------------------

ICD2单步执行时,定时器为什么运行不正常?

这是使用在线调试器的缺点之一。由于代码实际上是在调试执行程序中运行,在调试执行程序运行期间,即使用户的应用程序被中止,定时器也会继续运行。


--------------------------------------------------------------------------------

ICD2通过RETFIE 指令来使用高优先级中断时,为什么 W 、 STATUS 和BSR寄存器的值会改变?

用于高优先级中断和CALL FAST 的影子寄存器被MPLAB ICD 2 使用了。这些是保留给MPLAB ICD 2 操作的资源。如果断点设置在CALL FAST 子程序内,或者在通过RETURN FAST 或RETFIE 指令使用了影子寄存器的高优先级中断服务程序内,将会出现问题。


--------------------------------------------------------------------------------

dsPIC 使用ICD2在线调试的接口选择

在某些情况下,dsPIC默认的编程和调试引脚功能PGC/EMUC和PGD/EMUD,可能与其他外设(如I2CTM?、SPI或UART模块等)引脚复用。在这种情况下,应用能将这些引脚用于编程,但不能用于在线调试。此时在线调试应该使用备用调试通道,EMUC/EMUD1、EMUC2/EMUD2或EMUC3/EMUD3,具体的电路设计请参考152816.pdf文档。


--------------------------------------------------------------------------------

ICD2当在程序的起始位置设置一个断点时,为什么它停止在地址0x0001 ,而不是地址0x0000 ?

MPLAB ICD 2 在断点后的指令上暂停。这意味着设置了断点的地址0000 处的指令会被执行,接着当它发现断点时,程序计数器会指向地址0001。如果用户需要在其代码的第一条指令处暂停,他们必须在地址0000 处插入一条NOP 指令。


--------------------------------------------------------------------------------

ICD2通信不上

有可能操作系统有误,此时需要寄到原厂重新下载;也有可能是升级模块跟主板没有接触好。


--------------------------------------------------------------------------------

ICD2调试时出现ICDWarn0015: Program memory has changed since last program operation?

程序修改之后没有再重新编译、烧写到芯片里


--------------------------------------------------------------------------------

ICD2连接时出现ICD0152: Failed to read all of requested bytes (0x0 of 0x8)?

首先,ICD2是用USB还是串口跟电脑连接的?如果是串口连接的,改一下串口属性,具体步骤如下:

右击我的电脑--属性--硬件--设备管理器--端口(COM)--COM1(如果用其他COM,则选择相应的COMx)--属性--端口设置,在这里要做两个设置:

1,流控制方式--选择硬件

2,点击“高级”按纽--使用FIFO缓冲区。。。前面那个钩去掉。 设置完后可能还需要重启电脑。其次,升级一下IDE版本。


--------------------------------------------------------------------------------

PICKit2烧写完程序时出现Warning - No configuration word found in hex file?

那是因为烧写的程序里没有包含Config信息,需要在MPLAB IDE里对configbits进行设置,具体步骤:

1、打开MPLAB IDE;

2、通过file->import,打开要烧写的HEX文件;

3、对configbits进行设置;

4、通过file->export,导出HEX文件。

此时的HEX文件才是包含了config 信息的HEX文件,这样再用PICKIT2烧写的话应该就不会提示那个错误了。

系统分类: 单片机  |  用户分类: 网络酷文转载  |  标签: pic  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(1742) | 回复(0)

发表于 2008/3/28 17:26:00

0

关于投票

堆内存与栈内存

堆内存与栈内存
0
推荐    在标准C语言上,使用malloc等内存分配函数获取内存既是从堆中分配内存,而在一个函数体中例如定义一个数组之类的操作是从栈中分配内存。

    从堆中分配的内存需要程序员手动释放,如果不释放,而系统内存管理器又不自动回收这些堆内存的话(实现这一项功能的系统很少),那就一直被占用。而栈内存在函数体内一直存在,你无法丢掉,在离开函数体后,立即被销毁,你无法挽留。

    如果老是申请堆内存,而不释放,内存会越来越少,很明显的结果是系统变慢或者申请不到新的堆内存。而过度的申请栈内存(可以试试在函数中申请一个1G的数组!),会导致栈被压爆,结果是灾难性的。栈都爆了,谁知道函数会跑到哪里去?!

    我们掌握堆内存的权柄就是返回的指针,一旦丢掉了指针,便无法在我们视野内释放它。这便是内存泄露。而如果在函数中申请一个数组,在函数体外调用使用这块栈内存,结果谁也无法预测。
  
    申请栈内存的时间是基本确定的。核心只要栈指针的偏移和对它进行初始化(如果必要的话)。但堆中的时间是无法预测的,这是内存管理器的任务,跟他的算法和当前的堆内存结构有关,也许很快,也许很慢。两者在这里不存在可比性,尽管大多数情况下栈内存的申请的确比堆内存要快。
    申请的时候,栈内存几乎等同与申请大小,大多数的偏差是内存对齐引发的几个字节影响。但对内存但实际也会会相差很大(这主要源于内存管理器算法)。常见的内存管理都是按照基本内存块大小来分配的。在一个基本单元是1024Byte的管理器上,哪怕你只申请一个Byte,它也会给你1024个。频繁的申请小的堆内存是不明智的。
    在申请和销毁之外的使用过程中,他们是一样,可以同样对待。一般情况下,他们具有同样的访问速度,都不要进行越界访问,哪怕堆内存先后越界暂时不会出错。

    栈内存和堆内存的大小也没有可比性。栈内存大小跟IC,编译器,OS相关。而对堆内存的大小一般是内存管理器说了算。X86上Windos下VC编译的代码只是N种情况之一。并不具备多少代表性。至于磁盘是否能为堆内存撑腰,完全在于你使用的内存管理器和IC是否支持虚拟内存。

    从更底层一点来说,堆和栈只是对他的可见内存(可能是物理内存)的使用方式。如果我们你有1G的内存,我们可以给分256K给栈,然后拿500M给内存管理器。于是前者成了栈内存,后者成了堆内存。当然,如果你要给栈800M,对256个字节也没问题。如果我有块干净的IC和系统,所有的东西都自己起步,就可以这样干。只需要拿一块单片机系统或者直接在VC上模拟也可以。

     malloc只是标准C种实现动态内存申请的一种方式而已。它和堆内存申请并不等价。在我们自己内存管理器种,完全可以是任何名称(不考虑编程规范和接口标准的话)。


     参考与实现:
     参阅任何一本数据结构和操作系统书籍。
     参阅任何一种小的OS(uC_OS II就可以了);
     自己在单片机或者VC上模拟他们进程和内存管理。最简单的实现在函数种分配数组进行各种访问,并观察堆栈

。定一个很大数组,进行分配和回收。

   

系统分类: 单片机  |  用户分类: 网络酷文转载  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(710) | 回复(0)

发表于 2008/3/28 16:59:00

0

关于投票

我在深圳五年的销售心得(转帖)

我在深圳五年的销售心得(转帖)

关于我自己
  
    1、业务员和客户聊天的时候哪些话题不需要聊太多关于技术和理论的话题,需要的是今天的新闻呀、天气呀等话题。因此,业务员在日常的时候必须多读些有关经济、销售方面的书籍、杂志,尤其必须每天阅读报纸,了解国家、社会消息、新闻大事,这往往是最好的话题,这样我们在拜访客户时才不会被看成孤陋寡闻、见识浅薄。
  
    2、关于业务员晚上的四个小时。一个业务员的成就很大程度上取决于他晚上那四个小时是怎样过的。最差的业务员晚上就抱着个电视看,或者在抱怨,出去玩等。这样的业务员没出息。一般的业务员去找客户应酬,喝酒聊天。这样的业务员会有单,但我个人认为难有很高的成就。好一点的业务员晚上整理资料,分析客户,做好计划等。这样的业务是一个好业务,应该有前途。最好的业务员我认为是在做完好业务员的工作后还坚持看一个小时的书。我觉得这样的业务很有出息,以后有机会可以做老板。
  
    3、关于业务员本身。很多人觉得,业务员最好身材高大,英俊潇洒。业务员一定要口才好,能说会道,嘴里能吐出油来才叫口才好。业务员一定要会抽烟,身上随时带着烟,逢人就派。业务员一定要会喝酒,白酒,啤酒千杯不倒。其实我感觉这些都不是重要的。就我个人而言,我身高不到172MM,刚开始跑业务时心里很自卑,说话都不流畅,更别说口才好了。我是从来不抽烟的,喝酒我最多一瓶啤酒,多点就醉了。可是勤能补拙,我刚跑业务时,在惠州,刚开始三个月,我拿几件衣服就到东莞的弟弟厂里一跑就是几天。一个工业区,一个工业区的跑。就这样,我走了三个月,客户也跑下了几个,可是皮鞋也烂了一双,人黑的像黑碳头一样。我现在自己开工厂了,我经常对业务员,头三个月过的是不是人的日子的,熬过后就可以了。所以业务的办公室在厂外。

关于找客户
  
    做业务刚进公司的头三个月是考验业务员能否成功的最关键的三个月,这三个月可以说是影响了业务员以后的业务工作的。这之中第一个面对的就是如何找到客户的问题,关于怎样寻找目标客户。一般来说新业务员进到一个新公司后,在熟悉到1个星期左右的产品知识就要自己找客户去拜访了。如果开始没有业务经理或者老板提供客户资源的话,可以通过以下方法去找客户。
  
    1、黄页,一般公司都有很多黄页的,如《深圳黄页》等。我们可以按照上面的分类等找到我们的原始目标客户。现在深圳也有好多专业类的行业黄页,如家电黄页,玩具黄页等,业务员最好找到这样的黄页来收集第一手资料。这些黄页在一般大的图书馆都有。可以拿个本子去那里抄就可以了。
  
    2、浏览招聘广告,就象在深圳,《深圳特区报》每天都有大量的招聘广告,还有《南方都市报》每个星期一都有招聘广告,我们可以通过阅览的招聘广告来获得我们想要的客户。我们也可以去附近的招聘市场看看,一般的招聘市场会在门口贴出每天的招聘单位的名称和招聘工种我们也可以通过他招聘的工种来分析他是做什么的,这样就可以找到我们要的客户了。还有我们可以去一些大的工业区附近转转,现在几乎所有的厂都招工,也可以通过他们门口的招工广告找到的。我们也可以上网看招聘网站,如卓博招聘网等。
  
    从招聘广告中找的客户的好处是第一可以找到很多新的客户,因为有很多新的厂,他或者刚开,或者刚搬过来,如果我们第一个先找到他,那就是捷足先登了。还有,一般有能力大量招工的厂家生意都比较好,对以后业务做成功后的货款回收也相对有点信心。
  
    3、网络搜索。我们可以通过关键字去搜索,如在百度输入我们要找的客户的生产产品的名字,我们可以找到大把的客户。我们也可以通过专业的网站来找客户,如阿里巴巴,如慧聪等等。这样我们可以找到很多客户的名单了。而且还可以找到老板的手机号码和老板的姓名等。
  
    4、我们也要经常上街找客户,我们去逛商场,我一般会到家电商场去看看,他们都有包装的,或者有品牌和公司的名称,我们可以记录下来,回去上网找就可以了。我们可以通过商场的产品的销售来判断一个客户的经营情况来的。这从侧面也反映了他的一个经济实力。
  
    5、但我个人认为最好的找客户的方法是通过交际网络的相互介绍来发展客户。以后做业务讲究资源共享的时代。例如你是做电线的,我是做插头的,他是做电阻的。我们同时做一个音响的客户。如果我们都可以资源共享,把好的客户都互相介绍,这样做进去一个客户就非常容易和省心。而且我们的客户因为大家互相看着,客户一有什么风吹草动.大家可以提防,风险不就低很多了吗。
  
    6、还有个最好的办法是客户介绍客户,这是成功率最高的。厉害的业务员在有了几个原始客户以后,就会认真服务好这几个客户,和他们做朋友。等到熟悉了,就开口让他们介绍同行或者朋友给你。这时候不要让他们给你名单就好了,名单那里都可以找到,最主要是要让他帮你打个电话。如果他帮你打了个推荐电话,好过你打100个电话。你以后就主要服务好他介绍的客户,然后也依次类推的让这个新客户介绍下去,那样你就可以很轻松的找到你的客户网络拉。
  
    所以我们是有很多方法来找到我们想要的客户的,只要我们要用心。业务员的身上无论什么时候都要有三个东西在身上,除了冲凉的时候,这三个东西是:笔,小笔记本,名片。别人都说业务员有8个眼睛的,也是很有道理的,生活中处处留心,就可以找到很多商机。

关于打电话
  
    我们找到客户之后,第二个问题就是要想着怎样打电话约客户了。这里面也有一些细节的。注意一下就可以了。
  
    1、很多人打电话都会遇到这样的情况。客户还没有听完我们的介绍,就说不要不要,接着就啪的一生挂电话了。还有你说要去拜访他,他说没空,让你传真资料给他,或者把资料放到门卫室去。我们千万不要传真资料和放到保安室给他,没用的。遇到这样的情况我开始就很郁闷,后来我就这样想,可能采购小姐今天一上班就给老板骂了,不高兴所以才拒绝我,或者想可能采购小姐今天和男朋友吵架了,所以不理我。没关系,我下次再找你好了。我很多客户都是打了好多次电话才得到约见的,有时就是这么奇怪,采购小姐昨天还说不要,今天再打就可以让你带样品去见她了。所以生意的成功往往就是看你坚持不坚持了。
  
    2、无论你的业务技巧多么熟练,我觉得打电话是还是要想一想将要讲的内容比较好,不要一拿起电话就聊。因为我们会聊着聊着就忘记了一些本来要讲的内容,往往刚挂掉电话又要打多一次。搞的大家都不好。对于刚做业务的朋友最好用纸写下来。这样会讲的比较有条理。
  
    3、我觉得站着打电话比较好点,。因为人站着的时候我感觉注意力比较集中,会比较认真,还有站着的时候中气十足,讲的话声音比较好听。大家不信试试看。 无论你刚刚受了多大的气,打电话时最好带着微笑。这样气氛比较轻松,客户会感觉的到的。做业务本来就是受气的活,可是我们的客户没必要和你分担。
  
    4、我们不要等到有求于客户的时候才打电话给他们。我们在平时的时候要经常给他们打电话,聊聊天,问候问候也好。直到他一听到声音就知道是我为止。最好能让他惦记着你。做业务就像谈恋爱一样。我们不能约了一次会后就指望别人能嫁给你。采购是很健忘的,我们要不断的提醒他。

初拜访客户
  
    1、推销前的准备、计划工作,决不可疏忽轻视,有备而来才能胜券在握。准备好样品,目录书、笔和笔记本等。见客户之前先想想开场白、要问的问题、该说的话、以及可能的回答。平时对与公司产品有关的资料、说明书、广告等,均必须努力研讨、熟记,同时要收集竞争对手的广告、宣传资料、说明书等,加以研究、分析,以便做到“知己知彼”,如此才能真正知己知彼.
  
    2、准时赴约——迟到意味着:“我不尊重你的时间”。迟到是没有任何借口的,假使无法避免迟到的发生,你必须在约定时间之前打通电话过去道歉,我相信提前出门是避免迟到的唯一方法。
  
    3、服装不能造就完人,但是初次见面给的人印象,90%产生于服装。礼节、仪表、谈吐、举止是人与人相处的好坏印象的来源,销售代表必须多在这方面下功夫。我不喜欢我的业务员穿着红色绿色的T衬衣等去见我的客户。我起码要求是衬衣。还有公文包一定是皮的。
  
    4、我们不可能与拜访的每一位客户达成交易,他应当努力去拜访更多的客户来提高成交的百分比。在拜访客户时,我们应当信奉的一个原则是“即使跌倒也要抓一把沙”。意思是,销售代表不能空手而归,即使你拜访的哪个暂时没有需求,不能成交。也要想办法让他帮你介绍一位新客户。
  
    5、对客户而言。要经常留意客户喜欢的话题和他的爱好,他喜欢的就多跟他聊些。留意他的一举一动。你就可以投其所好拉。 谈话的结果不重要,过程的气氛很重要。我们在和采购聊天的时候,往往很注意谈话的内容,老是说没话题。其实我们要注意到我们谈话的过程和气氛。如果我们哪天聊的很愉快,和融洽,我们的感情就会很亲近。在许多天后,我们往往回忘记了当时谈的是什么,只记得哪天我们聊得很好。其实采购也一样。价格我们会有报价单给他,品质我们有品质承认书给他,交期我们会盖章签名回传给他。所以我们只要和业务之外的事情就可以了,聊他感兴趣的问题最好。

如何维护客户
  
    1、业务员在做到应该钓鱼,不是洒网。跑业务时最有效和舒服的做法是用钓鱼法。就像我们刚开始追女孩子时,难道我们会同时追几个女孩子,然后在博他有一个成吗吗。我们往会看准一个,竭而不舍的追求她,直到成功吧。我自己是这样跑业务的。我会选准一个行业,比如我要做耳机行业,我会挑行业里的3个左右认认真真的去攻他,直到做进去为止,以后其他的就很好做了。这样等你在耳机行业里占到80%的份额。我们再转到别的行业,复制它。就像钓鱼一样,看准大的。一条一条的钓,很舒服。胆大,心细,脸皮厚。我们年轻的时候,追女孩子,大一点的告诉我们的经验就是:胆大,心细,脸皮厚。其实做业务就像追女孩子一样的。
  
    2、据估计,有80%的业务之所以完成,是由于交情关系。现在竞争都很激烈,在同样质量,同样价格,同样服务等的情况下,你要竞争过对手,只有凭交情了,如果你比对手更用心的对待客户,和朋友结成朋友关系。这样谁还能抢走你的单?所以你把时间花在什么地方,你就得到什么。所以说交情是个宝。
  
    3、一定要热情,热情可以感染客户的。可能我们有很多业务员刚开始会非常热情,可是等到你做到一定的成绩就会变成老油条了,失去了往日的热情,有时候感觉反而单没那么好做了,你会以过分热情而失去某一笔交易,但会因热情不够而失去一百次交易。热情远比花言巧语更有感染力。
  
    4、一定要有个试用期。一个客户做下来,就像男女结婚一样。发现客户就像我们发现一个心仪的梦中情人。从打电话到下单就像开始送情书到订婚那么漫长。到真正结婚了,都还要度完蜜月才可以认认真真的过日子。所以我们和客户也要度度蜜月,我们不要一下子就做的很大。一见钟情而结婚的新鲜感过后很难维持的。我们都应该给点时间客户和我们。互相考察一下信用,服务等等。

关于成交
  
    1、很多业务员开始做业务的时候,往往冲劲很大,找到客户,送了样品,报了价就不知道怎么办了,往往前功尽弃。其实你应该不断的问他,你哪个单什么时候下呀,不断的问他,知道有结果为止。其实,采购就是等我们问他呢。会哭的孩子有奶吃。就像孩子不哭,我们怎么知道他饿了呢?所以我们要要求客户购买。然而,80%的业务员都没有向客户提出成交要求。
  
    2、如果未能成交,销售代表要立即与客户约好下一个见面日期,如果在你和客户面对面的时候,都不能约好下—次见面的时间,以后要想与这位客户见面可就难上加难了。
  
    3、我的感觉是,做业务要坚持追踪,追踪、再追踪,如果要完成一件业务工作需要与客户接触5至10次的话,那你不惜一切也要熬到那第10次倾听购买信号—如果你很专心在听的话,当客户已决定要购买时,通常会给你暗示。倾听比说话更重要。
  
    做业务就是:以成交为目的而开展的一系列活动。虽然成交不等于一切,但没有成交就没有一切。

关于收款
  
    1、做业务不要爱面子。业务做下来了,到收款的时候,很多人会想,我跟采购那么熟,一天到晚去追他的款感觉不好意思。所以就很少追款或者追几次没追到就不追了。其实我们也是要拿到货款才有提成拿呀。欠债还钱,天经地义的,如果你给他欠的太多,你的生意还做不长久呢。我一般追款,不是求他安排,而是说。**先生,你星期3安排货款给我,我哪天下午去拿。他有时会说哪天不行,那我就说,那就星期二罗,他往往就说星期三行了。
  
    2、对自己而言,在做客户之前,应该细心的去了解客户的一切。比如他之前和谁做的业务,也就是你的竞争对手是谁,知道了这一点你就可以报价和做出对策。了解客户为什么会想和你做生意。如果是别人不肯供货给他,那我们就可以要求他做现金。他肯定会赖帐。如果是对手的原因,例如质量不好,价钱高,服务不好。你就可以作相应的对策去应付他。如果是你在某方面做的比对手好而令到他跟你做,那你以后就知道怎么做了。
  
    3、预防客户的拖款最好的办法是和客户成交之前的调查。我们要认真的考察客户的一切信息,包括他的员工工资水准,发工资准时否,厂房是自己的还是租的,老板是那里的。生产的东西是在中国卖还是外销。最好是要认识客户的一些老供应商,这样可以向他们了解客户的的信用情况。

系统分类: 单片机  |  用户分类: 网络酷文转载  |  标签: 无标签  |  来源: 转贴  | 

点击查看原文

发表评论 阅读全文(564) | 回复(1)

23Next >Total , Page /