14 12
發新話題
打印

F060 CAN

F060 CAN

我有些問題要請教各位,程式為修改範例程式,並使用貴公司發展板
//////////////////////////////////////////////////////////////////
貼出來是CAN1負責接收CAN2傳過來的資料,我把CAN初始化跟UART初始化個別包在一個函士
CAN2傳到CAN1是傳'B',當CAN1成功收到後燈會暗掉並把資料存放在Array[0],
若再按下CAN1按鈕則會開啟UART並把Array[0]送到電腦
以上測試都符合自己預期,但是我把Outchar0(Array[0])寫在while(1)迴圈裡
卻只有第一筆成功傳出'B'
//////////////////////////////////////////////////////////////////
unsigned char xdata  Array[1];     //Array[]存收到的資料 宣告在全域變數

void main (void) {
           
           Init_CAN();              //初始化CAN
           
          if (BUTTON == 0)    //當按鈕按下,UART初始化並把Array[0] 傳到電腦
         {
              Init_Device();   //UART 初始化
                 
            while(1)
              {
               Outchar0(Array[0]);
               delay(20);     //延遲函士
              }
         }
}

void receive_data (char MsgNum)  //接收端我用'B'判斷是否與CAN2傳過來的'B'一樣
{
  char virtual_button;
  SFRPAGE  = CAN0_PAGE; // IF1 already set up for RX
  CAN0ADR  = IF2CMDRQST;// Point to Command Request Reg.
  CAN0DATL = MsgNum;    // Move new data for RX from Msg Obj "MsgNum"
                        // Move new data to a
  CAN0ADR  = IF2DATA1;  // Point to 1st byte of Data Field

  virtual_button = CAN0DATL;
  if (virtual_button == 'B')   //Ones is signal from other node to turn LED ON
    {
        LED = 0;  //virtual_button=0x11(ON)
        Array[0]=virtual_button;  //把virtual_button資料存到Array[0]
    }
  else  LED = 1;  //virtual_button=0x00(OFF) //Otherwise turn LED OFF (message was one's)
}

問題整理:
(1)為什麼我把Array[0]放在While迴圈,卻只有第一筆正確傳出'B',後面都一直傳"......................."
   是否程式有哪裡重置時洗掉了,我用單部執行看確實在剛收到時是'B',但後面就都錯的
(2)存放的Array[]是否只能用Xdata宣告?或是宣告在idata也可以?
(3)我初始化UART會把CAN功能關掉,請問可以兩個功能一起存在嗎?也就是CAN收到資料就直接用UART傳到電腦!

                                                           謝謝過位板友觀看及答覆

TOP

您要注意到060 sfr page切換的問題.uart 轉can 的傳送確定是可行的..因為我弄過

TOP

回復 2# 小柚子 的帖子

謝謝你的回覆

所以就是說我要用UART就開UART功能,用CAN就開CAN功能

不可以UART與CAN功能同時開著,當CAN收到新的資料就直接用UART丟到PC !

TOP

不可以UART與CAN功能同時開著,當CAN收到新的資料就直接用UART丟到PC !
==>程式設計上是同開著沒錯..但是當進入中斷的時候要要讀取站存器的時候就要注意到sfr的問題,
我的範例程式是pc<-->uart<-->can<-->uart<--->pc

TOP

我有特別注意sfr變換,每個初始化我都有寫sfr
CAN:
    external_osc => SFRPAGE = CONFIG_PAGE
    config_IO => SFRPAGE  = CONFIG_PAGE
   
    clear_msg_objects => SFRPAGE  = CAN0_PAGE
    init_msg_object_RX => SFRPAGE  = CAN0_PAGE
    init_msg_object_TX => SFRPAGE = CAN0_PAGE
    start_CAN => SFRPAGE  = CAN0_PAGE
    transmit_turn_LED_ON => SFRPAGE  = CAN0_PAGE
    receive_data => SFRPAGE  = CAN0_PAGE
-----------------------------------------------------------
UART:
      Timer_Init => SFRPAGE   = TIMER01_PAGE
      Outchar0 => SFRPAGE   = UART0_PAGE
      UART_Init => SFRPAGE   = UART0_PAGE
      Port_IO_Init => SFRPAGE   = CONFIG_PAGE
      Oscillator_Init => SFRPAGE   = CONFIG_PAGE

