會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客





不同型號的兩個PIC相互通訊
中級會員
註冊日期:
2016/05/03 21:00
所屬群組:
註冊會員
文章: 41
等級: 5; EXP: 19
HP : 0 / 104
MP : 13 / 755
離線
各位大大,不好意思小弟又來發問了
我有兩個PIC,PIC18F2520與PIC16F1614之間有兩組10bit的訊號要做傳遞,過去一直沒有用到這塊所以看得很霧。

大概了解有UART與I2C兩種傳遞方式,哪種比較好上手呢?
剛剛有確認過兩個型號都有I2C的功能。


1.接線部分是不是把兩端I2C的SCL與SDA對接起來,都用10K電阻做上拉的動作就行了?

2.主傳送端將數值先複製到特定的位址等待傳送,接收端則先選定位址做存取,再將存取的值複製出來做使用,這樣理解對嗎?有需要用到EEPROM嗎?因為這部分我也還沒涉獵。

3.打算用XIDE的MCC做設定,這部分有範例可以參考嗎?
我自己查到的I2C範例都是對EEPROM或者周邊硬體的,PIC對PIC的好像沒有看到。

謝謝各位了。

9月25日 19:18:14
轉換PDF檔 列印


Re: 不同型號的兩個PIC相互通訊
中級會員
註冊日期:
2016/05/03 21:00
所屬群組:
註冊會員
文章: 41
等級: 5; EXP: 19
HP : 0 / 104
MP : 13 / 755
離線
補充問題:
Enble SM Bus Input 這是什麼用途呢?

再來就是MasterWrite與MasterRead的用法看不懂,這邊該怎麼設定? 假設要傳輸的值 Value = 0x03FF; 要填入那些數值才能順利傳輸呢? Slave那邊的設定也是一樣的嗎?

void I2C_MasterWrite(uint8_t *pdata,
uint8_t length,
uint16_t address,
I2C_MESSAGE_STATUS *pflag)
void I2C_MasterRead(
uint8_t *pdata,
uint8_t length,
uint16_t address,
I2C_MESSAGE_STATUS *pflag)

9月25日 22:51:08
轉換PDF檔 列印


Re: 不同型號的兩個PIC相互通訊
中級會員
註冊日期:
2014/05/28 13:30
所屬群組:
註冊會員
文章: 49
等級: 5; EXP: 82
HP : 0 / 120
MP : 16 / 1551
離線
MCU 之間的溝通除了I2C、UART還有SPI、CAN BUS...等很多種方式,

問題>>>>>哪種比較好上手呢?
如果要我選的話我會選擇UART,
一來除錯方便(市面上很多TTL轉USB tool and software),
可以很簡單地在電腦上看訊息,
二來硬體不需要多做著墨.

如果使用I2C的話要分析得很細也許你會需要邏輯分析儀or示波器,
這些設備除非是在學校或企業,
否則對於一個初學者/自學者會相對比較難取得,
再者I2C的Mater與Slave的架構對於初學/自學也都是比較頭痛的,
無論是Master或是Slave的撰寫上要寫得很Solid,
必須全面考慮I2C BUS的錯誤然後加入的Fault handler,

問題1.接線部分是不是把兩端I2C的SCL與SDA對接起來,都用10K電阻做上拉的動作就行了?
基本上是這樣沒錯,但是還是需要視實際情況去調整上拉電阻.

問題2.主傳送端將數值先複製到特定的位址等待傳送,接收端則先選定位址做存取,再將存取的值複製出來做使用,這樣理解對嗎?有需要用到EEPROM嗎?因為這部分我也還沒涉獵。
建議先找教育訓練光碟裡面的範例練習...

問題3.打算用XIDE的MCC做設定,這部分有範例可以參考嗎?
我自己查到的I2C範例都是對EEPROM或者周邊硬體的,PIC對PIC的好像沒有看到。
MCC的部分我沒有涉略,但其實有PIC to EEP的範例基本上Master就差不多建好了,
你只差Slave端的建置,

以上,
如果有錯請多多見諒.

9月26日 09:23:03
轉換PDF檔 列印


