會員登陸
帳號:

密碼:

記住我



忘記密碼?

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


正在流覽:   1 名訪客





PIC16F1526 EUSART 啟動中斷之後 RX 再也讀不到資料?
新會員
註冊日期:
2016/09/05 20:30
所屬群組:
註冊會員
文章: 2
等級: 1; EXP: 2
HP : 0 / 0
MP : 0 / 7
離線
您好,

我的問題是,不啟用中斷的情況下,可以用 EUSART rx 讀資料,但一旦啟用中斷, rx 就再也讀不到資料。
可以給我一個範例嗎?

xide v3.35
compiler: XC8

code configurator:
Pin Module:
RG1 EUSART2 TX2 start high:False, analog:False, Output:True
RG2 start high:False, analog:False, Output:False
Interrupt Vector
1 EUSART2 TXI enabled
2 EUSART2 RCI enabled
3 Pin Module IOCI unchecked

Enable EUSART, Transmit, 19200bps, Enable Continuous Receive

謝謝!

2016/09/05 21:56
轉換PDF檔 列印


Re: PIC16F1526 EUSART 啟動中斷之後 RX 再也讀不到資料?
新會員
註冊日期:
2016/09/05 20:30
所屬群組:
註冊會員
文章: 2
等級: 1; EXP: 2
HP : 0 / 0
MP : 0 / 7
離線
嗯,我找到答案了。
main() 堶接鬮彌憚 Global Interrupts & Peripheral Interrupts 的兩行程式碼要拿掉。

有資料進來時,會跳進 eusartX.c 的 EUSARTx_Receive_ISR()

