機電之家資源網(wǎng)
單片機首頁|單片機基礎(chǔ)|單片機應(yīng)用|單片機開發(fā)|單片機文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓信息
贊助商
ATmega128實現(xiàn)一個工業(yè)設(shè)備的主控制板
ATmega128實現(xiàn)一個工業(yè)設(shè)備的主控制板
 更新時間:2008-8-3 15:53:31  點擊數(shù):6
【字體: 字體顏色


    

    使用ATmega128實現(xiàn)一個工業(yè)設(shè)備的主控制板,它與由ATmega8管理的按鍵和LED顯示構(gòu)成的控制面板距離在2米左右,兩者之間采用 USART通信聯(lián)系?紤]到在實際應(yīng)用中,倆者之間交換的數(shù)據(jù)很少,通信速度也不需要很高,重要的是保證通信的可靠和抗干擾,因此在硬件設(shè)計上采用電流環(huán)的連接方式,見圖5.4。 
   在圖中通信雙方采用光隔和三極管,將USART的電平變化變成電流變化后傳送連接,如同工業(yè)上使用的20mA電流環(huán)通信一樣,大大提高了通信的抗干擾能力。
通信協(xié)議和規(guī)程的制定:

   l.通信速率采用2400bps(速率太高時電流環(huán)的變化會跟不上)。

   2. 用戶數(shù)據(jù)包采用定長格式,每個數(shù)據(jù)包長度為6個字節(jié),其中第1個字節(jié)是數(shù)據(jù)包起始字節(jié)0xBB,第6字節(jié)為數(shù)據(jù)包結(jié)束字節(jié)0xEE,其它為用戶命令、數(shù)據(jù)和系統(tǒng)狀態(tài)參數(shù)。

   3.每次通信由A端發(fā)起,下發(fā)一個數(shù)據(jù)包;B端收到一個正確的數(shù)據(jù)包后,必須返回一個數(shù)據(jù)包應(yīng)答。

   4.A端下發(fā)一個數(shù)據(jù)包后,在300ms內(nèi)沒有正確收到應(yīng)答包時(在2400bps時傳送6個字節(jié)的時間約為30ms),將再次重發(fā);3次重發(fā)均不能正確收到應(yīng)答包則報警。

   5.在系統(tǒng)正常工作時,A端每隔250ms下發(fā)一個數(shù)據(jù)包,B端如果在1s內(nèi)沒有正確收到一個下發(fā)的數(shù)據(jù)包,將進入安全保護程序。

   在這個應(yīng)用實例中,USART接口的發(fā)送程序與前面給出的典型例程中的一樣,而對USART的接收程序進行了改動和簡化,使其更加符合在本系統(tǒng)中使用。

#define UART_BEGIN_STX        0xBB
#define UART_END_STX        0xEE
#define RX_BUFFER_SIZE0        6

char rx_buffer0[RX_BUFFER_SIZE0];
unsigned char rx_counter;
bit Uart_RecvFlag

// USART Receiver interrupt service routine
#pragma savereg-
interrupt [USART_RXC] void uart_rx_isr(void)
{
  unsigned char status,data;
  #asm
    push r26
    push r27
    push r30
    push r31
    in   r26,sreg
    push r26
  #endasm

  status=UCSRA;
  data=UDR;
  if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
  {
    if (!Uart_RecvFlag)
    {    
       rx_buffer[rx_counter] = data;
    switch (rx_counter)
    {
            case 0:
        if (data == UART_BEGIN_STX)     rx_counter = 1;
        break;
       case 1:
       case 2:
       case 3:
       case 4:
        rx_counter++;
        break;
       case 5:
        rx_counter = 0;
        if (data == UART_END_STX)  Uart_RecvFlag = 1;
        break;
    }
      }
   }
   else
      rx_counter = 0;

   #asm
        pop  r26
    out  sreg,r26
    pop  r31
    pop  r30
    pop  r27
    pop  r26
  #endasm
}
#pragma savereg+
…………
void main(void)
{
  while(1)
  {
    if (Uart_RecvFlag)
    {
    …………            //處理收到的數(shù)據(jù)包
    Uart_RecvFlag = 0;        //允許USART接受新的數(shù)據(jù)包
     }
  …………            //處理其它任務(wù)
  }
}

     在這段代碼中,接收中斷服務(wù)程序直接對數(shù)據(jù)包的起始字符和結(jié)束字符進行判斷,并完成對整個數(shù)據(jù)包的接收。當接收到正確的6個字符的數(shù)據(jù)包后,將 “Uart_RecvFlag”標志置位,通知上層程序處理收到的數(shù)據(jù)。一旦“Uart_RecvFlag”標志置位后,中斷服務(wù)程序?qū)⒉辉俳邮招碌臄?shù)據(jù)(放棄掉收到的字節(jié)),使得數(shù)據(jù)緩沖區(qū)不會溢出。

    上層程序的設(shè)計,應(yīng)保證以200ms左右的間隔對“Uart_RecvFlag”標志位進行一次判斷。一旦判斷“Uart_RecvFlag”標志置位后,馬上進行處理,回送應(yīng)答數(shù)據(jù)。處理完后將“Uart_RecvFlag”標志清除,允許USART接收新的數(shù)據(jù)包。
還可以考慮在數(shù)據(jù)包中增加“數(shù)據(jù)包編號”和“數(shù)據(jù)校驗”2個字節(jié),以進一步提高通信的可靠性。

 



[1] [2]  下一頁
  • 上一篇: AVR單片機控制的開關(guān)電源
  • 下一篇: AVR單片機定時/計數(shù)器PWM設(shè)計要點
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機電之家 | 會員助手 | 免費鏈接

    點擊這里給我發(fā)消息66821730(技術(shù)支持)點擊這里給我發(fā)消息66821730(廣告投放) 點擊這里給我發(fā)消息41031197(編輯) 點擊這里給我發(fā)消息58733127(審核)
    本站提供的機電設(shè)備,機電供求等信息由機電企業(yè)自行提供,該企業(yè)負責信息內(nèi)容的真實性、準確性和合法性。
    機電之家對此不承擔任何保證責任,有侵犯您利益的地方請聯(lián)系機電之家,機電之家將及時作出處理。
    Copyright 2007 機電之家 Inc All Rights Reserved.機電之家-由機電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機電一體化學會
    中國行業(yè)電子商務(wù)100強網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1