[AVR单片机] atmega128a的icp1捕捉问题

[复制链接]
 楼主| ghye 发表于 2011-5-11 14:28 | 显示全部楼层 |阅读模式
本帖最后由 ghye 于 2011-5-11 14:32 编辑

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

  5. unsigned short icp1_tmr1;
  6. unsigned short icp1_tmr2;
  7. unsigned short icp1_cnt;
  8. unsigned char icp1_ok;


  9. inline void gpio_init(void)
  10. {
  11.         DDRA = 0x0f;//LED gpio

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

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

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

  18. inline int chk_key1(void)
  19. {
  20.         if( !(PINC & 0x01))
  21.         {
  22.                 _delay_ms(20);
  23.                 if( !(PINC &0x01))
  24.                         return 1;
  25.         }

  26.         return 0;
  27. }

  28. inline void icp1_init(void)
  29. {
  30.         icp1_cnt = 0;
  31. }

  32. ISR(TIMER1_CAPT_vect)
  33. {
  34.         if(icp1_cnt > 0)
  35.         {
  36.                 TIMSK &= ~_BV(TICIE1); //使能T/C1输入捕捉中断。没定是否需要T/C1溢出中断
  37. PORTA = 0x02;//LED灯测试
  38. _delay_ms(1000);
  39.         }
  40.         else if(icp1_cnt == 0)
  41.         {
  42. PORTA = ~PORTA;//LED灯测试
  43.                 icp1_tmr1 = ICR1;
  44.         }

  45.         icp1_cnt++;
  46. }

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

  52.         while(1)
  53.         {
  54.                 if(chk_key1())
  55.                 {
  56.                         icp1_init();
  57.         TIMSK |= _BV(TICIE1); //使能T/C1输入捕捉中断。没定是否需要T/C1溢出中断
  58.                 }
  59.         }

  60.         return 0;
  61. }
我的目的是检测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开中断 会不会不同?
 楼主| ghye 发表于 2011-5-12 14:16 | 显示全部楼层
2# a84809

判断按键。
 楼主| ghye 发表于 2011-5-12 14:17 | 显示全部楼层
3# a84809

  1. ISR(TIMER1_CAPT_vect)

这就是中断了。不需要也不应该有其他什么中断声明。
 楼主| ghye 发表于 2011-5-12 14:20 | 显示全部楼层
4# a84809

先TIMSK再sei也一样的。
另外,如果多个中断时,只禁止其中一个中断时,只有使用TIMSK来禁止它。所以说sei和TIMSK不应该有先后问题。
a84809 发表于 2011-5-12 15:26 | 显示全部楼层
我是新手啦 不要笑我
这样行不行呀?
icp1_cnt=chk_key1();
 楼主| ghye 发表于 2011-5-12 16:37 | 显示全部楼层
8# a84809

不行。在中断里面还是认为icp1_cnt不变的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

25

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部