การใช้งาน พอร์ตอนุกรม ใน ไมโครคอนโทรลเลอร์ MCS-51 : MIND-TEK.NET

homenewsarticleproductwebboardpaymentdeliverydownloadcontact
 
 

การใช้งานพอร์ตอนุกรมในไมโครคอนโทรลเลอร์ MCS-51

ตามมาตรฐานของไมโครคอนโทรลเลอร์ MCS-51 จะมีพอร์ตสื่อสารอนุกรมแบบฟูลดูเพล็กซ์อยู่ 1 พอร์ต อยู่ที่พอร์ต 3.0(Rx) และ 3.1(Tx) ในกรณีที่เป็นตัวถังแบบ PDIP40 พอร์ตอนุกรมของไมโครคอนโทรลเลอร์จะอยู่ในตำแหน่งพิน 10 (Rx) และ 11 (Tx) ตามลำดับ สัญญาณที่ออกมาจากพอร์ตของไมโครคอนโทรลเลอร์นั้นเป็นสัญญาณระดับ TTL ซึ่งมีระดับสัญญาณอยู่ที่ 0-5V แต่ตามมาตรฐานการสื่อสารแบบอนุกรม RS-232 นั้นสัญญาณ logic “0” ต้องมีระดับสัญญาณอยู่ที่ 3-15 V และ logic “1” ต้องมีระดับสัญญาณอยู่ที่ (-3)-(-15V) ดังนั้นเราจึงต้องใช้วงจรแปลงระดับสัญญาณซึ่งสามารถใช้ IC MAX232 เป็นตัวปรับระดับสัญญาณจากระดับ TTL ให้เป็นไปตามมาตรฐานของ RS-232 โดยสามารถต่อวงจรได้ตามรูปที่ 1

วงจรพอร์ตอนุกรม rs-232

รูปที่ 1 วงจรติดต่อผ่านพอร์ตสื่อสารอนุกรม RS-232

การใช้งานพอร์ตอนุกรมของ MCS-51 นั้นเราจำเป็นต้องรู้จักรีจิสเตอร์พิเศษที่ใช้สำหรับควบคุมการรับส่งข้อมูลผ่านพอร์ตอนุกรมซึ่งมีรายละเอียดดังนี้

รีจิสเตอร์ SBUF (Serial data buffer register) เป็นรีจิสเตอร์ขนาด 8 บิต มีแอดแดรสอยู่ที่ตำแหน่ง 99H ของรีจิสเตอร์ฟังก์ชันพิเศษหรือ SFR (Special Function Register) ทำหน้าที่เป็นบัฟเฟอร์สำหรับ การรับ ส่งข้อมูลผ่านพอร์ตอนุกรม

รีจิสเตอร์ SCON (Serial port Control Register) เป็นรีจิสเตอร์ขนาด 8 บิต มีแอดเดรสอยู่ที่ตำแหน่ง 98H สามารถเข้าถึงได้ในระดับบิตโดยมีรายละเอียดดังแสดงในรูปที่ 2

รีจิสเตอร์ SCON

รูปที่ 2 โครงสร้างรีจิสเตอร์ SCON ซึ่งใช้ควบคุมการใช้งานพอร์ตสื่อสารอนุกรมของ MCS-51

SM0-SM1 (Serial port Mode): ใช้ในการเลือกโหมดการทำงานของพอร์ตอนุกรม โดยมีรายละเอียดดังนี้

SM0

SM1

โหมดการทำงาน

0

0

พอร์ตอนุกรมทำงานในโหมด 1

0

1

พอร์ตอนุกรมทำงานในโหมด 2

1

0

พอร์ตอนุกรมทำงานในโหมด 3

1

1

พอร์ตอนุกรมทำงานในโหมด 4

SM2: ใช้สำหรับเลือกเพื่อกำหนดการทำงานและสื่อสารเป็นแบบ มัลติโปรเซสเซอร์ (multiprocessor) โดยถ้าบิตนี้เป็น “1” จะเป็นการสื่อสารแบบมัลติโปรเซสเซอร์

REN (Enable serial reception): ใช้ในการอีนาเบิลการรับข้อมูลของพอร์ตอนุกรม โดยถ้าต้องการให้พอร์ตอนุกรมสามารถรับข้อมูลด้วย ต้องเซตบิต REN นี้ให้เป็น “1”

TB8: ใช้สำหรับเก็บข้อมูลบิตที่ 9 ที่ต้องการส่งไปในการใช้งานพอร์ตอนุกรมในโหมด 2 และ 3 โดยสามารถเซต และเคลียร์ได้ด้วยกระบวนการทางซอฟท์แวร

