打印

是不是端口的“读-修改-写”问题

[复制链接]
9889|40
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 laibour 于 2011-9-1 09:05 编辑

最近用PIC18F26K20写GSM模块程序的时候出现了一下奇怪的问题,当我直接用PORT端口对FRA0赋高电平(图1),延时一段时间,再同样用PORT端口对FRA1赋高电平(图2),此时先前FRA0上的高电平自动变为了低电平。但是如果两个端口都用LAT锁存器的方式进行同样操作的时候就不会出现上述情况???我看了张明锋的《PIC单片机入门与实战》中举的一个“读-修改-写”的一个例子,但是因为图1中的FRA0有接一个电阻再接到三极管的基极,这样当写FRA1时读回的FRA0应该仍然是高电平啊???

图1.jpg (13.47 KB )

图1.jpg

图2.jpg (9.8 KB )

图2.jpg
沙发
yewuyi| | 2011-9-1 22:15 | 只看该作者
输出请使用LATA寄存器,张明峰写那本书时,还没有退出带LATA寄存器的芯片。

使用特权

评论回复
板凳
laibour|  楼主 | 2011-9-2 08:09 | 只看该作者
输出请使用LATA寄存器,张明峰写那本书时,还没有退出带LATA寄存器的芯片。
yewuyi 发表于 2011-9-1 22:15

以后写程序会改为输出用LAT寄存器了。因为之前输出用PORT寄存器,都没出现过问题。但是还是不太明白在这个地方用PORT寄存器和LAT寄存器有什么差别?

使用特权

评论回复
地板
NE5532| | 2011-9-2 19:00 | 只看该作者
BE极之间的电阻电容干嘛的?

使用特权

评论回复
5
virtualtryon| | 2011-9-2 19:38 | 只看该作者
BE极的电阻电容有两个用途,
一是,I/O输出是有漏电流的,即使是输出0,也不是绝对的地,三极管没有绝对的截止,只要有电流就会被放大。
下拉电阻是为了给漏电流提供通路,避免流过BE级被放大。
也可以考虑为分压,从最坏情况分析,加在BE级两端的电压<0.3V才能认为可靠截止。
另一个是,加上电容一般是为了使边缘平稳,降低信号的上升和下降速度,减少EMI。

使用特权

评论回复
6
NE5532| | 2011-9-2 19:56 | 只看该作者
先抛开0.3怎么来的不说,单片机输出的低电平会到0.3V么?0.1uF电容控制EMI,这个是经常开关的端口么?这么慢的控制速度也太夸张了吧……

使用特权

