AVR单片机ATmega8工业总线项目的通信处理以及实现

发布者:书卷气息最新更新时间:2018-07-16 来源: eefocus关键字:AVR单片机  ATmega8  工业总线  通信处理 手机看文章 扫描二维码
随时随地手机看文章

这两天带博主的工程师给了一个小任务给我,使用7个小器件进行半双工的工业485总线通信,使用公司内部标准帧格式,采用主动上传方式每隔一定的定量时间进行数据上传。当然,实现一个器件的数据上传是十分简单的,但是使用大于两个器件进行485工业数据传输的时候就必须要考虑数据碰撞的问题了,因为由于485半双工的特性,同一时间数据只能上传或者下载,但是当多个数据进行数据通信的时候就要小心数据的交叉碰撞。

项目要求,在符合帧格式的前提下使用6台工作器件进行数据主动上传,因为前期设定每台设备的主动上传时间为2min,所以不可避免的遇到一个问题,就是如何进行数据的总线判“忙”检测,并且在其他的数据帧发送完毕后进行数据的发送?

经过博主的资料的查询和带我的工程师的指导下,博主总结了判断线忙的主要方法:

(1)由于数据主动上传,所以定时器必须给一个定时,定时2min,到时间了就上传一帧数据,数据上传帧还是通过填充中断首字母的方式进行,不懂的同学们可以看一看博主前面的博文。

(2)数据上传就必须要进行判断的检测,经过现在项目的完成经验来看,一开始需要定义两个变量 sendok 和sending,因为我们知道数据的判忙不是说判断总线现在的时刻不忙就可以发送一帧数据,数据是连续的,如果仅仅是一个时刻的不忙就发送那么帧和帧之间还是会乱码,会碰撞,这个时候的sendok变量就是判断当下是不是有一个大于等于帧长的时间的间隔,如果有,则说明现在有一个连续的空闲时间可以发送,这个sendok博主的处理是放在定时器2中,使用一个专门的定时器进行判断,具体方法是在收中断中进行定时器的开启,接下来判断完毕后更改变量的值,发中断发送完毕后就关闭定时器:

定时器2

interrupt [TIM2_OVF] void timer2_ovf_isr(void)  
{
    TCNT2=0xF8;
    t2cnt++;
    #asm("wdr");
    if(t2cnt>100)
    {   
        t2cnt=0;
        sendok=1;     
    } 
}

收中断

// USART Receiver interrupt service routine    串口接收中断服务程序
interrupt [USART_RXC] void usart_rx_isr(void) //接在中断接收引脚上面  结束中断向量USART_RXC 连接串口与中断的好东西
{                                             //这里的收中断 需要写一个判断是否空闲10ms,如果空闲则可以发送
    u16 crctemp;
    char status,data;
    status=UCSRA;                              
    data=UDR; 
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) 
    {   
        rxbuf[rxcnt++]=data;     
        if(rxcnt>99)rxcnt=0;
        //01 15 01 00 xx xx
        t2cnt=0; 
        TCCR2=0x05;
    } 

}

发中断

interrupt [USART_TXC] void usart_tx_isr(void)  //发送引脚中断函数
{
    static u8 TxCont;
    if(--txcnt)  
    {   
        sending=0;  
        UDR=txbuf[TxCont+1];
        TxCont++;      
    }
    else
    {   sending=1;
        UCSRA |=0x60;
        TxCont=0;
        TCCR2=0X00;   
        TCCR0=0x05;   
        Rx;          
    }  
   
}

那么sending这个变量呢,就是监测的第二步,因为我们第一步仅仅是监测了当前的空闲时间是不是有足够的时间可能发送,可以说第一个变量是我们帧可以发送的充分不必要条件,第二个变量sending就是说监测是不是一直在发送中,如果我们的帧在发送了,那么sending就置位,表明当前是有数据在“”持续不断“”的发送,这样就可以判断是不是说数据已经发完了,如果sending返回初始化的值后,就可以接着发送了。变量的改变主要是在发中断中,只要在发就持续不断的置位sending。

(2)变量的“持续性”,在判断变量的变化时候博主一开始犯了一个错误,就是使用if()来判断。后来反省了一下,在数据是一个位一个位上传的时候当然可以这样判断,还是那句话,一位一位的数据上传没有“持续性”,那我们就需要一个机制可以使得如果不满足变量改变的时候程序是一直等待的。解决方法如下,使用while

  while(!sending){
            while(!sendok);}

改语句的用途就是只要当前不符合数据发送的时间或者当前还有数据进行发送,下一帧的发送就不会进行。

(3)此时是不是在程序上就能实现数据帧的传送了呢?博主尝试后发现,并不能实现数据帧无损的传输,原因经过博主的分析,发现由于程序定时器0定死2min发送一帧,虽然在前面的程序中做了一些判忙的措施,但是唯独没有想到的就是一开始的数据发送情况,一开始大家都没有发送,一到了2min,于是大家都抢着发送各自的数据帧,此时由于是第一帧,所以sending变量判断的功能就失效了,由于是一开始到了2min就发送数据,所以sendok就发送失效,这样带来的后果就是,第二个2min,第三个2min,这样的情况会一直持续下去,最直观的结果就是在串口助手上我们可以发现每隔2min 7个avr就会发送一堆不知道是什么东西的乱码。

