[ บทความ : Guide to PIC16F877 ] ตอนที่ 1 ... เกริ่นนำ....(ทำไมผมต้องมาศึกษา PIC หว่า?)

 

สวัสดีครับ หลังจากที่ผมได้ศึกษาเกี่ยวกับไมโครโปรเซสเซอร์ ตั้งแต่รุ่น 8086/8088 จนถึงตัวปัจจุบัน แล้วได้เปลี่ยนแปลงตัวเองมาเล่นทางด้าน ไมโครโปรเซสเซอร์รุ่นเก๋าอย่าง Z80 ซึ่งถ้าถามว่าทำไมผมได้เปลี่ยนมาใช้งานไมโครโปรเซสเซอร์ตัวเก่าๆ (8 บิต) คำตอบคือ ผมมักมีคำถามว่า ถ้าเราจะควบคุมอะไรสักอย่างหนึ่ง เราจะทำอย่างไร จะลงทุนใช้คอมพิวเตอร์ตั้งโต๊ะดีไหม มันก็ดีถ้าเรามีไฟ 220V ให้มันกิน ... แล้วยังมีจอที่มีน้ำหนักมาก แถมยังต้องอาศัยการ์ดขยายสำหรับติดต่อกับ I/O ภายนอก ซึ่งยังบอกไม่ได้ว่า ถ้าระบบปฏิบัติการเปลี่ยนไป เราจะสามารถใช้งานมันได้เหมือนเดิมหรือไม่ ? … หรือจะมองไปที่พอร์ตเครื่องพิมพ์ (Printer port) ก็มีปัญหาว่า ความเร็วของการทำงานในแต่ละเครื่องนั้นจะไม่เท่ากัน คือ CPU เร็วมันก็เร็วตามไปด้วย ดังนั้น เราต้องคอยเปลี่ยนแปลงค่าการหน่วงเวลา ให้เหมาะสม ... อืม ... ถ้ามาใช้ Serial Port ล่ะ ... ก็ต้องทำการสื่อสารกับพอร์ตนี้ ซึ่งมีมาตรฐานที่ตายตัว ... ดูดีๆ .. แล้วทำอย่างไรถึงจะได้พอร์ตที่เป็นทั้ง Input และ Output ล่ะ ... เจอปัญหาอีกแล้ว ... ทางแก้น่ะเหรอ ... ก็สร้างบอร์ดสำหรับติดต่อกับ RS232 ไงครับ ... ในกรณีนี้ก็มีทางเลือก 2 ด้าน คือ

 

1. บอร์ดที่ขยายเพิ่มไปนั้น จะต้องใช้ CPU ของเครื่อง PC เป็นตัวประมวลผล

2. บอร์ดที่ขยายเพิ่มไปนั้น มี CPU ของตัวเองเป็นผู้ประมวลผล

 

ทางเลือกของผมนั้น จึงเป็นแบบที่ 2 มากกว่า นั่นคือ ตัวบอร์ดขยายมันก็ทำงานของมันไป เครื่อง PC ของเราก็ทำงานอย่างอื่นไป อย่างนี้จะไม่ทำให้ CPU ของเราทำงานเกินหน้าที่ ... บางคนก็บอกว่า CPU มันเร็วพอสำหรับ ทำงานควบคุม... อืม ... มันก็จริงแฮะ ... อย่างไรก็ดีครับ เราเป็นตัวของเราเอง ... ผมก็เลยพยายามศึกษา โดยเริ่มจาก Z80 ...  ซึ่งผมต้องขอขอบคุณ      อาจารย์เที่ยง เหมียดไธสง อย่างสูงครับที่ได้ให้การสนับสนุน...    ทั้งนี้เพราะอาจารย์ท่านได้มอบบอร์ด ET-BARD v3.5    มาให้ผมทดลองเล่น .. ผมก็ลองเล่นดู มันก็ OK นะ ...   แต่ผมว่ามันมีขนาดใหญ่ไปนิดนึง มีอะไรที่ต้องทำความเข้าใจค่อนข้างเยอะ แล้วผมก็รู้สึกว่ามันช้ามาก (ใครลองเขียนโปรแกรมบน PC มาก่อนแล้วเปลี่ยนมาใช้พวก Z80 จะรู้สึกเหมือนผมนี่แหละครับ มันเป็นเพราะว่าเราไม่รู้จริงว่า
ช้า/เร็วเป็นอย่างไร โดยสนใจแต่เรื่องความเร็วของ
CPU) ...   แล้วอาจารย์ท่านก็ให้บอร์ด ET-8032 V2 มาให้เล่น ... คราวนี้ล่ะมึน เพราะแนวคิดมันไม่เหมือนไมโครโปรเซสเซอร์เลย ... อะไรเนี่ย......มันมี ROM/RAM/PORT ในตัวเลยเหรอ ... อืม แปลกดีๆ ...

