หน้าเว็บ

วันอาทิตย์ที่ 28 กรกฎาคม พ.ศ. 2556

การติดต่อ Serial Port (RS232)กับ PIC

Serial Port คือ พอร์ตอนุกรม ในการสื่อสารข้อมูลนั้นพอร์ตอนุกรมจะมีความเร็วในการสื่อสารที่ช้ากว่าแบบ ขนาน เพราะการเคลื่อนย้ายข้อมูลแบบอนุกรมนั้นเป็นการส่งข้อมูลครั้งละ 1 บิต แต่พอร์ตขนานนั้นสามารถส่งข้อมูลทีละหลายๆ บิทพร้อมๆกันได้ แต่ข้อดีของการสื่อสารข้อมูลแบบอนุกรมคือ สามารถส่งข้อมูลได้ในระยะทางที่ไกลกว่าแบบขนาน และใช้สายสัญญาณที่น้อยกว่าการสื่อสารข้อมูลแบบขนาน




ประเภทของการสื่อสารแบบอนุกรมแบ่งตามลักษณะสัญญาณในการส่งแบ่งได้ 2 แบบ คือ

1.การสื่อสารแบบซิงโครนัส (Synchronous) เป็นการสื่อสารข้อมูลโดยใช้สัญญาณนาฬิกาในการควบคุมจังหวะของการรับส่งสัญญาณ
2.การสื่อสารแบบอะซิงโครนัส (Asynchronous) เป็นการสื่อสารที่ใช้สายข้อมูลเพียงตัวเดียว จะใช้รูปแบบของการส่งข้อมูล(Bit Pattern) เป็นตัวกำหนดว่าส่วนไหนเป็นส่วนเริ่มต้นข้อมูล ส่วนไหนเป็นตัวข้อมูล ส่วนไหนจะเป็นตัวตรวจสอบความถูกต้องของข้อมูล และส่วนไหนเป็นส่วนปิดท้ายของข้อมูล โดยต้องกำหนดให้สัญญาณนาฬิกาเท่ากันทั้งภาคส่งและภาครับ

คอนเน็กเตอร์ที่นิยมใช้จะเป็นชนิด D-Type แบบ 9 ขา และแบบ 25 ขา โดยจะติดตั้งอยู่หลังเครื่องคอมพิวเตอร์ ระดับแรงดันจะมีค่าระหว่าง -3 โวลต์ ถึง-15โวลต์คะ


การเชื่อมต่อ Seria Port ระหว่างไมโครคอนโทรเลอร์กับคอมพิวเตอร์

ในการพัฒนาโปรแกรมไมโครคอนโทรเลอร์ โดยเทคนิคส่วนตัวของเจ้าของบล๊อค เราจำเป็นอย่างยิ่งที่ต้องเห็นการทำงานแต่ละสเตปหรือเป็นการดีบัคโปรแกรมคะ ว่าตอนนี้ไมโครคอนโลรเลอร์ทำงานอยู่ในส่วนไหนตำแหน่งไหนของโค้ด ซึ่งวิธีง่ายสุดคือการสั่ง printf ออกมาทางหน้าจอคอมพิวเตอร์ เช่น

if(x == 1){
       printf("Positon 1  >>  x=1\n\r");
}else if(x==2){
       printf("Positon 2  >>  x=2\n\r");
}else{
       printf("Positon 3 >> x=other\n\r");
}

การเชื่อมต่อ serial port กับไมโครคอนโทรเลอร์จำเป็นที่จะต้องมีไอซีที่ใช้ในการแปรงระดังสัญญาณระหว่างTTL Level (5 Volt) กับ RS232 Level (+/- 9 Volt) โดยเราจะใช้ไอซี MAX232 ในการเชื่อมต่อ


ในการทดลองนี้ เราจะใช้ PIC เบอร์ PIC18F2550 ซึ่งเป็นไมโครคอนโทรเลอร์ 28 pins คะ ซึ่งตัวเล็กกระทัดลัดแต่ประสิทธิภาพไม่เล็กเหมือนตัวนะคะ โดยคุณสมบัติของไอซีเบอร์ดังกล่างคือ



การต่อวงจรให้ต่อตามรูปข้างล่างคะ โดยสัญญาณ Tx และ Rx ของ UART ในตัวไมโครคอนโทรเลอร์ จะต่ออยู่ที่ขา C6 และ C7 เราจะให้ Crytal ความถี่ 20MHz เป็นสัญญาณนาฬิกาให้กับไมโครคอนโทรเลอร์คะ ส่วน C1 (0.1uF) ที่ต่อระหว่าง VDD กับ VSS ซึ่งต้องต่อไกล้ๆนะค่ะ  ตัวนี้ค่อนข้างสำคัญคะ เพราะเจ้าของบล๊อคเองเคยเจอว่า ถ้าเราลืมต่อมัน บางทีมันเวิร์คบ้างไม่เวิร์คบ้าง อาจเป็นเพราะอาจจมี noise จากข้างนอก หรือจาก clock ของตัวมันเองมากวนคะ ซึ่งจะทำให้เราหลงทางได้ ^^ 


