close

上次的 AVR ATTINY26, 減肥實驗 (http://hk.myblog.yahoo.com/xiao-laba/article?mid=1465),
學會了一招 [除以10] 的演算設計方法. 最近又預到另外一個問題, 因為以前曾
經學過一個攝氏溫度轉換到華氏溫度的公式, 要用的時候居然忘記得乾乾淨淨.

查察 GOOGLE, 記憶中的公式是找回來, 但是又來了另外一個問題. 先來看看公式
http://en.wikipedia.org/wiki/Celsius

華氏溫度 = 攝氏溫度 * 9 / 5 +32 = 攝氏溫度 * 1.8 +32

因為有 9/5 這個除法存在, 再來就是乘法, 處理小數, 對一般 8 位元 CPU 來說會很吃力, 而且另外一個問題就是轉換速度很慢. 如果用 16 位元 CPU 或許比較好, 但移船就堪是唯一的選擇.

好久以前, 看到這個, 轉到這個裡, 看過那個網頁, 介紹過某個數乘以 PI (圓周率) 的近似值算法, 讀完以後, 還特別用 EXCEL 算了一下這樣的原理, 終於明白人家在做什麼, 因為實際的需要, 也完全同意必須要這樣作, 必要地捨棄繁複的浮點運算.

計算的方法

pi_cal  
  



得到的 201 / 64 大約等於 PI (3.14), 8 位元可以表示 0 -255 的範圍, 所以,

201 除以 64 (2的6次方) 可以簡單的得到答案如下:

201, 十六進制為 0xc9, 二進制為 b11001001,

201 除以 64 (2的6次方) = b11001001, 且小數點向左移動六位 , 得到 b11,001001

b11,001001 => 整數部份為 b11 = 3, (改正) 應該是餘數部份 b001001 = 9

以最傳統的 HC08 的指令寫法作運算, 紀錄如下:

LDA #201 ; 設定被除數為 201 = b11,001001
LSRA ; 被除數向右移一位, 變成 b11,00100
LSRA ; 被除數向右移一位, 變成 b11,0010
LSRA ; 被除數向右移一位, 變成 b11,001
LSRA ; 被除數向右移一位, 變成 b11,00
LSRA ; 被除數向右移一位, 變成 b11,0
LSRA ; 被除數向右移一位, 變成 b11,
STA 整數部份 ; 被除數剩下 3, 存放起來
LDA #201 ; 設定被除數為 201 = b11,001001
AND #b00111111 ; 被除數保留右邊的6位原來狀態, 變成 b00,001001
STA 餘數部份 ; 被除數剩下 9, 存放起來

問題是.....變成 3 + 餘數 9 ? 還是沒有完全理解....所以一下去做就跟想像的有了出入.

既然有些少難度, 就直接套用 HC08 的16 bit / 8 bit 指令, 應該可以算到 900 / 64......

hc08_routine_div




再來, 餘數 9 = 8 + 1 = 2的3次方 + 2的0次方
所以, (2^3+2^0) / 64 = 2^-3 + 2^-6 = 0.125 +  0.015625
若乘以 1000, 則得到 125 + 15.625 = 140.625
雖然閱讀上可以為 3, 140, 各佔用一個BYTE, 運算還是要用到 16 bit 移位配合加減法.

對於 C -> F, 這次比較沒有那麼不知所措, 起馬找到一盞明燈, 套用類似的方法, 試試看能不能解決自己遇到的題目.



arrow
arrow
    全站熱搜

    xiaolabaDIY 發表在 痞客邦 留言(0) 人氣()