ช่วงแรกๆนั้นไม่ค่อยจะรู้เรื่องหรอกครับ ... ทำไงดีล่ะ ... อาจารย์เที่ยง ก็เลยให้วงจรและอุปกรณ์มาลองสร้างบอร์ดเอง ประกอบกับช่วงนั้นมีอาจารย์จาก
JICA คือ อาจารย์ฮิเดฟูมิ (นามสกุลผมลืมแล้ว...อืม ... ทากิซาว่า .. หรือเปล่าหนอ ... อืม .. แปะโป้งเอาไว้ก่อนนะครับ) ท่านชำนาญด้าน Z80 และ PIC เป็นอย่างมาก ในช่วงนี้ผมเลยได้อ่านวารสารของญี่ปุ่น (จริงๆ แล้วดูวงจร ส่วนรายละเอียดนั้น อาจารย์ท่านช่วยอธิบายเพิ่มให้ผมฟัง) ...

จากการทดลองสร้างบอร์ด Z80 , SRAM (ลองทำวงจรสำหรับเขียนข้อมูลลง RAM และแสดง
ผลลัพธ์ออกมาดูทาง
LED โดยใช้ Switch 8 อันสำหรับ Data และอีก 16 อันสำหรับ Address) ก็เรียกได้ว่าบอร์ดนั้นดูไม่ได้เลยครับ (แต่ทำงานได้นะ) คือ สายไฟยาว และไม่สวยงามเลยล่ะ ... แต่ผมก็เข้าใจแล้วล่ะว่า อะไรคืออะไร และทำงานได้อย่างไร ... (ใครลองทำดูก็จะเข้าใจใช่ไหมครับ ^_^)

ผมเลยลองสร้างบอร์ด MCS-51 ดูบ้าง ... อืม ... มันง่ายดีแฮะ (ความรู้สึกในตอนนั้นนะครับ) ถึงสายจะเยอะ (เพราะผมต้องต่อ ROM ภายนอก) แล้วต้องอาศัยเครื่องลบ/เขียน EPROM (ตอนนั้นซื้อมาหมดไปหลายพันเลยล่ะ ... ฮ่ะๆๆ จริงๆ ก็ประมาณ 5,000 บาทน่ะครับ ... อดอยากเป็นเดือนๆ เลยล่ะครับ ... ก็ตอนนั้นเงินเดือนมัน 6,000 กว่าๆเอง) ตอนแรกก็ใช้พอร์ตพวก P1 กับ P3 มันก็ทำงานได้ดี

     
จากก้าวแรกที่สามารถ ต่อวงจรและเขียนโปรแกรมทำไฟวิ่งและติดต่อกับ
Switch ได้เรียบร้อย (โดยมีอาจารย์ทั้ง 2 ท่านดูแลอย่างใกล้ชิด ... ฮ่ะๆๆๆ) ผมก็เริ่มต่อวงจร RS232 โดยใช้ไอซีกลับแรงดันจาก +/-5VDC มาเป็น +/-12 VDC ช่วงแรกก็มึนครับ เพราะตัว Capacitor นั้นมันต่อกลับไปกลับมา ... ผมก็ต่อผิดเยอะเลยอ่ะครับ (เสียเยอะ แต่สนุกดี ฮ่ะๆๆ ... ทำไงได้ล่ะความรู้ด้านอิเล็กทรอนิกส์ เนี่ยมันเล็กๆน้อยๆ จริงๆ) จนแล้วจนรอดผมก็สามารถติดต่อกับ PC ได้สำเร็จ หลังจากนั้นก็ลองเขียนโปรแกรมสั่งไฟวิ่งจาก PC ดู... มันก็ทำงานได้ ... เอาล่ะ สรุปได้ว่าผมเจอทางเลือกของผมแล้วล่ะว่าจะใช้ MCS-51 เนี่ยล่ะในการเขียนโปรแกรมติดต่อกับอุปกรณ์ภายนอก โดยใช้ PC เป็นตัวควบคุมผ่านทาง RS232


