打印
[AVR单片机]

红外编码程序的问题(输入捕捉)

[复制链接]
2373|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呢?以下是关键的程序部分:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#define uchar unsigned char
#define uint unsigned int
volatile uint arr[16]={0};//保存捕捉值
volatile uchar times=0;//记录捕捉次数
volatile uchar num=0;//数组索引
volatile uchar ir_code=0;//红外遥控键码
volatile uchar OK_flag=0;//解码完毕标志

void Timer1_init(void)//定时器1初始化
{
    TCNT1=0x00;
    ICR1=0x00;
    TCCR1A=0x00;
    TCCR1B|=(1<<CS11)|(1<<ICNC1);
    TIMSK|=(1<<TICIE1)|(1<<TOIE1);
}
ISR(TIMER1_CAPT_vect)//输入捕捉中断
{
    uint value;
    value=ICR1;

    TCNT1=0x00;
    times++;
    if(times>18&×<35)
    {
        arr[num]=value;
        num++;
    }
    else if(times>=35)
    {
        times=0;
        num=0;
        OK_flag=1;
        value=0;     
    }
}
ISR(TIMER1_OVF_vect)//定时器1中断函数
{
    num=0;//如果这两个变量不赋值为0,就得不到正确的键值。
    times=0;

}

相关帖子

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

本版积分规则

3

主题

36

帖子

0

粉丝