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

- มีคำสั่ง 33 คำสั่ง
- ทุกคำสั่งใช้เวลาปฏิบัติการแบบบรานซ์ต้องใช้เวลาถึงสองไซเคิล
- ความเร็วในการทำงาน : จากช่วงดีซี - สัญญาณนาฬิกาอินพุตเท่ากับ 4 เมกะเฮิรตซ์ หรือจากช่วงดีซี - ไซเคิลคำสั่งเท่ากับ 1 ไมโครวินาที
- คำสั่งมีขนาดกว้าง 12 บิต
- บัสข้อมูลกว้าง 8 บิต
- หน่วยความจำเก็บโปรแกรมเป็นอีพรอมขนาด 12 บิต มีความจุ 512 ไบต์ ถึง 2 กิโลไบต์
- รีจิสเตอร์ใช้งานทั่วไปขนาด 8 บิตมี 25
- รีจิสเตอร์ฮาร์ดแวร์ที่ทำหน้าที่พิเศษมี 7 ตัว
- สแต็กฮาร์ดแวร์มีความลึก 4 ระดับ
- มีโหมดการอ้างอิงแอดเดรสของข้อมูลและคำสั่งแบบโดยตรง, โดยอ้อมและแบบสัมพันธ์
- Port สามารถควบคุมทิศทางทำโดยการใช้ขา I/O ถึง 20 ขา
- มีตัวนับเวลา/สัญญาณเวลาขนาด 8 บิต (RTCC) กับตัวตั้งค่าที่โปรแกรมได้ขนาด 8 บิต
- มีตัวรีเซตกำลังไฟ (Power-on Reset)
- มีตัว OAR (Oscillator Start-up Timer)
- มีตัว WDT (Watchdog Timer) กับออสซิลเลเตอร์แบบ RC เพื่อใช้ในการปฏิบัติการที่เชื่อถือได้
- มีฟิวส์อีพรอมพิเศษเพื่อป้องกันการลอกเลียนแบบซอร์สโค้ด
- มีโหมด SLEEP ลดการสูญเสียพลังงานเมื่อไม่ได้ใช้งาน
- มีออสซิลเลอเตอร์ให้เลือกใช้เพื่อกำหนดไปยังอีพรอมแบบต่าง ๆ ดังนี้
	+ ออสซิลเลเตอร์แบบ RC ที่มีราคาถูก : RC
	+ คริสตอล/รีโซเนเตอร์มาตรฐาน : XT
	+ คริสตอล/รีโซเนเตอร์ความเร็วสูง : HS
	+ คริสตอลความถี่ต่ำ, กินไฟน้อย : LP
- กินไฟต่ำ, ใช้อีพรอมแบบ CMOS ที่มีความเร็วสูง
- ค่าศักดาไฟในช่วงที่ใช้งาน 2.5 โวลต์ ถึง 6.25 โวลต์
- กินไฟต่ำ - น้อยกว่า 2 มิลลิแอมป์ที่แรงดัน 5 โวลต์ ความถี่ 4 เมกเฮิรตซ์
- น้อยกว่า 15 ไมโครแอมที่แรงดัน 3 โวลต์ ความถี่ 32 กิโลเฮิรตซ์

ตารางสรุป คำสั่งทั้งหมด ของ PIC

การเขียนโปรแกรมลงไปบน PIC eeprom ต้องอาศัยเครื่องโปรแกรม ซึ่งถ้าจะทำเองก็ได้ โดยดูที่ http://www.jdm.homepage.dk/newpic.htm หรืออาจจะสนับสนุน คนไทยเขาทำขายที่ http://www.geocities.com/mpu51/jdm84/jdm84.htm ของเขาขนาดเล็กนิดเดียวแถมไม่ต้องใช้ไฟจากภายนอก
Program PonyProg V1.17a
การเซ็ตโปรแกรม PonyProg ให้ใช้งานกับ JDM84 (16x84)




Interruption for PIC 16F84 การทำงานแบบ ขัดจังหวะของระบบไมโครโปรเซสเซอร์ PIC16F84


ในขณะที่ PIC ทำงานตามโปรแกรมหลัก เราสามารถเขียนโปรแกรมแบบที่ ให้ PIC รองรับเหตุการทำงาน (event) แบบขัดจังหวะได้โดย เขียนส่วน Code เป็น Sub ไว้ และกำหนดส่วน Call ไว้ที่ตำแหน่ง 004 ดังรูปแบบโครงโปรแกรม ส่วนเรื่องการจัดลำดับของการขัดจังหวะ สามารถ Check หลังจากเกิดสัญญาณแล้ว จาก bit I/O Port

LIST p=16F84
#include <c:\lib\p16f84.inc> ;ส่วนกำหนด ตัวแปรชื่อมาตราฐาน
ORG 000H ;เริ่มต้นโปรแกรมปกติ
GOTO MAIN ;การเรียกไปทำงานโปรแกรมปกติ

ORG 004H ;ตำแหน่งเริ่มต้นการรองรับการขัดจังหวะ
GOTO INT_SERV ;การเรียกไปโปรแกรม รองรับการการขัดจังหวะ แล้วก็ กลับมาทำต่อที่จุดโดนขัดจังหวะ
MAIN:
ส่วนโปรแกรม กำหนด Register ต่างๆเพื่อรองรับ Interrupt
ส่วนโปรแกรมหลัก
การวนกลับต่างๆ Loop

INT_SERV:
ส่วนเก็บสถาณะต่างๆก่อนเกิด การขัดจังหวะ
ส่วนโปรแกรมรองรับ Interrupt
ส่วนดึงสถาณะกลับคืน

RETFIE ;ส่วนย้อนกลับไปทำงานที่ โปรแกรมหลัก
end ;จบโปรแกรม