我的想法是在初始化時都有放PAGE,當PAGE更改時應該是不會把存過的data洗掉!例如:CAN收到的資料
還是讀取data時也要指定到特定的sfr
還是UART(22.1MHz) 跟 CAN(11.05MHz)使用的震盪頻率不同有關係?兩個都是使用external oscillator
請各位高手開釋我巴!感恩阿

TOP

哈摟:
     我又來問問題了,目前仍然用F060 CAN, 遇到的問題是無法收到多節點, 每個節點都傳8 bytes 到CAN Bus Line
     當Master 個別收一個node 時是沒問題的, 我是改變Master Rx id跟 node Tx id相同來接收node資料
      
      但是把5個nodes 都接到CAN Bus Line, 依序改變Master Rx id 且另存陣列, 就只能收到其中一個node
      感覺是5個nodes都接到Bus Line時節點之間會有衝突(不確定)!

     現在要解決的問題是,如何設定CAN Bus接收多節點資料, 或是有關node優先權要怎嚜設定或要注意的地方?      
     拜託給予建議跟指教~~謝謝         
                                            再次謝謝觀看及之前各位給予我的幫助.

TOP

node優先在於ID的大小,越小優先權越高..

TOP

哈摟:
     謝謝您的回覆,我設定了以下兩種,應該還是有錯誤的地方,我把node1設為最優先,依序node2.....
      每收到一個node就另存sensor_data[0][8].......
設定1:
    nodes(傳)設定:                                     | Master (接收)  main(void)依序寫為   
     node1=>  msg_object_TX (0x01,1)  transmit(1) |   收node1=> 設 id=1, mes_value=1
    node2=>  msg_object_TX (0x02,2)   transmit(2)|   收node2=> 設 id=2, mes_value=2         
    node3=>  msg_object_TX (0x03,3)   transmit(3)|   收node3=> 設 id=3, mes_value=3
    node4=>  msg_object_TX (0x04,4)   transmit(4)|   收node4=> 設 id=4, mes_value=4   
    node5=>  msg_object_TX (0x05,5)   transmit(5)|   收node5=> 設 id=5, mes_value=5

    到此有些問題 (1) Master的mes_value是否要與node的MsgNum及transmit(num)一樣?
               (2) node的  init_object_TX (num,4)及transmit(num) num要一樣嗎?
               (3) Master的 mes_value=1只是決定接收時放在debug介面的 01 位置嗎還是要跟node配合?   

---------------------------------------------------------------------------------------------
設定2:  
    nodes(傳)設定: id都設一樣 =1                    | Master (接收)   id也都 =1
     node1=>  msg_object_TX (0x01,1)  transmit(1) |   收node1=> 設 id=1, mes_value=?
    node2=>  msg_object_TX (0x02,1)   transmit(2)|   收node2=> 設 id=1, mes_value=?         
    node3=>  msg_object_TX (0x03,1)   transmit(3)|   收node3=> 設 id=1, mes_value=?
    node4=>  msg_object_TX (0x04,1)   transmit(4)|   收node4=> 設 id=1, mes_value=?   
    node5=>  msg_object_TX (0x05,1)   transmit(5)|   收node5=> 設 id=1, mes_value=?
     
    若用此方法也有問題  若node設定好MsgNum(優先權) CAN依據優先權把5個node都收下來了
                         那我怎知那個node放在那個編號位置?

                                                      再次煩勞各位給我指點,謝謝!

TOP

那個node放在那個編號位置?
這是使用者自己定義的
例如在車控中..每個裝置的id會是固定的
所以用診斷儀就可以判讀該裝置的好壞

TOP

謝謝您的回覆,似乎越來越清楚了,所以
node部分(傳): init_msg_object_TX( MsgNum ,ID ) transmit(MsgNum)
              node的 MsgNum要一樣 ex: TX( 0x01 ,ID ) ,transmit(1)   
---------------------------------------------------------------
Master部分(收): init_msg_object_RX (mes_value,ID) receive_data (mes_value)  
                Master的 mes_value要一樣 ex: RX (0x01,ID) ,receive_data (1)
                其中 mes_value 編號只決定我收到node時要編成第幾號
---------------------------------------------------------------
    當收哪個node時  Master RX(ID) 要與 node TX(ID)相同  ex: RX(1)則 TX(1)
    以上這樣講有錯嗎?? 我想要確定一點
----------------------------------------------------------------------------
   觀看 message Registers時  其中 MSGCN是什麼??

TOP

 14 12
發新話題