โครงสร้าง MEMORY ของ PIC16F87x (1)

Memory ใน PIC16F87X มีอยู่ 4 ประเภทคือ

PROGRAM MEMORY

PIC16F87x จะมีขนาดของ program memory ซึ่งสามารถอ้างได้ถึง 8K byte โดย PIC16F877/876 จะมีขนาดหน่วยความจำเท่ากับ 8K x 14 และ PIC16F873/874 มีขนาด 4K x 14 ซึ่ง ตำแหน่ง reset vector จะอยู่ที่ 0000h และ interrupt vector จะอยู่ที่ 0004h

Register ที่เกี่ยวข้องกับ program memory ของ PIC คือ PCL และ PCLATH ซึ่งก็คือ program counter LOW และ HIGH byte นั่นเอง โดยที่ LOW byte จะมีขนาด 8bit ส่วน HIGH byte จะมีขนาด 5 bit ซึ่งทำให้มีขนาดรวมกัน 13 bit ก็คือสามารถอ้างหน่วยความจำได้ 8K bytes นั่นเอง

PIC จะแบ่ง program memory ออกเป็น page ซึ่งแต่ละ page ก็จะมีขนาด 2 Kbytes ซึ่งคำสั่ง CALL และ GOTO สามารถสั่งให้ program counter กระโดดไปมาได้ในช่วง page เท่านั้นแต่ถ้าเมื่อเราต้องการกระโดดจาก page หนึ่งไปยังอีก page หนึ่ง เราจะต้องไปควบคุม PCLATH<4:3> (bit address ที่ 12 และ 13 ให้ชี้ไปยัง page ที่เราต้องการเสียก่อน หลังจากนั้นจึงเรียกคำสั่ง CALL หรือ GOTO ตามอีกที

Page 0 PCLATH<4:3> = 00

Page1 PCLATH<4:3> = 01

Page2 PCLATH<4:3> = 10

Page3 PCLATH<4:3> = 11

เมื่อเราใช้คำสั่ง CALL ไปที่ routine ใด routine หนึ่งแล้ว เราจะใช้คำสั่ง RETURN ในการกลับไป การ RETURN กลับนั้นเราไม่ต้องสั่ง PCLATH ให้ชี้ไปยัง Page ก่อนหน้าที่เราจะเรียก CALL เพราะค่า address ดังกล่าวจะถูกเก็บไว้ใน STACK เรียบร้อยแล้ว แต่สำหรับคำสั่ง GOTO เวลาข้าม page เราจะต้องสั่งให้ PCLATH ชี้ไปยัง page ที่เราจะไปทุกครั้ง สำหรับผมจะสร้าง marco ไว้ที่หัวโปรแกรม เพื่อเอาไว้เรียกใช้ในการข้าม page ให้สะดวกขึ้น

PAGE0 MACRO
BCF PCLATH,3
BCF PCLATH,4
ENDM

PAGE1 MACRO
BSF PCLATH,3
BCF PCLATH,4

ENDM

PAGE2 MACRO
BCF PCLATH,3
BSF PCLATH,4

ENDM

PAGE3 MACRO

BSF PCLATH,3
BSF PCLATH,4
ENDM

เวลาจะข้าม page ก็เรียก macro เช่น

PAGE2 // เตรียมกระโดดไป page 2

CALL BCDCONV // เรียก routine ที่เราต้องการ

 

 

BACK