การกำหนด 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

ส่วนวงจรอิเลคทรอนิคส์ที่ใช้ทำ สัญญานขัดจังหวะ ( Pluse Interrupt ) สามารถใช้ NotGate 7400 ที่ขา Input ต่อ C ขนาด 0.05 uF อณุกรมไว้ และหลังจากนั้นต่อ R ขนาด 330 โอมห์ ลงกราวด์ จะได้สัญญานขนาด 16 uSec
กรณีต้องการรับสัญญานขัดจังหวะจาก [หลายจุด] สามารถใช้ Flip Flop เข้ามาช่วยโดยให้ สัญญานขัดจังหวะส่วนหนึ่งป้อนเข้าที่ ขา RB0/INT และอีกส่วนหนึ่งป้อนเข้าที่ขา CLK ของ Flip Flop เพื่อค้างสถาณะที่ Q ไปป้อนที่ขา Input อื่นๆ จากนั้นเมื่อ PIC วิ่งไปทำงานที่ ส่วนโปรแกรมรองรับการขัดจังหวะแล้ว ก็จะสามารถมาตรวจสอบที่ขา Input นั้นๆเพื่อแยกแยะการตอบสนองต่อ ไปตาม รูปแบบที่ออกแบบรองรับไว้


การเขียนโปรแกรมแบบ อ้างอิงแปรตาราง LookUp Table

เป็นการดึงค่าตัวแปร จากการไปเพิ่มค่า 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

การใช้งาน โปรแกรมตั้งเวลาหรือหน่วงเวลา และ โปรแกรมนับ Timer and Counter.

การใช้งานจากความสามารถของ 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

ขั้นตอนโดยรวมของระบบการทำงานหน่วงเวลา มีเป็นข้อๆดังนี้

1. กำหนด การเลือกแหล่งกำเหนิดสัญญานนาฬิกาว่าจะ เลือกจากแหล่งใด โดยถ้าเป็นภายนอกสามารถนำเข้าที่ Port ขา Input

2. กำหนด ว่าจะผ่านวงจรการหาร ( Prescaler ค่าสเกล ) หรือไม่

3. ถ้าใช้ ก็กำหนด Prescaler บิทซึ่งอยู่ที่ 3 บิทสุดท้ายของ Option register โดยมีค่าตัวหารเป็น 2 ยกกำลัง N

4. ผ่านวงจรนับ Counter

5. ขั้นตอนการตรวจสถาณะผลลัพธ์ Output Flag ที่ TMR0 bit 5

รายละเอียดโปรแกรมเป็นดังตัวอย่าง


การใช้งาน LCD กับ PIC

LCD เป็นตัวแสดงผลที่ดีกว่าตัวแสดงผลแบบ 7 segment เนื่องจากสามารถแสดงตัวอักษรข้อความได้ชัดเจนและยังสามารถรับภาระ ด้านการเลื่อน แทรก ค้างข้อความ ค้างข้อมูลไว้ในหน่วยความจำเฉพาะ รวมถึงสามารถอ่านกลับมาที่ CPU ได้ด้วย ขั้นตอนการทำงานอย่าง ย่อคือ เริ่มป้อนไฟแล้วรอการ reset อย่างน้อย 5 Msec จากนั้นเป็นการส่งสัญญานควบคุมโดยให้ ขาสัญญาน 0,0 และสุดท้ายเป็นการ ส่งค่าตำแหน่งและรหัสตัวอักษร
ปัญหาเท่าที่พบส่วนใหญ่เกิดจากการ ขั้นตอนการ Initialize ไม่สมบูรณ์ ซึ่งอาจเกิดจากการ หน่วงเวลาแต่ละคำสั่ง การควบคุมขา E ชึ่ง ต้องเหมาะสมกับกลาง Plus ของขาข้อมูล ( Data ) อื่นๆ ดูรูปสัญญานประกอบ
การ Control LCD นั้นสามารถควบคุมแบบปกติโดยใช้ขา Data 8 bit และขา Control อีก 4 bit หรือยังสามารถควบคุม data โดยใช้แบบ 4 bit แต่ต้องส่งคำสั่ง 2 ครั้ง นอกจากนี้ยังสามารถควบคุม Data โดยใช้ 1 bit ก็ได้แต่ต้องใช้ IC FlipFlop มาควบคุมด้วย ดูรูปวงจร ประกอบ


ขั้นตอนการการควบคุม LCD มีดังนี้

1. ป้อนไฟเข้าตัว LCD แล้วรออย่างน้อย 5 MinSec เพื่อให้เกิดการ Reset วงจรภายใน
2. ส่งคำสั่งควบคุมเพื่อ เลือกแบบการส่ง Data ว่าเป็นแบบ 4 หรือ 8 bit ( ที่ตัว LCD สามารถเลือกได้ 2 แบบนี้โดยไม่ใช่ IC เพิ่ม )
แต่กรณี Port ของ CPU ไม่พอใช้งานก็สามารถประยุกต์ Ship Register มาช่วยทำงานได้ โดยเหลือใช้ขา ควบคุมเพียง 2 Port
3. ส่งสัญญาน ขา E เพื่อให้เกิดการรับคำสั่งเข้าไป
4. รอการประมวลผลคำสั่งประมาณ 400 uSec หรือจะใช้วิธีการอ่าน สัญญาน Busy ระบบของ LCD ก็ได้
5. ส่งคำสั่งเพื่อควบคุม จำนวนบรรทัด การกระพิบ ตำแหน่งตัวอักษร การควบคุมทิศทาง และการแสดงหน้าจอ
6. ส่งค่า Ascii ของตัวอักษรที่ต้องการแสดงผลออกไป

Hosted by www.Geocities.ws

1