主题 : 红外驱动问题 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 42790
精华: 0
发帖: 44
金钱: 230 两
威望: 46 点
综合积分: 88 分
注册时间: 2011-04-11
最后登录: 2012-04-26
楼主  发表于: 2011-06-19 14:06

 红外驱动问题

ret_irq = request_irq(IRQ_EINT(12), EINT_thread,IRQF_DISABLED | IRQ_TYPE_EDGE_FALLING, "mem", 0);
    if ( ret_irq<0 )
    {
          printk(KERN_ERR "timer: cannot register IRQ %d\n", IRQ_EINT(12));
    }    

static irqreturn_t EINT_thread(int irq, void *dev_id)
{
    //if(ir_read_size != 34)
    //{
        printk("xai jiang yan chu fa %d\n",n++);
        do_gettimeofday(&time_tv[ir_read_size++]);
        

        if(ir_read_size >1)
        {
            time_lenth = time_tv[ir_read_size-1].tv_usec - time_tv[ir_read_size-2].tv_usec ;
            if(time_lenth < 0)
            {
                time_lenth = 1000000- time_tv[ir_read_size-2].tv_usec;
                time_lenth = time_tv[bitcount-1].tv_usec + time_lenth ;
            }
            if(ir_read_size == 2)
                {
            if((time_lenth > 13200) && (time_lenth < 13800))
            {
                printk("yindao\n");
                bit=0;
                ir_data = 0;
                
            }

            else
            {
                printk("no yindao\n");
                //ir_read_size=0;
                n=0;
                ir_learned_size =0;
    
                return 0;
            }
        }
        if((time_lenth > 1000) && (time_lenth < 1300))//捕获到的是0
        {
            printk("0      bit : %d\n",bit);
            bit++;
        }

        if((time_lenth > 2100) && (time_lenth < 2400))//捕获到的是1
        {
                
            ir_data |= (1<<(31-bit));
            printk("1      bit : %d\n",bit);
            bit++;
        }

        if(bit == 32)
        {
            bit=0;
            ir_read_size =0;
        }
    }
    
    return IRQ_HANDLED;
}

我按以上中断方式解红红外码,下降沿中断,有时候都触发不够次数的,这样按一下按钮应该触发33次才对的,但是有时候触发够,有时候没有,还有有时候即使触发33次,但是统计0和1时候,几乎没有一次统计够32位的
统计0和1,总是少于32位,上面的中断有什么问题吗?希望得到技术支持的回答
级别: 新手上路
UID: 42790
精华: 0
发帖: 44
金钱: 230 两
威望: 46 点
综合积分: 88 分
注册时间: 2011-04-11
最后登录: 2012-04-26
1楼  发表于: 2011-06-19 14:23
        

我按以上中断方式解红红外码,下降沿中断,有时候都触发不够次数的,这样按一下按钮应该触发33次才对的,但是有时候触发够,有时候没有,还有有时候即使触发33次,但是统计0和1时候,几乎没有一次统计够32位的
统计0和1,总是少于32位,为什么总是少于32位呢?中断应该没有问题的
级别: 新手上路
UID: 43312
精华: 0
发帖: 15
金钱: 75 两
威望: 15 点
综合积分: 30 分
注册时间: 2011-04-15
最后登录: 2018-02-08
2楼  发表于: 2011-07-03 20:32
楼主我也在做红外驱动,也遇到定时的问题,一起讨论下
级别: 新手上路
UID: 2781
精华: 0
发帖: 37
金钱: 190 两
威望: 37 点
综合积分: 74 分
注册时间: 2008-12-08
最后登录: 2017-09-13
3楼  发表于: 2011-08-10 16:08
可能2440 的中断没有那么快吧