[ บทความ : Guide to PIC16F877 ] ตอนที่ 2 ... สถาปัตยกรรมของ PIC16F877 และ 16F84 ....

 

จากบทความครั้งที่แล้วผมได้ตัดสินใจว่าจะไม่นำตัวอย่าง 16F84 มากล่าวถึง ... แต่หลังจากที่ไตร่ตรองก็พบว่า ทาง ETT เองก็มีอุปกรณ์ที่ใช้สำหรับจำลอง (Emulator) ตัว PIC16F84 แถมยังมีบอร์ด ET-BASIC Stamp 1 ที่ใช้ชิพตัวดังกล่าวอีกด้วย แต่มุ่งเน้นที่ใช้ภาษาเบสิกในการพัฒนา ซึ่งข้อดีก็มีอยู่ว่า การทำงานนั้นจะเร็วกว่าใช้ BASIC Stamp 1 ทั้งนี้เนื่องจาก BS1 (BASIC Stamp1) นั้น ทำงานแบบ Interpreter (แปลทีละคำสั่ง) แต่ PBASIC นั้น จะทำการแปลภาษาเบสิกให้เป็นภาษาแอสเซมบลี หลังจากนั้นก็นำโค้ดแอสเซมบลี มาแปลเป็นรหัสเครื่องอีกทีหนึ่ง การทำงานจึงเร็วกว่า แต่ลำบากกว่าในเรื่องของขั้นตอนพัฒนา คือ แบบหลังนี้เราจะต้องมีเครื่องโปรแกรมชิพ และต้องมีตัวแปลภาษาเพิ่มเข้ามาอีกด้วย (คือว่า ซื้อเพิ่มน่ะครับ) 

 

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

 

 

ภาพรวมของ PIC16Fxxx/18Fxxx

 

ชิพ

หน่วยความจำโปรแกรม

หน่วยความจำข้อมูล

CAN Module

จำนวน I/O (บิต)

OSC (MHz)

Timer

PLL

RAM

EEPROM

16F84

1K Word

68

64

ไม่มี

13

4-10

1

ไม่มี

16F877

8K Word

368

256

ไม่มี

33

4-20

3

ไม่มี

18F442

16 KB

768

256

ไม่มี

34

40

4

มี

18F458

32 KB

1536

256

มี

34

40

4

มี

หมายเหตุ

       1. 16F84/877 นั้น ใช้หน่วยความจำโปรแกรมขนาด 14 บิต ต่อ 1 คำ (Word)

       2. CAN Module คือ

       3. PLL (Phase Lock Loop) คือ วงจรที่สร้างความถี่ของสัญญาณนาฬิกาเป็น 4 เท่าจาก XTAL ดังนั้น ถ้าเราเลือกโหมด PLL ก็จะใช้ XTAL 

          ได้ไม่เกิน 10MHz

 

สัญญาณนาฬิกา

PIC จะใช้สัญญาณนาฬิกา โดยมองเป็นลักษณะของ วงรอบ (Cycle) ซึ่งระบุเอาไว้ว่า 1 คำสั่งนั้นจะประกอบไปด้วย 1-2 วงรอบ โดยแต่ละวงรอบนั้นจะแบ่งเป็น 4 ส่วน คือ Q1, Q2, Q3 และ Q4 ด้วยเหตุนี้ ความเร็วโดยรวมของ PIC จึงเท่ากับ ค่าความถี่ของสัญญาณนาฬิกา หาร ด้วย 4

ส่วนรุ่น 18Fxxx นั้นจะมีความสามารถพิเศษคือ สามารถสร้างสัญญาณนาฬิกาเป็น 4 เท่าของ XTAL โดยใช้วงจรเฟสล็อกลูป (อยู่ในตัวไมโครคอนโทรลเลอร์) ด้วยเหตุนี้ ถ้าเราใช้ XTAL 10 MHz ความเร็วสูงสุดของชิพจึงเป็น 40MHz ซึ่งถ้าหารด้วย 4 ก็ประมาณได้ว่า ทำงานที่ความเร็วประมาณ 10 ล้านคำสั่งต่อวินาที (อย่าลืมนะครับว่าถ้าเป็นพวกคำสั่งกระโดดจะใช้มากกว่า 1 cycle ครับ)

 

การจัดขาของไอซี

หลังจากที่ทำความเข้าใจเกี่ยวกับสัญญาณนาฬิกากันไปแล้ว เรามาดูเรื่องการจัดขาของชิพกันดีกว่าครับ ในรูปนั้นถ้าขาใดเป็น Active Low ผมจะใส่เครื่องหมาย’ เอาไว้ด้านหลังนะครับ เช่น MCLR’ ก็คือ ขาที่ Active แบบ Low นั่นเอง

การจัดขาของ PIC16F84 การจัดขาของ PIC16F877

 

 

 

การจัดขาของ PIC18F442

การจัดขาของ PIC18F458
จากโครงสร้างขาของ 16F877,18F442 และ 18F458 จะพบว่าลักษณะนั้นเหมือนกันมาก แตกต่างเพียงขาบางขานั้น ทำหน้าที่มากกว่า 16F877 เท่านั้น

 

