2016年8月9日 星期二

DIY - PIC24:通用非同步收發器 UART 中斷程式(三十七)

DIY - PIC24:通用非同步收發器 UART 中斷程式(三十七): 

Microchip PIC24FJ64GA008 通用非同步收發器 UART 的中斷處理程式,主要是針對處理接收 UART 的資料,因為 MCU 不能夠預測何時接收 UART 的資料,所以當有接收資料,便要啓動中斷處理程式,首先要重置接收中斷標誌,假如標誌沒有重置,則無法判斷第二次中斷曾發生過否。

PIC24FJ64GA008 開發板的 UART LCD1602 顯示
PIC24FJ64GA008 開發板的 UART LCD1602 接收中斷顯示
UART 接收中斷(Receive Interrupt):
UART 接收中斷標誌(UxRXIF)位於相應的中斷標誌狀態(IFS)寄存器中。URXISEL<1:0>UxSTA<7:6>)控制位決定UART接收器何時將產生一個中斷。

a如果 URXISEL<1:0> = 0001,每當一個資料字從接收移位寄存器(UxRSR)傳輸到接收緩衝器後,就會產生中斷。接收緩衝器中可以有一個或多個字元。 
b如果 URXISEL<1:0> = 10,當一個字從接收移位寄存器(UxRSR)傳輸到接收緩衝器時就會產生中斷,其結果是接收緩衝器中有 3 4個字元。 
c如果 URXISEL<1:0> = 11,當一個字從接收移位寄存器(UxRSR)傳輸到接收緩衝器時就會產生中斷,其結果是接收緩衝器中有 4個字元(即,緩衝器滿)。

運行時可以在三種中斷模式間切換。URXDA UxRXIF 標誌位元指示 UxRXREG 寄存器的狀態,而 RIDLE 位元(UxSTA<4>)表明 UxRSR 寄存器的狀態。RIDLE 狀態位元是唯讀位元,在接收器空閒時(即,UxRSR 寄存器為空)時被置 1。因為沒有與此位元關聯的中斷邏輯,所以用戶必須查詢此位以判斷 UxRSR 是否空閒。

URXDA位(UxSTA<0>)指示接收緩衝器有資料還是為空。只要接收緩衝器中至少有一個可以讀出的字元,該位元就將置 1URXDA 是唯讀位。

Microchip PIC24FJ64GA008 通用非同步收發器 UART 中斷啓動程式:
void IntUART1( void)
{
    U1STAbits.URXISEL = 1; // Set RX Interrupt

    INTCON1  = 0x8000;
    INTCON2  = 0;
    IEC0     = 0x1800;

    IFS0bits.U1RXIF = 0; // Reset RX Interrupt
} // initUART1

Microchip PIC24FJ64GA008 通用非同步收發器 UART 中斷程式
void __attribute__((interrupt, no_auto_psv)) _U1RXInterrupt(void) {

IFS0bits.U1RXIF = 0;

UART_RX_data = U1RXREG;
SetDDRamAddr(0x40);
WriteStrXLCD("INT = ");
WriteDataXLCD(UART_RX_data);
}

Microchip PIC24FJ64GA008 通用非同步收發器 UART 收發程式
// 1. Init the UART1 Serial Port
initUART1(); 
// 2. Init the UART1 Interrupt
IntUART1();

char hello[]=("\n>> Hello ugworkshop PICFJ24GA008 Development Board \n");
putstringUART1(hello);
putcharUART1( '\r');

while(1){
}

筆者使用 Terminal 程式來收發 RS-232 的數據資料,當電腦 Terminal 程式啓動後,選擇 ComPort = Com1Baud rate = 9600Data Bit = 8Parity = noneHand shaking = none,連接 RS-232 串口線,重置 PIC24FJ64GA008 開發板,電腦 Terminal 程式便會接收到訊息,然後在 Transmit 空白位置,按打鍵盤,PIC24FJ64GA008 開發板便會接收到訊息。

電腦 Terminal 程式接收到訊息
PIC24FJ64GA008 開發板接收到中斷訊息
2016年 8月 9日 天氣報告
氣溫:27.9@ 20:10
相對濕度:百分之 78%
天氣:微雨

沒有留言:

張貼留言