- ข้อกำหนด:
- การเขียนโปรแกรมไมโครคอนโทรลเลอร์ PIC สำหรับการสื่อสาร UART:
- จำลองโปรแกรมของเรา:
- การตั้งค่าฮาร์ดแวร์และการทดสอบผลลัพธ์:
ในการกวดวิชานี้เราเรียนรู้ที่จะเปิดใช้งานการสื่อสาร UART กับไมโครคอนโทรลเลอร์ PIC และวิธีการถ่ายโอนข้อมูลเข้าและออกจากคอมพิวเตอร์ของคุณ จนถึงตอนนี้เราได้ครอบคลุมโมดูลพื้นฐานทั้งหมดเช่น ADC, Timers, PWM และยังได้เรียนรู้วิธีการเชื่อมต่อ LCD และจอแสดงผล 7-Segment ตอนนี้เราจะเตรียมเครื่องมือสื่อสารใหม่ที่เรียกว่า UART ซึ่งใช้กันอย่างแพร่หลายในโครงการไมโครคอนโทรลเลอร์ส่วนใหญ่ ดูบทช่วยสอนไมโครคอนโทรลเลอร์ PIC ที่สมบูรณ์ของเราโดยใช้ MPLAB และ XC8
ที่นี่เราได้ใช้PIC16F877A MCUก็มีโมดูลที่เรียกว่า“ยูนิเวอร์แซแอดเดรส Synchronous Asynchronous Receiver และส่งสัญญาณ” ที่รู้จักกันในไม่ช้าเป็น USART USART เป็นระบบการสื่อสารสองสายที่ข้อมูลไหลแบบเป็นชุด USART ยังเป็นการสื่อสารแบบฟูลดูเพล็กซ์ซึ่งหมายความว่าคุณสามารถส่งและรับข้อมูลได้ในเวลาเดียวกันซึ่งสามารถใช้ในการสื่อสารกับอุปกรณ์ต่อพ่วงเช่นขั้ว CRT และคอมพิวเตอร์ส่วนบุคคล
USARTสามารถกำหนดค่าในโหมดต่อไปนี้:
- อะซิงโครนัส (ฟูลดูเพล็กซ์)
- ซิงโครนัส - Master (half-duplex)
- ซิงโครนัส - Slave (half-duplex)
นอกจากนี้ยังมีโหมดที่แตกต่างกันสองโหมด ได้แก่ โหมด 8 บิตและ 9 บิตในบทช่วยสอนนี้เราจะกำหนดค่าโมดูล USART ให้ทำงานในโหมดอะซิงโครนัสด้วยระบบการสื่อสาร 8 บิตเนื่องจากเป็นประเภทการสื่อสารที่ใช้มากที่สุด เนื่องจากเป็นแบบอะซิงโครนัสจึงไม่จำเป็นต้องส่งสัญญาณนาฬิกาพร้อมกับสัญญาณข้อมูล UART ใช้สายข้อมูลสองเส้นในการส่ง (Tx) และรับ (Rx) ข้อมูล พื้นดินของอุปกรณ์ทั้งสองควรทำเป็นแบบธรรมดา การสื่อสารประเภทนี้ไม่ได้ใช้นาฬิการ่วมกันดังนั้นพื้นๆจึงมีความสำคัญมากสำหรับระบบในการทำงาน
ในตอนท้ายของบทช่วยสอนนี้คุณจะสามารถสร้างการสื่อสาร (UART) ระหว่างคอมพิวเตอร์ของคุณกับไมโครคอนโทรลเลอร์ PIC ของคุณและสลับไฟ LED บนบอร์ด PIC จากแล็ปท็อปของคุณ สถานะของ LED จะถูกส่งไปยังแล็ปท็อปของคุณจาก PIC MCU เราจะทดสอบผลลัพธ์โดยใช้ Hyper Terminal ในคอมพิวเตอร์ วิดีโอโดยละเอียดจะได้รับในตอนท้ายของบทช่วยสอนนี้
ข้อกำหนด:
ฮาร์ดแวร์:
- PIC16F877A Perf Board
- RS232 เป็นโมดูลแปลง USB
- คอมพิวเตอร์
- โปรแกรมเมอร์ PICkit 3
ซอฟต์แวร์:
- MPLABX
- ไฮเปอร์เทอร์มินัล
RS232 เพื่อแปลง USBเป็นสิ่งจำเป็นในการแปลงข้อมูลแบบอนุกรมลงในรูปแบบที่อ่านคอมพิวเตอร์ มีหลายวิธีในการออกแบบวงจรของคุณเองแทนที่จะซื้อโมดูลของคุณเอง แต่ไม่น่าเชื่อถือเนื่องจากมีสัญญาณรบกวน รายการที่เราใช้อยู่แสดงด้านล่าง
หมายเหตุ: ตัวแปลง RS232 เป็น USB แต่ละตัวจะต้องติดตั้งไดรเวอร์พิเศษ ส่วนใหญ่ควรได้รับการติดตั้งโดยอัตโนมัติทันทีที่คุณเสียบอุปกรณ์ แต่ถ้าไม่คลาย !!! ใช้ส่วนความคิดเห็นแล้วฉันจะช่วยคุณเอง
การเขียนโปรแกรมไมโครคอนโทรลเลอร์ PIC สำหรับการสื่อสาร UART:
เช่นเดียวกับโมดูลทั้งหมด (ADC, Timer, PWM) เราควรเริ่มต้นโมดูล USART ของเราของPIC16F877A MCUของเราและสั่งให้ทำงานในโหมดการสื่อสาร UART 8 บิต มากำหนดบิตการกำหนดค่าและเริ่มต้นด้วยฟังก์ชันการเริ่มต้น UART
การเริ่มต้นโมดูล UART ของไมโครคอนโทรลเลอร์ PIC:
พิน Tx และ Rx มีอยู่จริงที่พิน RC6 และ RC7 ตามที่ให้ของแผ่นข้อมูลประกาศเท็กซัสเป็นผลผลิตและ RX เป็น input
// **** การตั้งค่าพิน I / O สำหรับ UART **** // TRISC6 = 0; // TX Pin ตั้งเป็นเอาต์พุต TRISC7 = 1; // RX Pin ตั้งเป็นอินพุต // ________ ชุดพิน I / O __________ //
ตอนนี้อัตราการส่งข้อมูลจะต้องมีการตั้งค่าอัตราการส่งข้อมูลคืออัตราที่ข้อมูลถูกถ่ายโอนในช่องทางการสื่อสาร นี่อาจเป็นค่าเริ่มต้นหลายค่า แต่ในโปรแกรมนี้เราใช้ 9600 เนื่องจากเป็นอัตรารับส่งข้อมูลที่ใช้มากที่สุด
/ ** เริ่มต้นการลงทะเบียน SPBRG สำหรับอัตราการรับส่งข้อมูลที่ต้องการและตั้งค่า BRGH สำหรับความเร็ว baud_rate ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // สำหรับ baud_rate สูง // _________ สิ้นสุดการตั้งค่า baud_rate _________ //
ต้องตั้งค่าอัตรารับส่งข้อมูลโดยใช้รีจิสเตอร์SPBRGค่าขึ้นอยู่กับค่าของความถี่คริสตัลภายนอกสูตรในการคำนวณอัตรารับส่งข้อมูลแสดงไว้ด้านล่าง:
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1;
ต้องสร้างบิต BRGH ให้สูงเพื่อเปิดใช้งานอัตราบิตความเร็วสูง ตามเอกสารข้อมูล (หน้า 13) การเปิดใช้งานเป็นประโยชน์เสมอเนื่องจากสามารถขจัดข้อผิดพลาดระหว่างการสื่อสารได้
ดังที่ได้กล่าวไว้ก่อนหน้านี้เราจะทำงานในโหมดอะซิงโครนัสดังนั้นบิต SYNC ควรเป็นศูนย์และบิต SPEM จะต้องสูงเพื่อเปิดใช้งานพินอนุกรม (TRISC6 และ TRICSC5)
// **** เปิดใช้งานพอร์ตอนุกรมอะซิงโครนัส ******* // SYNC = 0; // SPEN แบบอะซิงโครนัส = 1; // เปิดใช้งานพินพอร์ตอนุกรม // _____ เปิดใช้งานพอร์ตอนุกรมอะซิงโครนัส _______ //
ในการกวดวิชานี้เราจะมีทั้งการส่งและรับข้อมูลระหว่างคอมพิวเตอร์ MCU และด้วยเหตุนี้เราต้องเปิดใช้ทั้ง TXEN และ CREN บิต
// ** เตรียมความพร้อมสำหรับการส่งและการรับ ** // TXEN = 1; // เปิดใช้งานการส่ง CREN = 1; // เปิดใช้งานการรับ // __ โมดูล UART พร้อมสำหรับการส่งและรับ __ //
บิต TX9 และ RX9 ต้องทำศูนย์เพื่อให้เราดำเนินการใน 8 บิตโหมด หากต้องมีความน่าเชื่อถือสูงจำเป็นต้องสร้างขึ้นก็สามารถเลือกโหมด 9 บิตได้
// ** เลือกโหมด 8 บิต ** // TX9 = 0; // การรับ 8 บิตเลือก RX9 = 0; // เลือกโหมดการรับ 8 บิต // __ เลือกโหมด 8 บิต __ //
ด้วยเหตุนี้เราจึงทำการตั้งค่าเริ่มต้นให้เสร็จสมบูรณ์ และพร้อมสำหรับการดำเนินการ
การส่งข้อมูลโดยใช้ UART:
สามารถใช้ฟังก์ชันด้านล่างเพื่อส่งข้อมูลผ่านโมดูล UART:
// ** ฟังก์ชันส่งวันที่หนึ่งไบต์ไปยัง UART ** // โมฆะ UART_send_char (ถ่าน bt) {while (! TXIF); // กดโปรแกรมค้างไว้จนกว่า TX บัฟเฟอร์ฟรี TXREG = bt; // โหลดบัฟเฟอร์เครื่องส่งด้วยค่าที่ได้รับ} // _____________ สิ้นสุดฟังก์ชัน ________________ //
เมื่อโมดูลเริ่มต้นค่าใดก็ตามที่โหลดลงใน register TXREGจะถูกส่งผ่าน UART แต่การส่งข้อมูลอาจทับซ้อนกัน ดังนั้นเราควรตรวจสอบค่าสถานะ Transmission Interrupt TXIF เสมอ เฉพาะในกรณีที่บิตนี้ต่ำเราสามารถดำเนินการกับบิตถัดไปเพื่อส่งอย่างอื่นได้เราควรรอให้แฟล็กนี้ต่ำลง
อย่างไรก็ตามฟังก์ชันข้างต้นสามารถใช้เพื่อส่งข้อมูลเพียงหนึ่งไบต์เท่านั้นในการส่งสตริงที่สมบูรณ์ควรใช้ฟังก์ชันด้านล่าง
// ** ฟังก์ชันในการแปลงสตริงเป็นไบต์ ** // โมฆะ UART_send_string (ถ่าน * st_pt) {while (* st_pt) // หากมีอักขระ UART_send_char (* st_pt ++); // ประมวลผลเป็นข้อมูลไบต์} // ___________ สิ้นสุดฟังก์ชัน ______________ //
ฟังก์ชั่นนี้อาจเข้าใจยากเล็กน้อยเนื่องจากมีพอยน์เตอร์ แต่เชื่อเถอะพอยน์เตอร์นั้นยอดเยี่ยมและทำให้การเขียนโปรแกรมง่ายขึ้นและนี่ก็เป็นตัวอย่างที่ดีเช่นเดียวกัน
อย่างที่คุณสังเกตเห็นเราได้เรียกอีกครั้งว่า UART_send_char () แต่ตอนนี้อยู่ในลูป while เราได้แยกสตริงออกเป็นแต่ละอักขระทุกครั้งที่เรียกใช้ฟังก์ชันนี้หนึ่งอักขระจะถูกส่งไปยัง TXREG และจะถูกส่ง
การรับข้อมูลโดยใช้ UART:
สามารถใช้ฟังก์ชันต่อไปนี้เพื่อรับข้อมูลจากโมดูล UART:
// ** ฟังก์ชันรับวันที่หนึ่งไบต์จาก UART ** // ถ่าน UART_get_char () {if (OERR) // ตรวจสอบข้อผิดพลาด {CREN = 0; // หากเกิดข้อผิดพลาด -> รีเซ็ต CREN = 1; // หาก error -> Reset} while (! RCIF); // กดโปรแกรมค้างไว้จนกว่า RX buffer จะเป็น RCREG ที่ส่งคืนฟรี // รับค่าและส่งไปยังฟังก์ชันหลัก} // _____________ สิ้นสุดฟังก์ชัน ________________ //
เมื่อโมดูล UART ได้รับข้อมูลจะดึงข้อมูลและจัดเก็บไว้ในทะเบียนRCREG เราสามารถโอนค่าไปยังตัวแปรใดก็ได้และใช้มัน แต่อาจมีข้อผิดพลาดที่ทับซ้อนกันหรือผู้ใช้อาจส่งข้อมูลอย่างต่อเนื่องและเรายังไม่ได้โอนข้อมูลเหล่านั้นไปยังตัวแปร
ในกรณีนั้นRCIFบิตแฟล็กรับจะเข้ามาช่วยเหลือ บิตนี้จะลดลงทุกครั้งที่ได้รับข้อมูลและยังไม่ได้รับการประมวลผล ดังนั้นเราจึงใช้มันใน while loop สร้างการหน่วงเวลาเพื่อเก็บโปรแกรมไว้จนกว่าเราจะจัดการกับค่านั้น
การสลับ LED โดยใช้โมดูล UART ของไมโครคอนโทรลเลอร์ PIC:
ตอนนี้ให้เรามาถึงส่วนสุดท้ายของโครงการที่ เป็นโมฆะหลัก (void) ฟังก์ชั่นที่เราจะได้รับการสลับ LED ผ่านเครื่องคอมพิวเตอร์โดยใช้การสื่อสาร UART ระหว่าง PIC และคอมพิวเตอร์
เมื่อเราส่งอักขระ“ 1” (จากคอมพิวเตอร์) ไฟ LED จะเปิดและข้อความสถานะ “ LED สีแดง -> เปิด” จะถูกส่งกลับ (จาก PIC MCU) ไปยังคอมพิวเตอร์
ในทำนองเดียวกันเราส่งอักขระ“ 0” (จากคอมพิวเตอร์) LED จะปิดและข้อความสถานะ “ LED สีแดง -> ปิด” จะถูกส่งกลับ (จาก PIC MCU) ไปยังคอมพิวเตอร์
ในขณะที่ (1) // ลูปไม่มีที่สิ้นสุด {get_value = UART_get_char (); if (get_value == '1') // ถ้าผู้ใช้ส่ง "1" {RB3 = 1; // เปิด LED UART_send_string ("RED LED -> ON"); // ส่งการแจ้งเตือนไปยังคอมพิวเตอร์ UART_send_char (10); // ค่า ASCII 10 ใช้สำหรับการส่งคืนแคร่ (เพื่อพิมพ์ในบรรทัดใหม่)} if (get_value == '0') // หากผู้ใช้ส่ง "0" {RB3 = 0; // ปิด LED UART_send_string ("RED -> OFF"); // ส่งการแจ้งเตือนไปยังคอมพิวเตอร์ UART_send_char (10); // ค่า ASCII 10 ใช้สำหรับการส่งคืนแคร่ (เพื่อพิมพ์ในบรรทัดใหม่)}}
จำลองโปรแกรมของเรา:
ตามปกติเรามาจำลองโปรแกรมของเราโดยใช้โปรตีอุสและดูว่ามันทำงานได้ตามที่คาดไว้หรือไม่
ภาพด้านบนแสดงเทอร์มินัลเสมือนซึ่งแสดงข้อความต้อนรับและสถานะของ LED ไฟ LED สีแดงสามารถสังเกตได้ว่าเชื่อมต่อกับพิน RB3 รายละเอียดการทำงานของการจำลองสามารถพบได้ในวิดีโอตอนท้าย
การตั้งค่าฮาร์ดแวร์และการทดสอบผลลัพธ์:
การเชื่อมต่อสำหรับวงจรนี้ง่ายมากเราใช้บอร์ด PIC Perf ของเราและเพียงแค่เชื่อมต่อสายไฟสามเส้นเข้ากับตัวแปลง RS232 เป็น USB และเชื่อมต่อโมดูลกับคอมพิวเตอร์ของเราโดยใช้สายเคเบิลข้อมูล USB ดังที่แสดงด้านล่าง
ต่อไปเราจะติดตั้งแอปพลิเคชัน Hyper Terminal (ดาวน์โหลดจากที่นี่) และเปิดขึ้น มันควรจะแสดงอะไรแบบนี้
ตอนนี้เปิด Device Manager บนคอมพิวเตอร์ของคุณและตรวจสอบว่าพอร์ต Com เชื่อมต่อกับโมดูลใดของฉันเชื่อมต่อกับพอร์ต COM 17 ดังที่แสดงด้านล่าง
หมายเหตุ: ชื่อพอร์ต COM สำหรับโมดูลของคุณอาจเปลี่ยนแปลงไปตามผู้จำหน่ายของคุณไม่ใช่ปัญหา
กลับไปที่แอปพลิเคชัน Hyper Terminal แล้วไปที่การ ตั้งค่า -> การกำหนดค่าพอร์ต หรือกด Alt + C เพื่อรับกล่องป๊อปอัปต่อไปนี้และเลือกพอร์ตที่ต้องการ (COM17 ในกรณีของฉัน) ในหน้าต่างป๊อปอัปและคลิกที่เชื่อมต่อ.
เมื่อสร้างการเชื่อมต่อแล้วให้เปิดบอร์ด PIC perf ของคุณและคุณจะเห็นสิ่งนี้ด้านล่าง
ให้เคอร์เซอร์ของคุณอยู่ในหน้าต่างคำสั่งและป้อน 1 จากนั้นกด Enter ไฟ LED จะเปิดขึ้นและสถานะจะแสดงดังภาพด้านล่าง
ในทำนองเดียวกันให้เคอร์เซอร์ของคุณอยู่ในหน้าต่างคำสั่งและป้อน 0 จากนั้นกด Enter ไฟ LED จะดับลงและสถานะจะแสดงดังภาพด้านล่าง
ด้านล่างนี้คือโค้ดที่สมบูรณ์และวิดีโอโดยละเอียดซึ่งจะแสดงให้เห็นว่า LED ตอบสนองแบบเรียลไทม์สำหรับ“ 1” และ“ 0” อย่างไร
นั่นคือพวกมันเราได้เชื่อม PIC UART กับเครื่องคอมพิวเตอร์ของเราและย้ายข้อมูลไปยังสลับไฟ LED ใช้ terminal หวังว่าคุณจะเข้าใจถ้าไม่ใช้ส่วนความคิดเห็นเพื่อถามคำถามของคุณ ในบทช่วยสอนครั้งต่อไปเราจะใช้ UART อีกครั้ง แต่ทำให้น่าสนใจยิ่งขึ้นโดยใช้โมดูลบลูทู ธ และถ่ายทอดข้อมูลทางอากาศ
ตรวจสอบการสื่อสาร UART ระหว่างไมโครคอนโทรลเลอร์ ATmega8 สองตัวและการสื่อสาร UART ระหว่าง ATmega8 และ Arduino Uno