ว่าด้วยเรื่องของ 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 ก็ตาม เพราะโอกาสผิดพลาดเกิดขึ้นได้

 

BACK