RB8: ใช้สำหรับรับข้อมูลบิตที่ 9 ที่เข้ามา ในการใช้งานพอร์ตอนุกรมในโหมดที่ 2 และ 3 โดยสามารถเซต และเคลียร์ได้ด้วยกระบวนการทางซอฟท์แวร

TI (Transmit Interrupt flag): ใช้แสดงการเกิดอินเตอร์รัปต์เมื่อมีการส่งข้อมูลออกทางพอร์ตอนุกรม

RI (Receive Interrupt flag): ใช้แสดงการเกิดอินเตอร์รัปต์เมื่อมีการรับข้อมูลเข้ามาทางพอร์ตอนุกรม

การทำงานของพอร์ตอนุกรมใน MCS-51 นั้นมี 4 โหมดด้วยกัน ในโหมด 0 อัตราการรับส่งข้อมูลแบบอนุกรมจะขึ้นอยู่กับความถี่คริสตอลที่ใช้กับไมโครคอนโทรลเลอร์โดยตรงโดยมีความสัมพันธ์ดังนี้

อัตราการรับส่งข้อมูล = ความถี่ของคริสตอลที่ใช้/12   บิต/วินาท

สำหรับในการทำงานในโหมด 1 เป็นโหมดที่รับส่งข้อมูลครั้งละ 10 บิต นั้นคือส่งบิตเริ่มต้น 1 บิตมาก่อน ตามด้วยบิตข้อมูลขนาด 8 บิต และปิดท้ายด้วยบิตจบข้อมูลอีก 1 บิต อัตราการรับส่งข้อมูลแบบอนุกรม สามารถเลือกได้จาก 2 แหล่งคือ จากการโอเวอร์โฟลวของไทเมอร์ 1 หรือ ไทเมอร์ 2 ในกรณีใช้ไทเมอร์ 1 อัตราข้อมูลจะเป็นไปตามความสัมพันธ์ดังนี้

อัตราการรับส่งข้อมูล = ((2^ค่าของบิต SMOD)/32) x ความถี่สัญญาณนาฬิกา/{12x[256-(TH1)]}) บิต/วินาท

ในกรณีที่ใช้ไทเมอร์ 2 เป็นตัวกำเนิดอัตราข้อมูล ต้องกำหนดบิต RCLK, TCLK และ TR2 ในรีจิสเตอร์ T2CON ให้เป็น “1” เพื่อตั้งให้ไทเมอร์ 2 ทำงานในโหมดกำเนิดสัญญาณนาฬิกาสำหรับการสื่อสารอนุกรม (รายละเอียดดูในหัวข้อการใช้ไทเมอร์ของ MCS-51) โดยการรับส่งข้อมูลของพอร์ตอนุกรมที่ใช้จะมีอัตราข้อมูลดังนี้

อัตราการรับส่งข้อมูล = ความถี่สัญญาณนาฬิกา/ (32 x (65536-(RCAP2H, RCAP2L))) บิต/วินาท

การใช้งานพอร์ตอนุกรมในโหมด 3 เป็นโหมดที่รับส่งข้อมูลทีละ 11 บิต อัตราข้อมูลนั้นเท่ากับการทำงานในโหมด 1

การส่งข้อมูลออกทางพอร์ตอนุกรมสามารถทำได้โดยเขียนข้อมูลที่ต้องการส่งนั้นลงไปยังรีจิสเตอร์ SBUF โดยต้องเคลียร์บิต TI ให้เป็น “0” ก่อนทุกครั้ง เมื่อเขียนข้อมูลลงรีจิสเตอร์ SBUF เรียบร้อยแล้ว บิต TI จะถูกเซตให้เป็น “1” อัตโนมัติ เพื่อแจ้งให้ทราบว่าการส่งข้อมูลออกทางพอร์ตอนุกรมนั้นเรียบร้อยแล้ว ในกรณีที่พัฒนาด้วย Keil ซึ่งเป็นภาษา C สามารถใช้ฟังก์ชัน printf เพื่อส่งข้อความออกทางพอร์ตอนุกรมได้โดยตรง 
การรับข้อมูลจากพอร์ตอนุกรมสามารถทำได้โดยตรวจสอบว่าบิต RI นั้นเกิดการเซตขึ้นหรือไม่ ถ้ามีการเซตขึ้นเป็น “1” แสดงว่ามีข้อมูลเข้ามาทางพอร์ตอนุกรม เราสามารถอ่านข้อมูลนั้นจากรีจิสเตอร์ SBUF ได้ทันที

