找回密码
 立即注册

QQ登录

只需一步,快速开始

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

会九齐的进来看看

[复制链接]
跳转到指定楼层
楼主
ID:1125252 发表于 2024-8-26 20:09 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
有谁会写九齐的,接私单的聊下,我这边有几个项目,因为不熟悉有些BUG。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:466250 发表于 2024-8-27 00:58 | 只看该作者
发出来看看
回复

使用道具 举报

板凳
ID:822634 发表于 2024-8-27 09:46 | 只看该作者
九齐多年,你有什么问题
回复

使用道具 举报

地板
ID:947230 发表于 2024-8-27 11:40 | 只看该作者
有什么问题可以先发出来讨论一下
回复

使用道具 举报

5#
ID:1125252 发表于 2024-8-29 11:34 | 只看该作者
九齐使用内部1/4通道读取电压,参考电压是2V,怎么得到2V时的ADC值
回复

使用道具 举报

6#
ID:1125252 发表于 2024-8-29 11:36 | 只看该作者
九齐IC为何&&都用不了?我用定时器给433解码,接收到的32位数据都不准,因为判断时只能用大于或小于,不能局限在一个区间内
回复

使用道具 举报

7#
ID:1125252 发表于 2024-8-29 11:41 | 只看该作者
莫忠良 发表于 2024-8-27 09:46
九齐多年,你有什么问题

九齐用定时器给433解码,发现截取到的32数值对不上。怀疑是判断问题,问下九齐怎么操作可以&&运算,我之前用定时器同时两个计数,发现对时间有影响,变不准了
回复

使用道具 举报

8#
ID:401564 发表于 2024-8-29 13:01 | 只看该作者
1481509156 发表于 2024-8-29 11:41
九齐用定时器给433解码,发现截取到的32数值对不上。怀疑是判断问题,问下九齐怎么操作可以&&运算,我之 ...

&&这个我一直在用,并没有发现什么问题呀
你首先要了解九齐的硬件资源,它可不是STC或者STM32,片上资源非常有限的,有的RAM才48个字节......,4层硬件堆栈,随便点代码就溢出了
回复

使用道具 举报

9#
ID:1125252 发表于 2024-8-29 15:00 | 只看该作者
Y_G_G 发表于 2024-8-29 13:01
&&这个我一直在用,并没有发现什么问题呀
你首先要了解九齐的硬件资源,它可不是STC或者STM32,片上资源非 ...

我用定时器计时,用 if(TIMER >10 && TIMER <15)为啥不行?我在同一个定时器里计时两个数,它的定时时间就减少了好多,没有什么规律。而且有临界点。比如取8时计时可能400us,取9时有时会到1.2ms
回复

使用道具 举报

10#
ID:401564 发表于 2024-8-29 22:28 | 只看该作者
1481509156 发表于 2024-8-29 15:00
我用定时器计时,用 if(TIMER >10 && TIMER

九齐不是STC,片上资源是非常有限的,而且,九齐的汇编指令是精简指令,一个简单的C语言运算,它可能要花上几百个时钟来完成的
比如 %取模就很耗时间,所以,能不在中断中处理就尽量不要在中断中处理,特别是uS级别的中断
你贴上完整的代码看一下
回复

使用道具 举报

11#
ID:1125252 发表于 2024-8-30 11:43 | 只看该作者
Y_G_G 发表于 2024-8-29 22:28
九齐不是STC,片上资源是非常有限的,而且,九齐的汇编指令是精简指令,一个简单的C语言运算,它可能要花上几 ...

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 = 48;                        //50us
        T1CR1 = 0x03;
        T1CR2 = C_TMR1_ClkSrc_Inst | C_PS1_Div4;
        INTE = 0x08;
}
/******************************中断*************************************************/
#define K1_NUM1  0x5A          //短按
#define K1_NUM2  0xA5        //长按
#define K2_NUM1  0X55        //短按
#define K2_NUM2  0XAA          //长按

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))  //50us*6=300
                        {
                                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;
                }
        }
       
}
回复

使用道具 举报

12#
ID:1125252 发表于 2024-8-30 11:44 | 只看该作者
Y_G_G 发表于 2024-8-29 22:28
九齐不是STC,片上资源是非常有限的,而且,九齐的汇编指令是精简指令,一个简单的C语言运算,它可能要花上几 ...

大哥,汇编太古老了,我不会啊
回复

使用道具 举报

13#
ID:401564 发表于 2024-8-30 14:21 | 只看该作者
1481509156 发表于 2024-8-30 11:44
大哥,汇编太古老了,我不会啊

不是叫你看汇编,是告诉你工作原理
1: 进入定时器中断之后,要马上清除中断标志位像这样
if(INTFbits.T1IF)                                // 定时器0中断 132 = 1MS
        {
           INTFbits.T1IF = 0;
           TMR1 = 48;    //如果是定时模式,还要写入重载值
         ...........
    }

2:soft_decode();这个函数,想办法放在主函数,不要放在中断中执行
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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