2017年12月25日 星期一

DS18B20-Write-寫個位元

跨出第二步



要掌握DS18B20,其實就只要三個基礎程序,第一項就是啟動程序:包含了重置及應答程序,而第二項就是寫位元(Write a bit)及第三項讀位元(Read a bit),有了這三項基本程序就能延伸出所有的後續操作如命令、讀取溫度值等。

啟動程序已在上一篇談過,本篇開始就進入第二項基礎程序寫字元(Write a bit),關鍵還是時序的掌握。

如何寫入一個位元至DS18B20

首先我會先介紹位元與字元的差異,以免混淆觀念,然後就是將官方資料(Datasheet)的資料呈現出來,再附上寫位元的時序分段概念圖,以供各位參考。

 基本概念:位元(bit)與字元(byte)

位元(bit) :目前電腦的最基本的單位就是位元(bit),每個位元,透過電壓(High/Low)的判別,可以儲存(1/0)兩種訊息

字元(byte):字元(byte)就是8個位元的組合,要注意的是位元序號是由0開始,且由右至左的升序,最左的位元為bit 7,由於每個位元有兩種狀態(0/1),因此8個位元組合而成的字元(byte)就有2^8(2的8次方)=256種狀態可區分。

基本應用:透過標準的狀態規定,可以達到訊息的傳遞。以電腦中常用的A,其基本組成如上圖例中的"01000001",而透過ASCII編碼表中,電腦可顯示它為"A"。

官方資料及其時序圖


資料來源:Datasheet之第15頁及第16頁的圖示

寫位元的時序圖

Arduino 寫"0"訊息進位元槽的時序
1-將電位拉高
2-將電位拉低
3-持續於低電位(60~120μS),讓DS18B20採樣讀取時間
4-釋放電位控制(上拉電阻會將其電位拉高)
5-等待間隔:等待上拉電阻將電位復位為High的時間

Arduino 寫"0"訊息進位元槽的時序1-將電位拉高
2-將電位拉低並持續於低電位(1~15μS)至少1μS,且於15μS前要回復高電位
3-轉換為高電位
4-加上前段的延時,至少要等待60μS(DS18B20採樣時間)

※簡單的來說:寫程序都是拉高電位,再拉低電位作開端,
所以整個寫的時序,需注意的是以下兩項重點:
1、程序間隔時間
2、在DS18B20的採樣時間中給予正確的位元訊息


程式碼撰寫

掌握了時序圖後,再配合程式碼中的說明,應該沒什麼問題,此程式碼沒有輸出,需等第三步Read程序的撰寫,才會有具體的輸出顯示。


程式碼


程式碼是一個WriteSolt(uint8_t order_bit)的副程式,會讀取一個位元值(傳值變數是order_bit),副程式依其值(1或0)來作不同的處理程序。
void WriteSolt(uint8_t order_bit)
{
 if(order_bit) {        //當欲寫入的值(變數名稱:order_bit)為1時的處理,
  pinMode(g_dq_pin, OUTPUT);      //先將pin腳改為輸出狀態
  digitalWrite(g_dq_pin, LOW);    //將電位拉低,等於通知DS18B20要do something
  delayMicroseconds(10);       //至少要等待1us,但於15us前轉為高電位
  pinMode(g_dq_pin, INPUT);     //將接收轉成INPUT狀態,轉為高電位
  delayMicroseconds(60);      //加前段的延時至少等待60us過此周期
 }
 else {           //當寫入值為'0'時,Tx拉低電位時段60~120us
  pinMode(g_dq_pin, OUTPUT);    //先轉為輸出狀態
  digitalWrite(g_dq_pin, LOW);   //將電位輸出低電位
  delayMicroseconds(65);         //靜靜的等待DS18B20來讀取資料
  pinMode(g_dq_pin, INPUT);      //釋放電位控制轉回輸入狀態
  delayMicroseconds(5);     //等待上拉電阻將電位復位為HIGH
 }
}

結語 

完成此一步驟,基本上對於DS18B20的時序圖及其英文資訊應該不會太排斥了吧!其實,電子類的操作英文都不會太難,只是我們不常接觸!

時序圖只要掌握到重點,再加上適當的步驟分解,也可以輕易的轉換成程式!

寫入一個位元,沒問題了,下一步應是講寫入一個字元(byte),但其實就是拆解字元命令,再重覆八次的寫入程序,必要但不重要,所以...

下一步,就是讀取一個位元值的程序!


沒有留言:

張貼留言