ตัวอย่างการใช้งานพอร์ตอนุกรมนี้ เป็นการใช้งานในโหมด 1 และใช้ไทเมอร์ 2 ในการสร้างสัญญาณนาฬิกาเพื่อให้รับส่งข้อมูลด้วยอัตราข้อมูล 9600 บิต/วินาที การทำงานของตัวอย่างนี้ ไมโครคอนโทรลเลอร์จะรอรับข้อมูลจากพอร์ตอนุกรม และเมื่อมีข้อมูลเข้ามาทางพอร์ตอนุกรมแล้ว ไมโครคอนโทรลเลอร์จะส่งข้อมูลนั้นกลับไป 2 แบบด้วยกัน แบบแรกเป็นการส่งโดยการเขียนค่าลงในรีจิสเตอร์ SBUF และแบบที่ 2 เป็นการส่งข้อมูลโดยการใช้ฟังก์ชัน printf        

#include <t89c51rd2.h>
#include <stdio.h>
unsigned char temp;
Init_Serial() {
SCON=0x52; // Serial Port working in mode 1 
PCON=0; // Serial port working in normal mode
T2MOD=0x00; //
RCAP2H=0xFF; // Set Baud rate to 9600 bps
RCAP2L=0xC4; // Set Baud rate to 9600 bps
T2CON=0x34; // Enable Timer2 TR2 = '1' and use overflow of Timer 2 to generate clock signal for both Tx & Rx of serial
}
void main()
{
Init_Serial();
printf ("\nTEST Serial port\n");
while(1) {
if (RI==1) { // Incoming Data from Serial Port
temp=SBUF; // Read Incoming Data
RI=0; // Clear Register RI
TI=0; // Clear Register TI for transmitting data to Serial Port
SBUF=temp; // Transmit Data to Serial Port by writing data to register SBUF
while (TI==0); // Wait for Transmission Complete
printf("\nGot %c from serial port!\n",temp); // Transmit Data by using prinf Function
}
}
}

จากโปรแกรมจะเห็นได้ว่าก่อนการใช้งานพอร์ตอนุกรม ต้องกำหนดค่ารีจิสเตอร์ SCON เพื่อให้พอร์ตอนุกรมทำงานในโหมด 1, กำหนดค่า RCAP2H, RCAP2L เพื่อให้รับส่งข้อมูลด้วยอัตราข้อมูล 9,600 บิต/วินาที (การทดลองนี้ได้ใช้คริสตอลความถี่ 18.432 Mhz) และกำหนดค่ารีจิสเตอร์ T2CONให้ไทเมอร์ 2 ทำงานในโหมดสร้างสัญญาณนาฬิกาสำหรับพอร์ตอนุกรม จากนั้นจึงค่อยให้ไมโครคอนโทรลเลอร์คอยตรวจสอบบิต RI โดยถ้ามีข้อมูลเข้ามาทางพอร์ตอนุกรม บิต RI จะเป็น “1” ไมโครคอนโทรลเลอร์จะอ่านข้อมูลที่รับเข้าทางพอร์ตอนุกรมจากรีจิสเตอร์ SBUF และเคลียร์บิต RI ให้กลับเป็น “0” จากนั้นจึงส่งข้อมูลที่ได้รับมากลับไป 2 แบบ แบบแรกเขียนค่าลงรีจิสเตอร์ SBUF ซึ่งต้องเคลียร์บิต TI ให้เป็น “0” ก่อน และเมื่อส่งข้อมูลนั้นกลับไปแล้ว ต้องรอจนกว่ารีจิสเตอร์ TI จะเป็น “1” ซึ่งแสดงว่าการส่งเรียบร้อยแล้ว จากนั้นจึงส่งข้อมูลแบบที่ 2 โดยใช้ฟังก์ชัน printf ซึ่งสามารถส่งข้อมูลออกได้เป็นประโยคยาว ๆ ได้

ในการทดลองใช้พอร์ตอนุกรมของ MCS-51 นั้น เราสามารถใช้โปรแกรม HyperTerminal หรือโปรแกรมอื่นที่เป็นโปรแกรมติดต่อพอร์ตอนุกรมของคอมพิวเตอร์ร่วมทดสอบก็ได้ โดยในทดสอบต้องเชื่อมต่อ MCS-51 เข้ากับคอมพิวเตอร์ผ่านทางพอร์ตอนุกรม ในกรณีที่ใช้โปรแกรม HyperTerminal ต้องสร้าง Connection ใหม่ ตามรูปที่ 3   

hyperterminal

รูปที่ 3 การสร้าง Connection ใหม่ด้วยโปรแกรม HyperTerminal

ในการสร้าง Connection ใหม่ต้องเลือก Com Port ที่เชื่อมต่อกับ MCS-51 ให้ถูกต้อง สำหรับในเครื่องที่ใช้ทดสอบนี้เป็น COM5 ดังแสดงในรูปที่ 4