คุณสมบัติของ 16F877

     เอาแบบคร่าวๆนะครับ

          1.  มีคำสั่งให้ใช้งาน 35 คำสั่ง

          2.  คำสั่งหนึ่งๆใช้เวลาทำงาน 1 ถึง 2 Cycle

          3.  ทำงานได้สูงสุดที่ 20MHz (PIC16F877-20/P นะครับ ไม่ใช่ 16F877-04/p)

          4.  ทำงานแบบ Pipe-line (มี 2 ท่อ) ทำให้ ณ เวลาหนึ่งทำงาน 2 อย่างพร้อมๆกันได้

          5.  หน่วยความจำโปรแกรมเป็นแบบ Flash มีขนาด 8KWord (1 word=14 บิต)

          6.  มี RAM ขนาด 368 ไบต์ ให้เราใช้งาน

          7.  มี EEPROM ขนาด 256 ไบต์

          8.  ตอบสนองกับอินเตอร์รัพได้ทั้งหมด 14 แหล่ง

          9.  มี Stack ให้ใช้ได้สูงสุด 8 ระดับ (เวลาเขียนโปรแกรมต้องระวังให้ดีครับ)

        10.  มีระบบ Power On Reset, Power Up Timer, Oscillator Start-up timer (คืออะไรหว่า? ฮาๆๆ พูดเล่นๆน่ะครับ)

        11.  Watchdog timer

        12.  มีระบบ Code Protection กันใครก๊อบเอาไปแจก

        13.  มีโหมดประหยัดเงิน (ประหยัดพลังงาน ก็ประหยัดเงินไปด้วย)

        14.  สัญญาณนาฬิกามีหลายโหมดให้เลือกใช้งาน คือ อาจจะใช้ XTAL หรือ วงจร RC ก็ได้

        15.  สามารถโปรแกรมด้วยไฟ +5VDC ได้

        16.  ใช้การโปรแกรมแบบ In-Circuit Serial Programming

        17.  ทำงานที่ไฟเลี้ยง 2VDC ถึง 5.5VDC

        18.  Current Sink และ Current Source อยู่ที่ 25mA (ขับ LED ได้สบายเลยล่ะครับ ... ไม่เหมือน MCS-51 เนอะ!)

        19.  มี Timer/Counter 3 ตัว

        20.  มีโมดูล Capture/Compare/PWM อีก 2 ชุด (มี PWM นี่คุม DC Motor ได้สบายเลยครับ)

        21.  มี A-TO-D Converter แบบ 10 บิต จำนวน 8 ช่องนำเข้า  ในตัวเอง (ประหยัดเงินค่าไอซี A-TO-D Converter ไปหลายบาท)

        22.  มีระบบ USART สำหรับต่อกับ การสื่อสารแบบ RS232 หรือดีกว่า

        23.  มีระบบตรวจระดับไปเลี้ยง (Brown-out reset)

        24.  มี I/O พอร์ตทั้งหมด 5 พอร์ต (แต่ว่าแต่ละพอร์ตเนี่ยมีจำนวนบิตไม่เท่ากันนะครับ ... งงไหม?)

เยอะดีจังเลยครับ ... ส่วนคุณสมบัติเพิ่มเติมของ 18F442 และ 18F458 ก็ดูได้จากตารางภาพรวมด้านบนครับ

 

โครงสร้างภายในชิพ

มาดูผังไดอะแกรมของ PIC 16F877 กันก่อนครับ ส่วนรายละเอียดที่เกี่ยวข้องนั้นผมขอกล่าวถึงทีหลัง (ตอนเรียนรู้ชุดคำสั่งน่ะแหละครับ)

จากผังจะมี Register สำคัญๆ คือ W ซึ่งเป็น Register ที่ใช้ในการทำเป็น Input ให้กับ ALU และเป็นตัวเก็บผลลัพธ์จากการทำงานของ ALU, STATUS เป็น Register ที่ใช้เก็บสถานะ การทำงานของคำสั่ง ว่าเมื่อคำสั่งทำงานเสร็จแล้วเกิดอะไรขึ้นมาบ้าง ซึ่งมีประโยชน์ในการเขียนโปรแกรมแบบมีเงื่อนไข, PC หรือ Program Counter เป็น Register อีกตัวหนึ่งที่มีความสำคัญ เนื่องจากใช้สำหรับเป็นตัวชี้ว่า คำสั่งที่จะนำมาประมวลผลนั้นอยู่ ณ ตำแหน่งใดในหน่วยความจำ

 

