有關C 如何中斷
|
||||
---|---|---|---|---|
新會員
|
因為之前是用組語在寫中斷
那現在想用C練習寫中斷 那我用的是pic16f687 用hi-tech c寫 納中斷副程式的開頭是要如何寫,才能寄入中斷 我的寫法是: static void interrupt isr(void) { // code } 可是我發現無法進入 請問一下要進入中斷 是否還要加什麼條件
發表於: 2008/12/5 15:59
|
|||
|
急!!請問各位前輩有關PIC16F687 I2C SLAVE的問題,謝謝
|
||||
---|---|---|---|---|
新會員
|
不好意思想請問一下各位前輩有關pic16f687 slave的問題
因為想用C寫有關slave的程式,想做slave傳資料給master 所以master應該是做讀取的動作 那我想就是每次傳五筆資料給master端 那這五筆資料是發生五次中斷時才將資料傳完 Interrupt1::(ADDR+R)-(DATA1+ACK) Interrupt2::(ADDR+R)-(DATA2+ACK) Interrupt3::(ADDR+R)-(DATA3+ACK) Interrupt4::(ADDR+R)-(DATA4+ACK) Interrupt5::(ADDR+R)-(DATA5+ACK) 還是說在一次中斷就可以將五筆資料給傳完 Interrupt:(ADDR+R)-(DATA1+ACK)-(DATA2+ACK)-(DATA3+ACK)-(DATA4+ACK)-(DATA5+ACK) 以下是我的程式,有覺得哪裏有問題的話可以麻煩說一下, 因為我沒有寫過I2C的程式,所以有可能問題一大堆,那也請各位前輩不吝指教,謝謝 //-------------------------------------------------- // INTERRUPT SETTING //-------------------------------------------------- // INTCON=0X00; // GIE=0; INTCON=0XC0; //---------------------------------------------------- // PIE1 AND PIE2 SETTING //------------------------------------------------------ // PIE1=0X00; PIE1=0X08; //SSPIE=1 //----------------------------------------------------- // SSP SETTING //----------------------------------------------------- SSPSTAT=0X24; SSPCON=0X36; //slave mode 7 bit SSPADD=0X08; //slave addr /*********************************************/ /* Interrupt Function */ /*********************************************// 此程式是將五筆資料用五個中斷來傳給master static void interrupt isr (void) { if(I2Ccount>5) { I2Ccount=1; } if(RW==1) //read { CKP=0; if(I2Ccount==1) { SSPBUF=0; } else if(I2Ccount==2) { SSPBUF=20; } else if(I2Ccount==3) { SSPBUF=3; } else if(I2Ccount==4) { SSPBUF=0; } else if(I2Ccount==5) { SSPBUF=0; } I2Ccount++; SSPIF=0; CKP=1; } } }
發表於: 2008/12/3 22:38
|
|||
|
急!請問各位icd有問題如何解決
|
||||
---|---|---|---|---|
新會員
|
不好意思各位,請教各位有關ICD2的問題
就是我PIC型號都設對 然後我也有用過download ICD2 operating system 可是還是一樣出現下列訊息 請問各位如何解決此問題 謝謝 Setting Vdd source to MPLAB ICD 2 ICDWarn0020: Invalid target device id (expected=0x99, read=0x0) ...Reading ICD Product ID Running ICD Self Test ...Passed ...Download Operating System Succeeded
發表於: 2008/8/18 15:50
|
|||
|
請問各位前輩有關16f687的問題
|
||||
---|---|---|---|---|
新會員
|
不好意思,因為我要利用RA3當作INPUT來判斷燈是否會亮
當RA3=LOW時燈就會亮,RA3=HIGH時燈就不會亮 可是我利用示波器來觀看結果,當RA3=HIGH時燈卻亮起來 那我也檢查過程式覺得沒有問題,所以來此問各位前輩哪裡有問題,以下是程式碼: ; =================================================================== ; Macros SelBank0 macro BCF STATUS,RP1 BCF STATUS,RP0 endm SelBank1 macro BCF STATUS,RP1 BSF STATUS,RP0 endm SelBank2 macro BSF STATUS,RP1 BCF STATUS,RP0 endm SelBank3 macro BSF STATUS,RP1 BSF STATUS,RP0 endm ;********************************************************************** ORG 0x000 ; processor reset vector GOTO MAIN ; go to beginning of program ORG 0X004 GOTO INTERRUPT ;----------------------------------------------- ; PORTA SETTING ;------------------------------------------------ SelBank0 BANKSEL PORTA MOVLW B'00011001' ;#B'00011001' MOVWF PORTA SelBank1 MOVLW B'00101111' ;#B'00101111' MOVWF TRISA SelBank2 ;Bank 2 CLRF ANSEL ;digital I/O CLRF WPUA ;disabled pull-up BANKSEL IOCA MOVLW B'00001001' ;#B'00000000' MOVWF IOCA ;--------------------------------------------- ; PORTC SETTING ;--------------------------------------------- SelBank0 MOVLW B'00010000' ;#B'00000000' MOVWF PORTC SelBank1 MOVLW B'11000000' ;#B'00001111' MOVWF TRISC MAIN DisableInterrupts CALL INITIAL EnableInterrupts CALL VARIABLE_INITIAL DELAY MOVLW .150 CALL Delay_Process DELAY1 MOVLW .0 XORWF Delay10msCountReg,W BTFSS STATUS,Z GOTO DELAY1 GOTO DELAY ;---------------------------------------------------------- INTERRUPT T0_ISR ; do Timer 0 stuff here CALL T0_ISR_Process SelBank0 MOVLW .216 MOVWF TMR0 BCF INTCON,T0IF; GOTO ISR_DONE ;------------------------------------------------------------ ; TO_ISR_PROCESS ;----------------------------------------------------------- T0_ISR_Process DECF Delay10msCountReg,F CALL CheckAudio_Process RETURN ;----------------------------------------------------------------- ; FINISH THE INTERRUPTION ;------------------------------------------------------------------ ISR_DONE ;finished with the ISR, return MOVF status_temp,w ; retrieve copy of STATUS register MOVWF STATUS ; restore pre-isr STATUS register contents SWAPF w_temp,f SWAPF w_temp,w ; restore pre-isr W register contents RETFIE ; return from interru ;-------------------------------------------------------------- CheckAudio_Process SelBank0 BTFSC PORTA,RA3 -->初始為HIGH GOTO CheckOffAudio_Process CLRF NoAudio10msCountReg CLRF NoAudio1sCountReg BSF PORTC,RC0--->燈卻亮起來 BSF AudioFlag1Reg,AudioDetectF1 ; GOTO POWERON RETURN END
發表於: 2008/8/13 14:58
|
|||
|
請問各位USART有問題如何解決
|
||||
---|---|---|---|---|
新會員
|
不好意思,就是之前有前輩指導我用不同的方法去良測USART 訊號出來對不對,那結果都不是我想要的
那我從試波器量測的結果BAUD RATE=7,14K 而不是我想要的BAUD RATE=38.4K 那我的SPBRG=25, BRG=1 我想請問一下各位那裡出了問題 再麻煩各位一下為我解答,謝謝 ; Macros SelBank0 macro BCF STATUS,RP1 BCF STATUS,RP0 endm SelBank1 macro BCF STATUS,RP1 BSF STATUS,RP0 endm SelBank2 macro BSF STATUS,RP1 BCF STATUS,RP0 endm SelBank3 macro BSF STATUS,RP1 BSF STATUS,RP0 endm ;********************************************************************** ORG 0x000 ; processor reset vector GOTO MAIN MAIN CALL INITIAL GOTO PARING_Process PARING_Process USART_TX MOVLW B'01111011' ;{ SelBank0 MOVWF TXREG USART_TX_0 BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_0 SelBank0 CLRF TXREG SelBank0 MOVLW B'01100001' ;a MOVWF TXREG USART_TX_1 BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_1 SelBank0 CLRF TXREG MOVLW B'00101101' ;- SelBank0 MOVWF TXREG USART_TX_3_0 BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_3_0 SelBank0 CLRF TXREG MOVLW B'00110000' ;0 SelBank0 MOVWF TXREG USART_TX_4 BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_4 SelBank0 CLRF TXREG MOVLW B'01111101' ;} SelBank0 MOVWF TXREG USART_TX_5 BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_5 SelBank0 CLRF TXREG GOTO USART_TX ;-------------------初始化----------------------- INITIAL ;---------------------------------------------------- ; OPTION_REG SETTING ;---------------------------------------------------- SelBank1 MOVLW B'00000111' ;#B'00000111' MOVWF OPTION_REG ;ENABLE PORTA/B PULL-UP,INT-FALLING,WDT,WDT RATE 1:128 ;-------------------------------------------------------- ; OSCCON AND OSCTUNE SETTING ;-------------------------------------------------------- MOVLW B'01100101' ;#B'01100101' MOVWF OSCCON ;INTERNAL OSC 4MHz SelBank1 MOVLW B'00000000' MOVWF OSCTUNE ;----------------------------------------------- ; PORTA SETTING ;------------------------------------------------ SelBank0 BANKSEL PORTA MOVLW B'00101111' ;#B'00101111' MOVWF PORTA SelBank1 MOVLW B'00101111' ;#B'00101111' MOVWF TRISA SelBank2 ;Bank 2 CLRF ANSEL ;digital I/O CLRF WPUA ;disabled pull-up BANKSEL IOCA MOVLW B'00000000' ;#B'00000000' MOVWF IOCA ;------------------------------------------ ; PORTB SETTING ;------------------------------------------ BANKSEL PORTB MOVLW B'00000000' ;#B'00000000' MOVWF PORTB BANKSEL TRISB MOVLW B'00100000' ;#B'00100000' MOVWF TRISB BANKSEL WPUB MOVLW B'00000000' ;#B'00000000' MOVWF WPUB BANKSEL IOCB MOVLW B'00000000' ;#B'00000000' MOVWF IOCB ;-------------------------------------------------- ; INTERRUPT SETTING ;-------------------------------------------------- SelBank0 MOVLW B'00000000' ;DISABLE GIE,INTE,RABIE MOVWF INTCON ;-------------------------------------------------- ; USART SETTING ;------------------------------------------------ SelBank1 MOVLW B'00100100' ;8-BIT TRANSMISSION,TRANSMIT ENABLED,ASYNCHRONOUS MODE,HIGH SPEED,TSR EMPTY MOVWF TXSTA SelBank0 MOVLW B'10010000' ;SERIAL PORT ENABLED,8-BIT RECEPTION,ENABLES CONTINUOUS RECEIVE,DISABLES ADDRESS DETECTION,NO FRAMING ERROR,NO OVERRUN ERROR MOVWF RCSTA SelBank1 MOVLW .25 ;SET BAUD RATES AT 9600K WITH HIGH SPEED MODE(4MHZ=25,20MHZ=129) ; MOVWF SPBRG SelBank1 BSF PIE1,TXIE ;ENABLES THE USART TRANSMIT INTERRUPT ;開啟USART BSF PIE1,RCIE ;ENABLES THE USART RECEIVE INTERRUPT ;開啟USART SelBank0 BCF PIR1,TXIF ;THE USART TRANSMIT BUFFER IS FULL BCF PIR1,RCIF ;THE USART RECEIVE BUFFER IS EMPTY SelBank1 BSF TXSTA,BRGH CLRF SPBRGH ;BSF BAUDCTL,ABDEN BCF BAUDCTL,BRG16 ;------------------------------------------------------- RETURN END
發表於: 2008/8/8 9:33
|
|||
|
請問各位USART有問題如何解決
|
||||
---|---|---|---|---|
新會員
|
不好意思我想再請教各位一下,那之前有照前輩的建議去試看看
可是還是有問題 就是我設定BAUD RATE=9.6K 但是在試波器顯示BAUD RATE=7.14K 那我SPBRG=25 BRG16=0 我想請問一下各位前輩 我這樣設定有問題嗎 為什麼試波器顯示出來不是我想要的 以下為程式: list p=16f687 #include <P16F687.inc> ; Macros SelBank0 macro BCF STATUS,RP1 BCF STATUS,RP0 endm SelBank1 macro BCF STATUS,RP1 BSF STATUS,RP0 endm SelBank2 macro BSF STATUS,RP1 BCF STATUS,RP0 endm SelBank3 macro BSF STATUS,RP1 BSF STATUS,RP0 endm ORG 0X00 GOTO MAIN MAIN CALL INITIAL USART_TX MOVLW B'01111011' ;{ SelBank0 MOVWF TXREG USART_TX_0 BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_0 SelBank0 CLRF TXREG SelBank0 MOVLW B'01100001' ;a MOVWF TXREG USART_TX_1 CLRWDT BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_1 SelBank0 CLRF TXREG MOVLW B'00101101' ;- SelBank0 MOVWF TXREG ;==================\R\N=========================== USART_TX_3_0 CLRWDT BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_3_0 SelBank0 CLRF TXREG MOVLW B'00110000' ;0 SelBank0 MOVWF TXREG USART_TX_4 CLRWDT BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_4 SelBank0 CLRF TXREG MOVLW B'01111101' ;} ;;MOVF TXDATA5,W SelBank0 MOVWF TXREG USART_TX_5 CLRWDT BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_5 SelBank0 CLRF TXREG GOTO USART_TX INITIAL SelBank1 MOVLW B'00001111' ;#B'00001111' MOVWF OPTION_REG ;ENABLE PORTA/B PULL-UP,INT-FALLING,WDT,WDT RATE 1:128 MOVLW B'01100101' ;#B'01100101' MOVWF OSCCON ;INTERNAL OSC 4MHz SelBank1 MOVLW B'00000000' MOVWF OSCTUNE ;;;;;PORTA SelBank0 BANKSEL PORTA MOVLW B'00000100' ;#B'00000100' MOVWF PORTA BANKSEL TRISA MOVLW B'00000100' ;#B'00000100' MOVWF TRISA BANKSEL WPUA MOVLW B'00000100' ;#B'00000100' MOVWF WPUA BANKSEL IOCA MOVLW B'00000000' ;#B'00000000' MOVWF IOCA ;;;;;PORTB BANKSEL PORTB MOVLW B'00000000' ;#B'00000000' MOVWF PORTB BANKSEL TRISB MOVLW B'00100000' ;#B'00100000' MOVWF TRISB BANKSEL WPUB MOVLW B'00000000' ;#B'00000000' MOVWF WPUB BANKSEL IOCB MOVLW B'00000000' ;#B'00000000' MOVWF IOCB ;;;;;PORTC BANKSEL PORTC MOVLW B'00000000' ;#B'00000000' MOVWF PORTC BANKSEL TRISC MOVLW B'00001111' ;#B'00001111' MOVWF TRISC ;;;;;INTERRUPT SelBank0 MOVLW B'00000000' ;DISABLE GIE,INTE,RABIE MOVWF INTCON ;;;;;USART SelBank1 MOVLW B'00100100' ;8-BIT TRANSMISSION,TRANSMIT ENABLED,ASYNCHRONOUS MODE,HIGH SPEED,TSR EMPTY MOVWF TXSTA SelBank0 MOVLW B'10010000' ;SERIAL PORT ENABLED,8-BIT RECEPTION,ENABLES CONTINUOUS RECEIVE,DISABLES ADDRESS DETECTION,NO FRAMING ERROR,NO OVERRUN ERROR MOVWF RCSTA SelBank1 MOVLW .71 ;SET BAUD RATES AT 9600K WITH HIGH SPEED MODE(4MHZ=25,20MHZ=129) MOVWF SPBRG SelBank1 BSF PIE1,TXIE ;ENABLES THE USART TRANSMIT INTERRUPT ;開啟USART BSF PIE1,RCIE ;ENABLES THE USART RECEIVE INTERRUPT ;開啟USART SelBank0 BCF PIR1,TXIF ;THE USART TRANSMIT BUFFER IS FULL BCF PIR1,RCIF ;THE USART RECEIVE BUFFER IS EMPTY SelBank1 BSF TXSTA,BRGH CLRF SPBRGH BSF BAUDCTL,BRG16 RETURN END
發表於: 2008/8/7 13:47
|
|||
|
Re: 急!請問各位USART有問題如何解決
|
||||
---|---|---|---|---|
新會員
|
我有試過了
我是要產生{a-0}這串字 所以相對應的ASCII 的十六進位數值為 7B,61,2D,30,7D 然後把值送到TXREG MOVLW H'7B' MOVWF TXREG 然後從終端機看到的值卻不是我所想要的 不是{a-0} 我想再請問各位一下 我這樣對應試錯的嗎
發表於: 2008/8/6 17:30
|
|||
|
急!請問各位USART有問題如何解決
|
||||
---|---|---|---|---|
新會員
|
不好意思我又有一個問題測試不出來
傳送值為123,97,45,48,125 雖然用試波器測試,有波型出現 可是用終端機接到電腦上值測試是否是我想要的 發現跟我所傳輸的值不太一樣 那也跟改了 BAUDCTL 的設定值試看看,結果還是跟傳送的不符 那我想再請教各位前輩一下,為什麼會不一樣 因為這是我的第一份程式,我想把他給弄懂 希望前輩們能幫助我一下, 謝謝 list p=16f687 #include <P16F687.inc> ; Macros SelBank0 macro BCF STATUS,RP1 BCF STATUS,RP0 endm SelBank1 macro BCF STATUS,RP1 BSF STATUS,RP0 endm SelBank2 macro BSF STATUS,RP1 BCF STATUS,RP0 endm SelBank3 macro BSF STATUS,RP1 BSF STATUS,RP0 endm ORG 0X00 GOTO MAIN MAIN CALL INITIAL USART_TX MOVLW .123 SelBank0 MOVWF TXREG USART_TX_0 CLRWDT BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_0 SelBank0 CLRF TXREG ;MOVF TXDATA1,W MOVLW .97 MOVWF TXREG USART_TX_1 CLRWDT BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_1 SelBank0 CLRF TXREG ;MOVLW B'00101100' ;SelBank0 ;MOVWF TXREG USART_TX_1_0 CLRWDT BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_1_0 SelBank0 CLRF TXREG ;MOVF TXDATA2,W MOVLW .45 SelBank0 MOVWF TXREG USART_TX_2 CLRWDT BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_2 SelBank0 CLRF TXREG MOVLW .48 ;MOVF TXDATA3,W MOVWF TXREG USART_TX_3 CLRWDT BTFSS PIR1,TXIF ;判斷TRANSMIT BUFFER是否滿了 GOTO USART_TX_3 SelBank0 CLRF TXREG MOVLW .125 ;MOVF TXDATA4,W SelBank0 MOVWF TXREG GOTO USART_TX INITIAL SelBank1 MOVLW B'00001111' ;#B'00001111' MOVWF OPTION_REG ;ENABLE PORTA/B PULL-UP,INT-FALLING,WDT,WDT RATE 1:128 BANKSEL WDTCON MOVLW B'00001001' ;#B'00001001' MOVWF WDTCON ;WDT 1:512,WDT IS ON BIT0=1;SLEEP SET BIT0=0 BANKSEL OSCCON MOVLW B'01100101' ;#B'01100101' MOVWF OSCCON ;INTERNAL OSC 4MHz ;;;;;PORTA SelBank0 BANKSEL PORTA MOVLW B'00000100' ;#B'00000100' MOVWF PORTA BANKSEL TRISA MOVLW B'00000100' ;#B'00000100' MOVWF TRISA BANKSEL WPUA MOVLW B'00000100' ;#B'00000100' MOVWF WPUA BANKSEL IOCA MOVLW B'00000000' ;#B'00000000' MOVWF IOCA ;;;;;PORTB BANKSEL PORTB MOVLW B'00000000' ;#B'00000000' MOVWF PORTB BANKSEL TRISB MOVLW B'00100000' ;#B'00100000' MOVWF TRISB BANKSEL WPUB MOVLW B'00000000' ;#B'00000000' MOVWF WPUB BANKSEL IOCB MOVLW B'00000000' ;#B'00000000' MOVWF IOCB ;;;;;PORTC BANKSEL PORTC MOVLW B'00000000' ;#B'00000000' MOVWF PORTC BANKSEL TRISC MOVLW B'00001111' ;#B'00001111' MOVWF TRISC ;;;;;INTERRUPT SelBank0 MOVLW B'00000000' ;DISABLE GIE,INTE,RABIE MOVWF INTCON ;;;;;USART SelBank1 MOVLW B'00100100' ;8-BIT TRANSMISSION,TRANSMIT ENABLED,ASYNCHRONOUS MODE,HIGH SPEED,TSR EMPTY MOVWF TXSTA SelBank0 MOVLW B'10010000' ;SERIAL PORT ENABLED,8-BIT RECEPTION,ENABLES CONTINUOUS RECEIVE,DISABLES ADDRESS DETECTION,NO FRAMING ERROR,NO OVERRUN ERROR MOVWF RCSTA SelBank1 MOVLW .25 ;SET BAUD RATES AT 9600K WITH HIGH SPEED MODE(4MHZ=25,20MHZ=129) MOVWF SPBRG SelBank1 BSF PIE1,TXIE ;ENABLES THE USART TRANSMIT INTERRUPT ;開啟USART BSF PIE1,RCIE ;ENABLES THE USART RECEIVE INTERRUPT ;開啟USART SelBank0 BCF PIR1,TXIF ;THE USART TRANSMIT BUFFER IS FULL BCF PIR1,RCIF ;THE USART RECEIVE BUFFER IS EMPTY SelBank1 MOVLW B'01001001' MOVWF BAUDCTL RETURN END
發表於: 2008/8/6 14:15
|
|||
|
急!請問各位icd有問題如何解決
|
||||
---|---|---|---|---|
新會員
|
之前在用icd 都沒有問題
可是現在卻是一值出現這樣的訊息: ICDWarn0020: Invalid target device id (expected=0x99, read=0x0) ...Reading ICD Product ID Running ICD Self Test ... Failed Self Test. See ICD2 Settings (status tab) for details. MPLAB ICD 2 Ready 請問這樣的情況要如何解決 謝謝
發表於: 2008/8/6 10:33
|
|||
|