Re: 不同型號的兩個PIC相互通訊
中級會員
註冊日期:
2016/05/03 21:00
所屬群組:
註冊會員
文章: 41
等級: 5; EXP: 19
HP : 0 / 104
MP : 13 / 755
離線
感謝energy0364的回覆,
因為兩塊板子相隔約1.5米。有兩組感測器的A-D數值需要共享,考慮到如果用並聯的方式線拉太遠且走線位置是與動力線固定再一起,怕會有雜訊或衰減,才會想要用通訊的方式。

單純的想把Value1與Value2做傳遞,但昨天下班後翻了一個晚上的資料
首先是沒有找到PIC TO PIC的範例,再來就是我對資料架構沒有很熟
所以那些文章盯了半天也沒有開悟XD

還是希望有範例可以參考,或有哪位高手肯幫忙指點一下,真的感激不盡。

9月26日 12:33:41
轉換PDF檔 列印


Re: 不同型號的兩個PIC相互通訊
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14501
等級: 73; EXP: 6
HP : 1080 / 1801
MP : 4833 / 76200
離線
MCU 與 MCU 的短距離的通訊一般最簡單的方式有三種: I2C, SPI & UART。這三種以 UART 最簡單,SPI 次之,較複雜的 I2C。

建議初學者先從 UART 的通訊開始學起。1.5米對 UART 不算長,如果加個 RS-232 的驅動元件就可以延長到 30米。只要將雙方 MCU 的 TxD 接到對方的 RxD 就可以通訊了。

至於 I2C 你必須先下載 I2C 的規範來研讀,I2C Master Mode and I2C Slave mode 都要弄清楚才行。

現行的教育訓練教材可以參考一下 W401 裡的 UART 傳輸的範例。

9月26日 14:09:16
轉換PDF檔 列印


Re: 不同型號的兩個PIC相互通訊
中級會員
註冊日期:
2016/05/03 21:00
所屬群組:
註冊會員
文章: 41
等級: 5; EXP: 19
HP : 0 / 104
MP : 13 / 755
離線
好的,決定使用USART做傳輸,但看過手冊後我有個大疑問就是,

1.接收端怎麼判別接收的順序呢?
比如我有三組數值要傳輸,電流Value1,轉速Value2,Value3。
接收端如何判別目前讀出的數據是哪一組呢?
也是用排序的方式嗎? 第一組接收到的資料就是Value1,第二組是Value2以此類推。

2.
還是要開啟中斷功能? 輸出後觸發中斷,等到數據被讀取後在寫入下一組?
但是在模組中只有看到寫入完成的指令
EUSART_is_tx_done();
請問有偵測對方讀取完成的指令嗎?




參考的範例程式
while(1)
{
// Logic to echo received data
if(EUSART_is_rx_ready())
{
rxData = UART1_Read();
if(EUSART_is_tx_ready())
{
EUSARTWrite(rxData);
}
}
}


發問完我好像開悟了XD
雙向傳輸
A->B的時候 B先接收,接收完成後B->A一個旗標
A讀取到旗標後再寫入下一組數據
現在問題是用什麼值當旗標,避免跟Value重合時誤判

9月27日 12:29:50

a780917a 於 2018年09月27日 12:48:13
轉換PDF檔 列印