พอได้วงจรภาค
RS232 มาแล้ว ผมก็ลองต่อขยาย RAM ดูบ้าง ก็พบว่า สายไฟบนบอร์ดนั้นเยอะขึ้นอย่างมาก แถมเหลือพอร์ต P1 (พอร์ต P0/P2 ผมใช้ในการติดต่อกับ EPROM และ SRAM แล้วไม่กล้าใช้สองพอร์ตนี้เกรงว่าจะมีปัญหาข้างเคียงระหว่างทำงาน … จนถึงวันนี้ผมก็ยังไม่แน่ใจว่ามันเสี่ยงจริงหรือเปล่า ฮาๆๆ แต่เท่าที่ลองมันก็เพี้ยนๆ อยู่นะครับ ... ไม่มี Scope เอาไว้ตรวจการทำงานเลยไม่รู้สาเหตุจนถึงทุกวันนี้… เห็นไหมว่าผมไม่ได้รู้ไปเสียทุกเรื่อง แต่พยายามรู้ในสิ่งที่ถนัดให้เยอะที่สุด)

สำหรับติดต่อกับ I/O … ทำไงดีล่ะ ... ก็ขยายพอร์ตซะสิ ... คราวนี้เลยสนุกกว่าเดิมครับ ผมเพิ่ม 8255 เข้าไปอีก 1 ตัว วงจรบนบอร์ดก็เลยซับซ้อนมาก กว่าจะทำงานได้นั้นผมรื้อวงจรเพื่อแก้ไขไปหลายรอบ (ต้องขอบขอบคุณกำลังใจรอบตัวครับ ที่ทำให้พยายามได้ขนาดนี้ ... ซื้อมาใช้ก็หมดเรื่องไปแล้ว ... เฮ้อ) พอใช้งานได้ก็ทดลองกับวงจรที่ทำเอาไว้ ก็พบว่า 8255 มันช้ากว่า MCS-51 การสั่งงานเลยต้อง Delay เอาไว้นิดหนึ่ง (ปัญหานี้ไม่เกิดกับ Z80) อยากให้ 8255 เร็วขึ้น ผมเลยไปรื้อ XT (8086) เพื่อหา 8255AC5 ที่เขาบอกว่าเร็วกว่า ... ก็เลยใช้บอร์ดนี้พร้อม 8255AC5 มาเรื่อยๆ แล้วมันก็ถึงวันตายของบอร์ดที่ผมทำเองกับมือ (เศร้ามากครับในช่วงเวลานั้นนะ) ... ผมก็เลยลงทุนซื้อบอร์ดสำเร็จจากบริษัทมาอย่างละ 1 ตัว (มีหลายบริษัทน่ะครับ) ก็ใช้งานได้ดี ครับ


นั่นเป็นจุดเริ่มครับ ... ต่อมาผมเริ่มมีปัญหากับ ภาษาแอสเซมบลี (ขี้เกียจเขียนน่ะ) ก็เลยลองสั่งซื้อ
Micro-C/51 จากทาง ETT ก็พอใช้ได้ครับ (ดีกว่า ASM แต่มึนเพราะไม่มีเอกสาร) ผมเลยทำเอกสารประกอบการศึกษาของผม บวกกับใส่ประสบการณ์ด้านการทดลอง (แบบผิดๆถูกๆ) ลงไปด้วย จนสุดท้ายก็ได้มาเป็นหนังสือ Micro-C/51 ที่ทาง ETT ช่วยเหลือในการจัดพิมพ์ ... ซึ่งกว่าจะเขียนหนังสือเสร็จ ผมก็เสียเงินซื้อบอร์ดควบคุม หลายรุ่นด้วยกันครับ (มีบางตัวราคากว่า 5000 บาท ... ซึ่งเช่นเคยครับ อดอยากเป็นเดือนเลย) หลังจากที่ศึกษา Micro-C/51 สำเร็จ (เหมือนพวกฤาษีเลยครับ) ก็มาสอนนักศึกษา จนมาลองทำพวกหุ่นยนต์ขับเคลื่อนด้วยล้อ ... ช่วงแรกนั้นแค่ตรวจสอบการชนยังทำได้ลำบากมาก ... พอทำได้สำเร็จ ก็ปรับมาเป็นเดินตามเส้น ด้วยการแนะนำจาก อ.ฮิเดฟูมิ  ก็ทำงานได้สำเร็จ แล้วก็มีการจัดแข่งขันกันภายในระหว่างนักศึกษา ... ก็สนุกดีครับ ... 