我改堶悸熊{式來進一步處理,是嗎?

2016/09/05 22:29
轉換PDF檔 列印


Re: PIC16F1526 EUSART 啟動中斷之後 RX 再也讀不到資料?
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
離線
MCC 所產生的UART函數,接收是採中斷模式及Ring Buffer 的方式儲存接收到的資料。

所以只要檢查Buffer的旗號即可判定是否有新資料進來,讀走資料後它內部的資料指位變數會自動調整的。

可以看一下教育訓練光碟裡的 MCC RTC 教材裡的 UART 說明。

2016/09/06 09:46
轉換PDF檔 列印


Re: PIC16F1526 EUSART 啟動中斷之後 RX 再也讀不到資料?
新會員
註冊日期:
3月18日 10:17:28
所屬群組:
註冊會員
文章: 9
等級: 1; EXP: 86
HP : 0 / 21
MP : 3 / 13
離線
版主:
請問 :
能直接給網址嗎?
我找不到!
非常感謝!

版主:
我用是 : PIC18F4520
以下是我的 code ,

在 void __interrupt () Low_ISR (void) 下 if(PIR1bits.RCIF)

中斷只進來一次!
請您指教 ,

#include <stdio.h>
#include <stdlib.h>
#include "UART/UART.h"

#include "k18.h"
#include "UART.h"

#pragma config OSC = INTIO67
#pragma config WDT = OFF
#pragma config LVP = OFF

#define UART_RX_BUFFER_SIZE 40

unsigned char TimerCnt=0;
unsigned char INDEX=0;
unsigned char RB[10];
void __interrupt () Low_ISR (void)
{
if( INTCONbits.TMR0IF ) //125ms base,TMR0 register has overflowed
{
INTCONbits.TMR0IF = 0; //Clear Timer Interrupt Flag
TimerCnt++;
if(TimerCnt%20 ==0)
COL3 = ~COL3;
}

if(PIR1bits.TXIF) // EUSART receive buffer(RCREG) is full - Data ready
{
PIR1bits.TXIF = 0;
if(TimerCnt)
{
}
}

if(PIR1bits.RCIF) // EUSART receive buffer(RCREG) is full - Data ready
{
if(INDEX<5)
{
RB[INDEX] = RCREG;
INDEX++;
}
else
{
INDEX =0;
PIR1bits.RCIF =0;
}
}

}

void Delay(long n)
{
while(n--);
}

void putch(char data)
{
while(PIR1bits.TXIF==0)
continue;
TXREG = data;

}

void main()
{
unsigned int ADC_Value0=0;
unsigned int ADC_Value1=0;
unsigned int ADC_Value2=0;

k18_init();

//@OSCILLATOR CONFIGURATIONS
OSCCON = 0b01100000; //0x60; OSCCON REGISTER
OSCTUNEbits.PLLEN = 1; //internal OSC & PLL = 16MHz

//@TIMER0 MODULE
//RCON = 0b10000010; // Enable IPEN
INTCONbits.GIEH = 1;

/*
b7 : 1 Enables Timer0
b6 : 0 Timer0 is configured as a 16-bit timer/counter
b5 : 0 Internal instruction cycle clock (CLKO)
b4 : 1 Increment on high-to-low transition on T0CKI pin
b3 : 0 Timer0 prescaler is assigned. Timer0 clock input comes from prescaler output.
b2~b0 : 010 = 1:8 prescale value
*/
T0CON = 0b10011010;
TMR0L = 0xDB; //WriteTimer0(Timer0_Value); // Write timer value
TMR0H = 0x0B;
INTCONbits.T0IE = 1;
INTCONbits.TMR0IF = 0; // Clear interrupt flag
T0CONbits.TMR0ON = 1; // 0 = disable Timer0 , 1 = enable Timer0

//@EUSART initial
TXSTA = 0b00100100; //0x24; //TRANSMIT STATUS AND CONTROL REGISTER
RCSTA = 0b10010000; //0x90; //RECEIVE STATUS AND CONTROL REGISTER
BAUDCON = 0b00001000; //0x08; //BAUD RATE CONTROL REGISTER
SPBRG = 0b10100000; //0xA0; //EUSART Baud Rate Generator Register Low Byte
SPBRGH = 0b00000001; //0x01; //EUSART Baud Rate Generator Register High Byte

//disable tx interrupt
PIE1bits.TXIE = 0;
PIR1bits.TXIF = 0;
PIE1bits.RCIE = 1;
PIR1bits.RCIF = 0;

//@10-BIT ANALOG-TO-DIGITAL CONVERTER (A/D) MODULE
ADCON1=0b00001100; //ADCON1=0b00001110;
ADCON2=0b10010100;

UART_param.UR_idx=0;

while(1)
{

}
}

3月29日 18:14:41
轉換PDF檔 列印


Re: PIC16F1526 EUSART 啟動中斷之後 RX 再也讀不到資料?
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
離線
if(PIR1bits.RCIF) // EUSART receive buffer(RCREG) is full - Data ready
{
if(INDEX<5)
{
RB[INDEX] = RCREG;
INDEX++;
}
else
{
INDEX =0;
PIR1bits.RCIF =0; // 接收的中斷旗號的清除不是直接使用 RCIF=0 的方式清除,他必須讀取 RCREG 後才會清除。所以你的接收中斷會出問題,接收後就一直在間入接收中斷的迴圈裡。
INDEX = RCREG; // 對REREG 做個讀取的動作清除其旗號。
INDEX = 0;
}

3月30日 10:25:12
轉換PDF檔 列印


Re: PIC16F1526 EUSART 啟動中斷之後 RX 再也讀不到資料?
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
離線
再者你的中斷方式也有些混淆。

正確的高優先權中斷函數的語法是:
void interrupt HighISR(void)

並配合開啟高、低優先權的設定:
RCONbits.IPEN = 1;
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;

當然相對應的周邊也要開啟高優先權的周邊啟用:
例如:
INTCON2bits.TMR0IP = 1;
INTCONbits.T0IE = 1;

===================================================

正確的低優先權中斷函數的語法是:
void interrupt low_priority LowISR(void)

相對應的周邊也要開啟低優先權的周邊啟用:
例如:
INTCON2bits.TMR0IP = 0;
INTCONbits.T0IE = 1;

===================================================
記得這兩個中斷函數都必須在 main( ) 函數外作圓形的宣告。

有關 PCI18Fxxxx 的中斷說明可以參考教育訓練光碟下的: XC8 的教育訓練裡的 Lab 3 的範例及講義。

3月30日 10:49:50
轉換PDF檔 列印


Re: PIC16F1526 EUSART 啟動中斷之後 RX 再也讀不到資料?
新會員
註冊日期:
3月18日 10:17:28
所屬群組:
註冊會員
文章: 9
等級: 1; EXP: 86
HP : 0 / 21
MP : 3 / 13
離線
Ryang 您好:

以下是我的 code:
雖然可以進中斷,
可是收到一堆亂碼!
我是用 Teraterm 送出 1234567890
卻收到 :
'å'; 0xe5
'?'; 0x9a
'?'; 0x9c
'ï'; 0xef
'?'; 0xbf

請您再指導一下!
非常感謝!


#include <stdio.h>
#include <stdlib.h>
#include "UART/UART.h"

#include "k18.h"
#include "UART.h"

#pragma config OSC = INTIO67
#pragma config WDT = OFF
#pragma config LVP = OFF

#define UART_RX_BUFFER_SIZE 40

unsigned char TimerCnt=0;
unsigned char INDEX=0;
unsigned char RB[10];

void __interrupt (high_priority) HighISR(void)
{
if(PIR1bits.RCIF) // EUSART receive buffer(RCREG) is full - Data ready
{
if(INDEX<5)
{
RB[INDEX] = RCREG;
INDEX++;
}
else
{
INDEX = 0;
RB[INDEX] = RCREG;

}
}
}

void __interrupt (low_priority) Low_ISR (void)
{
if( INTCONbits.TMR0IF ) //125ms base,TMR0 register has overflowed
{
INTCONbits.TMR0IF = 0; //Clear Timer Interrupt Flag
TimerCnt++;
if(TimerCnt%20 ==0)
COL3 = ~COL3;
}

if(PIR1bits.TXIF) // EUSART receive buffer(RCREG) is full - Data ready
{
PIR1bits.TXIF = 0;
if(TimerCnt)
{
}
}
}

void Delay(long n)
{
while(n--);
}

void putch(char data)
{
while(PIR1bits.TXIF==0)
continue;
TXREG = data;

}

void main()
{
unsigned int ADC_Value0=0;
unsigned int ADC_Value1=0;
unsigned int ADC_Value2=0;

k18_init();

//@OSCILLATOR CONFIGURATIONS
OSCCON = 0b01100000; //0x60; OSCCON REGISTER
OSCTUNEbits.PLLEN = 1; //internal OSC & PLL = 16MHz

//@TIMER0 MODULE
//RCON = 0b10000010; // Enable IPEN
RCONbits.IPEN = 1; // Enable interrupt priority levels
INTCONbits.GIEL = 1; // Enable all low-priority interrupts
INTCONbits.GIEH = 1; // Enable all high-priority interrupts

/*
b7 : 1 Enables Timer0
b6 : 0 Timer0 is configured as a 16-bit timer/counter
b5 : 0 Internal instruction cycle clock (CLKO)
b4 : 1 Increment on high-to-low transition on T0CKI pin
b3 : 0 Timer0 prescaler is assigned. Timer0 clock input comes from prescaler output.
b2~b0 : 010 = 1:8 prescale value
*/
T0CON = 0b10011010;
TMR0L = 0xDB; //WriteTimer0(Timer0_Value); // Write timer value
TMR0H = 0x0B;
INTCONbits.T0IE = 1;
INTCONbits.TMR0IF = 0; // Clear interrupt flag
T0CONbits.TMR0ON = 1; // 0 = disable Timer0 , 1 = enable Timer0
INTCON2bits.TMR0IP = 0;

//@EUSART initial
TXSTA = 0b00100100; //0x24; //TRANSMIT STATUS AND CONTROL REGISTER
RCSTA = 0b10010000; //0x90; //RECEIVE STATUS AND CONTROL REGISTER
BAUDCON = 0b00001000; //0x08; //BAUD RATE CONTROL REGISTER
SPBRG = 0b10100000; //0xA0; //EUSART Baud Rate Generator Register Low Byte
SPBRGH = 0b00000001; //0x01; //EUSART Baud Rate Generator Register High Byte

//disable tx interrupt
PIE1bits.TXIE = 0;
PIR1bits.TXIF = 0;
IPR1bits.TXIP = 0;
PIE1bits.RCIE = 1;
IPR1bits.RCIP = 1;

//@10-BIT ANALOG-TO-DIGITAL CONVERTER (A/D) MODULE
ADCON1=0b00001100; //ADCON1=0b00001110;
ADCON2=0b10010100;

while(1)
{
if(RCSTAbits.OERR) // OERR error condition
{
RCSTAbits.CREN = 0;
RCSTAbits.CREN = 1;
}
}
}

3月30日 20:29:12

Ryang 於 2020年04月01日 10:30:16
轉換PDF檔 列印


Re: PIC16F1526 EUSART 啟動中斷之後 RX 再也讀不到資料?
版主
註冊日期:
2004/04/30 10:53
來自 CAE, Microchip
所屬群組:
站務管理者
註冊會員
MICROCHIP
文章: 15047
等級: 73; EXP: 90
HP : 1093 / 1822
MP : 5015 / 85702
離線
請檢查一下中斷接收,在重設 index=0 的時候,你沒有去收 REREG 做 RCIF 旗號的清除。

INDEX = 0;
RB[INDEX] = RCREG;

資料會錯,請一檢查 BAUD RADE 有沒有設錯。

3月31日 11:27:35

Ryang 於 2020年03月31日 14:59:28
Ryang 於 2020年04月01日 10:30:39
轉換PDF檔 列印






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

[進階搜尋]


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