这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » MCU » 给大家转载几篇Get Over it相关文章

共19条 1/2 1 2 跳转至

给大家转载几篇Get Over it相关文章

工程师
2009-08-28 06:46:28     打赏

 

大家作为参考,里面有不少都是经验之谈啊!


一个复位电路故障分析及改进报告
l问题提出:

根据客户反馈的信息,公司的一款产品在电源插拔过程中及点火过程中经常发生里程数据丢失或错乱的现象。

在我们自己的测试中,也发现了同样的问题。具体表现如下:

1、里程数据丢失,或错乱

2、显示乱码

3、指针乱走

4、死机,有时能自动恢复(可能是看门狗起作用了),但有时不能恢复。

而在旧版中,没有该问题。

l问题分析:

根据有关现象,我们主要怀疑以下几个方面:

1、软件部分,由于新版与旧版经历了好几次软件改动。所以一开始怀疑是否软件在历次改动中出了差错。后经过仔细检查软件,没有发现问题。另外,由于有时有死机现象发生,也说明问题不是软件造成的。

2、芯片封装方面,由于新版采用公司自己的封装,而旧版采用的是原厂封装。所以我们也怀疑过是否是因为封装的问题。我们重新用原厂封装的芯片烧录了新的程序测试,但问题依旧。说明问题不是出在芯片封装方面。

3、最后,我们把关注的焦点集中在复位电路上。原来的复位电路比较简单,芯片的RESET脚只是通过一个上拉电阻接到接到VDD上。在频繁插拔过程中容易造成复位不良。

l问题解决方案:

根据以上分析,我们采用以下复位电路(见附件“复位电路.jpg”):


 


采用该复位电路后,问题得到了解决。通过示波器可以看出改进前后复位脚上信号的变化(见附件“波形图.jpg”):

复位电路.JPG (5.56 KB)

下载次数:26

2009-8-4 00:04

 

 

复位电路.JPG

波形图.JPG (9.73 KB)

下载次数:12

2009-8-4 00:04

 

 

波形图.JPG

     



关键词: 大家     转载     几篇     相关     文章     问题    

工程师
2009-08-28 06:47:32     打赏
2楼
一个复位电路故障分析及改进报告
l问题提出:

根据客户反馈的信息,公司的一款产品在电源插拔过程中及点火过程中经常发生里程数据丢失或错乱的现象。

在我们自己的测试中,也发现了同样的问题。具体表现如下:

1、里程数据丢失,或错乱

2、显示乱码

3、指针乱走

4、死机,有时能自动恢复(可能是看门狗起作用了),但有时不能恢复。

而在旧版中,没有该问题。

l问题分析:

根据有关现象,我们主要怀疑以下几个方面:

1、软件部分,由于新版与旧版经历了好几次软件改动。所以一开始怀疑是否软件在历次改动中出了差错。后经过仔细检查软件,没有发现问题。另外,由于有时有死机现象发生,也说明问题不是软件造成的。

2、芯片封装方面,由于新版采用公司自己的封装,而旧版采用的是原厂封装。所以我们也怀疑过是否是因为封装的问题。我们重新用原厂封装的芯片烧录了新的程序测试,但问题依旧。说明问题不是出在芯片封装方面。

3、最后,我们把关注的焦点集中在复位电路上。原来的复位电路比较简单,芯片的RESET脚只是通过一个上拉电阻接到接到VDD上。在频繁插拔过程中容易造成复位不良。

l问题解决方案:

根据以上分析,我们采用以下复位电路(见附件“复位电路.jpg”):


 


采用该复位电路后,问题得到了解决。通过示波器可以看出改进前后复位脚上信号的变化(见附件“波形图.jpg”):

复位电路.JPG (5.56 KB)

下载次数:26

2009-8-4 00:04

 

 

复位电路.JPG

波形图.JPG (9.73 KB)

下载次数:12

2009-8-4 00:04

 

 

波形图.JPG

   

工程师
2009-08-28 06:50:37     打赏
3楼
  睬上数据类型自动转换的雷区
问题提出:
  测试MP3过程中,发现用小容量(32M)的的SD卡能正常工作,换上一个2G的SD卡,测试时发现无**常播放。哈哈,朋友开玩笑说,穷苦人家吃上一顿大鱼大肉还会消化不良的,肯定是虫子在里面作怪。

问题分析:
  根据故障现象,可以断定软件的基本流程是可行了,小容量与大容量的区别就在于某些变量的取值的不一样,于是查找软件定义的全局变量是否符合规范。打开FAT文档对照全局变量进行检查
//文件系统用全局变量
UINT32 BootSector;  /* 逻辑盘的起始绝对扇区号LBA */
UINT8 SecPerClus;  /* 逻辑盘的每簇扇区数 */
UINT8 RsvdSecCnt;  /* 逻辑盘的保留扇区数 */
UINT16 FATSz16;  /* FAT16逻辑盘的FAT表占用的扇区数 */
UINT32  FATStartSecotr;  /*FAT表起始扇区号*/
UINT32  BootDirStart; //根目录的起始扇区号
UINT32  DiskDataStart; /*存放数据的起始扇区号*/
还真找到了一个变量定义的不符合规范,立马仿真调试跟踪,发现高兴得太早,这个BUG不是致命BUG,是个良性的BUG。
  变量检查完了,开始查找功能函数,从前往后扫了一遍。发现如下函数
