除錯過程很奇怪, 記錄下來, 作為紀念.
1. 電路
1) 165接6路單刀雙擲開關, 公共端接165晶元, 常閉端接5v, 常開端接地. 最高位的2路(d7,d6), 直接接地. 165晶元5v供電.
2) 微控制器使用是stm32f103, i/o管腳通過9012pnp型三極體, 將3.3v轉為5v, 控制165晶元的pl端和cp端, 165晶元的資料端直接接103的i/o口.
2. 出現問題
1) 在除錯程式的過程中發現, 只有按d5管腳的開關, 讀取的資料才是正確的, 其他的開關都是錯誤資料.
3. 解決問題
1) 一開始懷疑是三極體頻率不夠. 在三極體基極上增加乙個0.1uf的電容, 結果讀出來的資料全是0, 更不對.
2) 直接將三極體去掉, 用103的i/o管腳直接控制165晶元, 結果跟三極體不加電容的電路乙個效果.
3) 給165的時鐘訊號, 頻率減小(懷疑三極體開關速度不夠), 結果不變.
4) 單步除錯程式, 發現165資料輸出管腳的資料跟最後得到的資料是一致的, 排除資料在傳輸過程中被干擾的情況.
5) 懷疑在資料鎖存時, 就儲存了個錯誤資料. 程式做了2次更改:一是pl腳拉高前(由鎖存模式改為移位模式), 時間延長;二是用2次鎖存. 但是結果跟以前一樣.
6) 將165晶元改用3.3v供電, 並去掉三極體, 103直接控制165晶元. 結果正常.
4. 總結
1) 以前用過165晶元, 要不使用5v微控制器, 要不使用3.3v轉5v晶元, 都沒出過問題. 使用三極體把3.3v轉為5v, 結果就出問題了. 但是不明白是什麼原因. 按說三極體的頻率最少也有幾百k(百科說有150mhz), 完全夠用.
2) 165晶元使用5v電, 是因為以前使用時, 接收的是霍爾開關的訊號, 霍爾開關是5v供電. 使用輕觸開關(單刀雙擲), 還是用5v. 沒有仔細考慮, 還是按照以前經驗, 給165晶元用5v供電, 微控制器3.3v轉5v電, 控制165晶元.犯了經驗主義的錯誤.
用74HC165讀8個按鍵狀態
源 用74hc165讀8個按鍵狀態 源 74lv165與74hc595 使用 74lv165是8位並行負載或序列輸入移位暫存器,末級提供互補序列輸出 q7和q7 並行負載 pl 輸入為低電平時,來自d0至d7輸入的並行資料會非同步載入到暫存器中。輸入pl為高電平時,資料在輸入ds處序列輸入暫存器。其...
float型別做為引數傳遞過程中出現的問題
程式設計中發現 float 型別資料在跨檔案的值呼叫中會發生異常。舉例如下 test.c cpp view plain copy void a float x1 void b float x1 main.c cpp view plain copy include intmain 執行輸出結果是乙個奇...
ORB SLAM2除錯過程中可能出現的問題
orb slam2除錯過程中可能出現的問題 按照github上命令除錯仍然可能會出現一些問題,現將我遇到的問題整理如下1 出現cv bridge問題 安裝gcc g 5版本以上,配置設定成5版本以上 重啟 2 編譯orb slam2出現fatal error config.h沒有那個檔案或目錄 根據...