Re: 為何變數無法致能?
|
||||
---|---|---|---|---|
版主
|
1. 看起來你對PIC18F452的指令還不是很熟悉它的使用語法,建議下載右邊的教育訓練課程內的W400研讀一下PIC18F系列的Access Bank的使用方式。
2. 有關USART的使用範例程式可參考W400裡的Lab4,那裡有詳細的說明;底下就是從該程式中針對USART的涉頂所寫的副程式景供參考: ; OSC = 16MHz ;*********************************************************************** ;**** Initial USART as 9600,N,8,1 ;*********************************************************************** Init_USART: movlw b'00100000' ; 8-bit data mode , ASYNC movwf TXSTA ; Low Speed mode, Enable TxD ; movlw b'10010000' ; Enable Serial Port, 8-bit receive movwf RCSTA ; Continuous Receive, Disable Address Detection ; movlw .25 ; Set baud rate at 9600 with Low Speed mode movwf SPBRG ; bcf PIR1,TXIF ; Clear TxD interrupt flag bcf PIE1,TXIE ; Disable TxD interrupt ; bcf IPR1,RCIP ; Set the RxD for Low priority interrupt bcf PIR1,RCIF ; Clear RxD interrupt flag bsf PIE1,RCIE ; Enable RxD interrupt ; return
發表於: 2004/10/4 9:41
|
|||
|
Re: 為何變數無法致能?
|
||||
---|---|---|---|---|
高級會員
|
謝謝版主的答覆...
的確我是這方面的新手... 對於您的建議我會再好好研究一下... 以後請多多指教!
發表於: 2004/10/4 11:32
|
|||
|
Re: 為何變數無法致能? (版主加註:有關PIC18F252)
|
||||
---|---|---|---|---|
高級會員
|
版主不好意思....
你所建議我看的部份我已經下載看過了... 可是我還不是很了解你所指我不熟指令的使用語法的意思... 可否麻煩你再說明白一點... 是我所寫的指令有錯誤?! 還是致能的指令錯誤?! 還是哪個觀念有誤?! 麻煩再不厭其煩的指點我一下....
發表於: 2004/10/4 20:41
|
|||
|
Re: 為何變數無法致能?
|
||||
---|---|---|---|---|
高級會員
|
版主...
我想我已經了解你說的意思了... 因為我是看著16系列的書開始入門... 但我用的是18系列的IC... 我只注意到要修改標頭檔而已.. 卻忽略了指令部份... 原來指令也已經變了... 我再修改程式指令試試... 多謝你的指點...
發表於: 2004/10/5 15:40
|
|||
|
Re: 為何變數無法致能? (版主加註:有關PIC18F252)
|
||||
---|---|---|---|---|
高級會員
|
現在指令的執行好像都OK..
請問一下版主... 指令執行到最後一行"goto Trans"都屬正常.. TRMT也被致能變為"1"... 也確實跳到Trans... Q1: 可是好像TRMT從此就一直是滿的"1"狀態... 是代表資料傳已經出去了.. 但VB端接收不到... 指令就一直在 "banksel TXSTA btfss TXSTA,TRMT goto Trans" 三行打轉.... 因為TMRT一直為滿的?! Q2: 還有我VB程式一執行就發生錯誤... " Run - time error '8005' Port already open " 請問這是什麼原因.... VB程式 Private Sub C1_Click() Dim buf$ buf = Trim(MSComm1.Input) If Len(buf) = 0 Then T1.Text = "empty" Else T1.Text = buf End If MSComm1.PortOpen = False End Sub .............................................. Private Sub Form_Load() MSComm1.PortOpen = True End Sub
發表於: 2004/10/5 22:03
|
|||
|
Re: 為何變數無法致能? (版主加註:有關PIC18F252)
|
||||
---|---|---|---|---|
版主
|
VB不太懂,PIC18的程式可以改成偵測 TXIF試試,不知道你的TRMT為何會不動作而且還要切BANK,18F 對SFR 是不需切換BANK的,所有的SFR都是放在ACCESS BANK的,
movlw h'0a' ; Send 0x0A & 0x0D to terminal call Tx_a_Byte movlw h'0d' call Tx_a_Byte ; bra Main ; ;****** Send a byte to USART ****** Tx_a_Byte: movwf TXREG ; Send a byte vis USART nop ; btfss PIR1,TXIF ; Does the data sent out ? bra $-4 ; No, Loop check the TXIF bcf PIR1,TXIF ; Yes, completed to send the date, clear the TXIF return
發表於: 2004/10/5 22:14
|
|||
|
Re: 為何變數無法致能? (版主加註:有關PIC18F252)
|
||||
---|---|---|---|---|
高級會員
|
沒關係版主...
還是很感謝您的回答! 我會再試著改看看的! 再請教您幾個問題(本篇會有點長喔!) Q1: 您所說的有關Bank的切換... 意思是說.. 指要是在SFR裡的暫存器都不須使用切換指令?! 請問是如我下面程式所說的意思嗎?! PIC指令: initial: movlw .3 movwf trans_c banksel SPBRG...........略! movlw .129 movwf SPBRG banksel TXSTA...........略! bcf TXSTA,SYNC banksel RCSTA...........略! bsf RCSTA,SPEN banksel TXSTA...........略! bsf TXSTA,TXEN Trans: banksel TXSTA...........略! btfss TXSTA,TRMT goto Trans banksel TXREG...........略! movlw 0x55 movwf TXREG banksel trans_c.........不可略! decfsz trans_c,f goto Trans end Q2: 請問18F系列的指令最後不是有個[a]嗎? EX: BCF f,b,[a] If 'a' is 0, the Access Bank will be selected,overriding the BSR value If 'a'=1,then the bank will be selected as per the BSR value(default) 1. 不好意思,我不太懂如何選擇[a]為'0' or '1' ? 該如何選擇? 2. 選'0' or '1'個別是什麼意思? 3. 我看有些18系列的範例並沒使用到[a]?又是怎麼一回事呢? Q3: 在Q1裡的程式指令是16系列的指令... 為何我將指令改為18系列的執行時會不太正確... 反而用原本16系列的指令可以正確的執行... 1. 難道18FXXX的IC可以接受16系列的指令?! 2. 不知還是我指令改錯嗎? (麻煩對照Q1的程式指令) initial: movlw .3 movwf trans_c,0 banksel SPBRG movlw .129 movwf SPBRG,0 banksel TXSTA bcf TXSTA,4,0 ...SYNC banksel RCSTA bsf RCSTA,7,0 ...SPEN banksel TXSTA bsf TXSTA,5,0 ...TXEN Trans: banksel TXSTA btfss TXSTA,1,0 ...TRMT goto Trans banksel TXREG movlw 0x55 movwf TXREG,0 banksel trans_c decfsz trans_c,1,0 goto Trans end
發表於: 2004/10/6 10:49
|
|||
|
Re: 為何變數無法致能? (版主加註:有關PIC18F252)
|
||||
---|---|---|---|---|
版主
|
請在MPLAB中,輸入以下的指令,打開WATCH視窗觀察SPBRG的變化。
MOVLW D'2' MOVWF BSR INCF SPBRG INCF SPBRG,1,0 INCF SPBRG,0,0 INCF SPBRG,1,1 第1行的作用,完全等於第2行。原因是:在完整的指令中,如 INCF SPBRG,d,a,如果把d 省略,相當於把d設為1;如果把 a省略,相當於把a設為0 (有關於a,data sheet說是default是1,好像不對;用MPLAB做實驗會發現應該是0)。 如果a等於0,則指令會拿access bank裏頭的變數來處理。如果a等於1,則指令會依BSR暫存器的內容,去相對應的BANK拿變數來處理。SPBRG屬於特殊功能暫存器;而PIC18的所有特殊功能暫存器皆位於access bank。 而d如果等於1,指令處理後的結果,會放回所處理的變數;而 d如果等於0,指令處理後的結果,會放在w暫存器,所處理的變數不會改變。 這有沒有回答了您Q1~Q3?
發表於: 2004/10/6 18:22
|
|||
|
Re: 為何變數無法致能? (版主加註:有關PIC18F252)
|
||||
---|---|---|---|---|
高級會員
|
謝謝版主的回答...
我想我需要再把PIC18FXX2 Data Sheet再好好看過... 因為我沒注意到[d],[a]沒寫時會自動用預設值... 得好好kk書囉!
發表於: 2004/10/7 20:32
|
|||
|