预览模式: 普通 | 列表

咱来开博

“巨人的肩膀”之程式时序篇

在单片机“微秒必争”的世界里,时序的合理布控可谓是生命忧关,同样是单片机,有人可以写出实时性的操作系统,而有人却点亮个LED都会闪烁;好的主程式循环布局,不用中断来计时或事件中断,照样可以完成精准的走时,且其实时性,响应度不会有丝毫影响!
---首先来说说决定时序的关键所在----时钟源,对于大部分MCU来说,都是每个指令周期为4个振荡周期,这也是为什么往往我们看到的时钟源大多是4M或8M的缘故了,大多数指令在整数倍的时序周期(如4M为1us)内完成,也就方便了我们对时序的掌控;在有些要求精准时间的系统中,Real time 又帮了我们大忙,以32.768KHZ为整数倍而分频得到的RTC,可为我们得到准确的0.5s,1s……,这也是我们在有些产品中看到的4.195M时钟源的缘故。
----在有一个定时器的MCU应用程式中,开启定时器的计时功能,但不开中断功能,在主程式循环体内,每隔段时间在固定的地方等待判断定时器的或计时间隔时间标志,或溢出时间标志,保证整个主程式循环体每个循环周期为一个固定时间,这样就可以在主循环体内安插一段处理时间的子程式,依循环周期固定时间*N得到250ms、500等,进而加入计数器得到秒,分,小时等较精确的系统时间,依这些秒,分标志,你想怎样安排你的任何时间段都可以,当然这样的前提是你必需保证你的主程式循环体内没有未知性的时间差分,如小的循环延时,外界的随机性的接收判断死循环等;
----当主程式循环体内有较长的时间延时程式怎么办呢,我们可以采用定时中断来得到500ms(你的主程式循环周期应该不会长于500ms吧),置相应标志,在主程式安插一段处理时间的子程式,照样可以得到秒,分标志,这样即使你的个别秒种间隔会有稍许的延时差异,但我相信整个某一时间段的计时应该没有多大出入,若有RTC配合定时的精准中断,则做一个低功耗的钟表都绰绰有余!
----时序的另一较大用途是用于软件模拟相关的通讯协议,如IIC,SPI等,配合IO的普能功能,按照较严格的时序操作(满足通讯协议的时钟数据的变化),普能的MCU也能发挥高效的性能;

查看更多...

分类:匠人所思 | 固定链接 | 评论: 21 | 引用: 141 | 查看次数: 421
个人觉得写得很有深意,不失为人所了解的一篇好文章!

查看更多...

分类:夷人暇想 | 固定链接 | 评论: 29 | 引用: 4876 | 查看次数: 3998

“巨人的肩膀”之程式结构篇

