Hardware
เบื้องต้นของ PIC16F84(A)
PIC16F84A จะมีโครงสร้างแบบ RISC(Reduced Instruction
Set Computer) PIC ในตระกูล 16xxx จะมีคำสั่งให้ใช้ทั้งหมด 35 คำสั่ง หากต้องการทราบลายละเอียดเพิ่มเติมสามารถ
Download Datasheet ของ PIC16F84A ไปอ่านได้ครับ
โครงสร้างขาของ PIC16F84A

OSC1/CLKIN : Oscillator crystal input /
External clock source input.
OSC2/CLKOUT : Oscillator crystal output.
ทั้งสองขานี้จะต่อกับ crystal หรือ resonator ในกรณีที่อยู่ใน crystal oscillator
mode(ใช้สัญญาณนาฬิกาจากภายนอก)
MCLR(inv) : Master clear(reset)input /
Programming voltage input. เมื่อขานี้เป็น LOW แล้ว MCU
จะถูก reset อีกหน้าที่หนึ่งของขานี้ก็คือจะเป็น input ของ voltage programming
ขณะที่ทำการ program ตัว MCU
RA0 - RA3 : Bi-directional
I/O port. เป็นพอร์ตแบบ สองทิศทาง คือเลือกให้เป็น INPUT หรือ OUTPUT ก็ได้อย่างใดอย่างหนึ่ง
RA4/T0CKI : Bi-directional I/O port. เป็นพอร์ตแบบสองทิศทาง
คือเลือกให้เป็น INPUT หรือ OUTPUT ก็ได้อย่างใดอย่างหนึ่ง อีกหน้าที่หนึ่งก็คือ
Clock input to the TMR0 timer/counter. เป็น input ของ สัญญาณนาฬิกาเพื่อป้อนให้กับ
Timer 0 ซึ่งอยู่ภายใน MCU ในกรณีที่เลือกว่าแหล่งของสัญญาณนาฬิกาที่ป้อนให้กับ
Timer 0 ให้ใช้จากภายนอก
RB0/INT : Bi-directional I/O port. เป็นพอร์ตแบบสองทิศทาง
คือเลือกให้เป็น INPUT หรือ OUTPUT ก็ได้ อย่างใดอย่างหนึ่ง อีกหน้าที่หนึ่งก็คือ
External interrupt pinรับสัญญาณ interrupt เมื่อเกิดการเปลี่ยนแปลงของสัญญาณที่ขานี้
RB1 - RB7 : Bi-directional I/O port. เป็นพอร์ตแบบสองทิศทาง คือเลือกให้เป็น
INPUT หรือ OUTPUT ก็ได้ อย่างใดอย่างหนึ่ง
VSS : Ground
VDD : Positive supply(+2.0V to +5.5V)

