Re: 請問PID程式問題
|
||||
---|---|---|---|---|
初級會員
|
就算大大用浮點數去算,可是輸出給PWM時仍然是整數的值啊~~~
PWM有輸出浮點數的嗎?~~~
發表於: 2008/11/4 19:06
|
|||
|
Re: pic16F685的問題
|
||||
---|---|---|---|---|
初級會員
|
我有試過對ADC的暫存器做設置,在設完後有正常動作過,但不久就又出現無法讀取的問題。
我的設置為PORTA全拿來做輸入,PORTB和PORTC則為輸出 所以ADC功能disable,且全部設為數位輸出入腳。 banksel TRISA movlw b'11111111' movwf TRISA movlw b'00000000' movwf TRISB movlw b'00000000' movwf TRISC banksel PORTA movlw b'00000000' movwf PORTB movlw b'00000000' movwf PORTC ; set ADC all disable banksel ADCON0 clrf ADCON0 banksel ANSEL clrf ANSEL banksel ANSELH clrf ANSELH 而判斷輸入的程式段為 bottom_state: btfsc PORTA,1 goto bottom_exit movlw 0x09 return bottom_exit: movlw 0x02 之後有把W的內容輸出給7段,照上面程式,如果PORTA的第1腳為0,則輸出2;如果為1的話輸出9。 從模擬的時候去看暫存器,都有符合我的設定,但不知道為什麼無法做In的判斷。 難道是我的設置有問題嗎?
發表於: 2008/11/4 19:03
|
|||
|
Re: 請問PID程式問題
|
||||
---|---|---|---|---|
初級會員
|
last_error = error;
error_difference = error - last_error;//這週期的error減上週期的error 可愛的大大,你這裡有點問題,你一進來就把ERROR存起來,那下一行的ERROR_DEFFERENCE不是0那才奇怪吧... 正常應該是要把last_error = error; 放在void kd_set(void){}的最後一行才對。 如果你問那一開始的last_error不知道是多少,可愛的大大,可以設0沒關係。 I部份則是累積的值,也就是從開始做控制的時間點開始算,到你現在的誤差。 希望以上對您有幫助。
發表於: 2008/11/3 15:47
|
|||
|
Re: pic16F685的問題
|
||||
---|---|---|---|---|
初級會員
|
感謝2位大大的回覆
RB6我是經實驗後確定不能用,至於切回BANK,我的程式經初始化完後就沒切BANK,所以應該不會RB7可以用,RB6不能用吧。 目前還沒試I/O的DISABLE,因為不知道組語的寫法,所以沒有注意,這點說聲抱歉~~~ 等試過後小的會再回來回報結果。
發表於: 2008/11/3 14:50
|
|||
|
Re: pic16F685的問題
|
||||
---|---|---|---|---|
初級會員
|
指標消失指的是當模擬時按下F7會有一個綠色的指標,顯示程式執行到何處,就是這個綠色的指標
第2點已解決 後來再試,把查表的部份移動到中斷程式後面就可以了。 ====================================== 新的問題,我想把PORTA的0~2拿來做輸入腳,判斷按鍵,於是寫下下面程式: start: banksel TRISA movlw b'11111111' movwf TRISA . . . main: call bottom_state call LDTAB movwf PORTC . . . bottom_state: btfsc PORTA,1 goto bottom_exit movlw 0x09 return bottom_exit: movlw 0x02 return . . . 目的是想要依PORTA的第1腳來判斷有沒有被按下,以7段來觀察,有被按下則改變輸出。 問題是,當我把PORTA.1的腳接HIGH或LOW,都不會使7段變動,後來試了第0腳、第2腳,PORTB的第4~6腳皆無法動作,只有PORTB的第7腳會有反應,可是我想要的是讓PORTA的0和1腳做輸入...
發表於: 2008/10/30 18:45
|
|||
|
Re: pic16F685的問題
|
||||
---|---|---|---|---|
初級會員
|
感謝大大們的回應,我把程式改成ryang大的寫法,然後出現2個問題
1.實際動作無預期,故用模擬方法去除錯,發現在call LATAB這裡時,它會進入LATAB去,可是執行addwf PCL,F後指標就消失了。 我把start中call之前改成 movlw 0x05 所以應該會回傳0x2c,只是指標消失。 2.我有以下訊息: Message[305] C:\DSPIC\685FIRST\MAIN.ASM 95 : Using default destination of 1 (file). 有問題的程式 incf shift 我是要在中斷中對shift做累加的動作,後來發現,只要有incf的都會有這樣的訊息,可否問一下是為什麼? 再次麻煩各位大大了。
發表於: 2008/10/30 14:21
|
|||
|
pic16F685的問題
|
||||
---|---|---|---|---|
初級會員
|
我的問題
MPLINK 4.21, Linker Copyright (c) 2008 Microchip Technology Inc. Error - section '.org_2' can not fit the absolute section. Section '.org_2' start=0x00000050, length=0x00000014 Errors : 1 用的是PIC16F685 看過之前的文章,修改LKR文件可以,可是不知道怎麼改 有試著把page0和page1的START和END做變動,但是還是會得到上面的問題,麻煩大大們指導一下,感謝! LKR文件(16F685.lkr) LIBPATH . CODEPAGE NAME=page0 START=0x0 END=0x7FF CODEPAGE NAME=page1 START=0x800 END=0xFFF CODEPAGE NAME=.idlocs START=0x2000 END=0x2003 PROTECTED CODEPAGE NAME=.config START=0x2007 END=0x2007 PROTECTED CODEPAGE NAME=.calib START=0x2008 END=0x2008 PROTECTED CODEPAGE NAME=eedata START=0x2100 END=0x21FF PROTECTED 我的程式 org 0x00 goto start org 0x04 goto timer_isr start: . . . main: movfw count_tb call LDTAB movwf PORTC goto main timer_isr: . . . retfie LDTAB movwf PC org 0x0050 retlw 0xa0 ;0 retlw 0xbb ;1 retlw 0x62 ;2 retlw 0x2a ;3 retlw 0x39 ;4 retlw 0x2c ;5 retlw 0x24 ;6 retlw 0xb8 ;7 retlw 0x20 ;8 retlw 0x28 ;9 END 最後是查表的東西
發表於: 2008/10/29 23:01
|
|||
|
Re: icd2 無法連上PIC
|
||||
---|---|---|---|---|
初級會員
|
找到BUG了,應該是MCU出了問題,因為我換了一個新的上去就沒問題了~~~
我還是有接地電容,因為想說能滅少一些問題就減少一些。
發表於: 2008/10/15 16:50
|
|||
|
Re: icd2 無法連上PIC
|
||||
---|---|---|---|---|
初級會員
|
可是我的MCLR也當作RESET腳來用,可以不用接電容嗎?
發表於: 2008/10/15 10:51
|
|||
|