ผมก็เริ่มมาศึกษาเพิ่มเติมคือ ลองใช้บอร์ด
ET-DIO, ET-8255 ที่เป็น PC-Card (ได้มาจาก อ.เที่ยง) ก็เขียนโปรแกรมด้วย Visual C++ (อย่างที่มีให้อ่านในเว็บของ ETT น่ะแหละครับ) ... ช่วงนี้เรียกว่าผมสนุกจนลืมเขียนบทความพวก Linux กันไปเลยครับ (ฮ่ะๆๆ) หลังจากนั้นก็เริ่มมาใช้ AVR, Z180, 68HC11 (ตัวนี้ชอบมากครับ ซื้อมาทั้ง รุ่นเล็กและรุ่นใหญ่ ใช้เงินไปกว่า 6000 บาท ^_^ ... ลำบากกระเป๋าเหมือนเดิม) ... จนทาง ETT เห็นความสำคัญของบทความที่ผมเขียน ...แล้วให้ผมนำบทความมาใส่ในเว็บ ... (ฮ่ะๆๆ โชคดีแฮะเรา ไม่เคยคิดว่าจะได้ทำงานถึงระดับนี้ ... เพราะผมเคยพยายามมาหลายครั้ง แต่ไม่ประสบความสำเร็จด้วยเหตุผลอะไรอีกหลายอย่าง) ...

ด้วยเหตุนี้ ในระยะหลังผมเลยไม่ต้องลงทุนมากนัก เพราะทาง ETT จะสนับสนุน ทำให้ไม่ต้องสร้างบอร์ดเอง (ซึ่งผมว่าไม่ค่อยดีนะ .. ประสบการณ์มันไม่แน่น ^_^ แต่ประหยัดเวลาดีครับ ... เพิ่งรู้ว่าอายุยิ่งมาก เวลายิ่งเหลือน้อย)  ... มันเหมือนจะดีไปทุกๆ ด้าน แต่ก็มีปัญหาเยอะเหมือนกัน อะไรที่มีคนอ่านมาก มันย่อมมีอะไรที่ต้องตอบคำถามอีกเยอะ ... บ่อยครั้งที่อยากเลิกเขียนบทความ แต่ก็ต้องขอขอบคุณทาง ETT ที่คอยให้กำลังใจ (โดย เฉพาะคุณ กอบกิจ เติมผาติ) ก็เลยได้เห็น/ได้อ่านบทความของผมกันจนถึงทุกวันนี้ครับ


นอกจากนี้ ผมได้นำความรู้ที่ได้ศึกษามาประยุกต์ใช้กับพวกระบบแปลภาษา (พยายามเขียน
BASIC Interpreter) โดยเริ่มจากรู้จักคำสั่งพวกเดินหน้า/ถอนหลัง/เลี้ยวซ้าย/เลี้ยวขวา/ยกปากกาขึ้น/ลง ซึ่งก็ได้พัฒนาจนมาเป็นหุ่น Simple Mobile Robot ของทาง FIBO ที่มีน้องช้างเป็นผู้ออกแบบตัวหุ่น และเขียนโปรแกรมภาคควบคุมการเคลื่อนที่ (ใช้ MCS-51 โดยอาศัยบอร์ด
CP-S8252V2 ที่ปรับปรุงให้ทำงานกับ P86C51RD2 ซึ่งอ่านได้จากบทความบนเว็บ ETT นี่ล่ะครับ ส่วนตัวหุ่นนั้นสร้างเอง ราคาเฉพาะตัวหุ่นและมอเตอร์ก็อยู่ในหลักหมื่นบาทเลยครับ) ... 

ตรงนี้ผมต้องขอขอบคุณ ดร.สยาม เจริญเสียง เป็นอย่างสูงครับ ที่ทำให้ผมมีโอกาสเข้าไปทำงานที่
FIBO ในระยะหนึ่งครับ เป็นประสบการณ์ที่ดีมากครับ ... และต้องขอขอบคุณพี่ๆ เพื่อนๆ น้องๆ ที่ FIBO อย่างมากครับ เพราะในช่วงเวลานั้นผมสนุกมากครับ ได้เรียนรู้เกี่ยวกับหุ่นยนต์ (ที่ไม่ใช่แค่หุ่นยนต์ติดล้อที่ผมทำอยู่) , AI (Artificial Intelligent) , Fuzzy Logic, Neural Network , Computer Vision อย่างเต็มที่ (ยังมีอะไรอีกเยอะ แต่เล่าไม่หมดอ่ะครับ ... พอดีกว่าเนอะ มันชักเหมือนคนแก่เล่าความหลังซะแล้ว)

