一個低電平引發的思考
一、問題背景
昨天寫一個開發板的庫,寫到LCD部分,遇到了幾個問題。
相關電路如上圖,左上角為微控制器,通過硬體SPI連線74HC595,片選訊號由74HC138產生,8位並行輸出串聯兩個470歐8P4R排阻後連線到一組排針和LCD介面上。
1602的LCD一共16根引腳,其中資料有11根,把LCD連線到595上是迫不得已,微控制器沒有那麼多IO口。這是一個不好的設計,但我已經焊接完了才發現問題。
問題有兩個:
其一,595只能序列輸入並行輸出,但LCD模組有一個讀取指令,檢測LCD是否忙,並且這是一個必要的操作,然而微控制器不能直接讀取;
其二,我在每次寫操作前都等待LCD進入空閒狀態,但LCD只顯示大約一半的字元,而且不固定。
二、解決方案
第一個問題,我規定使用者要連線一根線,在初始化時作為引數傳入。
第二個問題,我在每次讀取之前把74HC595輸出置為高電平,然後就正常工作了。
現在回想起來,第二個問題與解決方案之間的聯絡有些微妙。
三、解決過程
作為一塊開發板,板上的許多net都引出了排針,可以用杜邦線連線起來。正好,595輸出是在串聯電阻後才接到LCD上的,兩個輸出不會衝突,並且這個net是有引出的,同時微控制器也引出了GPIO,於是第一個問題的解決方案就很顯而易見了——連起來。相應地程式中也要呼叫這個GPIO上的讀取操作。
而第二個問題的解決就頗費周折。在微控制器可以讀取LCD忙狀態以後,我在程式中每次寫入前等待LCD進入空閒,理應能正常工作,然而並沒有。
我先嚐試加入延時,在寫入過程中加入多個1ms延時,發現可以正常工作。然後我試著消除儘可能多的延時,並降低延時長度,發現只要LCD的E引腳的上升沿之前有10000次for迴圈延時就行,反之則不行。這種延時的解決方案遠不能讓我滿意。
在E引腳的上升沿同時,LCD讀取引腳電平並開始執行操作,在此之前一定要有延時。一個可能性是訊號傳輸有延遲,但這裡需要的最小延時有亞毫秒級,排除。另一個可能性就是忙狀態電平讀取錯誤,把表示忙狀態的高電平讀成了低電平。
之前在解決第一個問題的過程中,利用了595和LCD之間的電阻,它的存在讓兩個輸出不衝突。但是這個電阻只有470歐,如果兩端一個高電平一個低電平,會有10mA的電流,對於74HC595等CMOS IC,這個電流讓電壓偏離理想值不會超過1V,但是對別的IC就不一定了。
一個4引腳的RGB LED燈有共陰和共陽兩種連線方式,我曾疑惑為什麼要有兩種,查閱資料後得知,比較老的IC,比如51,是使用TTL工藝製造的,埠sink電流能力強而source電流的能力弱,所以如果要用引腳驅動LED,一般會把正極接到VCC,串聯電阻後接到引腳上,對於RGB的來說就是用共陽了。
下面兩張圖分別是TI的74HC00和74LS00的datasheet的截圖,分析資料可以得出,前者輸出低電平能力稍強,還是比較對稱的,而後者明顯不對稱。
在這個問題中,LCD模組輸出的source電流能力很弱,在5V電源下,當595輸出低,LCD輸出高時,後者埠上電壓為1.1V;當595輸出高,LCD輸出低時,後者埠上電壓也是1.1V;兩個電壓都會被微控制器判定為低電平。
分析至此,就不難得出解決方案了——在讀取之前把595的輸出置為高電平,然後就能正確地讀到LCD的輸出了。
四、思考
這是一個不難的問題,我也順利解決了,但是解決問題的思路與過程還是讓我挺有收穫的。
如果我在畫原理圖之前認真讀datasheet,就會知道LCD也有讀取的操作,就不會有後面的問題了。所以,以後做開發的過程中,要認真讀datasheet;表面上看起來只有輸出屬性的裝置也可能需要輸入,不要因為一個裝置是輸出裝置就把它掛在純輸出口上。
如果我在畫原理圖時把LCD直接與微控制器相連線,也不會有後面的問題。而在這塊開發板上,595連線了數碼管、LCD與排針3種裝置,這種複用方式是不好的,應該儘量避免;寧願多加幾個IC,或者換一個IO更多的微控制器,雖然成本高了,但時間也省下來了。
在開發板上放這塊595的最初目的,是為了給使用者學習時序,學會根據datasheet來寫程式,想著初學者也就會玩玩LED,為了方便使用者就加上了排阻,就算輸出要用作別的,串聯的電阻也人畜無害。後來才把數碼管和LCD一起連線上去。而LCD沒有直接連線595輸出而是連線電阻的原因,也只是為了方便佈線。沒想到最後歪打正著,串聯的電阻幫了大忙。也許以後設計的時候應該多考慮一下串聯電阻,反正幾分錢的電阻四捨五入一下就是不要錢,但沒準就有大用處。
最後,也是最重要的一點,電子電路的知識都是融會貫通的。即使是細枝末節、無關緊要的,或是已經obsolete的知識,也可能成為解決某個問題的關鍵。如果不曾瞭解共陽和共陰背後的原因,對於一個一直使用CMOS工藝製造的微控制器的開發者來說,怎麼會從LCD不接收指令一路聯想到是TTL驅動能力的問題呢?沒準到現在都沒解決問題吧!
&n