/* 将簇号转换为绝对LBA扇区地址 */
UINT32 mClusterToLba( UINT16 iCluster )
{
return( DiskDataStart + (( iCluster - 2 ) * SecPerClus );  /* 将簇号转换为LBA,得当前操作的起始LBA */
}
根据过去的经验,数据类型转换是个危险地带,此函数表面上看似乎能用,但是是短整型数X字节再加长整型数,最后的结果是长整形数。十有**就是在这儿碰上地雷了。

问题解决:
  采用如下写法,编译链接下载后,插2G的卡验证是否能正常使用
/* 将簇号转换为绝对LBA扇区地址 */
UINT32 mClusterToLba( UINT16 iCluster )
{
return( DiskDataStart + ((UINT32)( iCluster - 2 )) * SecPerClus );  /* 将簇号转换为LBA,得当前操作的起始LBA */
}
一切正常,哈哈,穷苦人吃鱼的确得小心,鱼刺有时不容易发现的。

小结:
此类BUG的根本原因是Keil c51开发系统中短整型数(UINT16)相乘时不会自动转换成长整型。所以要先进行类型转换,也可以在数值后面加L来指时,以前在使用AT45DB161D进行地址计算时也出过错。此次软件因为是从其它地方找来改的,所以存在BUG也是很正常的,但利用过去的经验很快就排雷成功。
所以大家在写软件时,遇到此类运算,务必提前作好强制类型转换的声明,就能避免犯错。

工程师
2009-08-28 06:52:25     打赏
4楼

液晶ESD和PCB温升故障分析

 

------------------------------------
一个带液晶显示的温度控制器故障分析及改进报告
l问题提出:
在开发一款带液晶显示的温度控制器的过程中,
碰见两个主要问题具体表现如下:
1、
液晶显示无法通过-8KV的接触ESD测试;静电测试后液晶显示不全,而很容易通过了12KV的空气放电;
背景:企业内部标准是通过ESD的标准是接触放电±8KV,空气放电通过±12KV;
2、
控制器采用开关电源设计,PCB电路板的温升导致温度显示明显偏高环境温度;
而在以往设计用电池供电的类似产品中,没有该问题。
l问题分析:
针对液晶显示无法通过-8KV的接触ESD的问题:
1.
分析出液晶显示不良到底是什么问题:费了不少功夫把27个引脚的液晶全部换下,重新换上新的LCD,结果段码显示不全依旧;
2.
开始怀疑静电测试中,LCD没有坏,可能是液晶驱动芯片出了问题,重新换掉驱动液晶32脚的贴片MCU,显示正常,定位驱动芯片被静电打坏;
3.
增加串联电阻提高驱动液晶MCU的抗干扰的能力,重新做试验失败;
4.
建议改LCD的外壳设计,延长静电测试点与MCU引脚的距离,公司层面坚持不该外壳,方案不成立;
5.
建议增加液晶接地的面积,或增加铁环,消除静电,改PCB和改液晶成本太大,放弃此方案;
6.
建议在液晶表面增加抗ESD薄膜,找了几个样品,经过多次做试验,仍然通过不了试验;
7.
其它的方案,效仿手机贴膜,PTC薄膜――――――

针对PCB电路板的温升导致温度显示明显偏高的问题:
1.
分析电路中可能产生的温升情况:一方面是开关电源芯片,温升参数分析高于环境温度7℃;另一方面是单片机的温度身高的情况;
2.
电路设计,一方面:DC/DC设计中,PCB布局上已经考虑到发热情况,让开关电源与温度传感器尽量的远;另外一方面是单片机MCU无法与温度传感器太远,处于电路板的中央;
3.
用红外热成像仪分析电路板的发热情况:发现开关电源温度比实际温度高7摄氏度;单片机的温度比环境温度高5摄氏度;
4.
在温度箱中,用专业温度采集工具,精确的分析出显示温度比实际温度高出多少。模拟温控器的安装高度,在通风的环境中模拟,在封闭的环境中模拟,把温控器导致,让放热电路处于不同的方位,分析出电路板的温升情况,综合各方面的情况高出环境温度2摄氏度左右;
5.
改温度传感器附近PCB的布线,减少温度传感器底下覆铜;
6.
改变温度传感器引脚的长度,以及弯折情况;
7.
最后的办法软件补偿温度差;
l问题解决方案:
根据以上分析,
针对液晶显示无法通过-8KV的接触ESD的问题;最后我们通过采用贴PTC膜,并且膜一定要盖住液晶的27个引脚,并超过一个毫米,成功通过了静电测试试验;
针对PCB电路板的温升导致温度显示明显偏高的问题:最后我们改了PCB温度传感器的覆铜,改变了温度传感器引脚的长度和弯折情况,经过反复测试,加上0.9摄氏度的温度软件补偿,实现了温度的准确控制。

谢谢!
菁菁木华
2009-08-05

工程师
2009-08-28 06:55:06     打赏
5楼
  高速光耦隔离H桥之痛


记得很久很久以前有一次突然想搞一个全光耦隔离的,H桥高速驱动电路,结果花啊花啊,没多久就画出来了,还没有测试就贴到了论坛上去,结果被网友笑话了一场,虽然很丢面子,但是还是确确实实学到了很多东西的说的。现在就来说说我当初的这次经历吧^_^
未命名.GIF 下载 (23.16 KB)
2009-8-8 09:17
                                                                                                                                                                                          
论坛的关系图片有点小,大家还是点开来仔细看吧

当初之所以认为这个电路能实现高速光耦隔离的H桥驱动,实际上也就是看中了那个6N137(这里用PS9601替代)的高速特性,因为使用6N137就一定能够实现高速的特性,结果就想当然的连接了一下以为就可以实现高速的H桥驱动了,其实完全不是怎么一回事的,

这里我就给大家说说这样的电路有哪些问题吧

第一,vmos虽然看似是电压驱动器件,但是实际上还是需要拥有相当低驱动内阻的器件才能使它高速的开关的,为什么呢,因为vmos存在着一个容量非常可观的Cgs,也就是G和S电极之间的等效电容,这个电容的容量差不多有2000p左右,视具体管子有所出入,但是都不小的说,由于这个电容的存在,就导致了这个电路的速度永远都不可能达到高速,我们显卡左下角的M1管子,可以看到关断是使用的三极管关断的,可能这个勉强还算过的去的,但是Vgs的上升就要缓慢的多了,因为它有一个rc时间,差不多是10k*2000p这个时间可不短了哦。可想而知M1的导通是多么的缓慢的说。再来看看更要命的M2吧,这是一个PVMOS的功率管,可以看到这样的当M2开启的时候是由晶体管来控制的所以相对来说还是过的去的,那过不去的就是关断时间了,这个就真的比较要命了,由于MOS管的特性,关断时间远慢于开启的时间。结果就是M2还没有关断的情况下,M1就已经开始慢慢导通了,导致了两个管子上下导通产生了相当大的电流,用不了多久内阻稍大的P沟道M2这个管子就会发热严重,慢慢的就过热烧毁了。这就是为什么很多人都说H桥容易烧P管的原因了。


第二,我们再来看看这里的vmos的控制电压,由于受制于6n137的工作电压,Vgs最高只有5v,远低于irf640的完全导通电压,所以导致vmos始终工作在高内阻区,功率管发热严重,所以这样的电路是绝对不具有任何实用性的。

既然分析后知道了上述原因,那我们应该如何才能修正这样的问题呢?
其实原本是很复杂的,简单的说就是6n137后面接放大电路,然后再推挽控制mos管子的开关和关断,

20070107141200243s.jpg 下载 (14.43 KB)
2009-8-6 22:24

大家可以参考这个电路的原理,但是实际上这样的电路由于结构复杂,非常不适合实际使用,同时由于放大器也具有可观的延迟,所以最终还是破坏了我们得到高速隔离mos管驱动的目的。要速度快就要用高速运放,还是价格很可观的哦。所以不建议使用

不过现在就比较方便了,推荐使用专用的mos管驱动用光耦,比如东芝的tlp250就是不错的选择

捕获5.gif 下载 (20.45 KB)
2009-8-8 09:06

大家可以看到内部已经帮我们集成了放大器和驱动电路了,能够在保证基本速度的情况下极大的简化外围电路的使用,方便我们简化H桥的电路,强力推荐使用

说道这里再给大家说个事情吧,那就是光耦隔离下的uart的串口通讯问题,

记得有不少朋友都碰到过,就是一个串口接上了普通的低速光耦,结果串口通讯就无论如何也调试不出来了,非要使用6n137这样昂贵的高速光耦才能正常通讯,其实不然,这里我教大家一个使用普通廉价低速光耦也能完成基本串口通讯的方法吧

未命名2.GIF 下载 (5.82 KB)
2009-8-6 22:24


如图所见,大家可以看到了这是市面上及其常见的廉价的ps2501光耦,我是因为pspice里面就它有模型才调用的其实别的电路也都一样的因为基本上它就是最烂最便宜的那个的代表了,不过通过19200波特率还是很轻松的

我们可以翻看他的手册,得知tr=3us tf=5us 这点速度已经远小于19200波特的26us的脉冲宽度了,所以器件理论上是可行的

再来看一下为什么平时大家都接的但是却不好用,这里给大家分析一下原因吧

我们要知道光耦的速度和光耦输出三极管工作电流有关系,为什么呢,因为工作电流越大,r24就必须越小,r24越小,这样r24和晶体管本身的结电容的rc充放电时间就短,这个rc时间短了,晶体管的开关速度也就自然上升了,但是晶体管的工作电流是由发光二极管的光照强度决定的,还有电流传输比决定的,所以发光二极管的点亮电流也要适当增加才能满足隔离晶体管的电流需求,一般cpu的io可能不能提供如此大的电流,所以这里使用一个8550做了一级电流放大,当然如果你的单片机驱动电流够大的情况下也可以不用这个三极管。还有一点就是可以看到后面的这个三极管是接的共集电极接法,而不是常见的共发射极接法,这是因为共集电极接法的速度远比共发射极接法来的快,同理前面的Q2也用的是共集电极接法来尽可能的提高光耦的速度,减少延迟。
再说一下光耦的电流也不是可以无限制增加的,最好在使用之前看一下手册上说明的最大工作电流,然后计算好适合的电阻再用。否则容易烧毁光耦。
最后给大家几张仿真的测试图片
捕获3.gif 下载 (37.21 KB)
2009-8-6 22:24

这个是工作在19200波特率下,电压3.3v情况下的光耦发光二极管电流和晶体三极管的电流仿真图



捕获4.gif 下载 (40.52 KB)
2009-8-6 22:24
这张图实在同等测试条件下的电压曲线图,可以看到ps2501这个垃圾光耦在19200的波特率下的波形良好,使用完全没有任何问题^_^


补充一下r24和r23的计算方法,r24等于(电源电压-0.2v)除以手册上的晶体管的极限工作电流,
r23等于晶体管的极限工作电流除以电流传输比,得出发光二极管需要多少电流就可以让后面的晶体管完全饱和了。

然后用(电源电压-1.8v)除以这个电流,就是r23的取值了,当然在满足速度的情况下r23和r24都可以适当增大阻止减少功耗

工程师
2009-08-28 06:56:59     打赏
6楼

HT1381等类似RTC的问题和处理!

 
04年的时候,我曾经在HOLTEK官方网站上发了一个帖子,讨论HT1381的OSC停振的问题,这么多年了,经常收到各地的网友打过来的电话问最后是怎么解决的,哈哈,俺就回忆回忆整理一下公布给大家拉。

问题描述:
1、设计时未发现有类似问题,但在批量投产后出现一定比例的OSC停振甚至是时振时不振荡的问题。
2、设计时,基本以工程师自己手工焊接,批量投产后,手工焊接和机器焊接都有,这主要是因为我们存在销售淡旺季,如果定单在淡季来到,为了养活工人,让他们有事情可做,就会选择手工焊接。
3、造成的后果,客户返回的部分故障机器经分析为此问题造成。
初步解决:
1、生产过程中发现此问题后,一般通过更换晶体后可解决,但更换下来的晶体焊接到别的机器上,发现有很多竟然可以正常工作。
2、加强出厂老化检查,将老化时间加长到72小时,但这显然拉长了生产、销售的周转时间,因为该产品多数销售到欧洲,为了赶船期,很多时候可能无法完成72小时老化就需要出厂。
3、曾经快递了3台产品至上海盛阳的某工程师(名字就不透露了),久经讨论无果。
4、上网查找资料,发现周立功网站上有一篇资料谈到了这个问题,其解释为:因为HT1381为了做到低功耗,故振荡的驱动功率比较低(该结论正确)。其给出的建议是:使用烙铁烫一下晶体,美其名曰为激活和振荡学习(该方式给我们造成了更大的损失)。虽然,当时俺从来没听说这个概念,但还是通知工程部门按照此尝试执行了一批以观察效果,但最终的统计结果是故障率更高。
最终解决:
1、一次无意的测试中,发现一些OSC停振的RTC,挪动了一下晶体的位置后,竟然振荡的波形很好,反复测试,发现只要这些产品如果把晶体按平到PCB上则振荡幅度很小甚至停振,随着离开PCB的距离加大,出现了振荡幅度慢慢加大的现象。
2、经检查,设计理论似乎没错,晶体外壳遵照一般常规理解被焊接到了GND上,但目前这个GND显然不能焊接了,思考之下,估计为晶体绝缘度不够造成。
3、估计结论:当晶体两个引脚和本身的壳体绝缘度不够的时候,类似与壳体的金属材质和GND铜皮形成了一个电容结构,因为32768晶体的谐振电容一般都比较小,我们最初使用的是2PF的,根据我的测试,当谐振电容接到4PF时,振荡就不稳定甚至停振了。
4、随对晶体进行失效分析,证实很多晶体本身确实存在这个问题(晶体质量差),另有一部分应该是焊接温度和时间没控制好,导致的内部石英晶体熔融现象,熔融之后绝缘度也出现了明显下降。
5、解决方案:
(1)更换晶体厂家为日本KDS(原来是南京的一家国产晶体厂家),型号为32.768KHZ,10PPM,12.5PF负载电容,2*6体积,选择这个也是因为这是他们价格最好的一个型号,原来选择的国产5PPM的经过测试,实际为20PPM的,在此鄙视一下国产厂家的作假行为。
(2)将晶体下部的GND铜皮挖掉,如图附件。
(3)加强焊接控制,避免过热焊接
(4)原通孔状晶体引脚改为采用SMD方式,在生产时,如果采用通孔状,工人在焊接后卧倒晶体时,容易导致晶体引脚和晶体壳体相碰的现象,这也是一个较高的故障点。

截图00.jpg (39.19 KB)

下载次数:1

2009-8-20 11:19

 

工程师
2009-08-28 06:59:04     打赏
7楼
  我的一次STM32 ISP下载稳定性调试经历  


问题提出:
      我用万用核心板焊了一个STM32F103CBT6的核心板,用来外出演示手持编程机的功能。
      但演示的时候,偶尔出现找不到芯片,需要用手碰一下连接线或者插座,才找到芯片,开始下载。
问题分析:
      首先,没有怀疑手持机的硬件问题,或者软件处理的问题,因为已经有客户用在生产线上批量烧录,未返回任何问题(不可能有问题不找偶,一千多块钱呢!!!)。
      直观的分析,得出的结论是连接线与插座接触不好。于是更换连接线,粗略测试,貌似未出现不良现象。
      不料,又一次现场演示,连接仍不灵敏,那个汗呀 ,这次可是当着业界有力人士的面。好彩此兄似乎未注意到 ,偷偷用手碰下,“蒙混过关”。
      回到家,立下决心,要拔除此隐患。
      把核心板的连线全部焊掉,重新焊接,结果依旧有故障现象。
      难道知名的“复位时TXD浮空导致发送乱码”的处理逻辑存在Bug?这个逻辑,手持机与已经广泛使用的"mcuisp.exe"是一样的呀!
      通过软件跟踪,发现有问题的时候,芯片没有任何发送,而不是发送了乱码。
      使用了“秘制”的干扰发生器--一个负离子模块贴在芯片施加干扰,故障现象并无明显改变。
      最后,调出stm32 datasheet,一个管脚一个管脚查过去,最后发现一个大问题:本该接到20脚PB2(BOOT1)的下拉电阻被我焊到21脚PB10了,造成BOOT1实际上是浮空的。如此一来,复位后,芯片随机的从System Bootloader或SRAM引导。当然会导致连接不良。
解决方案:
     把下拉电阻焊到20脚PB2(BOOT1),测试了一下午,非常稳定了(有点心疼,虽然有10k次寿命,那也是测一次少一次呀)。
经验教训:
     自己用的演示板也是产品,发现问题要一查到底,确诊问题所在。
     要抽时间改进一下万用核心板,增加一些丝印,减少出错几率。
经常有兄弟找我咨询STM32 ISP的问题,大都发现是目标板硬件不稳定,没想到我自己也在此栽了次跟头。

工程师
2009-08-28 07:00:44     打赏
8楼
MCU上电复位不良--差点杀公鸡祭拜~~  
很早以前写在博客上的,还是有点分享价值的。转过来和大家分享下。

正文
-------------------------------------------------
昨晚在调试AVR 单片机时又有一些心得体会,虽然结论是一个很小的问题造成的,但在此还是写出来给大家参考,避免走弯路。


事件描述:
       以前用AVR的芯片也做过好几个设计,从来没有怀疑过ATMEL的芯片的稳定性,以前的几个方案都是很稳定的,当然这跟PCB的设计有很大的关系,如果大家需要PCB相关参考资料的话可以到本站的PCB技术专栏里查找,那里有很多前辈的PCB布板心得。
        这次用的ATmega48制作的串口电压表就出现一个很奇怪的现象,电路板是用万能板焊接的,程序里用到ADC功能和串口通讯功能,用的AVR下载工具是STK500,每次下载程序后芯片总是不能正常复位工作,还要读取下芯片的特征字或熔丝位让芯片重新复位下才能工作,这时候复位后工作都稳定,没出现什么不正常。刚开始不在意这个问题,因为在开发的初期用AVR DRAGON仿真调试部分功能时复位脚不能接任何器件,所以也就把复位脚悬着不接复位电路,以为是没接阻容复位而造成不稳定。在此还是没有怀疑过芯片的问题。
         直到后来这个程序都开发完毕了,给ATMEGA48加上 一个10K的上拉电阻和0.1uF的电容做复位,把ISP线拔掉,独立给串口电压表上电(因为当时都是用几个电路模块连接做实验,串口电平转换电路也是独立的,初期串口调试已经都通过了,所以我把这个串口电平转换模块的连线都拔掉了),问题来了,上电不工作,手动把复位脚接地后放开可以工作,但过了一会后还是死了,加看门狗后还是老样,没有任何改善,每次手动复位正常工作后,把手指头放在ATMEGA48的1、2、3脚上方慢慢靠近,手指头还没碰到芯片就死机了~~~不会吧,没这么脆弱吧。以前用AVR Tiny26做的控制器,把手机放在芯片上方然后拨打10086都不会死机。不会中奖了吧,又不是第一次搞单片机,难道真要像以前论坛里的朋友开玩笑说:要杀只大公鸡祭拜下~~~
        奇怪啊~~~实在没招,把串口电平转换电路给接上继续调试下,这时候再上电每次都是正常工作,而如果再把串口电平转换电路断开则又不能正常复位工作~~~手动复位后把手再靠近芯片的1、2、3脚上方就又马上死机~~~狂晕~~~~不是吧~~~ATMEGA48的第一脚是RST,2、3两脚刚好是RXD、TXD串行引脚,难道真的是这个串口干扰引脚影响到复位电路?不可能吧,ATMEGA48芯片用得人多的是,各方面的应用都有,不可能是芯片的缺陷,还是多怀疑下自己吧...重新再好好看看自己的程序吧...
        程序里开始首先是对IO做初始化,TXD配置为输出,还有其他相关IO配置。然后是对定时器的一些初始化,再就是对串口的一些初始化了。看了下程序,在初始化的时候就把串口中断发送、接收允许都使能了,难道是这里的问题?串口电压表在实际工作的时候串口其实不是在一直工作的,是通过一个开关选择接地才发送数据,平时是不发送的,而在不接串口电平转换电路的时候RXD、TXD都是是悬空的,只有TXD为输出有上拉,RXD没有使能上拉,这时候RXD是最容易被外部干扰的,这就是问题的所在了。当然如果串口电平转换电路都连接着,那就没这个问题,因为串口电平转换电路已经把RXD的电平给钳住了。解决的方法很简单:在初始化串口的时候关闭串口中断使能,在主程序里需要发送数据的时候再使能串口,发送完马上关闭就可以。至此问题解决,这时候看你再怎么去“摸”ATMEGA48的引脚或封装都没有再出现任何的死机情况,每次上电复位都是非常的稳定。(把AVR的BOD熔丝打开可增加复位的可靠性,BOD LEVEL根据实际的电源电压进行选择,这里的电源是5V,所以BOD LEVEL选4.3V)


总结教训:
        这是自己的粗心大意、芯片内部功能的没有合理性利用的表现。在此引以为戒!告诉自己:不要以为自己做过一些小项目就飘飘然起来,不要动不动就去怀疑人家半导体厂家芯片的稳定性,要多怀疑自己才是。往往可能最基本的问题没注意而花费了很多的时间,自己做着玩的东西那都无所谓了,如果你是给别人打工呢?那性质就完全不一样了!

下图为AVR单片机 典型外部复位电路:
        AVR单片机已经内置了上电复位设计。并且在熔丝位里,可以控制复位时的额外时间,故AVR外部的复位线路在上电时,可以设计得很简单:直接拉一只10K的电阻到VCC即可。


        为了可靠,再加上一只0.1uF的电容以消除干扰、杂波。


        二极管1N4148的作用有两个:作用一是将复位输入的最高电压钳在Vcc+0.5V 左右,另一作用是系统断电时,将10K电阻短路,让0.1uF的电容快速放电,让下一次来电时,能产生有效的复位。


        当AVR在工作时,按下开关S 时,复位脚变成低电平,触发AVR芯片复位。

工程师
2009-08-28 07:02:00     打赏
9楼

工作后第一次做项目的教训与经验

 


    自从匠人发出号召后,马上就有一些网友积极响应,道出了自己的一些很好的经验,大家说得我的手也痒痒的,今天终于忍不住把我工作后的一些教训与经验写下来和大伙交流,之所以把教训放在经验之前,是因为我感觉主要是一些教训啦!感觉这次真的挺失败的,犯了不少低级错误,那接下来就容许俺为大伙娓娓道来啦~~

 


    说是一个项目,其实就是为我们公司的一款产品做一个功能测试工装。因为我看是一个挺简单的东西,而且硬件也被一个工程师搞好了,用的AVR单片机我也比较擅长,我无非就是写写程序,于是一口气就答应下来说:一个星期搞定!想想那时候也是急于表现自己,惭愧啊!

 


    谁知最简单的LCD12864就把我给难住了,看手册,写程序,不亮!改,参考别人的程序,写进去还是不亮!这可把我搞蒙了,是硬件有问题么?我开始问搞硬件的工程师,他说,硬件绝对没问题,这个硬件我们一直都在用。行家说的能有错吗?没办法,又开始调程序,搞了一整天,毫无结果,LCD顶多显示些乱码,难道是下载器有问题,下不了程序?我又写了几个简单程序进去,都没问题啊!这下可急我一头汗,最后还是头昏脑胀的回了家,回家后饭也吃不下了,就把我写的程序在我的板子上运行了一下,LCD正常显示,难道真是公司的硬件出了问题?

 


    第二天,我一上班,就拆开硬件,仔细的检查。果不出所料,硬件还真出了问题,原理图上的LCD模块的ENRS引脚定义和实际硬件正好相反。那一刻,兴奋啊!第一个拦路虎终于解决了,但事后这件事对我的最大教训是:实践出真知!不能过分相信权威,不能想当然,凡事都要自己去实践,去验证!这一点对于我们工程师来说至关重要!

 


    接下来开始进入真正的设计阶段了,到了做的时候才发现,让我做工装的人和我都不清楚产品的原理和具体的要求。我只有自己查资料,了解产品,测波形,挖掘客户要求。最后发现他的要求我根本不可能实现,于是就和他沟通,达成一致要求。而且设计硬件的工程师也没弄清要求,我只好又修改硬件,这段时间通过上次的教训,我遇到问题,积极思考,终于确定了硬件环境和要求,这也极大的树立了信心!这个阶段,我没有太急躁,思考的比较多,过得还算充实。所以我给大伙提个醒:作为咱们工程师和所有有志于进入我们工程师行列的学生们一定要思考,思考,再思考!

 


    接下来程序的组织和编写花了我近两天的时间,到了调试阶段,又出现问题了:产品反馈给单片机的信号总是固定的有几个检测不到,因为在学校时没做过此类东东,以至于调试了两天都没调出来搞的我焦头烂额的,结果因为整天死盯着电脑,精神压力又大,眼睛都长包了,挨了几针才好。最后还是在多方查找下,听网上有人说可能需要滤波,最后在加了滤波电路,程序才能够正常运行。从这次调试经历,我才了解到,做产品时滤波是何等重要(怪不得匠人要深入研究呢,以后得好好体会啊)。这几天我也领悟了:工作时精神上要放松,多与人交流,不间断的学习!

 


     这个小小的项目花了近半个月的时间才完成,以至于以后说话也不敢那么狂了,得先弄清楚再说。这次项目,我记住了三个字:实践,认真,思考!


工程师
2009-08-28 07:03:42     打赏
10楼
  C8051F 进不了main函数问题解决办法  


这是以前我遇到的,在ednchina上发过,现重新整理了一下,我的目标是ARM9,谁都表跟我抢
提出问题:
前一阵在做C8051F340的一个程序,用到USB,我在修改了他的Demo,加了一些数据在xdata里,程序编译通过,无错误无警告,但在仿真的时候一直进不了main函数
分析问题:
子曾经曰过:“知之为知之,不知google之,是知也”。于是遇到这问题,我首先google之,发现很多人遇到了和我一样的问题,还有很多人在百度知道上提出了,但一直没有解决,经过查阅大量的网页,借鉴别人的经验,站在前辈的肩上(没跟他们商量,我就自作主张站上去了),再加上自己的一点点思考,终于发现问题的存在
单片在进入main函数之前,会执行启动代码,由于我长时间用C,潜意识CPU上电就会跳到main的入口,我记得N年以前写汇编的时候,也是在0000H地址处加一个跳转指令直接跳到main函数的,从来没注意过启动代码,这次栽了跟头才好好的看了看
由于我原程序在xdata开辟了大量的数据,在启动代码中
IF XDATALEN <> 0
                MOV     DPTR,#XDATASTART
                MOV     R7,#LOW (XDATALEN)
  IF (LOW (XDATALEN)) <> 0
                MOV     R6,#(HIGH (XDATALEN)) +1
  ELSE
                MOV     R6,#HIGH (XDATALEN)
  ENDIF
                CLR     A
XDATALOOP:      MOVX    @DPTR,A
                INC     DPTR
                DJNZ    R7,XDATALOOP
                DJNZ    R6,XDATALOOP
ENDIF
会执行xdata的初始化,由于C8051F340有看门狗,而看门狗默认是开启的,我一般会在main函数的第一句话把看门狗关闭,由于定义的xdata很大,在启动代码中执行初始化时间远远超过了喂狗时间,所有导致执行启动代码的过程中看门狗复位,一直进不了主程序,关不了狗,够就一直复位,无限循环。。。。。
解决问题:
修改STARTUP.A51函数,在启动代码中关闭看门狗如下:
$NOMOD51
;------------------------------------------------------------------------------
;  This file is part of the C51 Compiler package
;  Copyright (c) 1988-2005 Keil Elektronik GmbH and Keil Software, Inc.
;  Version 8.01
;
;  *** <<< Use Configuration Wizard in Context Menu >>> ***
;------------------------------------------------------------------------------
;  STARTUP.A51:  This code is executed after processor reset.
;
;  To translate this file use A51 with the following invocation:
;
;     A51 STARTUP.A51
;
;  To link the modified STARTUP.OBJ file to your application use the following
;  Lx51 invocation:
;
;     Lx51 your object file list, STARTUP.OBJ  controls
;
;------------------------------------------------------------------------------
;
;  User-defined <h> Power-On Initialization of Memory
;
;  With the following EQU statements the initialization of memory
;  at processor reset can be defined:
;
; <o> IDATALEN: IDATA memory size <0x0-0x100>
;     <i> Note: The absolute start-address of IDATA memory is always 0
;     <i>       The IDATA space overlaps physically the DATA and BIT areas.

IDATALEN        EQU     80H
;
; <o> XDATASTART: XDATA memory start address <0x0-0xFFFF>
;     <i> The absolute start address of XDATA memory
XDATASTART      EQU     0   
;
; <o> XDATALEN: XDATA memory size <0x0-0xFFFF>
;     <i> The length of XDATA memory in bytes.
XDATALEN        EQU     0     
;
; <o> PDATASTART: PDATA memory start address <0x0-0xFFFF>
;     <i> The absolute start address of PDATA memory
PDATASTART      EQU     0H
;
; <o> PDATALEN: PDATA memory size <0x0-0xFF>
;     <i> The length of PDATA memory in bytes.
PDATALEN        EQU     0H
;
;</h>
;------------------------------------------------------------------------------
;
;<h> Reentrant Stack Initialization
;
;  The following EQU statements define the stack pointer for reentrant
;  functions and initialized it:
;
; <h> Stack Space for reentrant functions in the SMALL model.
;  <q> IBPSTACK: Enable SMALL model reentrant stack
;     <i> Stack space for reentrant functions in the SMALL model.
IBPSTACK        EQU     0       ; set to 1 if small reentrant is used.
;  <o> IBPSTACKTOP: End address of SMALL model stack <0x0-0xFF>
;     <i> Set the top of the stack to the highest location.
IBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1
; </h>
;
; <h> Stack Space for reentrant functions in the LARGE model.     
;  <q> XBPSTACK: Enable LARGE model reentrant stack
;     <i> Stack space for reentrant functions in the LARGE model.
XBPSTACK        EQU     0       ; set to 1 if large reentrant is used.
;  <o> XBPSTACKTOP: End address of LARGE model stack <0x0-0xFFFF>
;     <i> Set the top of the stack to the highest location.
XBPSTACKTOP     EQU     0xFFFF +1   ; default 0FFFFH+1
; </h>
;
; <h> Stack Space for reentrant functions in the COMPACT model.   
;  <q> PBPSTACK: Enable COMPACT model reentrant stack
;     <i> Stack space for reentrant functions in the COMPACT model.
PBPSTACK        EQU     0       ; set to 1 if compact reentrant is used.
;
;   <o> PBPSTACKTOP: End address of COMPACT model stack <0x0-0xFFFF>
;     <i> Set the top of the stack to the highest location.
PBPSTACKTOP     EQU     0xFF +1     ; default 0FFH+1
; </h>
;</h>
;------------------------------------------------------------------------------
;
;  Memory Page for Using the Compact Model with 64 KByte xdata RAM
;  <e>Compact Model Page Definition
;
;  <i>Define the XDATA page used for PDATA variables.
;  <i>PAGE must conform with the PPAGE set in the linker invocation.
;
; Enable pdata memory page initalization
PPAGEENABLE     EQU     0       ; set to 1 if pdata object are used.
;
; <o> PPAGE number <0x0-0xFF>
; <i> uppermost 256-byte address of the page used for PDATA variables.
PPAGE           EQU     0
;
; <o> SFR address which supplies uppermost address byte <0x0-0xFF>
; <i> most 8051 variants use P2 as uppermost address byte
PPAGE_SFR       DATA    0A0H
;
; </e>
;------------------------------------------------------------------------------

; Standard SFR Symbols
ACC     DATA    0E0H
B       DATA    0F0H
SP      DATA    81H
DPL     DATA    82H
DPH     DATA    83H
PCA0MD    DATA  0D9H //Added by auzxj,2009年6月22日

                NAME    ?C_STARTUP


?C_C51STARTUP   SEGMENT   CODE
?STACK          SEGMENT   IDATA

                RSEG    ?STACK
                DS      1

                EXTRN CODE (?C_START)
                PUBLIC  ?C_STARTUP

                CSEG    AT      0
?C_STARTUP:     LJMP    STARTUP1

                RSEG    ?C_C51STARTUP

STARTUP1:

IF IDATALEN <> 0
    ANL   PCA0MD, #NOT(040h)//Added by auzxj,2009年6月22日
                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
ENDIF

IF XDATALEN <> 0
                MOV     DPTR,#XDATASTART
                MOV     R7,#LOW (XDATALEN)
  IF (LOW (XDATALEN)) <> 0
                MOV     R6,#(HIGH (XDATALEN)) +1
  ELSE
                MOV     R6,#HIGH (XDATALEN)
  ENDIF
                CLR     A
XDATALOOP:      MOVX    @DPTR,A
                INC     DPTR
                DJNZ    R7,XDATALOOP
                DJNZ    R6,XDATALOOP
ENDIF

IF PPAGEENABLE <> 0
                MOV     PPAGE_SFR,#PPAGE
ENDIF

IF PDATALEN <> 0
                MOV     R0,#LOW (PDATASTART)
                MOV     R7,#LOW (PDATALEN)
                CLR     A
PDATALOOP:      MOVX    @R0,A
                INC     R0
                DJNZ    R7,PDATALOOP
ENDIF

IF IBPSTACK <> 0
EXTRN DATA (?C_IBP)

                MOV     ?C_IBP,#LOW IBPSTACKTOP
ENDIF

IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)

                MOV     ?C_XBP,#HIGH XBPSTACKTOP
                MOV     ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF

IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
                MOV     ?C_PBP,#LOW PBPSTACKTOP
ENDIF

                MOV     SP,#?STACK-1

; This code is required if you use L51_BANK.A51 with Banking Mode 4
;<h> Code Banking
; <q> Select Bank 0 for L51_BANK.A51 Mode 4
#if 0  
;     <i> Initialize bank mechanism to code bank 0 when using L51_BANK.A51 with Banking Mode 4.
EXTRN CODE (?B_SWITCH0)
                CALL    ?B_SWITCH0      ; init bank mechanism to code bank 0
#endif
;</h>
                LJMP    ?C_START

                END

//修改保存,并把它添加进你的工程

共19条 1/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]