ล้วมันเกี่ยวอะไรกับ
PIC16F877 เหรอ ... ฮ่ะๆๆ ทั้งหมดเป็นเกริ่นนำไงครับ ว่าทำไม Micro controller จึงน่าสนใจ ทำไมมันมีหลายรุ่น หลายยี่ห้อ แล้วผมเองก็เขียนบทความ ตั้งแต่ MCS-51, Z80, 68HC11 (ยังเขียนไม่จบเลยอ่ะ ... มันเยอะมาก ^_^) และล่าสุดเป็น BASIC Stamp P40 คราวนี้ก็เหลืออีก 2 ตระกูลที่ผมยังไม่ได้กล่าวถึง คือ AVR และ PIC 

 


เดิมทีนั้นว่าจะพูดถึง
AVR ก่อน เพราะผมซื้อบอร์ด/ไอซีมาตุนไว้ตั้งแต่มันออกมาขายใหม่ๆ (ยังไม่ได้ใช้ทำอะไรเลยจนถึงทุกวันนี้ ... หลายปีแล้วนะเนี่ย) ... พอดีทาง คุณกอบกิจ ส่ง CP-PICV3.0 กับ V4.0 พร้อมเอกสารของ PIC16F877 อีก 2 เล่ม ... ว่าจะรอให้เขียน AVR เสร็จก่อน ก็คงอีกนาน ผมเลยลัดคิวมาเป็น PIC16F877 กันก่อนเลย ... ตอนแรกคิดว่าจะเขียน 16F84 ก่อนดีไหม เพราะผมมีบอร์ดที่ทำเอาไว้ กับเครื่องโปรแกรมชิพ พร้อมอยู่แล้ว ก็คิดๆ ดูแล้วยังไงก็มี 16F877 แล้วทำไมต้องมาเขียนเรื่องเก่าๆอยู่อีก ... ก่อนหน้านี้ ผมก็ทำบอร์ดสำหรับ 16F877 เอาไว้แล้วเหมือนกันครับ แต่เวลาพัฒนาผมต้องถอดชิพมาโปรแกรม แล้วต้องนำกลับไปเสียบบนบอร์ดอีกครั้งเพื่อใช้งาน แต่บอร์ดของทาง ETT มันจะโปรแกรมชิพได้จากบนบอร์ดเลย (สะดวกดีครับ)

 

... ผมก็เลือกใช้
CP-PIC V4.0 เป็นบอร์ดหลัก ส่วน I/O นั้น ผมก็จะไม่ทำวงจรเพิ่มแล้วล่ะครับ (อย่างที่บอกครับ อายุยิ่งมากขึ้นเวลายิ่งน้อยลง)  ผมเลือกใช้ ET-I/O EXP4 ล่ะกันครับ (ทาง ETT ส่งมาให้ใช้ เมื่อนานมาแล้ว... ตอนนี้เรียกผมใช้คุ้มมากเลยครับ ^_^) … โดยผมจะลงวงจรที่เกี่ยวข้องประกอบลงในบทความไปด้วยล่ะกันครับ จะได้วงจรกระกอบการทดลอง (แปลกดีที่ทาง ETT ชอบให้ผมนำวงจรจากเอกสารของ ETT) ส่วนตัวแปลภาษานั้นผมใช้เครื่องมือของ MPLAB นะครับ เพราะมันให้ดาวน์โหลดฟรีอยู่แล้ว .. ภาษาที่ใช้เขียนน่ะเหรอ ... ก็แอสเซมบลีไงล่ะครับ (ฮ่ะๆๆ) 

 โดยภาพรวมของบทความนั้นจะเน้นไปที่แนะนำ เพื่อเป็นแนวทางในการศึกษาต่อในระดับสูงๆ (อีกแล้วเหรอ ... ทำไมผมไม่เขียนอะไรที่มันสูงๆยากๆบ้างล่ะเนี่ย ...)  แล้วคราวหน้าก็มาเริ่มกันที่เรื่องของสถาปัตยกรรมของ PIC16F877 กันเลยครับ ...


เขียนโดย : ศุภชัย บุศราทิจ
Author : Supachai Budsaratij
e-mail : raek@se-ed.net
วันที่ทำการปรับปรุง :  ๓๑ ม.ค. ๒๕๔๗