Tôi định cấu hình 2 bộ USART cho pic16f877a và sử dụng ngắt để lấy dữ liệu. Khi test tôi thấy khi dữ liệu được truyền đến từ <b>2 bộ usart</b> thì nó đều nhảy vào ngắt. Vậy làm thế nào để phân biệt được chính xác dữ liệu do bộ usart nào truyền đến.
Dưới đây là code trong chương trình của tôi.
include <16F877A.H>
#FUSES HS,NOWDT,NOPROTECT,NOLVP
#USE DELAY(CLOCK=11059200)
//================================================== ===
//INIT UART0
//================================================== ===
#USE RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7) //UART0
VOID PUTC1(CHAR C)
{
PUTC(C);
}
CHAR GETC1(VOID)
{
RETURN GETC();
}
//================================================== ===
//INIT UART1
//================================================== ===
#USE RS232(BAUD=9600,XMIT=PIN_A0,RCV=PIN_A1) //UART1
VOID PUTC2(CHAR C)
{
PUTC(C);
}
CHAR GETC2(VOID)
{
RETURN GETC();
}
//================================================== ===
#INCLUDE <DEFS.H>
UNSIGNED CHAR MSG[50];
//================================================== ===
//ISR
//================================================== ===
#INT_RDA
RX_ISR()
{
PUTC1(GETC1()); //GET DATA FROM UART0
PUTC2(GETC2()); //GET DATA FROM UART1
}
//================================================== ===
//MAINLINE...
//================================================== ===
VOID MAIN(VOID)
{
#ASM
MOVLW 0X20 //ENABLE RX INTERRUPT
MOVWF 0X8C //PIE1 REGISTER
#ENDASM
ENABLE_INTERRUPTS(GLOBAL); //ENABLE GLOBAL INTERRUPT
WHILE(1)
{
}
}
Mọi người cho ý kiến đóng góp về vấn đề này giúp tôi.
Cảm ơn tất cả mọi người.
Dưới đây là code trong chương trình của tôi.
include <16F877A.H>
#FUSES HS,NOWDT,NOPROTECT,NOLVP
#USE DELAY(CLOCK=11059200)
//================================================== ===
//INIT UART0
//================================================== ===
#USE RS232(BAUD=9600,XMIT=PIN_C6,RCV=PIN_C7) //UART0
VOID PUTC1(CHAR C)
{
PUTC(C);
}
CHAR GETC1(VOID)
{
RETURN GETC();
}
//================================================== ===
//INIT UART1
//================================================== ===
#USE RS232(BAUD=9600,XMIT=PIN_A0,RCV=PIN_A1) //UART1
VOID PUTC2(CHAR C)
{
PUTC(C);
}
CHAR GETC2(VOID)
{
RETURN GETC();
}
//================================================== ===
#INCLUDE <DEFS.H>
UNSIGNED CHAR MSG[50];
//================================================== ===
//ISR
//================================================== ===
#INT_RDA
RX_ISR()
{
PUTC1(GETC1()); //GET DATA FROM UART0
PUTC2(GETC2()); //GET DATA FROM UART1
}
//================================================== ===
//MAINLINE...
//================================================== ===
VOID MAIN(VOID)
{
#ASM
MOVLW 0X20 //ENABLE RX INTERRUPT
MOVWF 0X8C //PIE1 REGISTER
#ENDASM
ENABLE_INTERRUPTS(GLOBAL); //ENABLE GLOBAL INTERRUPT
WHILE(1)
{
}
}
Mọi người cho ý kiến đóng góp về vấn đề này giúp tôi.
Cảm ơn tất cả mọi người.
Comment