หน้าที่ของพอร์ตที่เราใช้งาน 
      RA0-RA3 และ RA5 จะใชงานเปน I/O ปกติ และทําหนาที่เปนขาอินพุตของสัญญาณอนาล็อก (AN0-AN4) 
      RA4 เป็นขา I/O
      RA6/OSC2/CLKO ทําหนาที่ในหลายสวน คือ เปนขา OSC2 และ CLKO จะนํามาใชเปนขาสัญญาณ I/O ไดก็ตอเมื่อเราใชคริสตอลออสซิลเลเตอร แบบที่เปนโมดูลสําเร็จสามารถตอเขากับขา OSC1/CLKIN ไดเลยโดยที่ไมตองตอกับขา RA6/OSC2 ทําให ขา RA6 วางและนําไปใชเปน I/O ได 
       RB0-RB7 สามารถใชงานเปน I/ แตมีคุณสมบัติ พิเศษคือวงจรมีพูลอัพ (Pull-Up) ภายใน และ เปน แหลงกําเนิดสัญญาณอินเตอรัพทตางๆ ดังนี้

- RB0/INT0 เปนขาสัญญาณอินเตอรรัพทภายนอก 0

- RB1/INT1 เปนขาสัญญาณอินเตอรรัพทภายนอก 1

- RB2/INT2 เปนขาสัญญาณอินเตอรรัพทภายนอก 2

- RB3/INT3 เปนขาสัญญาณอินเตอรรัพทภายนอก 3 (18F442)

- RB4-RB7 เปนขาที่สามารถกําเนิดสัญญาณอินเตอรรัพทได 

จะเห็นว่าผมแนะนำเฉพาะพอร์ต A และ B เท่านั้น ทั้งนี้เนื่องจาก ในบทความเรื่อง PIC ผมจะใช้ พอร์ต A (RA) ต่อกับพวก Switch และ พอร์ต B ต่อเข้ากับ LED เพื่อใช้ในการเรียนรู้คำสั่ง ของ PIC

แล้วเราจะอ้างอิงด้วยชิพตัวไหนดี?
คำตอบคือ 16F877 ครับผม ... เพราะมันอยู่ตรงกลางระหว่าง 16F84 กับ 18F442/458 คือว่า เรียนรู้ชิพตัวนี้แล้วเราก็ประยุกต์ไปใช้ได้หลายตัว (คุ้มดีนะผมว่า) ส่วนวงจรนั้น ผมใช้ CP-PIC V4 ของ ETT บนบอร์ดผมใช้ชิพ 18F458 แต่จะเขียนตัวอย่างที่เป็น 16F877 ครับ

 

วงจรใช้งาน

เอาล่ะครับก่อนจะจบกัน ผมแถมวงจรใช้งานของ PIC16F84 กับ PIC16F877 ไว้สำหรับใครต้องการทดลองสร้างบอร์ดควบคุมเอาไว้ใช้งานครับ (ส่วนเครื่องโปรแกรม หรือวงจรโปรแกรม ก็ตัวใครตัวมันนะครับ มันเกินความสามารถของผมน่ะครับ ฮ่ะๆๆ) และผมขอไม่แสดงวงจรแปลงไฟ 5VDC นะครับ เพราะได้เคยลงวงจรในบทความที่เกี่ยวกับ MCS-51 กันไปแล้ว ... 

 

มาดูวงจรใช้งานของ 16F84 กันก่อนครับ

 

ส่วน 16F877 ก็เป็นดังนี้ครับ

 

วงจรนั้นก็อย่างที่บอกครับผมก็จะใช้ ET-EXP 4 I/O โดยผมเน้นที่ส่วนของ LED กับ Switch (อาจจะต้องต่อวงจรเอาเองก็ได้ครับ) นะครับ บทความครั้งต่อไปก็จะเป็นเรื่องของชุดคำสั่งของ PIC … เจ้าชุดคำสั่งของ PIC นี้เป็นจุดเด่นของชิพตัวนี้ครับ เพราะจำนวนของคำสั่งนั้นน้อยมาก คือ 30 กว่าคำสั่ง แถมการออกแบบชุดคำสั่งนั้นใช้เทคโนโลยีแบบ RISC ซึ่งการทำงานนั้นซับซ้อนน้อย และได้ความเร็วสูง ... พอเราเรียนคำสั่งต่างๆกันเสร็จ ก็จะจบบทความของ PIC ก็จะปิดฉากลง ถ้าถามว่าทำไมผมไม่เขียนเป็นตอนยาวๆ แบบละเอียดๆ ล่ะก็ครับ ผมตอบได้แค่ว่า ผมเขียนได้ไม่ดีเท่ากับ “คุณวัชรินทร์  เคารพ”  (เขาเขียนเป็นตำราเลยล่ะครับ ถ้าสนใจก็ติดต่อกับ ETT ก็แล้วกันครับ ชื่อหนังสือ คือ “เรียนรู้และเข้าใจสถาปัตยกรรมไมโครคอนโทรลเลอร์ PIC16F877” ราคา 220.- จำนวนหน้าก็234 หน้า อธิบายทั้งภาคฮาร์ดแวร์, ชุดคำสั่ง และการทดลอง พร้อมคำอธิบายอย่างละเอียด) และเมื่อเขาทำได้ดีกว่า แล้วเราจะทำแข่งทำไม ใช่ไหมครับ (ฮ่ะๆๆ) … สัปดาห์นี้เท่านี้ก่อนครับ

 


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