Re: 不同型號的兩個PIC相互通訊
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14501
等級: 73; EXP: 6
HP : 1080 / 1801
MP : 4833 / 76200
離線
1: 現今你有三個資料要傳送 "電流Value1,轉速Value2,Value3" 如果是同時要傳送的話比較好的方式是加傳送的資料打包。
封包資料如果可以用 ASCII Code 傳送會比較好除錯,比如設計的傳送封包是:
0xA5 + Val1 (MSB + Val1 (LSB) + VAl2 (MSB) + Val2 (LSB) + Val3 (MSB) + VAl3 (LSB) + 0x0D + 0x0A

其中 0xA5 是固定值,表示資料的起頭
Value1 拆成兩個 Byte 並以 ASCII Code 方式編碼。
最後的 0x0D 是給終端機除錯用,功能是將 Cursor 拉回第一個位置,0x0A 族是換行顯示的命令。

這樣的結合就可以先用 UART to USB 的元件用 Tera Team 的終端機模擬程式先查看資料的正確性後,再去處理你的接收程式。

問題 2,接收建議用中斷方式來收資料,可以開啟一個陣列來存放資料,收到 0xA5 將指標指向陣列的第一個位置,之後收到的依序擺放,收到0x0A 代表資料結束。
其實主程式是不用管這接收的動作的,主程式可以隨時隨地到陣列裡拿走資料。因為接收是自動更新資料的,主程式是可以不管接收的。

9月28日 10:45:49
轉換PDF檔 列印


Re: 不同型號的兩個PIC相互通訊
中級會員
註冊日期:
2016/05/03 21:00
所屬群組:
註冊會員
文章: 41
等級: 5; EXP: 19
HP : 0 / 104
MP : 13 / 755
離線
板大謝謝您的回覆,再幫我看看這樣理解對嗎

您說的將傳送資料打包,意思是設個起始旗標(0xA5)與結束旗標(0x0A),這樣可以用排序的方式分辨Val1~Val3,拆成兩個byte就可以傳送16bit的參數,以上到這邊我沒問題。

我的煩惱是萬一我的Val1~3裡,傳輸的值剛好就是(0xA5)或(0x0A)會不會誤觸發? 當前的排序會整個亂掉?

那我想乾脆一次只傳7bit的數值,將第1個保留,這樣在數值傳遞中就不會出現(0xAX)的可能,用(0xA5)與(0xA4)當作起始與終止旗標就不會有誤觸的問題。



引用:

Ryang 寫道:
1: 現今你有三個資料要傳送 "電流Value1,轉速Value2,Value3" 如果是同時要傳送的話比較好的方式是加傳送的資料打包。
封包資料如果可以用 ASCII Code 傳送會比較好除錯,比如設計的傳送封包是:
0xA5 + Val1 (MSB + Val1 (LSB) + VAl2 (MSB) + Val2 (LSB) + Val3 (MSB) + VAl3 (LSB) + 0x0D + 0x0A

其中 0xA5 是固定值,表示資料的起頭
Value1 拆成兩個 Byte 並以 ASCII Code 方式編碼。
最後的 0x0D 是給終端機除錯用,功能是將 Cursor 拉回第一個位置,0x0A 族是換行顯示的命令。

這樣的結合就可以先用 UART to USB 的元件用 Tera Team 的終端機模擬程式先查看資料的正確性後,再去處理你的接收程式。

問題 2,接收建議用中斷方式來收資料,可以開啟一個陣列來存放資料,收到 0xA5 將指標指向陣列的第一個位置,之後收到的依序擺放,收到0x0A 代表資料結束。
其實主程式是不用管這接收的動作的,主程式可以隨時隨地到陣列裡拿走資料。因為接收是自動更新資料的,主程式是可以不管接收的。

9月28日 19:38:46
轉換PDF檔 列印


Re: 不同型號的兩個PIC相互通訊
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14501
等級: 73; EXP: 6
HP : 1080 / 1801
MP : 4833 / 76200
離線
我說過將資料轉成 ASCII Code 格式,這樣就不會有不當的資料出現。 因為轉成 ASCII Code 的資料是從0x30到0x39 及 0x41 ~ 0x47的範圍。

9月29日 10:35:20

Ryang 於 2018年09月29日 12:11:07
轉換PDF檔 列印


Re: 不同型號的兩個PIC相互通訊
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 14501
等級: 73; EXP: 6
HP : 1080 / 1801
MP : 4833 / 76200
離線
只轉資料的部分,比如 VAr1 的資料是 0xA3 = 0x41 + 0x33,Var2 是 0x05 = 0x30 + 0x35,Var3 為 0x36 = 0x33 + 0x36

則封包的資寮內容為: 0xA5,0x41,0x33,0x30,0x35,0x33,0x36,0x0D,0x0A

沒有資料會干擾標頭跟標尾的問題。

9月29日 10:39:24

Ryang 於 2018年09月29日 12:15:04
Ryang 於 2018年09月29日 12:15:20
轉換PDF檔 列印






無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2018 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project