標題: 電力載波實現代碼,值得紀念的日子 [打印本頁]

作者: xuwei    時間: 2015-6-13 16:02
標題: 電力載波實現代碼,值得紀念的日子
小ARM菜菜
日照高科園


  今天下午半下午時間用來調試程序,上午時間把電路環(huán)景搭建起來,到現在完成電力載波的初步半雙工通信!主要注意的是第一次收到的數據要丟棄,等待寄存器更新,并且要利用軟件控制字節(jié)流,而不可以用硬件,因為你根本不知道他有多少字節(jié),也就談不上控制了,也就是說他僅僅模擬了一個收發(fā)器,你要在軟件層面構建FIFO,另一點注意的是寄存器的配置和寫保護!我就是吃了這個虧!

主要程序片段!》》》》》》》》》》》》》》》》》》

extern void SendOneByte(unsigned char c);                                            
   uchar data i;
   uchar  data state;                 // 載波通訊狀態(tài)
  uchar data SSC_adr_bak;
  
  SSC_adr_bak=SSC_ADR;         //PRTECT
   SSC_ADR=0x00;                      //選擇載波狀態(tài)寄存器
   
   state= SSC_DAT;
   if ( ( state&0x01 ) == 1 )              //載波發(fā)送狀態(tài)
   { // 載波發(fā)送

   if ( PLC_send_pointer !=PLC_total_len )
        
    {
       SSC_BUF=PLC_T_buf_bak[PLC_send_pointer];                  //發(fā)送下一個字節(jié)
       PLC_send_pointer++;
    }
    else
    {  //發(fā)送完成
      PLC_sending=0;                 // 清正在發(fā)送標志
      PLC_data=0;
      PLC_TLED=1;                    // 發(fā)送指示燈滅
    }
  }
  else
/******接收區(qū)**************************/
  {
      // printf_usart("接收");
  // SSC_ADR=0x00;                      //選擇載波狀態(tài)寄存器
   
     
     //SendOneByte(SSC_DAT) ;
  // 載波接收  

   PLC_Rxd_timer=20;         // 最大字節(jié)接收延時時間為1S
    if ( ( state&0x04 ) == 0x04 )     //如果接收的是禎頭標志
    {
    //幀頭
  

      if ( PLC_Rxd_state == 0 )       //如果處于等待接收狀態(tài)
      {
             //接收第一個字節(jié),并準備接收后面的字節(jié)
         PLC_recv_buf[0]=SSC_BUF;
         PLC_Rxd_pointer=0;      //lxw2006-3-2 17:07
         PLC_Rxd_state=1;
         PLC_RLED=0;         //接收指示燈亮
   
    PLC_Rxd_tlen=3;
  

      }
      else               // translate to rec
      {      
       PLC_Rxd_state=0;
       SSC_ADR=0X0;   
        SSC_DAT=0X0;
      }
    }

   //數據流
    else
    {
      if ( PLC_Rxd_state == 1 )       // 如果已經接收了禎頭,繼續(xù)接收后續(xù)字節(jié)
      {
      
        PLC_recv_buf[PLC_Rxd_pointer]=SSC_BUF;
        PLC_Rxd_pointer++;

        if ( PLC_Rxd_pointer==PLC_Rxd_tlen )
        {
           PLC_Rxd_OK=1;
           PLC_RLED=1;       //接收完畢燈滅
           PLC_Rxd_state=0;
           SSC_ADR=0;      
           SSC_DAT=0;
        }
      }
      else            
      {
       PLC_Rxd_state=0;
       SSC_ADR=0X0;   
        SSC_DAT=0X0;
      }
    }

  }

  SSC_ADR=SSC_adr_bak;

SSC_ADR=0XFF;        //
  SSC_DAT=0XFF;        // 禁止寫保護
  
  SSC_ADR=0x01;        // 選擇3105載波通訊控制寄存器1
  SSC_DAT=64;        // ZZZ 2007-10-15 前導1bit為64個

  SSC_ADR=0x03;        // 選擇3201載波通訊控制寄存器3
  SSC_DAT=0xe0;        // 開啟載波通訊功能,打開中斷,選擇接收狀態(tài)置為3105模式
   
  SSC_ADR=0x04;      // 設置捕獲門限
  SSC_DAT=LIMIT_3105;
  
  SSC_ADR=0XFF;
  SSC_DAT=0XAA;        // 使能寫保護  

// 控制看門狗喂狗時間長度                  
  CKCON=0X3F;
  // 8位/16位運算模式選擇位設置
  ALU_MOD=0;      // 設置成8位運算模式
  //載波通訊配置
//************   3201的載波寄存器設置  **********//
  set_PLC_3105 (  );   //上電為3105模式
  
  SSC_ADR=0xFF;
  SSC_DAT=0xFF;
  SSC_ADR=0x02;
  SSC_DAT=0x1F;
  SSC_ADR=0xFF;
  SSC_DAT=0x00;
  
//************   3201的載波寄存器設置  **********//
  EIE=0X01;                  //  ( A9H 使能INT2中斷(EX2=1)
  IT2=1;                     //  ( C8H ) 為邊沿觸發(fā)方式(IT2=1)
  
  //串口通訊配置
  TMOD1 = 0x10 ;                       // 設 T/C1 為1分頻模式,ZZZ
  TMOD = 0x21 ;                       // 設 T/C1 為定時方式2 設置為8位自裝載計數器  T/C0 為定時方式 14
  SCON=0x50;                           // 工作方式1
  
  PCON=0X80;                           // 波特率加倍
  TH1=BPS2400;
  TL1=BPS2400;                        // 加倍設定波特率 9.6MHz ( 按1分頻2400計算)
  TR1=1;                               // 啟動定時器1
   
  // 定時器0中斷配置
  TH0=0x63;
  TL0=0xcc;                // 定時 50 ms 一個定時中斷
  TR0 = 1;                       // 啟動 T0 定時器
  // 中斷級別設置
  IP=0x02;                      // 定時器 T0 中斷為高級中斷
  EIP=1;                         // 外部中斷2 為高級中斷
  // 中斷允許設置
  IE=0x82;                      // 允許ET0=1定時器 T0 中斷;  開放中斷








歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1