找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1667|回复: 4
打印 上一主题 下一主题
收起左侧

各位大哥帮看下我这定时器1捕捉IO脚波形解码为啥无效?测IO脚是有波形的

[复制链接]
跳转到指定楼层
楼主
ID:1125252 发表于 2024-8-20 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
50黑币
void main(void)
{
    GPIO_INIT();
    DISI();                                    // 禁用所有未屏蔽的中断
    //AWUCON = 0X80;                               //0010 0000
   // TMR0  = 0;                                   // 加载0x00到TMR0(初始定时器寄存器)
    //T0MD  = 0X01;                               // 将precaler0赋给Timer0, precaler0分割率= 1:8,时钟源为指令时钟
    //INTE =  0X01;                              // 使能定时器0中断&PABIE状态变化中断   
    //;启用Timer0和全局中断位
    //PCON1 = C_TMR0_En;                           // 启用Timer0
   
    ENI();
   
    while(1)
    {      
        CLRWDT();
        
        RX_SHUT=0;
        CLRWDT();
        Timer1_INIT();
        soft_decodetask();
    }
}
void isr(void) __interrupt(0)
{
   
    if(INTFbits.T1IF)                                // 定时器0中断 132 = 1MS
    {
        if(RFDecodeOK == 0)
        {
            if(!RX_DATA)
            {
                IR_Time_L++;
                IR_Time_H=0;
                if(JumpFlag && IR_Time_L > 4)
                {
                    JumpFlag=0;
                }
            }
            else
            {
                IR_Time_H++;
                if(!JumpFlag && IR_Time_H > 4)
                {
                    JumpFlag=1;
                    soft_decode();
                    IR_Time_L=0;
                    IR_Time_H=0;
                }
            }
        }   
        INTF= (unsigned char)~(C_INT_TMR1);             // 清除T0IF标志位
    }

}
/******************************定时器配置*************************************************/
void Timer1_INIT(void)
{
    TMRH = 0;
    TMR1 = 50;            //50us
    T1CR1 = 0x03;
    T1CR2 = C_TMR1_ClkSrc_Inst | C_PS1_Div4;
    INTE = 0x08;
}
/******************************中断*************************************************/
void soft_decode()            //解码
{
        static unsigned char RxBitCnt = 0;    //接收数据位
        static unsigned long RxData = 0;    //数据缓冲
        if(IR_State==0)        
        {
            if((IR_Time_L >= 19) && (IR_Time < 25))
            {
                IR_State=1;
                RxData=0;
                RxBitCnt=0;
               
            }
            else
            {
                IR_State=0;
            }
        }
        else if(IR_State==1 && RxBitCnt < 32)            
        {
            
            if((IR_Time_L > 6) && (IR_Time_L < 9))
            {
                RxData = RxData<<1;
                RxBitCnt++;            
            }
            else if((IR_Time_L > 11) && (IR_Time_L < 14))
            {
                RxData = RxData<<1;
                RxData |=1;
                RxBitCnt++;        
            }
            else
            {
                RxBitCnt=0;
                IR_State=0;
            }
            if(IR_cnt>=32)
            {
                RxBitCnt=0;
                IR_State=0;
                RxUserCode = RxData >> 24;
                if(RxUserCode == K1_NUM1)
                {
                    RFDecodeOK = 1;
                    RX_flag = 1;
                }
                else if(RxUserCode == K1_NUM2)
                {
                    RFDecodeOK = 1;
                    RX_flag = 2;
                }
                else if(RxUserCode == K2_NUM1)
                {
                    RFDecodeOK = 1;
                    RX_flag = 3;
                }
                else if(RxUserCode == K2_NUM2)
                {
                    RFDecodeOK = 1;
                    RX_flag = 4;
                }
            }   
        }
}
void soft_decodetask(void)
{
    static unsigned int RxTimerCnt = 0;
    if(RFDecodeOK)
    {
        RFDecodeOK = 0;
        if(RX_flag==1){LED123=0;}
        if(RX_flag==2){LED123=1;}
        if(RX_flag==3){LED123=0;}
        if(RX_flag==4){LED123=1;}   
    }
    if(RFDecodeOK)
    {
        RxTimerCnt++;
        if(RxTimerCnt >= 2000)
        {
            RxTimerCnt=0;
            RFDecodeOK=0;
        }
    }
   
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1125252 发表于 2024-8-21 10:01 | 只看该作者
顶一下
回复

使用道具 举报

板凳
ID:1125252 发表于 2024-8-22 15:52 | 只看该作者
有波形输出,但是解码不出来
回复

使用道具 举报

地板
ID:982617 发表于 2024-8-23 14:28 | 只看该作者
如果您的定时器1解码代码在进行IO脚波形捕捉时无效,但您确认IO脚上确实存在波形,那可能有以下几个原因导致问题:
1. 定时器配置:检查定时器1的配置是否正确。确保您已经正确地配置了预分频器和时钟源。在您的代码中,`T1CR2 = C_TMR1_ClkSrc_Inst | C_PS1_Div4;` 这一行设置时钟源为指令时钟,并且预分频器为4。确保这符合您的设计需求。
2. 中断配置:您必须确保定时器的中断配置正确,以便在捕获到有效波形时触发中断。中断配置应该在`T1CR1`寄存器中进行,通常需要设置一个中断标志位。确保`INTE = 0x08;`中包括了定时器1的中断使能。
3. 中断服务函数:检查`isr`中断服务函数中对于中断的处理是否正确。确保在中断处理函数中,当检测到中断 (在这种情况下是`INTFbits.T1IF`为真) 时,您正确地读取了定时器的捕获值。您应该检查并处理中断标志位,以及在中断服务函数中正确执行解码逻辑。
4. 编码匹配:您的解码逻辑需要匹配实际接收到的波形。确保您在`soft_decode()`函数中设置的阈值和逻辑符合预期的遥控器信号编码方式。信号的频率、宽度、以及跳变点的检测对于正确的解码至关重要。
5. 逻辑错误: 检查您的解码逻辑,确保在处理不同状态(如`IR_State=0`和`IR_State=1`)以及不同波形宽度时的逻辑正确。错误的逻辑可能会导致在接收到的信号与预期不符时不能正确解码。
6. 时钟和电源问题:确保您的系统时钟频率稳定且正确配置,电源电压也稳定,这些因素都可能影响到定时器的准确工作。
7. 硬件问题:虽然您提到IO脚上有波形,但请检查是否有任何外部干扰或者硬件连接错误。有时候,干扰信号或者不正确的硬件连接可能会导致捕获的波形与预期不符。
8. 代码执行问题:确保您的代码在定时器中断事件处理过程中能够正确执行。检查是否有死锁或者其他代码执行错误导致中断处理逻辑被阻塞。
9. 测试和调试:使用硬件调试工具或者在仿真器上仔细调试您的代码和硬件设置,逐步分析问题所在。观察在不同阶段的寄存器值和状态,可以帮助您定位问题。
解决这类问题通常需要细致的逻辑分析和调试过程。如果以上建议都不能解决问题,建议再次检查您的硬件连接、代码实现以及参考相关的硬件手册和编码规范。
回复

使用道具 举报

5#
ID:192020 发表于 2024-8-24 17:07 | 只看该作者
首先Timer1_INIT();放在while里肯定不对的,然后中断向量看下对不对,中断(0)是定时器1吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表