會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客



« 1 (2)


Re: 關於ADC處理
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1014
等級: 28; EXP: 16
HP : 0 / 679
MP : 338 / 22855
離線
------------------------ADC讀取程式-----------------------
BANKSEL ADC_L
ADDWF ADC_L //將讀取到的值加到ADC_L
BTFSS STATUS,C //檢查是否溢位
INCF ADC_H //如果溢位ADC_H+1如果沒有跳下行

你前面把ADC讀取後,(累加)放在ADC_L跟ADC_H
你後面卻要在ADC_DETECTOR_TEMP找到答案
你不覺得 牛頭不對馬嘴 ??

RRF ADC_DETECTOR_TEMP,5 //除32
BANKSEL ADC_DETECTOR_TEMP
MOVFW ADC_DETECTOR_TEMP //最終取得的平均值

另外你一直說要用ASM 卻用// C的註解
(不知是否現在ASM與C都用相同的註解//)


參考另一個討論...
http://www.microchip.com.tw/modules/n ... 3&viewmode=flat&order=ASC

8月02日 13:41:39
轉換PDF檔 列印


Re: 關於ADC處理
新會員
註冊日期:
7月30日 11:05:58
來自 高雄
所屬群組:
註冊會員
文章: 7
等級: 1; EXP: 60
HP : 0 / 15
MP : 2 / 16
離線
引用:

jason680 寫道:
------------------------ADC讀取程式-----------------------
BANKSEL ADC_L
ADDWF ADC_L //將讀取到的值加到ADC_L
BTFSS STATUS,C //檢查是否溢位
INCF ADC_H //如果溢位ADC_H+1如果沒有跳下行

你前面把ADC讀取後,(累加)放在ADC_L跟ADC_H
你後面卻要在ADC_DETECTOR_TEMP找到答案
你不覺得 牛頭不對馬嘴 ??

RRF ADC_DETECTOR_TEMP,5 //除32
BANKSEL ADC_DETECTOR_TEMP
MOVFW ADC_DETECTOR_TEMP //最終取得的平均值

另外你一直說要用ASM 卻用// C的註解
(不知是否現在ASM與C都用相同的註解//)


參考另一個討論...
http://www.microchip.com.tw/modules/n ... 3&viewmode=flat&order=ASC




抱歉因為之前轉為硬體工程師之前有寫過C所以我在註記不小心弄錯了!!非常謝謝您的指教!!我再放最後一次我寫的程式(怕太麻煩大家教新手)~如果真的我這次寫的觀念還是有問題我在自己想辦法,非常謝謝您們願意耐心對一個新手指教!!我將您說的位移概念用上了。

ADC_COUNTER_BASE:

MOVLW 32 ;除32次
MOVWF ADC_DETECTOR ;將32次丟到計數暫存器

ADC_COUNTER:

BSF PORTC,2 ;驗證是否執行LDE2亮
CALL DELAY
BCF PORTC,2 ;驗證是否執行LDE2滅
CALL PWM_ADC_AVERAGE

PWM_ADC_AVERAGE:

DECF ADC_DETECTOR ;減計數暫存器數值

BSF PORTC,1 ;驗證是否執行LDE1亮
CALL DELAY


------------------------ADC讀取程式-----------------------

BANKSEL ADCON0
MOVLW B'00000001'
MOVWF ADCON0
CALL ADC_DELAY
BANKSEL ADCON0
BSF ADCON0,GO
BTFSC ADCON0,GO
GOTO $-1
BANKSEL ADRESH
MOVFW ADRESH ;將讀取到的值挪到W

----------------------ADC讀取程式 END---------------------

BANKSEL ADC_L
ADDWF ADC_L ;將讀取到的值加到ADC_L
BTFSS STATUS,C ;檢查是否溢位
INCF ADC_H ;如果溢位ADC_H +1



BCF PORTC,1 ;驗證是否執行LDE1滅

BTFSC ADC_DETECTOR ;執行32次後到除法區
GOTO ADC_COUNTER

GOTO DIVIDED

DIVIDED:

-----------------------一共往右位移5次--------------------

假設 ADC_H=0000 1010
ADC_L=1110 1110

假設取得值為0000 1010 1110 1110(往右移5格等於除32)
所以我要取得的值為紅色區域也就是0101 0111

BANKSEL ADC_H
RRF ADC_H,0 ;0000 1010->0000 0101 C=0
MOVWF ADC_H ;ADC_H=0000 0101
BANKSEL ADC_L
RRF ADC_L,0 ;1110 1110->0111 0111 C=0
MOVWF ADC_L ;ADC_L=0111 0111

BANKSEL ADC_H
RRF ADC_H,0 ;0000 0101->0000 0010 C=1
MOVWF ADC_H ;ADC_H=0000 0010
BANKSEL ADC_L
RRF ADC_L,0 ;0111 0111->1011 1011 C=1
MOVWF ADC_L ;ADC_L=1011 1011

BANKSEL ADC_H
RRF ADC_H,0 ;0000 0010->1000 0001 C=0
MOVWF ADC_H ;ADC_H=1000 0001
BANKSEL ADC_L
RRF ADC_L,0 ;1011 1011->0101 1101 C=1
MOVWF ADC_L ;ADC_L=0101 1101

BANKSEL ADC_H
RRF ADC_H,0 ;1000 0001->1100 0000 C=1
MOVWF ADC_H ;ADC_H=1100 0000
BANKSEL ADC_L
RRF ADC_L,0 ;0101 1101->1010 1110 C=1
MOVWF ADC_L ;ADC_L=1010 1110

BANKSEL ADC_H
RRF ADC_H,0 ;1100 0000->1110 0000 C=0
MOVWF ADC_H ;ADC_H=1110 0000
BANKSEL ADC_L
RRF ADC_L,0 ;1010 1110->0101 0111
MOVWF ADC_L ;0101 0111 (除32後取得的值)

--------------------一共往右位移5次 END------------------

BANKSEL ADC_L
MOVFW ADC_L ;將F值移到W
BANKSEL ADC_RESULT
MOVWF ADC_RESULT ;將ADC_L移到最終結果

8月02日 16:07:09
轉換PDF檔 列印


Re: 關於ADC處理
資深會員
註冊日期:
2007/06/05 21:45
所屬群組:
註冊會員
文章: 1014
等級: 28; EXP: 16
HP : 0 / 679
MP : 338 / 22855
離線
基本上,沒什麼問題...

但有另外幾個議題:
1. 請問,取32次再平均
用意為何?

2. 需不需要四捨五入
有除法就會有小數
有小數就可能要四捨五入

3. 之前有寫過C
也許你還是用C開發吧...


---------------------------------------------
註:現在ADC應該都有10bits解析度
但你卻只用8bit,然後取32次再平均
沒有做四捨五入(可能沒想過,也可能不會...)

3198/32 = 99.94 => 99 or 100 ?
3200/32 = 100.00 => 100
3208/32 = 100.25 => 100
3220/32 = 100.625 => 100 or 101 ?

你目前是無條件捨去,也就是
3198/32 = 99.94 => 99
3202/32 = 100.06 => 100

這些就留給你想一想...

8月02日 21:34:13
轉換PDF檔 列印


Re: 關於ADC處理
新會員
註冊日期:
7月30日 11:05:58
來自 高雄
所屬群組:
註冊會員
文章: 7
等級: 1; EXP: 60
HP : 0 / 15
MP : 2 / 16
離線
引用:

jason680 寫道:
基本上,沒什麼問題...

但有另外幾個議題:
1. 請問,取32次再平均
用意為何?

2. 需不需要四捨五入
有除法就會有小數
有小數就可能要四捨五入

3. 之前有寫過C
也許你還是用C開發吧...


---------------------------------------------
註:現在ADC應該都有10bits解析度
但你卻只用8bit,然後取32次再平均
沒有做四捨五入(可能沒想過,也可能不會...)

3198/32 = 99.94 => 99 or 100 ?
3200/32 = 100.00 => 100
3208/32 = 100.25 => 100
3220/32 = 100.625 => 100 or 101 ?

你目前是無條件捨去,也就是
3198/32 = 99.94 => 99
3202/32 = 100.06 => 100

這些就留給你想一想...


非常謝謝您幫我檢視我的程式,其實是這樣的這個ADC不需要非常精準到四捨五入,因為他只是一個控制速度的系統,對於轉速而言那0.幾並不影響太大,所以他們當初在寫的時候就是直接忽略,只用8bit檢視所以我也跟著他們之前寫的直接忽略。

目前會用到平均32次的原因是,目前合理懷疑ADC偵測被干擾,當初他們取樣只取1次就做動作(怕讀取到的是被干擾的訊號),現在要排除是 否為被干擾所以才會偵測32次平均後再送訊號,之後可能會在用C重新將程式寫一次~畢竟組合語言對我來說真的很陌生,不管如何真的非常謝謝您耐心的指導!!謝謝您,若還有甚麼建議再麻煩各位大神們不吝嗇指教!謝謝大家!!

8月03日 10:41:56
轉換PDF檔 列印



« 1 (2)



無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結

網頁捷徑
2019 Winter Elite 報名
教育訓練
其它網站連結
電話: 02-25000405
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project