我一直在想不論是誰,經過一小小段時間的磨練。好像都可以成為韌體工程師。
比如我目前所在的,怎麼連一個碰都沒碰過的,經過2~3月就可以handle一個案子了。
若是如此,那本科的到底差在那裡了。
我想除了,
上手的時間外,以過去經驗來學習新東西及解決問題能力外。
個人覺得還在個更為重要的"正確的開發方法"。
"若只是時間的問題;那還有什麼價值的"
因為時間才是重點。
但雖然我知道,卻不知如何去做起。只能不斷不斷地亂吸收有的沒的資訊。
這本"建立嵌入式系統-傑出軟體的設計模式"
是一本相當不錯的書我想就從這開始吧。
裡面的內容有系統架構、硬體(測試及處理錯誤)、輪出及輪入與計時器、動作流程(排程、事件、中斷)、週邊通訊、更新程式、
功耗、數學(嵌入式)
--------------------------------------------------------------------------------------------------------
就像是解數學(在設計時也應該把它現象具現化數值化),問題、變數及條件。
Q.
開關去抖動(Deboucing switch)
var.
其持續時間的長短(取決於使用的開關)
需考慮程式寫法,可能會有多個。
limit.
反應時間.
1.問題分析
按鍵debouce,我們都知道的東西。但我們只知加上個delay time去判斷有效否? 沒有詳細去觀察它。
它正確名稱為" 跳動數位按鈕訊號,bouncy digital button signal",而不論是採用poll or interrupt對這個都會
產生反應,而系統對 開關抖動(switch bouncing)的原因來自機械或電子效應。
可以見到其中有3個不確定的狀態 都是在上/下邊緣時的雜訊,這些就是抖動bounce現象。
而要去除這些則需要比反應取樣,並出現連續一致的就系統按鈕狀態已經改變。
2.條件(需求)
以一般的打字來算,平均一分鐘120字(每字5個字元)。即一分鐘按600次,故10 time/s=100ms。
而系統必須在一半的時間內判斷按下按鍵,所以是50mS。
加上其所使用的按鍵的datasheet,對於按下/放開的時間(設12.5 ms 內),則可以知以10mS(低於反應時間)
約有5次的sample來判判。
3.變數
由持續時間的長短,:
The current raw reading of the I/O line(raw data)
A counter to determine how long the raw reading has been consistent (counter)
The debounced button value used by the rest of the code (debounce button)
ps.因程式簡化,新增一個changed變數。
read button:
if raw reading same as debounced button value,
reset the counter //counter set number,no change,long press
else
decrement the counter
if the counter is zero,
set debounced button value to raw reading
set changed to true
reset the counter
main loop:
if time to read button,
read button
if button changed and button is no longer pressed
set button changed to false
set the delay period (reset or halve it)
if time to toggle the LED,
toggle LED
repeat
另一個例子是:
使用計時器
現在有一個要求是,每按下按鈕時改變LED閃爍的速度(6.5,8.5 and 10Hz)。
background:
其中 要求來關關LED,需以需要時間的"精確度"。
而系統中精確度來自輸入時脈(clock)的" 正確性" 及" 準確性"。
計時器的組成:
其中,Prescale register(預先倍率暫存器)是相當重要的一點,
將時脈值除以特定數字,讓計時器以較慢的速度增加。
問題:
現在有一個要求是,每按下按鈕時改變LED閃爍的速度(6.5,8.5 and 10Hz)。
條件(需求):
6.5,8.5 and 10Hz。容許誤差範圍。
其各timer register的設定範圍。(8bit/16bit)
變數:
main clock souce and how much? (4MHz)
各timer的register設定。(prescale register(預先倍率),time counter(輸入頻率),compare register(比對) and action register(動作))
由以上可以得到。
timerFrequency = clockIn/(prescaler * compareReg)
在已知clock In,只需改prescaler 及compareReg來得到其timerFrequency
其中,以10Hz閃爍(on/off)所以需要20Hz來on or off動作。
A.若不使用prescale (set =1)則 其compareReg = 4M/(20)=2x 10^5(超過compareReg大小255)
B.而prescale (1023,10bits),可以先求prescaler * compareReg的總數再找各別的,所以
prescaler * compareReg= 4M/20,
prescaler(8bit) * compareReg(10bit)=200,000, compareReg set 200, prescaler set 1000
另一個8.5Hz,若以相同的話?
prescaler * compareReg = 4M/17 = 235294.1
set prescaler = 923, compareReg =
因為沒法整除,所以必須將誤差代入(以最好計算)
error = 100*(goal frequency – actual)/goal
所以要以疊代計算。
| |
| \/
| <-------------- set new prescaler
Pulse Width Modulation (PWM)
若有一個新增一個按鈕來控制亮度。
沒有留言:
張貼留言