comport hyperterminal

รูปที่ 4 การเลือกคอมพอร์ตของ HyperTerminal

จากนั้นเลือกอัตราข้อมูลให้เป็นไปตามที่เราเขียนโปรแกรมให้กับ MCS-51 ไว้ ซึ่งในกรณีนี้เป็น 9600 bps ดังแสดงในรูปที่ 5

hyperterminal

รูปที่ 5 การเลือกอัตราข้อมูลของการสื่อสารผ่านพอร์ตอนุกรมโดยโปรแกรม HyperTerminal

จากนั้นเริ่มทดสอบได้ดังในรูปที่ 6 จะเห็นได้ว่าเมื่อรีเซตการทำงาน ไมโครคอนโทรลเลอร์จะส่งข้อมูล “Test Serial port” ออกมาทางพอร์ตอนุกรม ซึ่งจะแสดงออกมาทาง HyperTerminal จากนั้นถ้าผู้ใช้งานพิมพ์ตัวอักษรลงไปที่โปรแกรม HyperTerminal จะเป็นการส่งข้อมูลจากคอมพิวเตอร์ออกทางพอร์ตอนุกรมไปยัง MCS-51 เมื่อ MCS-51 ได้รับข้อมูล ก็จะส่งข้อมูลนั้นกลับมาแสดงที่ HyperTerminal 2 แบบด้วยกัน แบบแรกคือส่งกลับโดยการเขียนข้อมูลนั้นลงที่รีจิสเตอร์ SBUF ซึ่งจะทำให้ตัวอักษรที่พิมพ์ผ่านโปรแกรม HyperTerminal แสดงขึ้นที่หน้าจอ อีกแบบคือการส่งโดยใช้ฟังก์ชัน printf ซึ่งจะทำให้ไมโครคอนโทรลเลอร์ส่งข้อความแสดงข้อมูลที่ได้รับจากโปรแกรม HyperTerminal   

hyperterminal rs-232

รูปที่ 6 การทดสอบการสื่อสารผ่านพอร์ตอนุกรมด้วยโปรแกรม HyperTerminal

ในกรณีที่ทดลองแล้วโปรแกรม HyperTerminal ไม่แสดงตัวอักษรออกมา แสดงว่าการเชื่อมต่อมีปัญหา ให้ทดสอบโดยการ Loop ปลายสาย Tx, Rx ฝั่ง MCS-51 เข้าหากัน (ในกรณีที่เป็น Connector แบบ DB9 Loop pin 2 และ 3 เข้าหากัน) จากนั้นลองพิมพ์ตัวอักษรผ่านโปรแกรม HyperTerminal ถ้ามีตัวอักษรขึ้น แสดงว่าการเชื่อมต่อระหว่างคอมพิวเตอร์มายังปลายสายนั้นปกติดี แต่มีความผิดพลาดขึ้นที่ฝั่ง MCS-51 ซึ่งต้องตรวจสอบวงจร และโปรแกรมต่อไป แต่ในกรณีที่ Loop ปลายสายแล้ว พิมพ์ข้อความผ่านโปรแกรม HyperTerminal ไม่ขึ้นแสดงว่ามีความผิดพลาดขึ้นทางฝั่งคอมพิวเตอร์ หรือสายสัญญาณ ในกรณีให้ตรวจสอบสายสัญญาณ รวมไปถึงการเลือกใช้ COM Port ของคอมพิวเตอร์
ในกรณีที่ทดลองแล้วโปรแกรม HyperTerminal แสดงตัวอักษรออกมาเป็นภาษาต่างดาว แสดงว่าปัญหาเกิดจากอัตราการรับส่งข้อมูลทั้งทั้ง 2 ฝั่งไม่ตรงกัน ให้ตรวจสอบการคำนวณอัตราข้อมูล และการตั้งอัตราข้อมูลของโปรแกรม HyperTerminal

ไฟล์โค๊ดภาษา C สามารถดาวน์โหลดได้ที่ http://www.mind-tek.net/c/Serial.c หรือดาวน์โหลดไฟล์ hex ไปทดสอบกันได้ที่ http://www.mind-tek.net/hex/Serial.hex นะครับ ท้ายสุดนี้ หวังว่าผู้อ่านจะได้รับความรู้ ไม่มากก็น้อย และสามารถนำไปประยุกต์ใช้กับงานต่าง ๆ ได้นะครับ
 
 

73/206 Ratchathanee Paholyothin Rd. Klonghnung Klonghloung Pathumthanee 12120 Tel: 66-02516-5999 Fax:66-02516-8484 Email:webmaster@mind-tek.net