會員登陸
帳號:

密碼:

記住我



忘記密碼?

現在註冊!
網站導航
最新下載
訪問統計 (自2012/5/3)


正在流覽:   1 名訪客



(1) 2 »


PIC18F46K22 高、低優先中斷問題
新會員
註冊日期:
1月03日 08:21:20
所屬群組:
註冊會員
文章: 13
等級: 2; EXP: 38
HP : 0 / 34
MP : 4 / 25
離線
各位前輩好,
小弟目前操作MCC201v2.00的PIC18 Lab 3-1:EUSART 中斷接收模式課程
編譯完後在interrupt_manager.h跟.c檔遇到
void interrupt INTERRUPT_InterruptManagerHigh (void);
void interrupt low_priority INTERRUPT_InterruptManagerLow (void);
編譯錯誤顯示 variable has incomplete type 'void'

本身程式架構上沒什麼概念只能上網查或翻書
將高優先中斷改成:
void __interrupt() INTERRUPT_InterruptManagerHigh (void);
就可以成功編譯了

但是低優先中斷也按照一樣的方式也是一樣無法成功

3月18日 10:23:43
轉換PDF檔 列印


Re: PIC18F46K22 高、低優先中斷問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15011
等級: 73; EXP: 84
HP : 1092 / 1821
MP : 5003 / 84764
離線
引用:

編譯完後在interrupt_manager.h跟.c檔遇到
void interrupt INTERRUPT_InterruptManagerHigh (void);
void interrupt low_priority INTERRUPT_InterruptManagerLow (void);
編譯錯誤顯示 variable has incomplete type 'void'


以上的兩個是函數的原型宣告,讓這兩個函數成為 Global Function 讓每一個外部程式都可以參考的到。

底下的程式是在 "interrupt_manager.c" 裡對高優先權及低優先權中斷的真正中斷函數,在這中斷函數又將控制權交給外部的 xxx_ISR( ) 函數在執行中斷所要做的事情。所以只要在你的程式裡使用 "void EUSART1_Transmit_ISR(void)" 的函數來接住中斷所傳過來的執行。

void interrupt INTERRUPT_InterruptManagerHigh(void) {
// interrupt handler
if (PIE1bits.TMR1IE == 1 && PIR1bits.TMR1IF == 1) {
TMR1_ISR(); } else {
//Unhandled Interrupt
}
}