单片机程式设计中,其结构的演变关乎到算法的学问,此“算法”泛指广义的算法,但却又是有一个个小的算法的构造息息相关;一个整体的架构中,其主程式的多个task的分时指针,中断内多个事件计时合理掌控,可以说,在单片机的微秒级世界里,玩转指令间,全在掌控中:
关于任务:一个项目在立案之初,或在二次开发之前,对产品的详细功能要求,切实了解事在必行,从而有助于程式的全盘掌控;就拿一个简单的常用架构来说,一个主程式,一个中断程式,另一个是用户自定义的包含文件;主程式中放多少个任务,多个任务存放的先后顺序,前段对后段的交互,任务间时序的影响,是否是多个任务的盲目堆加,还是巧妙的利用主task指针来调用分任务的子程式,既照顾到最小任务的时序需求,又不会错过实际现实环境中任务的客观事件,等等这些,都是主程式思索的命题;对于中断内的处理,有人误以为只是突发的事件,其实不然,只要是时序要求紧急,即使是已知,为尝不可放在其中处理(如市电频率的模拟同步等),对于其多个AD采样、串口接收的判断、多点阵的LED或按键的扫描(非处理),巧妙组合,见缝插针,“瞬间的美丽也能成就神话”;
关于定义:笔者向来都主张自已创建一个用户自定义的包含文件,这个包含文件内呢,可放置常数、变量、系统寄存器、IO功能名、位操作旗标、RAM空间规划等等的定义,对于指令空间内的程式体,能不用就尽量不要用数字符号来表示,一来在程式后期的维护修改上,不用逐个去查找,相同的变化量,只在定义文档内修改一处就全盘搞定;二来在相近的程式体移置上,对于其IO功能的修改,事件判断的旗标等修改也容易,而不用花太多时间去关心读懂原来的程式(汇编本来就不好读识,时间长了也忘了);三是长期养成好的习惯,集累了多的定义名也是一笔编程的财富,对于其命名、格式一拖而就;对于定义的说明,在指令空间体也哆嗦一下,如标头,变量、常量或旗标等,其命名时最好是与你所处理的事件或程式体的意境相关联,这样在阅读理解上也更容易,而不是说,在命名上一塌糊涂,而程式旁又加一大堆注释(或有懒人干脆不加),效果显而易见(省时省力,立竿见影)!
关于位操作:位操作对于单片机来说,是它的强项,也正因为有了位操作,单片机的世界才那样精彩,归根究底,就是因为单片机与外界交互的IO口就是以位的方式存在的;好的、灵活的位操作(如旗标、计时计数器、指针等)可为单片机节省资源,减少指令操作,更重要的一点是,IO口位操作的唯一性,可有效杜绝单片机对外界的纷乱,减少很多不必要的误操作,所以在处理控制诸如继电器,可控硅,MOS管等重要的IO时,必须慎之又慎,在放置处理这样的IO的地方能少尽量少(防止程式跑飞),好的做法是一整个程式循环体里面只有一句ON和OFF这样IO的地方(当然这样做的代价是必需预设好多判断的条件),这样做程式的严密性就得到了保障,毕竟单片机的世界有太多外界干扰的因素,人无完人,何况它呢!
关于模块化:提到模块化,就不得不拿汇编与C作一下比较,到目前为止,我还没有发现用C写的程式能比用汇编写的程式的优势在哪里(虽然我现在也在努力的向C靠拢),当然我这样说并不是指C一无是处,而是说在单片机的应用领域里,C语言还没有发挥出它的优势来,就目前各大网站或教材上公布的例程来看,真的还找不出很好的实用实效性的综合产品实例(恕我孤陋寡闻),现况是,往往一个AD采样例程,就是一个入口,一个出口,中间几乎没有什么全局变量,要知道,一次采样就这样50us没有了,中间没有做其他任何事情(悲唉!),换而来之就是整个程式内多个采集量的不精准,或牺牲掉了太多的时间,一次中断的事件处理却让人等到黄花菜都凉了,也难怪有那么多论坛上只会用C的菜鸟在叫:可控硅不受控、多个LED扫描时有闪烁嫌时序不够用呀等(中国的教育呀,严重误人子弟);叫啸了多年的结构化,模块化,最终是没有把这些任务细化,单片机的实时性与C语言的强大指针功能分了家,“人生中最大的痛苦莫过于此”!

查看更多...

分类:工作笔记 | 固定链接 | 评论: 50 | 引用: 5274 | 查看次数: 3984

“巨人的肩膀”之序

“给我一个支点,我能翘起整个地球”,给你一个idea,你会少走许多弯路,试借笔者平时工作中的点滴,与同行分享一二,权做交流之平台,后继将逐一娓娓道来!
分类:工作笔记 | 固定链接 | 评论: 18 | 引用: 4378 | 查看次数: 5195

依现实环境对软件的防呆

在软件上对实际运用的防呆!

查看更多...

分类:夷人暇想 | 固定链接 | 评论: 107 | 引用: 4363 | 查看次数: 4034

浅谈使用可控硅对PG电机的控制

本人在空调主控板firmware设计中,曾遇到用可控硅对PG电机的控制,现将实现过程罗列如下:
此篇涉及两点命题:
1.可控硅的导通角:众所周知,在电路中使用的可控硅具有双向导通,过零点全导通的特性,因此,在电路中须增加过零点检测之电路,在每个市电周期的半坡变换处得到一个检测的方波,用外部中断的方式实现对零点的检测(当然,也可以用检测市电频率的方法得到零点);把每两个零点之间的距离算作180°的角度,可控硅的导通角距越小,则实现的功率越大,当然要因实际的被控器件,适当调整其工作的导通角度,实际运用中发现,一般在30°之前或150°之后,再调整其角度,变换的意义不大;对于其线性的调速,可选择采用固定的占空比,前后变换角度,以角度幅度来限制,或采用以变换的占空比,固定的角度从最大角度往前推进占空比这两种方式来实现,具体因被控器件的适应范围来变换,对于变化得到的功率,可实现多级调速,或因外力干扰,自动变换导通角度,实现控速的目的!
2.PG电机速率回馈的检测及控速的实现:PG电机在实际的运转过程中,每个运转周期返回三个等宽的方波,依此方波宽度时间,我们就可大致的推算出当前PG的转速,60000/(每方波宽度*3)ms就是每分钟PG的转速,依此返回值与设定转速值比较,进而作为调速的参考;在可硅控的有效调速范围内,当PG回馈值大于设定转速值时,就可适当调整加大可控硅的导通角,使PG转速加快,回馈值变小,使其与设定值匹配,反之,调整减小可控硅的导通角,起到自动控制稳定PG转速的目的;
以上所述之实现方法里,在firmware上来讲,致少需要2个中断口,2个内部计时器(为了控速能更稳定,更好是能用16位计时器),一中断检测过零,另一中断检测PG回馈(配合一计时器测定转速),用另一计时器来控制可控硅的导通角;以上实现方法,对于较小功率之PG电机,可得到满意的控速调速效果,但当PG功率较大时,采用此可控硅来控制时,就会造成较大的噪音困扰,得不到理想效果,因此有人提议用PWM来控制PG转速,但这样来看,硬件电路得做相应改动,且能否用可控硅来控制还得另行商凿!

