Freeman 发表于 2012-8-10 13:27:45

Arduino 的输入捕捉(ICP)怎么不行呢?

想用Arduino的PB0口来读取PWM的电平变化,以便计算信号频率。但是按照寄存器设置后,发现进不了中断。哪里出了错误?ICP1这个口,对于触发的电平有要求吗?datasheet上没有说呢?
下面是例程,很简单,就是循环然后等中断:int i=0;

/* Initial Function*/
void ICPinit(){
SREG = 0;
TCCR1B = (1 << CS12) | (1 << CS10);//1/1024
TCCR1B = (0 << ICNC1) | (1 << ICES1);// Enable Noise Canclation & Set the Rising edg detect
TIMSK1 = (1 << ICIE1);// Enable the Input Capture Interrupt
ICR1 = 0;// Clear the ICR
TCNT1 = 0;// Clear Counter1
SREG = 0x80;// Enable the Total Interrupt
}

void setup(){
pinMode(8,INPUT);         // 这是对应Mega328的12#脚
ICPinit();
}

void loop(){
while(1){
    digitalWrite(13,HIGH);
}
}

#pragma interrupt_handler timer1_CAPT:11
void timer1_CAPT(void)
{
digitalWrite(13,LOW);
i = ICR1;
TCNT1 = 0;
}

┏ωǒ┛菰独 发表于 2012-8-10 15:09:48

lz既然已经用avr的寄存器操作了,何必对GPIO的操作还使用arduino呢...
不知道你是否用jtag,发现进不了中断的?

我在msp430用过捕获模式, 计数器要设置为连续计数,不能设为计数至某个值然后归零,否则的话,没有设置计数基准的话,计数器值永远是0....
你可以看下 会不会是这个问题

我不懂avr ,只能提供给你一个可能的思路了

Freeman 发表于 2012-8-10 16:48:13

本帖最后由 Freeman 于 2012-8-10 16:55 编辑

┏ωǒ┛菰独 发表于 2012-8-10 15:09 static/image/common/back.gif
lz既然已经用avr的寄存器操作了,何必对GPIO的操作还使用arduino呢...
不知道你是否用jtag,发现进不了中断的 ...

谢谢你的回复手头没有jtag仿真器啊。所以想用13脚的LED来监测一下。 我也是新手,觉得arduino还是方便些的,只是偶然用到这个功能,才看了看寄存器的操作。
关于第二段话,我也在奇怪这个问题,到底TCNT2有没有开始计数呢,每次读出来都是0,但是datasheet上也没找到特别的话啊,我就设置了WGM12:0 = 0这三位规定它工作模式为normal,不就应该可以工作了吗?还非要打开计数器溢出中断它才会开始计数吗?
谢谢您的帮助

Freeman 发表于 2012-8-11 02:27:01

搞定了……

test01 发表于 2012-9-7 15:02:06

Freeman 发表于 2012-8-11 02:27 static/image/common/back.gif
搞定了……

可否把搞定了的程序贴出来大家学习下

ewx_boy 发表于 2012-9-19 11:00:33

关注,楼主或是谁能把解决思路说说吗?
页: [1]
查看完整版本: Arduino 的输入捕捉(ICP)怎么不行呢?