作者eternal1879 (瘋狂米虫)
看板ASM
標題[問題] 8051的一些小問題
時間Sun Mar 21 22:29:25 2010
最近開始在學習8051,現在有一些疑惑 希望有人可以幫我解答 感謝
前提 我的PORT一直在讀取一個變數 現在要輸出到LCD上
這個我都已經寫好了
但是怕誤差我想加上一個平均的寫法
假設15次平均後在輸出一次
問題一
考慮到溢位 我是想說把第一次的先存起來丟旁邊
再利用第二次輸入的與第一次輸入相減
第三次輸入的與第一次輸入相減...最後累加差值/15 在與第一次相加 可得平均數
可是我看了一下減法的程式跑法 SUBB 如果是負號他是利用CY來標記
那如果我把他們的差值移動到其他地方會不會系統就搞混?(是失真嗎?意思是差值變了
就是差值得正負在移動後會不會亂掉
我同學說會可是我感覺應該不會才對@@"
問題二
ADD,ADDC有人可以具體的描述他們的差異嗎
有方法可以讓我直接把數值拆開然後累加嗎
可是我考慮到累積15次...還是會有溢位的可能性
所以有人有更好的方法嗎?
能看到這行..真的感謝各位的幫忙..
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.125.93.19
1F:推 odahawk:問題二。用兩個記憶區,加一次判斷是否大於某值就進位 03/21 22:34
2F:→ eternal1879:判斷如果C的話我知道用if寫 組合語言判斷溢位 有好的 03/21 22:43
3F:→ eternal1879:寫法嗎? 03/21 22:43
4F:→ mepass:你可以先判斷大小 大的放一邊 小的放一邊 03/22 00:00
5F:→ mepass:要加減的時候再統一取正負 03/22 00:00
6F:→ mepass:比如說 i2>i1就取i2-i1放到正的暫存器 03/22 00:01
7F:→ mepass: i3<i1就取i1-i3放到負的暫存器 03/22 00:02
8F:→ mepass:這邊說的正負 是指後面相加減的時候你取的正負號 03/22 00:02
9F:推 mepass:add addc差別是一個溢位後會有旗標 簡單講就是表示進位 03/22 00:05
10F:→ mepass:就好比兩個個位數相加超過十會進一位一樣 03/22 00:06
11F:→ mepass:如果要把兩個8bit暫存器合起來變成一個16bit暫存器 03/22 00:06
12F:→ mepass:你就需要那個進位旗標 詳細作法應該書上都會有 03/22 00:07
13F:→ mepass:8051的書找不到就去找8086的看看 03/22 00:07
14F:推 stool100:問題一. 你可以把(新值*14+舊值)/15 放入舊值 03/22 01:45
15F:推 ksmrt0123:你會用8-bit指令做出16-bit加法嗎? 03/22 13:59
16F:→ ksmrt0123:平均還是累加後再除比較好做, 最好取2的冪次方個再平均 03/22 14:01
17F:→ ksmrt0123:如除16可用右移4 bit完成 03/22 14:02
感謝大家給我的想法
目前是利用
時脈一直讀取 A B C D E...一直跑N個
讀取A之後先存到一邊
B判斷 B>A B-A 得差值存到一邊(正)
B<A A-B 得差值存到一邊(數值為正,但意義上應該是負)
C D E..等等同B的計算方法
差值正的累加得到X
差值負的累加得到Y
再次判斷差值X>Y (X-Y)/N+A
X<Y A-(Y-X)/N
比大小是利用SUBB看CY是1或0來跑 利用JC決定放哪邊
有關2的N次方我之前有想過 可是我不會16BIT的加減法 有人要教我一下嗎
感覺利用16BIT的寫法會比較快一點
之前我是想說如果取2的一次方的數量 RR1次
2的二次方的數量 RR2次
2的三次方的數量 RR3次來計算平均
可是我只知道用ADD來計算 可是這樣會使A溢位
也想過利用類似邏設的半加法的方法..可是這樣要寫很多迴圈
16BIT是利用這樣寫嗎..?
應該不是吧...
※ 編輯: eternal1879 來自: 59.125.93.19 (03/22 16:09)
18F:推 kissy:印象中溢不溢位用組語來寫的話,可以靠STATUS來判斷 ? 03/22 17:16
19F:推 joy830:你讀取的是什麼東西? 如果是A/D 03/23 01:56
20F:→ joy830:已經自動平均了 只要把讀取頻率調低 自然會平均多一點 03/23 01:56