打印
[AVR单片机]

atmega128a的icp1捕捉问题

[复制链接]
3987|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ghye|  楼主 | 2011-5-11 14:28 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ghye 于 2011-5-11 14:32 编辑

代码如下:
#include <avr/io.h>
#include <avr/interrupt.h>
#define F_CPU 8000000UL
#include <util/delay.h>

unsigned short icp1_tmr1;
unsigned short icp1_tmr2;
unsigned short icp1_cnt;
unsigned char icp1_ok;


inline void gpio_init(void)
{
        DDRA = 0x0f;//LED gpio

        DDRC = 0x00;
        PORTC =0x01;//接key1的PC0口输入,上拉有效

        DDRD = 0x00;
        PORTD =0x10;//接红外一体接收头的引脚为输入,上拉有效

        SFIOR = 0x00;//全局上拉使能。默认使能
}

inline int chk_key1(void)
{
        if( !(PINC & 0x01))
        {
                _delay_ms(20);
                if( !(PINC &0x01))
                        return 1;
        }

        return 0;
}

inline void icp1_init(void)
{
        icp1_cnt = 0;
}

ISR(TIMER1_CAPT_vect)
{
        if(icp1_cnt > 0)
        {
                TIMSK &= ~_BV(TICIE1); //使能T/C1输入捕捉中断。没定是否需要T/C1溢出中断
PORTA = 0x02;//LED灯测试
_delay_ms(1000);
        }
        else if(icp1_cnt == 0)
        {
PORTA = ~PORTA;//LED灯测试
                icp1_tmr1 = ICR1;
        }

        icp1_cnt++;
}

int main(void)
{
        gpio_init();
        TCCR1B = 0x01;//icp1下降沿输入触发捕捉,1分频 . T/C1正常计数方式
        sei();

        while(1)
        {
                if(chk_key1())
                {
                        icp1_init();
        TIMSK |= _BV(TICIE1); //使能T/C1输入捕捉中断。没定是否需要T/C1溢出中断
                }
        }

        return 0;
}
我的目的是检测ICP1信号。这是一个测试的程序。
下载atmega128a板子上测试发现,一直运行:
        else if(icp1_cnt == 0)
        {
PORTA = ~PORTA;
                icp1_tmr1 = ICR1;
        }
而从来都没icp1_cnt > 0的情况。

为何下次捕捉中断时,icp1_cnt还是0呢? 请指教

环境:
avr-gcc (GCC) 4.3.2
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

相关帖子

沙发
a84809| | 2011-5-12 12:44 | 只看该作者
int chk_key1(void)

{

        if( !(PINC & 0x01))

        {

                _delay_ms(20);

                if( !(PINC &0x01))

                        return 1;

        }



        return 0;

}

神马意思?求指教

使用特权

评论回复
板凳
a84809| | 2011-5-12 12:50 | 只看该作者
是不是缺少中断声明呀?

使用特权

评论回复
地板
a84809| | 2011-5-12 12:53 | 只看该作者
先配置TIMSK寄存器 然后在SEI开中断 会不会不同?

使用特权

评论回复
5
ghye|  楼主 | 2011-5-12 14:16 | 只看该作者
2# a84809

判断按键。

使用特权

评论回复
6
ghye|  楼主 | 2011-5-12 14:17 | 只看该作者
3# a84809

ISR(TIMER1_CAPT_vect)

这就是中断了。不需要也不应该有其他什么中断声明。

使用特权

评论回复
7
ghye|  楼主 | 2011-5-12 14:20 | 只看该作者
4# a84809

先TIMSK再sei也一样的。
另外,如果多个中断时,只禁止其中一个中断时,只有使用TIMSK来禁止它。所以说sei和TIMSK不应该有先后问题。

使用特权

评论回复
8
a84809| | 2011-5-12 15:26 | 只看该作者
我是新手啦 不要笑我
这样行不行呀?
icp1_cnt=chk_key1();

使用特权

评论回复
9
ghye|  楼主 | 2011-5-12 16:37 | 只看该作者
8# a84809

不行。在中断里面还是认为icp1_cnt不变的

使用特权

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

本版积分规则

6

主题

25

帖子

1

粉丝