ใจเย็นๆ ครับอย่าพึ่งมึนครับ รูปมันทำให้ดูยากเฉยๆเท่านั้นเอง
เดี๋ยวจะอธิบายทีละส่วนครับ
- Flash Program Memory
Flash memory เป็นพื้นที่หน่วยความจำสำหรับเก็บ program ที่เราเขียนขึ้น ซึ่งมีขนาด1,024
words ถึงแม้ว่าจะไม่มีไฟฟ้าจ่ายให้กับ MCU ข้อมูลที่เก็บอยู่ใน flash memory
ก็จะไม่หายไป จุดเด่นของ Flash memory ก็คือสามารถเขียนทับเข้าไปใหม่ได้หลายๆ
ครั้ง ซึ่งจำนวนครั้งจะอยู่ที่ประมาณ 1000 ครั้ง
ภายใน program memory อาจสามารถแบ่งเป็นส่วนๆ ได้ดังนี้
Reset Vector ( 0000h ) เมื่อการ reset เกิดขึ้นเนื่องจากมีการป้อนไฟเข้า
MCU เป็นครั้งแรก หรือเกิด WDT(Watchdog Timer) time-out หรือในกรณีอื่นๆ โปรแกรมจะเริ่มต้นหลังจาก
reset ณ ตำแหน่งนี้
Peripheral Interrupt Vector ( 0004h ) เมื่อเกิดการ
interrupt ขึ้น program memory pointer จะชี้มายัง ณ ตำแหน่งนี้
Configuration word ( 2007h ) การทำงานเบื้องต้นของ PIC จะถูกกำหนดที่หน่วยความจำตรงนี้
ไม่ว่าจะเป็น Enable/Disable Power-up timer, Enable/Disable Watchdog timer, Oscillator
Selection bits(กำหนดที่มาของสัญญาณนาฬิกา) หน่วยความจำที่ตำแหน่งนี้ไม่สามารถเขียนได้ด้วยการเขียนโปรแกรม
จะต้องกำหนดในขณะทำการเขียนโปรแกรมลงสู่ Flash memory ของ MCU
- RAM(Random Access Memory) File Registers
หน่วยความจำของ RAM ภายใน PIC16F84(A) จะมีโครงสร้างเป็นแบ่งเป็น bank โดยจะมีขนาด
80 bytes(00h-4Fh) ต่อ bank ในกรณีของ PIC16F84A จะมี 2 banks Memory ในส่วนนี้จะถูกแบ่งออกเป็น
2 ส่วนคือ
ส่วนแรก 12 bytes(00h-0Bh) ของแต่ละ bank ซึ่งจะถูกเรียกว่า SFR(Special Function
Registers) จะใช้สำหรับบันทึกสถานะการทำงานของ PIC, เงื่อนไขของการกำหนดสถานะของ
port ว่าเป็น input/output ports และเงื่อนไขอื่นๆ ส่วนที่สองจะมีขนาด 68 bytes(0Ch-4Fh)
ซึ่งเริ่มตั้งแต่ ไบต์ที่ 13 จะถูกเรียกว่า GPR(General Purpose Registers) ซึ่งสามารถใช้เป็นหน่วยความจำที่จะเก็บผลลัพธ์
และเงื่อนไขต่างๆ เพื่อใช้ในการประมวลผลโปรแกรมขณะโปรแกรมทำงาน ถึงแม้ว่า PIC16F84A
จะมี 2 bank แต่ SFR จะมีทั้งหมดเพียง 16 ชนิดไม่ใช่ 24 ชนิด โดย SFR บางตัวจะมีอยู่ทั้ง
2 bank ส่วน GPR ถึงแม้จะเปลี่ยน bank ก็ยังคงชี้ไปยังตำแหน่งเดิมเพราะ 16F84A
มี GPR อยู่เพียง bank เดียวเท่านั้น และเมื่อไม่มีไฟฟ้าจ่ายให้กับ PIC ค่าใน memory
ส่วนนี้จะหายไปหมด อย่างไรก็ตามพื้นที่ใน GPR สามารถเขียนใหม่กี่ครั้งก็ได้ ไม่มีข้อจำกัดจำนวนครั้ง
- EEPROM(Electrically Erasable Programmable Read
Only Memory)
หน่วยความจำในส่วนนี้เมื่อไม่มีไฟฟ้าจ่ายให้กับ MCU แล้วข้อมูลที่อยู่ภายในยังคงอยู่จะไม่หายไป
และสามารถเขียนด้วยคำสั่งของ program จะมีขนาด 64 bytes. อย่างไรก็ตามการเขียนซ้ำก็มีข้อจำกัดโดยสามารถเขียนทับใหม่ได้ประมาณ
1 ล้านครั้ง ดังนั้นหน่วยความในส่วนนี้จะใช้เก็บข้อมูลที่ไม่ค่อยจะเปลี่ยนแปลงบ่อยนัก
หน่วยความจำในส่วนนี้สามารถเก็บข้อมูลได้นาน 40 ปี
- SFR Registers
SFR(Special Function Registers) มีอยู่ 16 ชนิดด้วยกัน ซึ่งสามารถอ้างถึงด้วยการ
เปลี่ยนตำแหน่งของ bank ที่จะอ้าง จากรูปข้างล่างแสดงถึงโครงสร้างของ File Registers.
ทั้งหมดจะมีขนาด 160 bytes แต่ในข้อเท็จจริงแล้วจะไม่สามารถอ้างได้ครบทั้งหมด
ในส่วนที่เป็นสีขาวแล้วมีลูกศรชี้จะหมายถึงว่า ถ้าเราอ้าง RAM ที่ตำแหน่งนี้ใน
BANK 1 ค่าที่ได้ก็คือค่าทางซ้ายมือที่อยู่ใน BANK 0 นั่นเอง เช่นเมื่อเราอ้างที่
address 84h ใน Bank 1 ค่าที่ได้ก็จะเป็น ค่า FSR ที่อยู่ใน BANK 0 สำหรับในส่วนที่เป็นสีเทาก็
คือ memory ที่ไม่สามารถอ้างถึงได้
ตัวแปรใน SFR มีดังนี้
INDF : จะเก็บค่าของ Data memory ที่ถูกชี้แบบ
indirect addressing
TMR0 : เป็นTimer counter ของ Timer 0
PCL : เก็บค่า 8 bits ล่างของ program counter
STATUS : จะเก็บค่า Flag ของผลลัพธ์ที่เกิดจากการคำนวณ
FSR : เป็น pointer ใช้สำหรับอ้างอิง data memory
แบบ indirect
PORTA : เก็บค่าสถานะของ PORTA
PORTB : เก็บค่าสถานะของ PORTB
EEDATA : เก็บค่าของ Data ที่ EEPADR ชี้อยู่
EEADR : ตำแหน่งของ EEPROM ที่ต้องการอ้างถึง
PCLATH : เป็น 5 bits บนของ program counter
INTCON : ใช้คำคุมการเกิด Interruption
OPTION_REG : ใช้สำหรับกำหนด Mode การทำงานของ
MCU
TRISA : ใช้กำหนด Mode ของ PORTA ว่าเป็น INPUT
หรือ OUTPUT
TRISB : ใช้กำหนด Mode ของ PORTB ว่าเป็น INPUT
หรือ OUTPUT
EECON1 : เป็น register ที่ใช้ควบคุม EEPROM
EECON2 : เป็น register ที่ใช้ป้องกันการเขียน
EEPROM
- Program Counter
เป็น counter ที่แสดงถึงตำแหน่ง address ของ program ที่เขียนเข้าไปไว้ใน flash
memory ที่กำลังทำการประมวลผล ซึ่งจะเป็น counter ขนาด 13 bits โดยทั่วไปแล้ว
counter ตัวนี้จะเพิ่มขึ้น 1 ทุกๆ ครั้งเมื่อมีการประมวลผลคำสั่งเกิดขึ้น 1 ครั้ง
ซึ่งค่าที่แสดงก็คือตำแหน่งของคำสั่งต่อไปที่จะทำการประมวลผล แต่เมื่อประมวลคำสั่ง
JUMP ตัว counter จะมีค่าเท่ากับตำแหน่งที่คำสั่ง JUMP นั้นอ้างถึง
- 8 Level Stack
stack คือ memory ซึ่งจะเก็บค่า return address ของ program ตัวอย่างเช่น เมื่อต้องทำการประมวลผลอย่างหนึ่งหลายๆ
ครั้ง ซึ่ง program ในส่วนนี้ถูกสร้างเป็น subroutine ไว้ ในตอนสุดท้ายของ subroutine
ก็จะมีคำสั่ง RUTURN ทุกครั้ง ในการเรียกใช้เราจะใช้คำสั่ง CALL ในการเรียก subroutine
ตำแหน่ง program address ที่ถัดจากคำสั่ง CALL ก็จะถูกเก็บลงสู่ stack (กระบวนการนี้บางครั้งจะเรียกว่า
PUSH) หลังจากได้ประมวลผลคำสั่งใน subroutine แล้ว ในตอนสุดท้ายเมื่อมาเจอคำสั่ง
RETURN มันก็จะทำการกระโดดไปยังตำแหน่งที่เก็บไว้ใน stack (กระบวนการนี้บางครั้งจะเรียกว่า
POP) แต่เนื่องจากว่า stack มีขนาดเพียง 8 เท่านั้น นั่นก็หมายความว่าเราสามารถเรียก
คำสั่ง CALL ได้ เก้าครั้งติดต่อกันเท่านั้น ซึ่งถ้าใช้คำสั่ง CALL ไปมากกว่านั้นโดยไม่
RETURN กลับ ค่า stack จะถูกทับเป็นผลทำให้ เมื่อใช้คำสั่ง RETURN ก็จะไม่สามารถกลับไปยังตำแหน่งเดิมได้

