[ บทความ : 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/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 หน้า อธิบายทั้งภาคฮาร์ดแวร์, ชุดคำสั่ง และการทดลอง พร้อมคำอธิบายอย่างละเอียด) และเมื่อเขาทำได้ดีกว่า แล้วเราจะทำแข่งทำไม ใช่ไหมครับ (ฮ่ะๆๆ) สัปดาห์นี้เท่านี้ก่อนครับ |