longtu
20-03-2012, 02:59 PM
Chào mọi người.
Vấn đề của mình như sau:
- Mình kết nối Max232 như sau: Xem hình: RS232 Communication.bmp
Lưu ý ở đây mình sử dụng Max232 loại SMD và các tụ điện loại ceramic Capcitor 100nF(104). Tuy nhiên, trong datasheet của Max232 nói rằng việc sử dụng tự không cực tính Ceramic là đuợc chấp nhận. Xem hình: Note(Max232 datasheet).bmp
- Đoạn code mình viết để Test việc giao tiếp RS232 đơn giãn như sau:
************************************************** ********/
#include <18F24K22.h>
#use delay(clock=20000000)//Crystall 20Mhz
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)
//-------------INCLUDED FILES:
#include <historic.c>
#include <main.h>
Void main()
{
//-------------Enable Inpout/Output:
//-------------Enable Interrup vecter:
ENABLE_INTERRUPTS(INT_RDA);
enable_interrupts(global);
while(1)
{
//Do nothing!
}
}
//------------------------------------------------------------------------------
#INT_RDA
void Receive_isr()
{
char c;
c=getc();
delay_us(10);
putc(c);
}
Đoạn code này: PC gửi 1 ký tự nào đó xuống Microcontroller thì Microcontrller sẽ gửi trả lại ký tự đó. Sử dụng ngắt Rs232 làm việc này.
Vấn đề của mình là:Mình tử Test gửi 0, 1, 2, ...9 thì chỉ có một số ký tự đúng.
- Gửi 0 -- nhận 3E(sai) lẽ ra phải nhận 30.
- Gửi 1 -- nhận 3F(sai) lẽ ra phải nhận 31.
- Gửi 2 -- nhận 32(đúng)
- Gửi 3 -- nhận 33(đúng)
- Gửi 4 -- nhận 36(sai) lẽ ra phải nhận 34.
- Gửi 5 -- nhận 36(sai) lẽ ra phải nhận 35.
- Gửi 6 -- nhận 36(đúng)
- Gửi 7 -- nhận 37(đúng)
- Gửi 8 -- nhận 3E(sai) lẽ ra phải nhận 38.
- Gửi 9 -- nhận 3F(sai) lẽ ra phải nhận 39.
(Xem hình: Serial input-output monitor.bmp).
Mình thử đi thử lại nhiều lần, kết quả đều như vậy. Mình không rõ nguyên nhân là do đâu? bạn nào có kinh nghiệm chia sẽ giúp minh nhé?
PS: Mình đã thay IC Max232 khác kết quả vẫn không thay đổi(loại trừ hư IC Max232).
Cám ơn các bạn đã đọc bài.
Thân,
Vấn đề của mình như sau:
- Mình kết nối Max232 như sau: Xem hình: RS232 Communication.bmp
Lưu ý ở đây mình sử dụng Max232 loại SMD và các tụ điện loại ceramic Capcitor 100nF(104). Tuy nhiên, trong datasheet của Max232 nói rằng việc sử dụng tự không cực tính Ceramic là đuợc chấp nhận. Xem hình: Note(Max232 datasheet).bmp
- Đoạn code mình viết để Test việc giao tiếp RS232 đơn giãn như sau:
************************************************** ********/
#include <18F24K22.h>
#use delay(clock=20000000)//Crystall 20Mhz
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT
#USE RS232(BAUD=9600, XMIT=PIN_C6, RCV=PIN_C7)
//-------------INCLUDED FILES:
#include <historic.c>
#include <main.h>
Void main()
{
//-------------Enable Inpout/Output:
//-------------Enable Interrup vecter:
ENABLE_INTERRUPTS(INT_RDA);
enable_interrupts(global);
while(1)
{
//Do nothing!
}
}
//------------------------------------------------------------------------------
#INT_RDA
void Receive_isr()
{
char c;
c=getc();
delay_us(10);
putc(c);
}
Đoạn code này: PC gửi 1 ký tự nào đó xuống Microcontroller thì Microcontrller sẽ gửi trả lại ký tự đó. Sử dụng ngắt Rs232 làm việc này.
Vấn đề của mình là:Mình tử Test gửi 0, 1, 2, ...9 thì chỉ có một số ký tự đúng.
- Gửi 0 -- nhận 3E(sai) lẽ ra phải nhận 30.
- Gửi 1 -- nhận 3F(sai) lẽ ra phải nhận 31.
- Gửi 2 -- nhận 32(đúng)
- Gửi 3 -- nhận 33(đúng)
- Gửi 4 -- nhận 36(sai) lẽ ra phải nhận 34.
- Gửi 5 -- nhận 36(sai) lẽ ra phải nhận 35.
- Gửi 6 -- nhận 36(đúng)
- Gửi 7 -- nhận 37(đúng)
- Gửi 8 -- nhận 3E(sai) lẽ ra phải nhận 38.
- Gửi 9 -- nhận 3F(sai) lẽ ra phải nhận 39.
(Xem hình: Serial input-output monitor.bmp).
Mình thử đi thử lại nhiều lần, kết quả đều như vậy. Mình không rõ nguyên nhân là do đâu? bạn nào có kinh nghiệm chia sẽ giúp minh nhé?
PS: Mình đã thay IC Max232 khác kết quả vẫn không thay đổi(loại trừ hư IC Max232).
Cám ơn các bạn đã đọc bài.
Thân,