作者ruemann (树海游魂)
看板ASM
标题Re: [问题] 量测脉波宽度
时间Sun Apr 12 03:52:07 2009
※ 引述《BlueFeel (蓝色感觉)》之铭言:
: 请教一下,
: 如果我要设计一个....
: pin2 输入负脉波宽度>1ms , pin1 = 1
: <1ms , pin1 = 0
: 的功能
: 刚开始以为 pin2用INT0(外部中断)做
: 在中断函式内 写个 计数器,
: 当跳开後,会依计数值做pin1判断1还是0
: 後来发现,我误会中断的意义
: 它是 "下缘触发".....就跳进中断函式,做计数没错
: 但这计数....值并非并非是负脉波宽度
: 怎麽说??
: 跳到中断计数....这计数只计1次.....非我想像的一直计数到 rising才停
: 所以想跟大大请教一下
: 这样的应用该怎麽做呢??
通常啦,你要的结果有 n 种解法,要怎麽解就是看你的应用和其他因素
例如这只是一个练习的话,Anal 说的是一种方法,但缺点在於在 plus 在改变状态
之前,程式会被卡在 ISR 里面
当然更简单的话,就是连中断都不用进,整个回圈就是在 poll IO 和计数 XD
如果你的程式有要做其他事情,那可以先估计 Anal 说的方法会不会造成什麽影响,
如果还可以的话,这个方法就不用增加什麽新的东西,改点程式码就 OK 了
当然,如果不用 Anal 的方法,那麽势必要增加硬体来解决这个部份
最简单就是换一颗支援 level change trigger 或是可以设定 trigger edge 方向的 IC
不过如果你的 IC 有支援 两个 IO 中断向量 or 中断 signal 的话
(简单的说就是有 INT0 和 INT1 之类的)
利用一个电晶体来当作反向器,例如:
pin1 = output
pin2 = int0
pin3 = int1
pin4 = output
TC0 = 计数/计时器 counter
把接到 pin2 的讯号经过一个反向器(也就是当 pin2 = 1 时 pin3 = 0,反之亦然)
然後程式一开始:pin2 = 1, pin3 = 0(因为一开始,所以 pin3 的中断应该会被清除)
falling edge :pin2 = 0, pin3 = 1,int0 被触发
在 int0 中取得 TC0 并重设 TC0,像是 T_Rising = TC0, TC0 = 0
rising edge :pin2 = 1, pin3 = 0,int1 被触发
在 int1 中取得 TC0 并重设 TC0,像是 T_Falling = TC0, TC0 = 0
那就看你是要看 rising to falling 还是要看 falling to rising 的时间
例如在 int0 中取得 TC0并计算完 T_Rising 後,以 pin1 来表示上昇脉波的宽度:
if ( T_Rising > 1ms )
pin1 = 1
else
pin1 = 0
或是在 int1 中取得 TC0 并计算完 T_Falling 後,以pin4 来表示下降脉波的宽度:
if ( T_Falling > 1ms )
pin4 = 1
else
pni4 = 0
以上
--
我是路人甲
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.205.238.166