訪客
|
關於 A/D 轉換的問題
|
|||
---|---|---|---|---|
訪客-訪客
|
原本我的Vref是用AN3,但現在用VDD,問題來了
之前我用AN3當參考電壓是比方我設5V好啦…而通道的電壓為4.799V 則ADRES暫存器的值為F5,粉正常嘛,但我若用VDD為參考電壓也是5V,則通常的電壓為4.799V~而ADRES反而變之FF....請問這是啥情形呢 |
|||
|
Re: 時鐘問題
|
||||
---|---|---|---|---|
版主
|
/* 程式功能:使用HI-TECH C,4MHz crystal,連接中階PIC, 達到每0.05秒中斷一次。
因為Interrupt latency,在使用內部(同步)中斷源時,固定為3 Tcy, 所不管主程式正在做什麼事,time-out之後,都會在相同的時機跳到 中斷處理程式。 由於不論寫值到 TMR1L或TMR1H都會使prescaler清為零, 所以,不要寫值到TMR1L或TMR1H,或者不要用prescaler會比較簡單。 如果,所接的crystal頻率,可以造成不必使用prescaler,又可以只 寫值到TMR1H,就可以不用考慮到中斷產生後,到寫值進TMR1L時,TMR1L 已經又遞增,不為零的情況。如32768Hz便滿足這個條件:不要使用prescaler, 只要讓它free-run,就會很準地每2秒進位到0000產生中斷一次;或者,只要 每次中斷填0x80到TMR1H,不要去動TMR1L,就可以每一秒中斷一次 */ #include <pic.h> #define TMR1H_VALUE 256-(unsigned char)((4000000/4 * 0.05)/256)-1 //0.05改為0.01就可變成0.01秒中斷一次 #define TMR1L_VALUE 256-(unsigned char)(4000000/4 * 0.05) % 256 //0.05改為0.01就可變成0.01秒中斷一次 void init(void) { TMR1L=TMR1L_VALUE; TMR1H=TMR1H_VALUE; T1CON=0B00000001; TMR1IF = 0; TMR1IE = 1; GIE = 1; PEIE = 1; } main() { init(); while (1) //迴圈中的內容只是用來切換BANK,以證明計時仍然準確。 { TRISB = 0; PORTB ++; TRISB = 0XFF; PORTB ++; } } interrupt void interrupt_isr( void) { if (TMR1IF == 1) { TMR1H=TMR1H_VALUE; TMR1L=TMR1L + TMR1L_VALUE; //以此補償中斷發生,到寫值到TMR1L的時間差要 //要注意可能因此加法,造成必須進位到TMR1H的情況 TMR1IF = 0; NOP(); //NOP只是用來測試已 NOP(); //NOP只是用來測試已 } else { NOP(); //NOP只是用來測試已 } } 以上程式,用軟體模擬測過,很準哦!
發表於: 2004/8/20 12:59
|
|||
|
中斷時間不對---幫幫忙
|
||||
---|---|---|---|---|
新會員
|
4MHZ震盪器 1秒要做250次 所以TMR0=7D,預除128
4MHZ/128/125=250,這樣對吧,下面我的的中斷程式幫忙看一下 INT0: movwf W_Tmp movf STATUS,w clrf STATUS movwf STATUS_Tmp movf PCLATH,w movwf PCLATH_Tmp clrf PCLATH bcf STATUS,RP0 btfsc INTCON,T0IF call T0 End_Int: movf PCLATH_Tmp,w movwf PCLATH movf STATUS_Tmp,w movwf STATUS movf W_Tmp retfie ;------------------------------------------- ;------------ TIMER0 INTERRUPT-------------- ;------------------------------------------- T0: ; bsf T0Flag,0 incf Tcount call CheckT bcf STATUS,RP0 bcf INTCON,2 return
發表於: 2004/8/20 10:54
|
|||
|
Re: 請問dspic30F2010中的PORTB與LATB之間的差異?
|
||||
---|---|---|---|---|
新會員
|
謝謝囉..我大概知道要怎麼處理...
對囉..像我使用30F2010這一顆IC的Timer1時..我要怎麼設定我中斷的時間呢?其中有關的戰存器有T1con及PR,而我使用的震盪器是7.37MHZ,我要如何設定才可以產生每1秒產生中斷的情況呢?經倍頻*4後,funcy=7.37MHZ的震盪器的內部工作內頻30MHZ,每一指令週期為0.135us,其中我參考了範例程式T1CON=0x8030,PR=funcy/256/2,可以產生0.5秒的中斷情況,其中PR為什麼要除256及除2呢? 有公式可循嗎? 謝謝..
發表於: 2004/8/20 0:37
|
|||
|
Re: 無法用icd2的除錯模式...
|
||||
---|---|---|---|---|
版主
|
在ICD2的完整包裝中,有一張大海報,其中有關於ICD2和PIC之間連接電路的詳細描述。
如果海報沒了,到Microchip美國網站搜尋ICD2 poster,大概可以找到它的電子檔。 感謝jubel將經驗分享出來。
發表於: 2004/8/19 23:30
|
|||
|
Re: 時鐘問題
|
||||
---|---|---|---|---|
資深會員
|
;4MHZ TMR1預除1
;使用預除2/4/8 有可能產生 1/62500~2/62500的誤差 16~32PPM INT_TMR1: BCF PIR1,TMR1IF MOVLW 0XDC ADDWF TMR1L,F MOVLW 0X0B SKPNC MOVLW 0X0C ADDWF TMR1H,F ;62500CYCLE 中斷一次 ;中斷16次即一秒
發表於: 2004/8/19 11:10
|
|||
|
Re: 無法用icd2的除錯模式...
|
||||
---|---|---|---|---|
資深會員
|
抱歉...
昨晚再去別處測試 弄一兩小時才發現問題 ICD2沒問題 是我的電路有問題 我的線路是直接把MCLR接去ICD2 沒有接其他元件 (我以為除錯時MCLR是ICD2控制的,所以沒接到VCC) 昨晚試的結果 MCLR需要用顆電阻接到VCC (電阻值跟ICD2有關,前晚測試的兩台,阻值相同,一台可用一台不可用...) 再一顆電容接地(有時不需要) 才可以使用除錯模式 抱歉浪費各位的時間 X_X
發表於: 2004/8/19 8:57
|
|||
|
MCLR 當成輸出用!?
|
||||
---|---|---|---|---|
高級會員
|
各位前輩好:
我記得在一本書上看過, 可以把 MCLR 當成輸出用, 可是我忘記裡面的內容. 請問前輩們, 可以這樣做嗎? 怎麼做?? Ming....!!
發表於: 2004/8/19 8:28
|
|||
|
Re: 時鐘問題
|
||||
---|---|---|---|---|
版主
|
就我所知,一般crystal的精度大約是50ppm。也就是說,程式寫得正確的話,一天誤差最多86400 * 50 /1000000 秒 ~ 4.32秒。
注意一點,就我的經驗,發現,crystal外殼要接地,否則,用手摸一下,頻率就跑掉了。 最近幾天,回問題時都快下班了,所以,偷懶了一些。希望順水推舟,讓提問題者自行找出解答。一定收穫、體認更大。 過兩天比較有空。 再提示: 仔細看一下timer 1的用法,也許要注意pre-scaller。
發表於: 2004/8/18 18:35
|
|||
|