PIC คืออะไร
มันคือ Programable Integrated Circuit โดยเป็น Processor ที่คาดว่าราคาเหมาะสม ต้องการวงจรประกอบ รอบนอกน้อย ทำความเร็วได้ประมาณ 1 uSec ต่อคำสั่งซึ่งนับว่าเร็วมาก ตัวที่น่า
เริ่มต้นเรียนรู้คือเบอร์ 16F84 ซึ่งมี EEPROM อยู่ภายในสามารถ ลบด้วยไฟฟ้าได้ ราคา ประมาร 190 บาท แต่ถ้าตัวใช้งานที่ โปรแกรม
ครั้งเดียวจะเหลือราคาประมาณ 100 บาท อีกทั้งยังป้องกัน การ Copy โปรแกรม ได้ด้วย
บริษัทที่ผลิตคือ Microchip มี WEB site ที่บริการ App Note คือ www.microchip.com รวมถึงมีโปรแกรมต่างๆเช่น Compiler
Sample Program ให้ Download นอกจากนี้ยังมี WEB link ที่ http://electronics.se-ed.com/links/elec_links.html เพื่อเชื่อมไป วงการ PIC คุณสมบัติทั่ว ๆ ไป
ตัว PIC เบอร์ 16F84 CPU ใช้รูปแบบการทำงานแบบ RISC มี port ใช้งาน 2 Port คือ Port A และ Port B ทั้งหมด 12 bit ใช้งาน ซึ่งเป็นได้ทั้ง input/output แล้วแต่โปรแกรม ระบบ Address จะใช้แบบ page ซึ่งทั้งหมดจะมี 12 bit แต่ใช้ปกติจะเป็น 8 bit ที่เหลือจะเป็นการใช้เลือก page ใช้งานซึ่งการเลือกนี้
จะใช้การไปโปรแกรม bit ของ Status register
+ ออสซิลเลเตอร์แบบ RC ที่มีราคาถูก : RC + คริสตอล/รีโซเนเตอร์มาตรฐาน : XT + คริสตอล/รีโซเนเตอร์ความเร็วสูง : HS + คริสตอลความถี่ต่ำ, กินไฟน้อย : LP
ตารางสรุป คำสั่งทั้งหมด ของ PICการเขียนโปรแกรมลงไปบน PIC eeprom ต้องอาศัยเครื่องโปรแกรม ซึ่งถ้าจะทำเองก็ได้ โดยดูที่ http://www.jdm.homepage.dk/newpic.htm
Program PonyProg V1.17a
ในขณะที่ PIC ทำงานตามโปรแกรมหลัก เราสามารถเขียนโปรแกรมแบบที่ ให้ PIC รองรับเหตุการทำงาน (event) แบบขัดจังหวะได้โดย เขียนส่วน Code เป็น Sub ไว้ และกำหนดส่วน Call ไว้ที่ตำแหน่ง 004 ดังรูปแบบโครงโปรแกรม ส่วนเรื่องการจัดลำดับของการขัดจังหวะ สามารถ Check หลังจากเกิดสัญญาณแล้ว จาก bit I/O Port
|
|
การกำหนด Register เพื่อจัดการการขัดจังหวะ ซึ่งมี Register ที่เกี่ยวข้อง 4 ตัวคือ GIE ขัดจังหวะรวม ,INTE ขัดจังหวะภายนอกที่ ขา RB0/INT, RBIE ขัดจังหวะที่ขา RB4 ถึง RB7 เปลี่ยนระดับสัญญาน ,TOIE ขัดจังหวะกรณีหมดเวลา รูปแบบของการกำหนด เป็นดังรูป
|------> INTE ----->
signal ------> GIE ----->|------> RBIE ---------> PIC Processor ( ทั้งหมดนี้อยู่ INTCON register 8bit ที่ตำแหน่ง 0x0B ]
|------> TOIE ----->
โดยต้องกำหนดค่า ตามลำดับเพื่อเปิดการรองรับ ซึ่งสามารถเปิดพร้อมกันหมดทุกตัวก็ได้แต่ต้องมีการตรวจสอบหลังเกิดขัดจังหวะแล้ว
และกำหนดแต่ละส่วน Sub-rutine มาลองรับ วิธีการกำหนดเพื่อเปิด Register
bsf INTCON, GIE bcf INTCON, GIE ;Gobal interrupt
bsf INTCON, INTE ถ้ากรณีปิดเพื่อยกเลิก } bcf INTCON, INTE ;Interrupt RB0/INT
bsf INTCON, RBIE bcf INTCON, RBIE ;Change in RB4 - RB7
bsf INTCON, TOIE bcf INTCON, TOIE ;Timer/Counter
เมื่อโปรแกรมรองรับการขัดจังหวะเริ่มทำงานต้องมีการปรับค่าสถาณะ ( Flag ) ที่แสดงว่ามีการขัดจังหวะเกิดขึ้น ออกโดยใช้คำสั่ง
bcf INTCON, INTF
bcf INTCON, RBIF
bcf INTCON, TOIF
การทำให้เกิดการขัดจังหวะทำได้โดย มีการให้สัญญานที่ขา RB0/INT ซึ่งรูปแบบสามารถกำหนดได้เช่น สัญญานขอบขาขึ้น ขอบขาลง
โดยกำหนดที่ Option Register ( bit6 ) ชื่อ INTEDG คำสั่งที่ใช้คือ
BSF OPTION_REG, INTEDG ;กำหนดให้ใช้สัญญานขัดจังหวะแบบขาขึ้น
การเขียนโปรแกรมส่วนเก็บสถาณะของ Register ต่างๆก่อนที่จะไปทำงานส่วนขัดจังหวะมีขั้นตอนดังนี้
SAVE: movwf temp_w ; เก็บค่าใน Register W ก่อน ซึ่งจำเป็นต้องทำเป็นอันดับแรก
swapf status,w ; เก็บค่า STATUS Register โดยใช้คำสั่ง swapf เพื่อไม่ให้กระทบ Register อื่น
movwf temp_s ; เก็บค่าที่ สลับมา (swapf) มาไว้ที่ตัวแปร temp_s
ที่ส่วนท้ายก่อนจบ โปรแกรมส่วนรองรับการขัดจังหวะ Interrupt service ends with
swapf temp_s,w ; สลับค่า จาก temp_s มาเก็บไว้ใน w ก่อน
movwf status ; ดึงค่า Status Register คืน
swapf temp_w,f ; สลับค่า จาก temp_w มาไว้ใน file
swapf temp_w,w ; ดึงค่า W Register คืนดังเดิม
retfie
เป็นการดึงค่าตัวแปร จากการไปเพิ่มค่า Program Couter ( PCL ) ขณะที่โปรแกรม กระโดดไปทำงานที่โปรแกรมย่อยเพื่อการ อ้างอิงค่า ตัวอย่างเป็นการ แสดงค่าออกที่ RB0 - RB6 ไปแสดงผลที่ตัวเลขดิจิตอล ( 7 segment ) โดยแสดงเฉพาะส่วนที่ ทำการจัดการด้านข้อมูลแสดงผลเท่านั้น โดยถือว่า PortB มีการจัดการกำหนดค่า Port เรียบร้อยแล้ว
DATAF equ 0x0c ;กำหนดตำแหน่ง file register movlw 0x00 ;ข้อมูลเช่น 0,1,2 กรณีนี้เป็นเลขศูนย์ movwf DATAF ;นำข้อมูลเข้า file register movf DATAF,w ;กำหนดค่า ไปไว้ใน W call segments;เรียกไปโปรแกรมย่อย movwf portb ;ส่งค่าออก ที่ Port B DONE: call& DONE ;จบโปรแกรม segment: addwf PCL, f ;เพิ่มค่าเข้าไปใน Program Counter retlw 3f ;แสดงค่า 0 ที่ตัวแสดงผลดิจิตอล retlw 06 ;ค่า 1 retlw 53 ;ค่า 2 ........เป็นต้น......... end
| เลข | ค่า Hex | ค่า Binary |
| 0 | 3f | 001 1111 |
| 1 | 06 | 000 0110 |
| 2 | 5b | 101 1011 |
| 3 | 4f | 100 1111 |
| 4 | 66 | 110 0110 |
| 5 | 6d | 110 1101 |
| 6 | 7d | 111 1101 |
| 7 | 07 | 000 0111 |
| 8 | 7f | 111 1111 |
| 9 | 6f | 110 1111 |
การใช้งานจากความสามารถของ PIC ส่วนนี้ สามารถประยุกต์ใช้ในการสร้าง สัญญาน Sqaure Wave ที่มีความสมบรูณ์ของรูป คลื่น (duty cycle) เท่ากันหรือไม่เท่าก็ได้ โดยอาจกำหนดให้ค่า 0 ที่ Port มีค่าเป็น Pluse 0 และ กำหนดค่า 1 ที่ Port มีค่าเป็น Pluse 1 ซึ่งถ้าใช้โปรแกรม หน่วงเวลาก็จะสามารถยืด เวลาของแต่ละส่วน Pluse ได้ ตัว PIC16F84 นี้สามารถรับสัญญานตั้งต้น หรือแหล่งกำเหนิดสัญญานนาฬิกา (clock) ได้จาก 2 แหล่ง คือ จากแหล่งกำเหนิด สัญญานนาฬิกาจากภายนอก และ อีกแหล่งหนึ่งคือ จากสัญญานนาฬิกาภายในซึ่งปกติต้องใช้ในการทำงานคำสั่งต่างๆ ของตัว CPU อยู่แล้ว สัญญานเหล่านี้จะสามารถนำมากระทำโดยการ หาร เพื่อให้ได้ขนาดตามที่ต้องการ จากนั้นการตรวจสอบสถาณะต่างๆ ทำได้โดยอ่านค่าจาก Output flag หรือ Overflow Flag ที่รีจีตเตอร์ TMR0 bit 5 มีค่าเป็น 1
ขั้นตอนโดยรวมของระบบการทำงานหน่วงเวลา มีเป็นข้อๆดังนี้
รายละเอียดโปรแกรมเป็นดังตัวอย่าง
การใช้งาน LCD กับ PIC