การเขียนโปรแกรมโดยใช้ CCS C ทำงานบน MPLAB IDE

ขึ้นตอนต่อไปเป็นขึ้นตอนที่สำคัญคะ คือการเขียนโปรแกรม ผู้เขียนจะใช้ CCS C คอมไพเลอร์ร่วมกับ MPLAB IDE ซึ่งภายในโค้ดผู้เขียนจะอธิบายโค้ดไปทีละบรรทัดเลยค่าาา ^^





 Source code  (ไฟล์.hex ดาวน์โหลดได้จากลิ้งนี่คะ)

#include <18f2550.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

// *** Device Specification ***
#fuses HS            // ใช้ Oscillator mode HS
#fuses NOWDT // ไม่ใช้ Watch dog 
#fuses NOLVP         // ไม่ใช้การโปรแกรมแบบ Low Voltage
#fuses NOPROTECT     // ไม่ต้องทำการป้องกันการอ่านโค้ด

#use delay (clock=20M, crystal)
// ใช้ built-in function: delay_ms() & delay_us() โดยใช้ crytal ความถี่ 20MHz 

#use rs232(baud=9600,xmit=pin_c6,rcv=pin_c7,stream=HOSTPC,errors)
// กำหมดการเชื่อมต่อกับ serial port โดยกำหนดคอนฟิคต่างๆ และใช้ stream ชื่อว่า HOSTPC โดยจะใช้เป็นช่องทางการสั่ง fprintf


/*******************************************************************************
*  Function prototypes
********************************************************************************/
void headle(void);

/***********************************************************************
 * FUNCTION:    headle
 * DESCRIPTION: Show headle title though rs232
 * PARAMETERS:  nothing
 * RETURNED:    nothing
 ***********************************************************************/
void headle(void){
                fprintf(HOSTPC,"\n\r**********************************************************************************\n\r");
                fprintf(HOSTPC,"Project        : RS232 print out \n\r");
                fprintf(HOSTPC,"Purpose        : Test serial port \n\r");
                fprintf(HOSTPC,"Auther         : JUMP start innovation\n\r");
                fprintf(HOSTPC,"Email          : jumpstartinnovation@gmail.com\n\r");
                fprintf(HOSTPC,"Complier       : CCS.PCWH.v4.134\n\r");
                fprintf(HOSTPC,"Hardware       : PIC18F2550\n\r");
                fprintf(HOSTPC,"**********************************************************************************\n\r");
    }

/***********************************************************************
 * FUNCTION:    main
 * DESCRIPTION: main function
 * PARAMETERS:  nothing
 * RETURNED:    nothing
 ***********************************************************************/
void main(void){

int i; // ประกาศตัวแปล i เป็นชนิด integer
headle(); //แรกฟังก์ชั่น headle เพื่อแสดงข้อความออกทาง serial port
fprintf(HOSTPC,"Hello World\n\r");  //แสดงข้อความ Hello World ออกทางหน้าจอ

// ทำการสั่งพิมพ์ค่า i ออกทางหน้าจอ โดยค่า i จะแสดงค่าตั้งแต่ 0 จนถึง 9 แล้ววนกลับมาใหม่
for(i = 0; i < 10; i++){
fprintf(HOSTPC,"i = %d\n\r",i);
}

}

ทดลอง Simulation โดยใช้ Proteus Software

ต่อวงจรตามรูปข้างล่างเลยคะ โดยกำหนด clock ให้กับไมโครคอนโทรเลอร์เป็นค่า 20MHz แต่ถ้าจำไม่ได้ว่าทำการ config มันยังไงให้กลับไปดูบนความก่อนหน้านี้คะ (link here) ส่วนไฟล์ไบนาลี่ไปเอามาได้จากลิ้งนี้คะ (link here)
เมื่อต่อเสร็จแล้วลองรันดูเลยค่าาาา .... ^^



บทความนี้น่าจะเป็นพื้นฐานที่สำคัญในการพัฒนาไมโครคอนโทรเลอร์นะคะ .... ขอบคุณที่เข้ามาติดตามค่าาาา ^^



ไม่มีความคิดเห็น:

แสดงความคิดเห็น