[AVR单片机] 红外编码程序的问题(输入捕捉)

[复制链接]
3100|0
 楼主| zage2009 发表于 2011-11-8 12:35 | 显示全部楼层 |阅读模式
本帖最后由 zage2009 于 2011-11-8 16:08 编辑

在网上找了一些通用的38KHz(uPD6121)的红外编码的资料,使用了atmega16(16M,8分频,下降沿触发)的定时器1的输入捕捉功能,发现只有加入了定时器1的中断函数后(对num和times变量赋0)才能得到正确的键值,但是在输入捕捉中断函数中发送完毕后,num和times两个变量就已经赋值为0了,是否有必要再一次赋0呢?以下是关键的程序部分:
  1. #include <avr/io.h>
  2. #include <avr/interrupt.h>
  3. #include <util/delay.h>
  4. #define uchar unsigned char
  5. #define uint unsigned int
  6. volatile uint arr[16]={0};//保存捕捉值
  7. volatile uchar times=0;//记录捕捉次数
  8. volatile uchar num=0;//数组索引
  9. volatile uchar ir_code=0;//红外遥控键码
  10. volatile uchar OK_flag=0;//解码完毕标志

  11. void Timer1_init(void)//定时器1初始化
  12. {
  13.     TCNT1=0x00;
  14.     ICR1=0x00;
  15.     TCCR1A=0x00;
  16.     TCCR1B|=(1<<CS11)|(1<<ICNC1);
  17.     TIMSK|=(1<<TICIE1)|(1<<TOIE1);
  18. }
  19. ISR(TIMER1_CAPT_vect)//输入捕捉中断
  20. {
  21.     uint value;
  22.     value=ICR1;

  23.     TCNT1=0x00;
  24.     times++;
  25.     if(times>18&×<35)
  26.     {
  27.         arr[num]=value;
  28.         num++;
  29.     }
  30.     else if(times>=35)
  31.     {
  32.         times=0;
  33.         num=0;
  34.         OK_flag=1;
  35.         value=0;     
  36.     }
  37. }
  38. ISR(TIMER1_OVF_vect)//定时器1中断函数
  39. {
  40.     num=0;//如果这两个变量不赋值为0,就得不到正确的键值。
  41.     times=0;

  42. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

36

帖子

0

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