void interrupt low_priority INTERRUPT_InterruptManagerLow(void) {
// interrupt handler
if (PIE1bits.RC1IE == 1 && PIR1bits.RC1IF == 1) {
EUSART1_Receive_ISR(); } else if (PIE1bits.TX1IE == 1 && PIR1bits.TX1IF == 1) {
EUSART1_Transmit_ISR();
} else {
//Unhandled Interrupt
}

3月18日 14:43:57
轉換PDF檔 列印


Re: PIC18F46K22 高、低優先中斷問題
新會員
註冊日期:
1月03日 08:21:20
所屬群組:
註冊會員
文章: 13
等級: 2; EXP: 38
HP : 0 / 34
MP : 4 / 25
離線
謝謝
你以下列出來的程式我用mcc就已經有產生出來了
不清楚我要在哪段程式在修改成void EUSART1_Transmit_ISR(void)

3月19日 08:42:19
轉換PDF檔 列印


Re: PIC18F46K22 高、低優先中斷問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15011
等級: 73; EXP: 84
HP : 1092 / 1821
MP : 5003 / 84764
離線
隨便,因為已有中斷的原型宣告。
所以 void EUSART1_Transmit_ISR(void) 這函數可以放在 main.c 或其他的程式裡。裡面寫你中斷要做的事情,也無須清除該周邊的 xxIF 中斷旗號。

3月19日 11:35:11
轉換PDF檔 列印


Re: PIC18F46K22 高、低優先中斷問題
新會員
註冊日期:
1月03日 08:21:20
所屬群組:
註冊會員
文章: 13
等級: 2; EXP: 38
HP : 0 / 34
MP : 4 / 25
離線
謝謝
看了一下eusart1.c裡面已經有void EUSART1_Transmit_ISR(void)這函數了,但編譯結果好像還是主要說到:
In file included from

mcc_generated_files/interrupt_manager.c:48:

mcc_generated_files/interrupt_manager.h:134:6: error: variable has incomplete type 'void'
void interrupt low_priority INTERRUPT_InterruptManagerLow (void);
^
mcc_generated_files/interrupt_manager.h:134:15: error: expected ';' after top level declarator
void interrupt low_priority INTERRUPT_InterruptManagerLow (void);
^
;
nbproject/Makefile-default.mk:179: recipe for target 'build/default/production/mcc_generated_files/mcc.p1' failed
mcc_generated_files/interrupt_manager.c:83:6: error: variable has incomplete type 'void'
void interrupt low_priority INTERRUPT_InterruptManagerLow (void)
^
mcc_generated_files/interrupt_manager.c:83:15: error: expected ';' after top level declarator
void interrupt low_priority INTERRUPT_InterruptManagerLow (void)
^
;
4 errors generated.

3月19日 13:10:47
轉換PDF檔 列印


Re: PIC18F46K22 高、低優先中斷問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15011
等級: 73; EXP: 84
HP : 1092 / 1821
MP : 5003 / 84764
離線
我快被搞混了。

interrupt_manager.c 只負責中斷函式的處理及轉移控制權到相對應的 ISR( )
引用:

void interrupt low_priority INTERRUPT_InterruptManagerLow(void) {
// interrupt handler
if (PIE1bits.RC1IE == 1 && PIR1bits.RC1IF == 1) {
EUSART1_Receive_ISR();
} else if (PIE1bits.TX1IE == 1 && PIR1bits.TX1IF == 1) {
EUSART1_Transmit_ISR();
} else {
//Unhandled Interrupt
}
}


裡面的 ISR( ) 則會呼叫 eusart1.c 的 ISR( ) 來接手中斷處理。
引用:
void EUSART1_Transmit_ISR(void) {

// add your EUSART1 interrupt custom code
if (sizeof (eusart1TxBuffer) > eusart1TxBufferRemaining) {
TXREG1 = eusart1TxBuffer[eusart1TxTail++];
if (sizeof (eusart1TxBuffer) <= eusart1TxTail) {
eusart1TxTail = 0;
}
eusart1TxBufferRemaining++;
} else {
PIE1bits.TX1IE = 0;
}
}

void EUSART1_Receive_ISR(void) {
if (1 == RC1STAbits.OERR) {
// EUSART1 error - restart

RC1STAbits.CREN = 0;
RC1STAbits.CREN = 1;
}

// buffer overruns are ignored
eusart1RxBuffer[eusart1RxHead++] = RCREG1;
if (sizeof (eusart1RxBuffer) <= eusart1RxHead) {
eusart1RxHead = 0;
}
eusart1RxCount++;
}


我看不出編譯中錯誤的程式?

3月19日 17:00:55
轉換PDF檔 列印


Re: PIC18F46K22 高、低優先中斷問題
新會員
註冊日期:
1月03日 08:21:20
所屬群組:
註冊會員
文章: 13
等級: 2; EXP: 38
HP : 0 / 34
MP : 4 / 25
離線
以上看起來前輩的程式跟我的完全都一樣,我也不知道是哪裡出了錯

3月19日 17:12:11
轉換PDF檔 列印


Re: PIC18F46K22 高、低優先中斷問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15011
等級: 73; EXP: 84
HP : 1092 / 1821
MP : 5003 / 84764
離線
這些程式都是 MCC 所產生的,基本上沒取修改她就不會錯。

試試看在專案的內容裡,將 XC8 設成 C90 的格式看看。

3月19日 17:23:54
轉換PDF檔 列印


Re: PIC18F46K22 高、低優先中斷問題
新會員
註冊日期:
1月03日 08:21:20
所屬群組:
註冊會員
文章: 13
等級: 2; EXP: 38
HP : 0 / 34
MP : 4 / 25
離線
謝謝
將格式設成C90之後編譯結果還是一樣

mcc_generated_files/interrupt_manager.c:48:
mcc_generated_files/interrupt_manager.h:134:6: error: variable has incomplete type 'void'
void interrupt low_priority INTERRUPT_InterruptManagerLow (void);
^
mcc_generated_files/interrupt_manager.h:134:15: error: expected ';' after top level declarator
void interrupt low_priority INTERRUPT_InterruptManagerLow (void);
^
;
mcc_generated_files/interrupt_manager.c:83:6: error: variable has incomplete type 'void'
void interrupt low_priority INTERRUPT_InterruptManagerLow (void)
^
mcc_generated_files/interrupt_manager.c:83:15: error: expected ';' after top level declarator
void interrupt low_priority INTERRUPT_InterruptManagerLow (void)
^
;
4 errors generated.

3月20日 08:20:19
轉換PDF檔 列印


Re: PIC18F46K22 高、低優先中斷問題
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15011
等級: 73; EXP: 84
HP : 1092 / 1821
MP : 5003 / 84764
離線
可以將你的專案壓縮成一個 zip 檔後傳過來,我來試試看。

richard.yang@microchip.com

3月20日 10:32:51
轉換PDF檔 列印



(1) 2 »



無法在此發表文章
可以在此觀看文章
無法回覆文章
無法編輯自己的文章
無法刪除自己的文章
無法發起投票調查
無法在此投票
無法上傳附加檔案
無法不經審核直接發表文章

[進階搜尋]


搜尋
Microchip連結
產品技術問題產品技術支援專線:0800-717718 台北02-25088600 新竹03-5778366 Ext. 8600 高雄07-2137830 MicrochipDIRECT 專線: 07-2137830
Powered by XOOPS © 2001-2012 The XOOPS Project