- Instruction Register
คำสั่งต่างๆ ของโปรแกรม ที่ถูกชี้โดย program counter จะถูกอ่านข้าไปยัง register
ตัวนี้ โดยกระบวนการนี้จะถูกเรียกว่า FETCH.
- Instruction Decode & Control
คำสั่งที่ถูก FETCH ไว้ใน instruction register จะถูกแปลความหมายและทำงานตามคำสั่งนั้น
- Multiplexer and Arithmetic Logic Unit
โดยการแปลความหมายและทำงานตามคำสั่งจะถูกกระทำโดย Multiplexer และ the Arithmetic
Logic Unit(ALU)
- W Register
ย่อมาจาก work register มันจะมีหน้าที่สำหรับเก็บผลของการคำนวณที่เกิดจาก ALU
เอาไว้ชั่วคราว เพื่อที่จะนำมาคำนวณต่อไป ตัวของมันจะทำหน้าที่เป็นตัวกลางในการคำนวณต่างๆ
และมันยังทำหน้าที่ส่งผ่านสถานะoutput ของ input-output port อีกด้วย
- STATUS Register
เป็น register ซึ่งจะเก็บค่าผลของ ALU(เช่น ผลลัพธ์ของการ บวก ลบ ของ register
เป็น 0, บวก, ลบ), เงื่อนไขการเกิด timeout , เป็นตัวกำหนดว่าขณะนี้ PIC อ้าง
register ที่ bank ไหน
- FSR Register
FSR(File Select Register) ใช้สาหรับอ้างตำแหน่งของ RAM ในรูปแบบ indirect address
การอ้างแบบ direct address ก็คือรูปแบบที่อ้างถึง Address
นั้นโดยเฉพาะเจาะจงเลย เช่น movfw h20 ซึ่งหมายความว่าทำการอ่านค่า ที่ address
20 มาเก็บไว้ที่ w register ในกรณีนี้สามารถอ้างตำแหน่งได้ตั้งแต่ 0 ถึง 127
หรืออ้างได้เพียง 7 bit ซึ่งจะอยู่ในขอบเขต 1 bank ในการที่จะเปลี่ยน bank จำเป็นที่จะต้องเกี่ยวข้องกับ
RP0 bits ของ STATUS register การอ้างแบบ indirect address โดยใช้ FSR register
จะนิยมใช้ในการอ้าง address ที่อยู่ติดๆ กันด้วยการอาศัยคำสั่ง inc FSR เพื่อเลื่อนไปยังตำแหน่ง
memory ถัดไป
- Address Multiplexer
ใช้เป็นตัวแบ่งแยกว่าเป็น indirect addressing หรือ the direct address. ซึ่งหมายความว่าทำการอ่านค่า
ที่ address 20 มาเก็บไว้ที่ w register ในกรณีนี้สามารถอ้างตำแหน่งได้ตั้งแต่
0 ถึง 127 หรืออ้างได้เพียง 7 bit ซึ่งจะอยู่ในขอบเขต 1 bank ในการที่จะเปลี่ยน
bank จำเป็นที่จะต้องเกี่ยวข้องกับ RP0 bits ของ STATUS register การอ้างแบบ
indirect address โดยใช้ FSR register จะนิยมใช้ในการอ้าง address ที่อยู่ติดๆ
กันด้วยการอาศัยคำสั่ง inc FSR เพื่อเลื่อนไปยังตำแหน่ง memory ถัดไป
- Address Multiplexer
ใช้เป็นตัวแบ่งแยกว่าเป็น indirect addressing หรือ the direct address.
- EEDATA
เป็น register ที่จะใช้เมื่อมีการอ่านหรือเขียนข้อมูล EEPROM
- EEADR
เป็น register ที่ใช้สำหรับอ้าง address ของ EEPROM. ซึ่งใน PIC16F84A จะมีหน่วยความจำ
EEPROM อยู่ทั้งหมด 64 bytes เมื่อจะทำการเขียน EEPROM จะต้อง เขียนข้อมูล 55h
และ AAh ไปยัง EECON2 เสียก่อนจึงจะเริ่มต้นการเขียน EEPROM ได้
- Timer
PIC16F84A จะมี timer เพียงแค่ตัวเดียว (TMR0) มีขนาด 8 bits การทำงานของมันก็คือมันจะทำการนับไปเรื่อยๆ
และจะเกิดการ time-out เมื่อการนับมาถึง 256 ซึ่งจะทำให้ T0IF bit ของ INTCON
register ซึ่งเป็น SFR กลายเป็น "1" ซึ่งมีผลทำให้เกิดการ interrupt เกิดขึ้นเมื่อเกิดการ
time-out. สำหรับการที่จะกำหนดว่าจะให้มีการ interrupt ของ TMR0 เกิดขึ้นได้หรือไม่นั้นกำหนดได้จาก
the GIF bit และ T0IE bit ของ INTCON register ซึ่งเป็น SFR โดยถ้าเป็น "1" ก็หมายความว่ากำหนดให้มีการ
interrupt เกิดขึ้นได้
- I/O Ports
PIC16F84(A) จะมี I/O Ports ทั้งหมด 13 ขา ซึ่งการกำหนดว่าจะให้ขานั้นเป็น INPUT
หรือ OUTPUT นั้นสามารถกำหนดได้ด้วยโปรแกรม ทั้ง 13 ขานั้นสามารถแบ่งออกได้เป็น
2 กลุ่มด้วยกันก็คือ 5 ขาเป็น A port และอีก 8 ขาที่เหลือเรียกว่า B port
- Timing Generation
PIC จะมีวงจรภายในที่จะสร้างสัญญาณนาฬิกาในการกำหนดความจังหวะของการทำงานของตัวมัน
โดยสัญญาณนาฬิกานี้จะมีแหล่งกำเนิดมาจาก crystal หรือ ceramic oscillator จากภายนอก
เมื่อสัญญาณนาฬิกาต้องการความแม่นยำสูงเราจะต้องเลือกใช้ crystal แต่โดยปกติทั่วๆไปแล้วจะใช้
ceramic resonator ต่อเข้ากับ capacitors เป็น module อยู่ภายนอก PIC16F84A จะ
execute 1 คำสั่ง(1 cycle) จะใช้สัญญาณนาฬิกา 4 pulses โดยจะใช้ pipeline architecture
แต่ในกรณีของคำสั่ง JUMP จะใช้ 2 cycle สำหรับเวลาที่ใช้ในการ execute นั้นโดยปกติแล้วจะใช้เวลา
200 nanoseconds ถ้าใช้ crystal ที่ความถี่ 20MHz, 1/(20MHz) = 50 nanoseconds.
หมายความว่าสามารถ execute คำสั่ง 5,000,000 instructions ภายในเวลา 1 วินาที
- Initialization circuits
ภายใน PIC16F84A จะต้องมีการกำหนดคุณสมบัติการทำงานให้แต่ตัวมันหลายอย่างดังนี้
POWER ON Timer
|
:
|
เป็น Timer ที่ใช้สำหรับสร้างช่วงระยะเวลาก่อนที่จะใช้
MCU ทำงานเพื่อรอจนกระทั่งแรงดันไฟฟ้าที่ป้อนให้กับ MCU จะนิ่งในกรณีเมื่อมีการป้อนไฟเข้าไปใหม่
|
OSC StartTimer
|
:
|
เป็น Timer ที่ใช้สำหรับสร้างช่วงระยะเวลาก่อนที่จะใช้
MCU ทำงานเพื่อรอจนกระทั่งสัญญาณนาฬิกาที่ป้อนให้กับ MCU จะนิ่งในกรณีเมื่อมีการป้อนไฟเข้าไปใหม่
|
POW ON Reset
|
:
|
จะทำการ RESET วงจรภายใน PIC ใหม่เมื่อมีการป้อนไฟเข้าไปใหม่
|
Watchdog Timer
|
:
|
เป็น Timer สำหรับจับเวลาว่าโปรแกรมบางช่วงใน PIC
ทำงานนานเกินไปหรือไม่ เพื่อป้องกันอาการที่เรียกว่า Dead Lock ซึ่ง Timer
ตัวนี้จะต้องทำการ clear ด้วยคำสั่งทาง software เมื่อ timer ตัวนี้นับจนกระทั่ง
time-out เกิดขึ้น PIC จะกลับไปอยู่ในสถานะเหมือนกับสภาพที่มีการป้อนไฟเข้าไปใหม่
|
BACK