เมนู

วันพฤหัสบดีที่ 24 มีนาคม พ.ศ. 2559

MPLABX MCC UART

             
                 ห่างหายไปนานสำหรับบล็อกนี้ พึ่งจะได้มีเวลาว่างมาเขียนอีกครั้ง /(^_^)\
สำหรับบทความนี้ตั้งใจจะเขียนถึงโมดูล USART ในตัว PIC เพราะค่อนข้างมีประโยชน์มากสำหรับงานทางด้าน embedded อย่างที่ผมทำอยู่ อย่างแรกคือมันเป็น user interface ที่สามารถสื่อสารกับตัวเราได้ เพราะสำหรับ micro controller ซึ่งไม่มีหน้าจอแล้ว มันค่อนข้างลำบากที่จะรู้ว่าตอนนี้เจ้า micro controller กำลังทำอะไรอยู่ แต่เราสามารถที่จะใช้โมดูล USART นี้เป็น user interface สื่อสารกับเราผ่านทางหน้าจอคอมพิวเตอร์ โดยอาศัยเจ้า usb-to-serial module ที่มาพร้อมกับบอร์ด PIC Get Start 8 และโปรแกรม terminal บนคอมพิวเตอร์ของเราเป็นตัวกลางและตัวช่วย เราก็จะสามารถสื่อสารกับ PIC ด้วยภาษาอังกฤษแล้ว นอกจากนี้เจ้าโมดูล USART ยังเป็นการสื่อสารแบบ serial ที่นิยมกันมาก สามารถใช้กับโมดูลต่างๆได้มากมาย ไม่ว่าจะเป็น Bluetooth-to-serial ที่เอาไว้ติดต่อกับ android phone ผ่านทาง Bluetooth เพื่อสื่อสารหรือทำหุ่นยนต์ไว้เล่นก็ได้ หรือจะเป็น WiFi-to-serial ที่เอาไว้ติดต่อทาง WiFi ก็เห็นมีใช้กันอยู่มากมาย ดังนั้น USART จึงน่าที่จะเรียนรู้ไว้ใช้งานเป็นอันดับแรก

                โมดูล USART นั้นมาจากคำว่า Universal Synchronous Asynchronous Receiver Transmitter ซึ่งหมายถึงว่ามันสามารถสื่อสารได้ทั้งแบบ Synchronous และแบบ Asynchronous โดยแบบ Synchronous จะมีขาสำหรับส่ง(transmit), ขาสำหรับรับ(receive), และขาสัญญานนาฬิกา(clock) เพื่อ sync กับข้อมูล  ส่วนแบบ Asynchronous จะมีเฉพาะขาส่ง กับขารับ เท่านั้น ซึ่งที่ผมจะใช้ก็จะเป็นแบบ Asynchronous ที่มีเพียง 2 ขาเท่านั้นและโมดูลส่วนใหญ่ก็จะใช้แบบ Asynchronous ทั้งนั้นเท่าที่ผมเคยใช้

          ในการเขียนโปรแกรมเพื่อใช้งานโมดูล USART นั้นจำเป็นที่จะต้องเข้าไปคอนฟิค รีจิสเตอร์ หลายตัวของโมดูลและยังจะต้องกำหนดว่าจะให้โมดูลสื่อสารกับคอมพิวเตอร์ที่ความเร็วเท่าไหร่ หรือก็คือการกำหนด baud rate นั่นเองโดยทั่วไปจะใช้งานที่ baud rate = 9600 แล้วใช้ data bits = 8 ไม่มี Parity bit ใช้ stop bit = 1 และไม่มี hardware flow control คราวนี้ถ้าไปดูจาก datasheet จะเห็นว่าค่อนข้างวุ่นวายพอควรเลยทีเดียวสำหรับมือใหม่ หรือถึงแม้มือเก่า (แก่) อย่างผมยังพลาดออกบ่อยไปเพราะ mcu ตัวใหม่ๆจะทำงานที่สปีดสูงๆ โมดูล USART ก็สามารถสื่อสารที่ baud rate สูงๆก็เลยต้องมีรีจิสเตอร์สำหรับคอนฟิคเพิ่มขึ้น นอกจากนี้ขา Tx กับ Rx ก็อาจจะ multiplex กับโมดูลอื่นอีกก็ต้องคอยเช็ค คอยเลือกให้ถูกต้อง เฮ้อเหนื่อยกว่าจะทำให้มันสื่อสารได้  แต่หลังจากมี MCC มาช่วยในการคอนฟิคแล้ว ทุกอย่างมันง่ายขึ้นเยอะเลยทีเดียวครับ แค่เลือก clock สำหรับ mcu ให้ถูกต้องจากนั้นก็มาคอนฟิคโมดูล USART ว่าจะใช้ baud rate เท่าไหร่ มันก็จะคำนวณค่าที่จะใช้ให้เสร็จสรรพ แถมคำนวณค่าผิดพลาดให้เรารู้ด้วยว่าอยู่ในช่วงที่ยอมรับได้หรือไม่ นอกจากนี้ก็ยังมีออปชั่นให้เลือกว่าจะใช้เป็นแบบ polling หรือแบบ interrupt ทั้งฝั่งส่งและรับ ถ้าเลือกเป็นแบบ interrupt มันจะสร้างเป็นแบบ circular buffer ให้เราเสร็จสรรพทั้งฝั่งส่งและรับ สามารถกำหนดขนาดของ buffer ได้ด้วยนะครับ  เมื่อก่อนนี้จะทำ circular buffer สำหรับ USART นี่ผมต้องหาจากเน็ทให้วุ่นวายไปหมด แล้วส่วนใหญ่ก็ไม่ค่อยเวิคส์เพราะไม่เข้าใจที่หามาได้   อันสุดท้ายสำหรับใครที่อยากใช้ printf กับ USART ก็สามารถเลือกให้ MCC สร้างฟังก์ชัน putch() ที่ printf จะเรียกใช้งานได้ด้วย สะดวกมากมายเลยครับ

                ในวีดีโอได้แสดงการสร้างโปรเจ็คและใช้ MCC เช็ทค่าโมดูล Timer0 ให้เกิด interrupt ทุกๆ 500 ms เพื่อ toggle LED จากนั้นจึงคอนฟิคโมดูล USART  ให้สามรถรับค่าและส่งค่ากับ PC ได้ โดยกำหนด baud rate ที่ 9600 และใช้ polling นอกจากนี้ก็เลือกให้สามารถใช้งาน printf() ได้เพื่อความสะดวก จากนั้นจึงโปรแกรม hex file ลง PIC16F1938 ผ่านทาง ds30loaderGUI โดยตัว ds30loaderGUI นี้มีออปชั่นให้เลือกว่าหลังจาก upload ไฟล์เสร็จแล้วก็จะออโตเมติคเปิดแท็ป terminal ให้เราเลย ซึ่งถ้าเรากำหนด baud rate ที่ถูกต้องไว้ก่อนแล้วมันก็จะแสดงข้อความที่เราโปรแกรมไว้ขึ้นมาให้เห็นทันที ไม่ต้องไปหาโปรแกรม terminal ตัวอื่นมาเปิด มาคอนเน็ค ให้เสียเวลากันอีกแล้วครับ เมื่อโปรแกรมเริ่มทำงานเราก็จะเห็นข้อความที่ PIC ส่งมาให้เราพิมพ์ตัวอักษรอะไรก็ได้ลงไป จากนั้นตัว PIC มันจะ echo กลับมาบอกว่าเราพิมพ์ตัวอะไรลงไป ในขณะที่ LED ก็กระพริบช้าๆ เพื่อบอกให้เรารู้ว่าตัว PIC มันกำลังทำงานอยู่นั่นเอง ลองทดลองกันดูนะครับ  ถ้าต้องการแนะนำอะไรก็คอมเม้นมาได้นะครับ

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

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