查看更多...

分类:工作笔记 | 固定链接 | 评论: 57 | 引用: 188 | 查看次数: 1499

用蜂鸣器实现合弦音乐之攻略篇

网上有高人用单一之IO口,实现对蜂鸣器的音乐产生,借用定时器产生不同的输出频率,以得到不同的音调效果:
音符频率对应表
音符 频率/HZ 半周期/us 音符 频率/HZ 半周期/us
------------------------------------------
低1DO 262 1908 #4FA# 740 0676

查看更多...

分类:工作笔记 | 固定链接 | 评论: 186 | 引用: 920 | 查看次数: 4233

由红外编码6222与NV9200说开来的

红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空调机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。通用红外遥控系统由发射和接收两大部分组成,应用编/解码专用集成电路芯片来进行控制操作,发射部分包括键盘矩阵、编码调制、LED红外发送器;接收部分包括光、电转换放大器、解调、解码电路。
通用型红外编码6222广泛用到玩具,DVD,彩电等数码产品,其编码简单、纠错性强,有诸多现成的编码格式芯片,外接相应按键电路即可组成发射端,现已推广用于多类简单电器产品上;由于编码格式中发送的是代表8位有效键值码,所以理想情况可以表示255个按键(当然受编码端电路的限制),接收端解码检索出来以后,可直接当作键值来调用相应的按键处理子程序,相于发射端来说,编码要简单,但对接收端来说,需处理的任务较繁琐。
三菱的09NV是一组专用于空调上的红外编码格式,他的编码数据有别于传统的红外编码,其解码检索出来的数据可直接参与程式的运行操作,减少了接受端很多工作量,其接受端的运行情况完全由发送端掌控,数据编码格式较长,有统一的数据定义规范,采用校验和来纠错,在解码检索有时会受外界的干扰原困,出现解码错误,因此对于部分要直接参与到程式运行的数据,需做二次备份,即在校验和核对正确之后,才可把要运行数据另存实际程式调用的RAM单元,否则有时可能出现非意愿性调用错误;
另我们在解码检索一段未知编码时,可借用RAM单元来查看编码数据:先用示波器大概看一下编码格式的起始码、结束码、数据0、数据1的占空比宽度,在共同调用解码程式段,适当调整这诸多占空比宽度的时间范围,(当然在正常的解码程式中也需设定合适的占空比时间范围,不然红外码受外界干扰波形失真时容错性将很差),采用断点多次调试,就可检索出大致的数据格式。

查看更多...

分类:工作笔记 | 固定链接 | 评论: 194 | 引用: 4422 | 查看次数: 6084

软 件 模 拟IIC 的 实 现

对于IIC总线时序的软件模拟,在实际的运用中得到了广泛的采纳,有些单片机厂家既不想购买PHILIPS公司的知识产权,又不妨碍其单片机开发者使用IIC总线技术外扩丰富廉价的IIC外围器件,以软件模拟IIC总线是一种可行的解决方案;
在利用单片机的普通I/O口模拟IIC总线的通信时序时,单片机的时钟频率必须满足SDA和SCL信号线的上升沿和下降沿的时间要求,因此,在时序模拟时最重要的是确保典型信号的时序要求,例如启动信号、停止信号、位传送、应答位等,这时就需要分析和研究IIC总线的时间参数的定义和限制范围
SCL 时钟的低电平周期  tlow 1.3us
SCL 时钟的高电平周期  Thigh 0.6us

查看更多...

分类:工作笔记 | 固定链接 | 评论: 37 | 引用: 4092 | 查看次数: 4474