ว่าด้วยเรื่องของ DATA MEMORY ใน PIC16F87X (2)
Data memory ของ pic16F87X จะมีอยู่ 2 ส่วนคือ Special register memory และ General purpose register
Special register คือ register ที่ถูกใช้ โดย MCU และ Peripheral Modules เพื่อใช้ในการควบคุมการทำงานของ MCU โดย register พวกนี้จะมีชื่อเฉพาะอยู่แล้ว โดยสามารถเข้าถึงได้เหมือน RAM ปกติ
General purpose register คือ register ที่สามารถนำไปใช้งานทั่วๆไปได้ ขึ้นอยู่กับผู้ใช้งาน
รูปข้างล่างเป็น memory map ของ PIC16F87X
สำหรับ PIC16F876 และ PIC16F877 จะมี general purpose register อยู่ที่ address
ส่วน PIC16F873 PIC16F874 จะมี general purpose register น้อยกว่า PIC16F876-PIC16F877 ซึ่งจะมีที่ตำแหน่ง memory ดังนี้
ในการอ้าง memory ของ general purpose register ทำได้ 2 วิธีคือ แบบ direct access กับ indirect access
Direct access ก็คือการอ้าง address นั้นโดยตรงนั่นเองเช่น
Read
movfw 0x21 ; อ่านข้อมูลที่ address 0x20 ไปใส่ไว้ที่ w register
Write
movwf 0x40 ; เขียนข้อมูลที่อยู่ใน w register ไปไว้ใน address 0x40
จะเห็นว่า data memory ของ pic16F87X จะ แบ่งเป็น 4 bank ในการที่เราจะอ้าง memory แบบ direct access ที่ bank ไหนเราจะต้องสั่งให้ mcu ชี้ไปที่ bank นั้นเสียก่อน แล้วค่อยทำการ direct access โดย register ที่เกี่ยวข้องก็คือ STATUS register บิต 6 กับ 5 ซึ่งเรียกว่า RP1,RP0
เช่น
BSF STATUS,RP0 ; เลือก ไปยัง Bank1
BCF STATUS,RP1 ;
Indirect access คือการอ้าง memory ของ general purpose register ในตำแหน่งนั้นๆ โดยผ่าน register 2 ตัว คือ FSR และ INDF ซึ่ง FSR จะทำหน้าที่เหมือน pointer address ส่วน data ในการ read/write จะกระทำผ่านทาง INDF ตัวอย่างเป็นดังนี้
movlw 0x20 ; ใส่ค่า 20h ไปยัง w
movwf FSR ; ให้ pointer ชี้ไปยัง address 20h
clrf INDF ; ทำการ clear ค่า ณ ตำแหน่ง memory ที่ FSR ชี้อยู่
ในการใช้ indirect access สามารถอ้าง memory ได้ทีละ 2 bank คือ 0 กับ 1 หรือ 2 กับ 3 โดย register bit ที่ใช้ในการควบคุมคือ STATUS register บิต 7 (IRP) โดยที่ ถ้าบิตนี้เป็น
1 = Bank 2, 3 (100h 1FFh)
0 = Bank 0, 1 (00h FFh)
ดังนั้นต้องคอยระวังเวลาที่จะทำการอ้าง memory ของ PIC ไม่ว่าจะเป็น direct หรือ indirect ก็ตาม เพราะโอกาสผิดพลาดเกิดขึ้นได้