那么到了这一步,该怎么解决呢?由于判忙机制是没有错误的,问题出在哪里呢?很明显就是出现在第一次的发送,就是所谓的定时发送,定时发送由于avr公司设计的外设晶振采用的是比较优质的晶振,所以定时的准确性是毋庸置疑的,所以就导致了一开始的碰撞。博主考虑的方法就是在2min的时间内能不能做一个随机的时间差,就想是121s 122s 或者190s 的时候发送,就是说在2min的左右的范围内,后期博主测定的范围在±3s内随机发送数据帧,这样就可以完美的利用前面写的判忙程序进行数据帧的发送了。

(4)那么现在问题来了,如何写一个真的随机数而不是伪随机数呢?

首先先要百度了解一下 rand() random() srand()这几个函数,了解真随机,伪随机以及随机种子的概念,了解这些后再考虑如何在avr这个没有time.h头文件的单片机工作平台上实现一个随机种子。

先不说随机种子的事情,博主把真随机的函数写出来(AVR单片机内适合使用)

/*随机函数*/
unsigned int random(unsigned int input)         //随机函数的定义,输入作为参数放到srand里面
{  
     unsigned int value;  
     srand(input*2);  
     value = rand() % (MAX + 1 - MIN)+ MIN;     //获取一个随机数(100-400)  
     return value;     

那么现在的问题就是集中在一点上,如何产生一个真正随机的随机种子呢?

其实在其他人的博客上可以看到有许多方法,博主使用的办法是通过ADC采集浮空引脚进行小数点的采集,然后将小数点的数值当做一个随机种子。放入随机函数的形参内。

ADC采集每个单片机有不同的配置方法,博主在这里贴出博主配置的ADC采集函数

/*ADC采集函数*/ 
unsigned int read_adc()
{
ADMUX|=0x46;// | (ADC_VREF_TYPE & 0xff);  ADC6
delay_us(10);
ADCSRA|=0xE7;     //128分频
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

不理解的同学可以查询AVR单片机ATmega8的数据手册进行查询。

(5)


以上就是博主的串口助手接收的数据帧,7台设备接入总线。定时发送,一帧一帧的完整发送成功了。


关键字:AVR单片机  ATmega8  工业总线  通信处理 引用地址:AVR单片机ATmega8工业总线项目的通信处理以及实现

上一篇:在ATmega8中真实可用的ADC转换器写法
下一篇:AVR单片机中ATmega8的AD转换探究

推荐阅读最新更新时间:2024-03-16 16:08

工业以太网在现场总线控制系统中的应用
一、前言 现场总线控制系统(FCS)是顺应智能现场仪表而发展起来的。它的初衷是用数字通讯代替4-20mA模拟传输技术,但随着现场总线技术与智能仪表管控一体化(仪表调校、控制组态、诊断、报警、记录)的发展,在控制领域内引起了一场前所未有的革命。控制专家们纷纷预言:FCS将成为21世纪控制系统的主流。 然而就在人们沸沸扬扬的对FCS进行概念炒作的时候,却没有注意到它的发展在某些方面的不协调,其主要表现在迄今为止现场总线的通讯标准尚未统一,这使得各厂商的仪表设备难以在不同的FCS中兼容。此外,FCS的传输速率也不尽人意,以基金会现场总线(FF)正在制定的国际标准为例,它采用了ISO的参考模型中的3层(物理层、数据链路层和应用层)和
[工业控制]
<font color='red'>工业</font>以太网在现场<font color='red'>总线</font>控制系统中的应用
工业自动化总线系统-ASI总线
  ASI总线概述   ASI(Actuator-Sensor-Interface)是执行器-传感器-接口的英文缩写,它是一种用在控制器(主站)和传感器/执行器(从站)之间双向交换信息的总线网络,它属于现场总线(Fieldbus)下面底层的监控网络系统。一个ASI总线系统通过它主站中的网关可以和多种现场总线(如FF、Profibus、CANbus)相连接。ASi主站可以作为上层现场 总线的一个节点服务器,在它的下面又可以挂接一批ASi从站。ASi总线主要运用于具有开关量特征的传感器和执行器系统,传感器可以是各种原理的位置接近 开关以及温度、压力、流量、液位开关等。执行器可以是各种开关阀门,电/气转换器以及声、光报警器,也可
[嵌入式]
AVR单片机下载烧录快速入门
存储器 锁定位(2)保护类型LB模式LB2LB1 111没有使能存储器保护特性210在并行和SPI/JTAG串行编程模式中Flash和EEPROM的进 一步编程被禁止,熔丝位被锁定。(1)300在并行和SPI/JTAG串行编程模式中Flash和EEPROM的进 一步编程及验证被禁止,锁定位和熔丝位被锁定(1)BLB0模式BLBO2BLB01 111SPM 和LPM 对应用区的访问没有限制210不允许SPM 对应用区进行写操作300不允许SPM 指令对应用区进行写操作,也不允许运行于 Boot Loader 区的LPM指令从应用区读取数据。若中断向量 位于Boot Loader 区,那么执行应用区代码时中断是禁止 的。401不允许运
[单片机]
<font color='red'>AVR单片机</font>下载烧录快速入门
基于AVR单片机对热敏电阻的温度测量
1 负温热敏电阻 PSB型负温热敏电阻由Co,Mn,Ni等过渡金属元素的氧化物组成,经高温烧成半陶瓷,利用半导体毫微米的精密加工工艺,采用玻璃管封装,耐温性好,可靠性高,反应速度快、灵敏度高。他采用轴向型结构,便于安装,能承受更高温度,且玻璃封装耐高低温(-50~350℃)。PT-25E2热敏电阻温度阻值变化曲线图如图1所示。 2 AVR单片机测温原理 温度测量电路如图2所示,标准电阻Rp,热敏电阻Rt,电容C1与AVR单片机三个引脚相连。其中PC0,PC1为一般普通IO引脚,CP1为捕获触发输入引脚,可以设定上升沿触发捕获中断。 Rp为100 kΩ的精密电阻;Rt为100 kΩ精度为1%的热敏电阻;C1为0.1μF的瓷片电
[单片机]
基于<font color='red'>AVR单片机</font>对热敏电阻的温度测量
Atmel三款带10位ADC的AVR单片机
Atmel三款带10位ADC的AVR单片机Atmel今天宣布推出针对电池充电器、传感器终端和低端马达控制应用的 AVR(R) 闪存微控制器系列的三个新成员。 三款最新14管脚 tinyAVR(R) 产品加入到广泛的 AVR 闪存微控制器系列中。三款设备都具有管脚兼容的特点,仅在闪存、EEPROM 和静态随机存取存储器 (SRAM) 的存储容量上有所不同。ATtiny24 的自编程闪存容量为 2 KB,而 ATtiny44 和 ATtiny84 则分别为 4 KB 和 8 KB。这三款新设备在 20 MHz 工作频率下的吞吐量均可达到 20 MIPS(每秒百万指令)。 由于具备与生俱来的低功耗特点和三种可单独选择的低功耗休眠模式,
[单片机]
基于AVR单片机PWM功能的数控恒流源电路设计与产品研制
随着电子技术的深入发展,各种智能仪器越来越多,涉及领域越来越广,而仪器对 电源 的要求也越来越高。现今,电源设备有朝着数字化方向发展的趋势。然而绝大多数数控电源设计是通过高位数的 A/D 和 D/A 芯片来实现的,这虽然能获得较高的精度,但也使得成本大为增加。本文介绍一种基于AVR单片机PWM功能的低成本高精度数控恒流源,能够精确实现0~2A恒流。 系统框图 图1为系统的总体框图。本系统通过小键盘和 LCD 实现人机交流,小键盘负责接收要实现的 电流 值,LCD12864负责显示。AVR单片机根据输入的电流值产生对应的PWM波,经过 滤波 和 功放 电路 后对压控恒流元件进行控制,产生电流,电流再经过采样 电阻 到达
[单片机]
基于<font color='red'>AVR单片机</font>PWM功能的数控恒流源电路设计与产品研制
基于AVR单片机的挖掘机器人控制系统设计
引言 挖掘机的出现使人类从繁重的体力劳动中解脱出来,然而传统的挖掘机操作复杂,对操作者的技能要求很高。人们一直谋求更省力、更高效率和更能实现精确轨迹的挖掘作业模式。随着微电子技术的进一步发展,集成电路的集成度和性能提高、价格下降,以微处理器为基础,实现挖掘机的机电一体化、机器人化、智能化进程,已经成为工程项目施工管理的一个重要研究课题与发展方向。本文以挖掘机器人为例,设计一种基于AVR单片机的挖掘机器人控制系统。 1 总体方案设计 挖掘机器人由挖掘机器人本体机械系统、红外传感器组成的传感器系统、直流电机驱动系统、以AVR单片机为核心的控制系统等四部分组成,其基本结构如图1所示。 图1 挖掘机器人的基本结构
[单片机]
基于<font color='red'>AVR单片机</font>的挖掘机器人控制系统设计
ATmega8单片机在LED遥控照明中的应用
引言 LED照明已经进入了家庭用户,与传统的照明设备(如白炽灯、荧光灯)相比,具有光源单色纯度高、色彩多样、效率高、光强度可调等优点。针对传统照明亮度不易调节、开关位置固定的问题,本文基于AVR单片机设计了一种LED遥控照明系统,提出了LED照明灯的驱动与亮度调节的方法。 1 LED照明灯控制系统原理 系统原理图如图1所示。当红外接收器接收到红外遥控信号时,通过外部中断将AVR单片机从休眠模式中唤醒;AVR单片机开始解析红外信号,如果与系统地址匹配,则将根据解析到的命令改变LED恒流源驱动的输入,从而改变LED灯的状态。 2 系统硬件设计 2.1 控制器 控制器采用AVR单片机ATmega8。ATmega8是A
[单片机]
<font color='red'>ATmega8</font>单片机在LED遥控照明中的应用
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved