CODE、ORG的差別
|
||||
---|---|---|---|---|
新會員
|
各位前輩好,我有問題想請教各位。
我用的PIC型號是:PIC16F887 我有問題想請教各位: 因為我寫的程式比較大,所以會有跨頁的問題,因此 會在寫程式先定義每個PAGE的起始位置。而我目前會用到三個PAGE。我的主程式是寫在PAGE0,而其它的PAGE是寫副程式。以下是我寫程式定義每個PAGE的方式: ;============PAGE0 RESET_VECTOR CODE 0X000 NOP GOTO START INT_VECTOR CODE 0X004 PAGESEL INTERRUPT GOTO INTERRUPT MAIN CODE START: ;MAIN POGRAM : : ;============PAGE1 PAGE1_SECT CODE 0X0800 SUBROUTINE0 : : RETURN SUBROUTINE1 : : RETURN : : ;============PAGE2 PAGE2_SECT CODE 0X1000 SUBROUTINE_0 : : RETURN SUBROUTINE_1 : : RETURN : : END 我的問題是,在程式用兩到個PAGE時,寫在PAGE0的主程式在從0000開始,而寫在PAGE1的副程式會從0800開始。而當我程式用到三個PAGE後,寫在寫在PAGE1的副程式還是從0800開始。但原本在PAGE0的主程式不是從0000而是從定義在PAGE2的副程式之後。例如:PAGE2的副程式是由1000~10F0 則原本在PAGE0的主程式則是由10F1開始。請問這是什麼問題。還有想在請教一個問題是,我看書上寫的程式,程式的開始者是用ORG 00H,沒有用COED 00H,但是我用CODE也可以寫,所用我想請教這兩個的差別在那。麻煩各位前輩指道。謝謝。
發表於: 2008/6/9 17:16
|
|||
|
Re: EEPROM 寫入問題
|
||||
---|---|---|---|---|
新會員
|
各位前輩,我有個EEPROM 寫入問題想請教:
我用的PIC型號:PIC16F887 以下是PIC16F的範例: ======================= LIST P=16f877 #INCLUDE <P16f877.INC> ; ;- RAM LOCATIONS------ ; ; Reserve RAM location 0x70 for ICD ; Data_EE_Addr equ 0X71 Data_EE_Data equ 0X72 ;--------VECTORS------------ org 0x0 nop goto START ;-------PROGRAM-------------- org 0X20 START call INIT : : ======================== 我改寫的: LIST P=16f887 #INCLUDE <P16f887.INC> ; ;- RAM LOCATIONS------ ; ; Reserve RAM location 0x70 for ICD ; UDATA Data_EE_Addr RES 1 Data_EE_Data RES 1 ;--------VECTORS------------ org 0x0 nop goto START ;-------PROGRAM-------------- org 0X20 START call INIT : : ======================== 我是用範例改寫程式,但是無法成功寫入EEPROM。 但是用範例程就可以。我有想過,是不是Data_EE_Addr Data_EE_Data設定的問題,因為我的程式是把Data_EE_Addr 、Data_EE_Data給他RAM位置, 而範例程式是定值給Data_EE_Addr 、Data_EE_Data。 還有一個問題想再請教的是,為何要在START前還要在加 ORG 0X20 不能只接在 ORG 0X00 下接直作程式WORK嗎?
發表於: 2008/6/6 11:37
|
|||
|
EEPROM 寫入問題
|
||||
---|---|---|---|---|
新會員
|
各位前輩,我有個EEPROM 寫入問題想請教:<br />我用的PIC型號:PIC16F887<br />以下是PIC16F的範例:<br />=======================<br />LIST P=16f877<br /> #INCLUDE <P16f877.INC> <br />;<br />;- RAM LOCATIONS------<br />;<br />; Reserve RAM location 0x70 for ICD<br />;<br />Data_EE_Addr equ 0X71<br />Data_EE_Data equ 0X72<br /><br />;--------VECTORS------------<br /><br /> org 0x0 <br /> nop<br /> goto START<br /><br />;-------PROGRAM--------------<br /> <br /> org 0X20<br />START<br /> call INIT<br />:<br />:<br />========================<br /><br />我改寫的:<br />LIST P=16f887<br /> #INCLUDE <P16f887.INC> <br />;<br />;- RAM LOCATIONS------<br />;<br />; Reserve RAM location 0x70 for ICD<br />;<br />UDATA<br />Data_EE_Addr RES 1<br />Data_EE_Data RES 1<br />;--------VECTORS------------<br /><br /> org 0x0 <br /> nop<br /> goto START<br /><br />;-------PROGRAM--------------<br /> <br /> org 0X20<br />START<br /> call INIT<br />:<br />:<br /><br />========================<br />我是用範例改寫程式,但是無法成功寫入EEPROM。<br />但是用範例程就可以。我有想過,是不是Data_EE_Addr <br /> Data_EE_Data設定的問題,因為我的程式是把Data_EE_Addr 、Data_EE_Data給他RAM位置,<br />而範例程式是定值給Data_EE_Addr 、Data_EE_Data。<br />還有一個問題想再請教的是,為何要在START前還要在加<br />ORG 0X20<br />不能只接在 ORG 0X00 下接直作程式WORK嗎?
發表於: 2008/6/6 11:34
|
|||
|
Re: INTERRUPT-ON-CHANGE問題
|
||||
---|---|---|---|---|
新會員
|
謝謝Ryang的指導。因為我想單純作INTERRUPT ON CHANGE的測試所以我才在中斷副程式中加了 DIM_CD Delay ,如果有其它好的方法請指導一下。同時我也找出DELAY 20 多秒才回主程的原因,是因為主程式中的DELAY副程式和中斷的DELAY副程式共用,造成DELAY副程式中某個數又從0開始計數。同時我把我的中斷副程式貼出來請各位前輩指導一下:
INTERRUPT: CALL BED BTFSS PORTB,2 GOTO CLR_RBINTF : : CLR_RBINTF: BANKSEL PORTB MOVF PORTB,F BCF INTCON,RBIF RETFIE 這個主要是參考MICROCHIP AN566 再作修改,其中BED是DELAY副程式,因為我是用BUTTON作INTERRUPT ON CHANGE 所以我想須讓BUTTON等一段時間,等到電位狀態真正改變才去作 BTFSS PORTB,2判別的動作 。不知這個想法對不對,如果不對想再請教各位輩,那裡須再修改。謝謝各位前輩指導。
發表於: 2008/4/24 20:40
|
|||
|
Re: INTERRUPT-ON-CHANGE問題
|
||||
---|---|---|---|---|
新會員
|
感謝Ryang指導。我加了這個指令動作。我現在又出現問題了,現在可執行中斷副程式了,但是執行中斷後再回到主程式會DELAY 20多秒,請問這是那裡出了問題。我所寫的測試程式的主要動作為:主程式中有兩個LED,各閃五次互換。而執行中斷時會另一個LED閃五次。以下是我修改後的程式,其中我只貼主程式及中斷副程式部份:
MAIN2:
發表於: 2008/4/23 19:59
|
|||
|
Re: INTERRUPT-ON-CHANGE問題
|
||||
---|---|---|---|---|
新會員
|
謝謝yiming指導,我試過了。在DEBUGGER MODE 用 按 animate 是無法進入 中斷,但是用run就可以進入中斷。
但是我現在又出現問題了,當我執行完中斷後會delay 20 多秒才回到主程式,同時我能確定是有回到主程式中斷點。我想再請教各位前輩。謝謝。
發表於: 2008/4/23 14:53
|
|||
|
Re: INTERRUPT-ON-CHANGE問題
|
||||
---|---|---|---|---|
新會員
|
謝謝slipknot的指導,但是還是不行,所以我把我的測試貼上來
以下我所寫的測試程: #INCLUDE P16F887.INC INT_VAR UDATA_SHR D1 RES 1 D2 RES 1 D3 RES 1 NUM RES 1 NUMIDX RES 1 ONEIDX RES 1 TENIDX RES 1 RB2IP RES 1 RB3IP RES 1 W_TEMP RES 1 STATUS_TEMP RES 1 PORTD_TEMP RES 1 RESET_VECTOR CODE 0X000 NOP GOTO START INT_VECTOR CODE 0X004 GOTO INTERRUPT MAIN CODE START: ;==================INITIALIZING PORTB BANKSEL ANSELH CLRF ANSELH BANKSEL CM2CON1 CLRF CM2CON1 ;BANKSEL WPUB ;CLRF WPUB BANKSEL IOCB MOVLW B'00000100' MOVWF IOCB BANKSEL TRISB MOVLW B'11111111' MOVWF TRISB ;BANKSEL PORTB ;CLRF PORTB ;=Setting up System-CLock to be 31KHz BANKSEL OSCCON MOVLW B'01110001' MOVWF OSCCON ;======PORTD(OUT) BSF STATUS,RP0 CLRF TRISD MOVLW H'00' MOVWF PORTD ;======MAIN PROGRAM BANKSEL OPTION_REG MOVLW B'00000000' MOVWF OPTION_REG BANKSEL INTCON MOVLW B'10001000' MOVWF INTCON MAIN: BCF PORTD,0 BSF PORTD,0 GOTO MAIN INTERRUPT: MOVWF W_TEMP SWAPF STATUS,W MOVWF STATUS_TEMP IT_LOOP: BCF RTD,1 BSF PORTD,1 SWAPF STATUS_TEMP,W MOVWF STATUS SWAPF W_TEMP,F SWAPF W_TEMP,W BCF INTCON,RBIF RETFIE END 我想請問是否還有那些沒有設定到謝謝。
發表於: 2008/4/22 18:07
|
|||
|
Re: INTERRUPT-ON-CHANGE問題
|
||||
---|---|---|---|---|
新會員
|
謝謝slipknot的指導。
因為,我需要2 個外部中斷源,所以用PORTB 的INTERRUPT ON CHANGE PIN 。我有試著設定ICOB(INTERRUPT ON CHANGE PIN )及RBIE、GIE,但是情況還是一樣,不知是那裡出錯了,還請各位指導。謝謝。
發表於: 2008/4/22 12:23
|
|||
|
INTERRUPT-ON-CHANGE問題
|
||||
---|---|---|---|---|
新會員
|
各位前輩好,我是MICROCHIP的初學者,我想請教各位前輩一些問:我所使用的PIC型號是16F887,我正在學習如用使用外部中斷,所以我試著用PORTB其中某個腳位作INTERRUPT-ON-CHANGE,但是就是無法執行中斷副程式,我試著用ICD2 DEBUGGER 看REGISTER的變化,其中INTCON=0XDD,因此我認為中的RBIF有產生,理論上是要執行中斷副程式,但是就沒有執行。所以想請教大家。謝謝。
發表於: 2008/4/21 20:21
|
|||
|