跨出第二步
要掌握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),但其實就是拆解字元命令,再重覆八次的寫入程序,必要但不重要,所以...
下一步,就是讀取一個位元值的程序!
沒有留言:
張貼留言