2146|3

3

帖子

0

TA的资源

一粒金砂(初级)

422接收灯不稳定,受主函数运行时间影响 [复制链接]

本帖最后由 索玥嘟嘟 于 2019-12-14 13:58 编辑

路过的大神帮忙解决下困扰我好久的难题,不胜感激

使用的是AT90CAN128的芯片,实现功能是串口接收完整一帧422数据后点灯,再通过串口1发出去,示波器测过422接收数据的波形了,接收完整且数据正确。就是点灯不稳定,点灯程序放在串口中断接收里面和主函数里面,都会受到干扰,换其他MCU引脚也一样。于是测了下点灯引脚的波形和主函数运行时间;

(主函数运行时间测试:在主函数利用MCU空余引脚,每进来一次主循环就翻转电平)

因特殊原因定时器设置为8.139ms。主函数运行周期测出来是400ms左右,422接收230ms左右一次,接收完整后就点灯。

图中,第一个为422接收波形(MCU引脚处),第二个位422灯波形,低电平亮,第四个为主函数执行周期波形。

 

图片1.png 图片2.png 图片3.png

 

 

最新回复

所谓“点灯不稳定”,那是你的编程有误,不是什么“干扰”问题。如果你的“点灯逻辑”仅仅是收到一帧完整的串口数据后改变某IO状态,那在串口中断里放一条该IO的赋值指令即可,然后只需注意“关灯逻辑”即可。   详情 回复 发表于 2019-12-14 14:22

回复
举报

1万

帖子

143

TA的资源

版主

所谓“点灯不稳定”,那是你的编程有误,不是什么“干扰”问题。如果你的“点灯逻辑”仅仅是收到一帧完整的串口数据后改变某IO状态,那在串口中断里放一条该IO的赋值指令即可,然后只需注意“关灯逻辑”即可。

个人签名上传了一些书籍资料,也许有你想要的:https://download.eeworld.com.cn/user/chunyang

回复

3

帖子

0

TA的资源

一粒金砂(初级)

本帖最后由 索玥嘟嘟 于 2019-12-16 09:11 编辑
chunyang 发表于 2019-12-14 14:22 所谓“点灯不稳定”,那是你的编程有误,不是什么“干扰”问题。如果你的“点灯 ...

谢谢回复~~~帮我看下程序逻辑吧,我实在分析不出来了,点灯程序我放到串口中断和主函数中都是不稳定的

1、这是422串口中断接收程序

/***************串口1计轴设备中断接收*******************/
#pragma interrupt_handler Rx1_isr:33
void Rx1_isr(void)
{
    unsigned char temp, i;
    unsigned int tempii;
    temp = UDR1;
    if ((temp == 0xFE) && (Rx1BFlag == Start))
    {
        Rx1Flag = Start;
        receive1_no = 2;
        Rx1BFlag = 0;
    }
    else
    {
        if (temp == 0xFB)       /*帧头检测*/   //接收18个字节  帧头为FB   FE 
        {
            Rx1BFlag = Start;
        }
        else
            Rx1BFlag = 0;
        if (Rx1Flag == Start)  /*接收数据*/
        {
            JzStatA[receive1_no] = temp;
            receive1_no++;
            if (receive1_no >= 18)  
            {
                receive1_no = 0;
                JzStopCount = 0;
                Rx1Flag = Finish;
                JZLedCount = 0;          //点通讯灯
                PORTD &= ~(1 << PD4); //点通讯灯PD4
                for (i = 0; i < 16; i++)
                {
                    JZ_crc_buffer = JzStatA[i + 2];
              
 }                
            }
        } 
    }
}

2、定时器中点灯计数的程序:

/*********T/C1比较中断**********/
#pragma interrupt_handler timer1_comp_isr:13
void timer1_comp_isr(void) //8.139ms
{

if (JZLedCount++ >= LEDTime)
    {
        JZLedCount = LEDTime;
        PORTD |= (1 << PD4);   //422的LED灯灭 PD4
    }
 }

3、定时器的初始化和中断程序

/***************** 初始化定时器1 *****************/
void init_Timer1(void)
{  
    TCCR1B = 0x00; //关闭定时器1
    OCR1AH = 0x1D; 
    OCR1AL = 0x4C; //8.139ms  7.3728M
    TCNT1H = 0x00;
    TCNT1L = 0x00; //计数初值设为零
    TCCR1A = 0x00; //比较匹配A输出
    TCCR1C = 0x00; //比较匹配时触发OC3A,OC3X为原OC3X取反
    TCCR1B = 0x0A; //启动定时器1,8分频,CTC模式 
    TIMSK1 = 0x02; //timer1比较匹配中断使能

/***************定时器1中断寄存器配置**************/
void InitIER(void)//2015.4.7
{        
       SMCR  = 0x00;
    EICRA = 0x00;
       EICRB = 0x00;//INT4低电平沿触发0x00//上升沿0x03//下降沿0x02
    EIMSK = 0x10;//外部中断4使能  1CAN-INT or 2CAN-INT
    EIFR  = 0xFF;
}

4、串口1的初始化
void ini_USART1(void) 
{  // desired baud rate:9600
    UBRR1L = 47;   //7.3728M:47
    UBRR1H = 0x00; 
    UCSR1A = 0x00;
    UCSR1B = 0x98;
    UCSR1C = 0x06;
    PORTD &= ~(1 << PD1); //打开发送

}


回复

3

帖子

0

TA的资源

一粒金砂(初级)

chunyang 发表于 2019-12-14 14:22 所谓“点灯不稳定”,那是你的编程有误,不是什么“干扰”问题。如果你的“点灯 ...

大神,帮我看下代码逻辑好不好呀


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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

关闭
站长推荐上一条 1/10 下一条

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表