การทดลองที่ 3 UART (Serial interrupt)

การสื่อสารทางพอร์ตอนุกรมเป็นการสื่อสารแบบ Full duplex คือสามารถรับและส่งได้ในเวลาเดียวกัน ซึ่งจะมีขา TXD ในการส่งและ RXD ในการรับ การสื่อสารทางพอร์ตอนุกรมโดยทั่วไปจะใช้ตัว driver/receiver มาต่อกับขา RXD/TXD อีกทีนึงเพื่อเพิ่มระยะทางในการสื่อสาร สำหรับการติดต่อกับคอมพิวเตอร์ เราจะต้องใช้ตัว driver/receiver เพื่อแปลงสัญญาณลอจิกของ MCS-51 ให้เป็นมาตราฐาน RS-232 เบอร์ที่นิยมใช้กันมากจะเป็น MAX232

  • มาตราฐานของ RS-232 ระบุไว้ว่าสามารถส่งได้เป็นระยะทาง 50 ฟุต หรือ 15 เมตร

สำหรับการส่งที่ต้องการระยะทางไกลมากขึ้นจะเป็น RS-485/RS-422 ตัว driver/receiver เช่นเบอร์ 75176

  • มาตราฐานของ RS-485/RS-422 ระบุไว้ว่าสามารถส่งได้เป็นระยะทาง 4000 ฟุต หรือ 1200 เมตร

สำหรับการทดลองนี้ผมจะทดลองกับ RS-232 ซึ่งเราสามารถส่งข้อมูลไปยังคอมพิวเตอร์ได้

null

รูปที่ 1 วงจรที่ใช้ในการทดลอง

ในการทดลองการรับส่งข้อมูลทาง serial port UART เราจะใช้โปรแกรมยอดฮิตที่ติดมาอยู่แล้วใน windows นั่นคือโปรแกรม HyperTerminal ถ้าใครหาโปรแกรมนี้ไม่เจอ ให้ไปที่ Start–>All Programs–>Accessories–>Communication–>Hyperterminal ตั้งต่าตามรูปที่ 2-4

รูปที่ 2

รูปที่ 3

รูปที่ 4

ทำการ Reset MCS-51 จะกด Reset หรือถอดปลั๊กแล้วเสียบใหม่ก็ได้ จะเห็นข้อความดังรูปที่ 5 ให้พิมพ์ชื่อตัวเองลงไป ผมพิมพ์ “Aon.” แล้ว Enter จะได้ข้อความดังรูปที่ 5

รูปที่ 5

การทดลองนี้ผมจะไม่ใช้ printf เนื่องจากคำสั่ง printf เราจะกินหน่วยความจำไปอีก 1K byte แต่ผมจะใช้วิธี copy string เข้าไปใน Txbuff แทน

//************************************************************************//
//Project : LAB3
//Description : Serial UART interrupt
//Device : 89S52
//XTAL : 11.0592 MHz
//By : ThaiEmbedded 2007
//************************************************************************//
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include <string.h>#define CR 0x0d
#define LF 0x0a

bit TX_OK,RX_OK;
unsigned char Txbuff[40];
unsigned char Rxbuff[20];
unsigned char Txn;
unsigned char Txcnt,Rxcnt;

//————————————————————————//
// Serial interrupt service routine
//————————————————————————//
void serial_isr() interrupt 4
{
if(TI)
{
TI=0;
if(Txcnt<Txn)
SBUF=Txbuff[Txcnt++];
else
TX_OK = 1;
}

if(RI)
{
RI=0;
if((!RX_OK)&&(Rxcnt<19))
{
Rxbuff[Rxcnt]=SBUF;
if(Rxbuff[Rxcnt]==0x0d)
RX_OK = 1;
Rxcnt++;
}
}

}
//————————————————————————//
// Initial register
//————————————————————————//
void init()
{
TMOD = 0×20;
TH1 = 0xfd;
IE = 0×90;
TR1 = 1;
SCON = 0×52;
}
//————————————————————————//
// Main
//————————————————————————//
void main ()
{
unsigned char i;
init();
// 01234567890123456789012
strncpy(Txbuff,”Welcome to ThaiEmbedded”,23);
Txbuff[23] = CR;
Txbuff[24] = LF;
Txn = 25;
Txcnt = 1;
TX_OK = 0;
SBUF = Txbuff[0];
while(!TX_OK);

while(1)
{
// 012345678901234
strncpy(Txbuff,”Type your name “,15);
Txn = 15;
Txcnt = 1;
TX_OK = 0;
SBUF = Txbuff[0];
while(!TX_OK);

Rxcnt = 0;
RX_OK = 0;
while(!RX_OK);

// 0123456789012
strncpy(Txbuff,”Your name is “,13);
Txn = 13;

for(i=0;i<Rxcnt;i++)
Txbuff[Txn++] = Rxbuff[i];

Txbuff[Txn++] = CR;
Txbuff[Txn++] = LF;
Txcnt = 1;
TX_OK = 0;
SBUF = Txbuff[0];
while(!TX_OK);
}
}

Download Code การทดลองที่ 3

บทความอื่นๆที่เกี่ยวข้อง

Leave a Reply