评论回复
7
virtualtryon| | 2011-9-2 20:58 | 只看该作者
[local]1[/local
B极变化慢不等于C极电流也变化慢,有一个很大的beta在呢.
至于C合不合适,如果是发的是数据,要根据波特率看一下上升,下降率是否合适.
如果是功率输出,要看在线性区停留的时间是否能承受.
功率输出的话,哪怕是一次输出,B极的边缘不做控制,那C极的EMI就不行了了.
如果是感性负载,更是如此.

cc51aeac6a390b5b4a36d6b4.jpg (13.98 KB )

cc51aeac6a390b5b4a36d6b4.jpg

使用特权

评论回复
8
virtualtryon| | 2011-9-2 21:10 | 只看该作者
本帖最后由 virtualtryon 于 2011-9-2 21:13 编辑

至于0.3V的由来,我先传一个图.

0.3V不是凭空想出来的,是某车厂和标准,在全工作温度范围内做WCCA分析时必须要的数值.
可靠性设计就是认为没有绝对的东西,所以的器件,所有的参数都有公差,这个公差不单单是初始公差,还有温度,老化等等。

使用特权

评论回复
9
NE5532| | 2011-9-2 21:23 | 只看该作者
本帖最后由 NE5532 于 2011-9-2 21:30 编辑

楼上你举的例子恰好说明0.3V是不可能的,单片机端口的数据,电流符号是+,是灌电流负载,这里的三极管是NPN型,E极向B极的漏电流在nA级别,根本不可能把单片机端口输出的低电平抬高。

再退一步说,就算有漏电流,单片机输出是MOS推挽结构,47k的电阻和MOS的导通电阻,你说电流是不是该走绝对低阻抗的单片机输出端呢。所以这个电阻根本没用。


可靠性设计还有一条原则就是:言多必失,没必要的东东不要加进去,多一个元件,多一个故障点。

另外EMI也没有道理,9013能开关的频率绝对不是什么高频,单片机系统EMI控制重点是时钟和外扩存储器总线。

使用特权

评论回复
10
virtualtryon| | 2011-9-2 21:55 | 只看该作者
上面那个例子如果是推挽输出应该是不会到0.3V的,但是如果是MOS管的输出,不加下拉电阻,当输出低时,BE极截止,MOS管又是开漏的.这个是高阻态了,不会有问题?
不单单看信号的频率,矩形波的高频成份是非常丰富的,加上一个小电容后高频成份大大削减了.
并不是元器件越少越好,有的时候就是要冗余.
要具体看器件的功能,如果两个器件的功能一样,而且发生故障的事件是相互独立的,那么一个器件出故障的概率如果是1%,那么两个同时出故障的概率就是0.01%了.

使用特权

评论回复
11
NE5532| | 2011-9-2 22:20 | 只看该作者
你是指开漏输出吧,开漏也是推挽的上半柱不要,低电平一样是MOS管在拉呀,还有开漏输出不加外上拉咋可能输出高电平呢,边沿确实决定了信号的最高频率,如果不是频繁动作的端口,就不是控制的重点,何况100k电阻下来的电流,能有多大的辐射能力啊。

我这样剖析给楼主看,是为了告诉他,他的一个无厘头设计给自己造成了现在的麻烦(虽然他的读修改写也有问题)

使用特权

评论回复
12
NE5532| | 2011-9-2 22:20 | 只看该作者
你是指开漏输出吧,开漏也是推挽的上半柱不要,低电平一样是MOS管在拉呀,还有开漏输出不加外上拉咋可能输出高电平呢,边沿确实决定了信号的最高频率,如果不是频繁动作的端口,就不是控制的重点,何况100k电阻下来的电流,能有多大的辐射能力啊。

我这样剖析给楼主看,是为了告诉他,他的一个无厘头设计给自己造成了现在的麻烦(虽然他的读修改写也有问题)

使用特权

评论回复
13
laibour|  楼主 | 2011-9-3 08:44 | 只看该作者
本帖最后由 laibour 于 2011-9-3 08:46 编辑

12# NE5532
先谢谢你们两位的讨论,硬件电路并不是我自己设计的,我只是在写这一部分的软件,对硬件我自己还是一个未入门的家伙:( 。我自己仔细看了一下电路图,然后询问一下设计者。按照他的说法和我的理解是这样的:电阻的引入是为了防止端口处于输入态的时候,外部干扰造成三极管的BE端被放大,而NPN管是控制一个电源的供给端口,如果干扰造成DC端的误动作,会给电路行造成很大影响;而电容的只是因为这一个电路模块为GSM手机模块电路,为了过滤高频干扰而做的。其实两个元器件都没必要,但因为不太了解一下元器件的性能而加上去的,即使没用也仅当是心理安慰吧:L。 你最后提到的读-修改-写问题,我到现在还是没怎么看懂,对RA0赋高电平之后,再对RA1赋高电平时,读回的RA0时因为有一个5.1K的电阻接到三极管的基极,此时应该仍然是高电平啊?就不存在读-修改-写的问题,不知这样理解正不正确。

使用特权

评论回复
14
NE5532| | 2011-9-3 09:00 | 只看该作者
首先电路设计是一门科学,不是玄学,也就是说“怕”之类的托词都可以翻译成“懒”就是懒得去搞懂,做出来的东西自然漏洞百出。

我也做GSM模块相关的东东,开机那个脉冲短了不起作用吧,另外单个晶体管要想被感应信号干扰,还是有点困难,加下拉是可以的。但是电容是没有道理的。

读修改写出现的问题,就是端口输出电平,电容延迟了端口电平达到设定值,这样修改令一个端口时,发生了读修改写现象,导致前面那个端口的电平被误读,再写回去,当然就不对咯。

使用特权

评论回复
15
NE5532| | 2011-9-3 09:01 | 只看该作者
另外提醒你,我用的GSM模块开关端不允许加外上拉,注意看下你的模块是不是有同样要求。

使用特权

评论回复
16
laibour|  楼主 | 2011-9-3 10:09 | 只看该作者
14# NE5532
图3中,RA0是作为GSM模块的电源控制开关,然后RA1是作为GSM模块的开关(IGT端口)的控制开关,IGT端口还接了一个上拉电阻。按照你的思路,我把电源控制端RA0置为高电平后延时了2s以上(此时电平应该是稳定了),然后再通过PORT寄存器对RA1进行赋值的时候,同样出现了电源端口(RA0)的电平被拉低了。但用LAT寄存器也没有出现上述问题。之前看很多程序都是用LAT寄存器进行写,PORT寄存器进行读,到现在也没胡搞明白到底为什么要这样做。

图3.jpg (71.31 KB )

图3.jpg

使用特权

评论回复
17
virtualtryon| | 2011-9-3 10:22 | 只看该作者
LZ把汇编代码发上来看一下,从框图上看,PORT和LAT的写都是操作同一个D触发器,是没有任何差别的.
PORT读端口的电平.
而LAT读LAT缓存器.
读才会有差别.

使用特权

评论回复
18
NE5532| | 2011-9-3 11:06 | 只看该作者
首先这个RC的时间不可能这么大,其次,不要怀疑说“应该”,要找证据,你输出送完以后就再把口线读回来看呢,另外注意有没有中断内外相互打架的。

使用特权

评论回复
19
virtualtryon| | 2011-9-3 11:15 | 只看该作者
写完LAT或者PORT寄存器,到电平出现在端口上,只有一个D触发器和TRIS三态门的延时时间,不会到us级,根本不用延时2s。

使用特权

评论回复
20
laibour|  楼主 | 2011-9-3 14:47 | 只看该作者
18# NE5532
1、将RA0置1,马上读RA0读出为0;
2、将RA0置1,延时2s后读RA0读出为0;
以上两种情况用LAT和PORT进行输出,操作结果都一样。
3、先将RA0置1,然后再将RA1置1.无论RA0采用LAT或者PORT寄存器输出,只要RA1采用LAT寄存器输出,两端口都会呈现高电平。但若RA1采用PORT寄存器输出,则两种情况都是RA0的电平为低,RA1的电平为高。
4、不管什么情况下,只要把RA0设置为输入态进行读操作时,RA0都会变为0电平,但不是绝对的0,而是0.1V左右。
RA0和RA1是都是两个模拟通道,但PIC18F26k20又没有像其它型号的一样,要把模拟通道设置为数字端口会不会是端口操作的问题。

图4.jpg (54.33 KB )

图4.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

22

主题

81

帖子

0

粉丝