|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
非软件错,也非硬件错,是软件硬件一块错
: J: M9 s1 B L1 Q今天遇到一个小bug,如题目所说,是软件和硬件凑到一块出的错。2 |% ^) @+ D V1 k" ]
如下图,是硬件。
( n0 f$ Y5 i. j* z; ^2 } k4 ?, K' W0 }- n2 S# F, c# i
# v% t$ h0 G; `! @这是用一个晶体管控制继电器的输出,pkn接单片机的输出,R14是上拉电阻。这个图的出处,是以前的设计,我直接抄过来用了。一向也还好用。. X8 M1 m, m# K- y0 i
但是必须指出,前一段用万用表 eepw.com.cn/news/listbylabel/label/万用表量过单片机的pkn引脚,在输出为高时,只有0.7V的电压,理论上应为单片机的供电电压5V。这大概是被晶体管拉低了。单片机是Microchip的DSPic,单腿的输出可到8mA,看样子单片机勉为其难了。长期这样会不会损坏单片机?' t4 Q7 ?) V1 l
4 C$ I+ K3 C0 o8 c7 @2 ~
出问题的是下面一段程序,要根据pkn的状态进入一段程序:6 }6 [* C' |, S$ d5 J* C
if(PORTBbits.PKN == 1)
( X) Z6 L+ t$ `, K$ t' Y { …… }
; m, w8 M6 _# V! F4 ] 结果有一万次路过这个块,该进而没有进去。这是为什么?
* [9 ~( E# L6 r" M 检查了半天,逻辑没有错。$ p# }- x. D# w4 t1 H* k
6 F; n% ^. z5 D+ B: M" o 不废话了。想到了前面说的,在程序让pkn输出为高的时候,它被三极管拉低到0.7V,这时三极管是开通的,但是单片机管脚的状态却是“0”。所以上面的判断语句,从程序本身没有错,因为已在稍早时对PORTBbits.PKN赋1了,但是这个脚的实际状态却是“0”。
) J) B/ o' O, e( ]# Q9 j6 M1 e) d( j' P: J3 P, z- m
这个程序,把PORTBbits.PKN,改为LATBbits.PKN,就是正确的。因为此时读、写的是输出锁存的状态,即使管脚的实际状态为零,锁存也告诉我们,他内心的态度是1。
5 x$ Z+ \6 {; |) f6 r 程序虽然对了,硬件还是不好,因为管脚还是要被拉低为零。而且R14的上拉是没有用处的。应把上拉的R14改为串在单片机管脚与三极管基极之间。 |
# j6 B( ]) y0 }9 J ^( D: f |
|