[ บทความ : มาเขียนโปรแกรมกับ 68HC11 กันเถอะ ตอนที่ 3 ]  เรจิสเตอร์และหน่วยความจำของ 68HC811E2

 

                 

            จากบทความตอนที่แล้ว เราได้รู้ถึงวิธีการใช้งาน Edit, Cross-32 รวมทั้งโปรแกรมอัพโหลดข้อมูลลงบอร์ดทดลอง (น่าจะเรียกว่าอัพโหลดลงชิพมากกว่าแฮะ... :D) ไปเรียบร้อยแล้ว หลายๆท่านคงจะคันไม้คันมือกันแล้วใช่ไหมครับ ... ฮาๆๆ บทความนี้ยังไม่มีการเขียนโปรแกรมครับ แต่ผมจะมาคุย (โม้) เรื่องรายละเอียด ที่เราต้องรู้เพื่อใช้ประกอบการเขียนโปรแกรมกันครับ นั่นก็คือเรื่องของ เรจิสเตอร์ และหน่วยความจำของ 68HC811E2 ไงครับ ... หลายท่านบอกว่าเริ่มจากการเขียนโปรแกรมไปเลยไม่ได้หรือ ... อืม... เท่าที่ผมทดลองและศึกษาการเขียนโปรแกรม ผมพบว่า การจะเขียนโปรแกรมอะไรสักอย่างหนึ่งนั้น อย่างน้อยเราต้องรู้ว่า เรากำลังเขียนอะไร และเขียนบนระบบอะไรก่อนครับ ไม่อย่างนั้น มันเหมือนพวกตาบอดคลำทางครับ ดังนั้น เพื่อไม่ให้เสียเวลา จนอาจจะหลงทางว่าจะต้องรู้แค่ไหน ปกติผมก็นิยมใช้วิธี รู้จากเปลือกนอกก่อนแล้วค่อยทำความเข้าใจเพิ่มขึ้นทีละนิดๆ แล้วมันก็จะรู้มากขึ้นเรื่อยๆ จริงไหมครับ ... ว่าแล้ว เรามาเริ่มเรียนรู้แบบทีละนิดละน้อย กันเถอะครับ ... ลุยล่ะ..

 

จุดประสงค์

                ศึกษาภาพรวมของเรจิสเตอร์ที่มีความสำคัญต่อการเขียนโปรแกรม และศึกษา การจัดระบบหน่วยความจำของ 68HC811E2 เพื่อเป็นพื้นฐานสำหรับการเขียนโปรแกรม

 

เรจิสเตอร์ภายในของ 68HC11E2

                  ในตัว 68HC811E2 นั้นจะมีเรจิสเตอร์ด้วยกันหลายประเภท แต่ในที่นี้ผู้เขียน ขอกล่าวถึงเฉพาะเรจิสเตอร์ที่เราต้องใช้ในกาเขียนโปรแกรมเป็นหลัก ซึ่งได้แก่

 

                 รายละเอียดของเรจิสเตอร์แต่ละตัวเป็นดังนี้ครับ

 A เป็น Accumulator  (ใช้ในการคำนวณ) ขนาด 8 บิต 
 เป็น Accumulator  (ใช้ในการคำนวณ) ขนาด 8 บิต 
D เป็น Register ขนาด 16 บิต ที่เกิดจากการนำ A กับ B มารวมกัน โดยมองว่า A เป็น Hi-Byte และ B เป็น Low-Byte
IX เป็นเรจิสเตอร์ขนาด 16 บิต ใช้เป็นตัวชี้ (Index-X)
IY เป็นเรจิสเตอร์ขนาด 16 บิต ใช้เป็นตัวชี้ (Index-Y)
SP เป็นเรจิสเตอร์ขนาด 16 บิต ใช้เป็นตัวชี้ตำแหน่งของสแต็ก (Stack Pointer)
PC  เป็นเรจิสเตอร์ขนาด 16 บิต ใช้เป็นตัวชี้ตำแหน่งของชุดคำสั่ง (Program Counter)
CCR เป็นเรจิสเตอร์ขนาด 8 บิต ที่ทำหน้าที่เก็บสถานะการทำงาน 68HC811E2 (flags)

                รายละเอียดของ CCR เป็นดังนี้

Bit no. หน้าที่
0 Carry/Borrow from MSB à (C)
1 Overflow à (O)
2 Zero à (Z)
3 Negative à (N)
4 Internal Interrupt Mask à (I)
5 Half carry (from bit 3) à (H)
6 External Interrupt mask à (X)
7 Stop disable à (S)

                                                                                                

ประเภทของข้อมูลที่ 68HC811E2 สามารถจัดเก็บและประมวลผลได้ จะมีด้วยกัน 4 ลักษณะ คือ ข้อมูลแบบบิต (Bit data), ข้อมูลจำนวนเต็มแบบ 8/16 บิต ทั้งแบบมีเครื่องหมาย/ไม่มีเครื่องหมาย (8-bit and 16-bit signed and unsigned data types), 16-bit unsigned fractions และ ตำแหน่งแบบ 16 บิต (16-bit addresses)

 

การเข้าถึงข้อมูล (แหล่งที่มาของข้อมูล)

                  การเข้าถึงข้อมูล (Addressing mode) ของ 68HC811E2 นั้นมีด้วยกัน 5 แบบ คือ 

immediate   ข้อมูลที่ส่งนั้นเป็นค่าของตัวเลขใดๆ 
Direct     ข้อมูลนั้นจะถูกเก็บเอาไว้ใน RAM (ณ ตำแหน่ง 00h-FFh) การอ้างอิงตำแหน่งนั้นจะใช้ได้ไม่เกิน 8 บิต (เพราะ RAM มีขนาด 256ไบต์)
Extended    ข้อมูลนั้นจะอยู่ในหน่วยความจำ ดังนั้น การอ้างอิงจึงมีช่วงค่าได้ตั้งแต่ 0000h – FFFFh (เนื่องจาก 68HC811E2 ที่ผมใช้นั้น บอร์ดออกแบบเป็น Single Chip จึงไม่ได้ต่อหน่วยความจำภายนอก เลยค่อนข้างแน่ใจว่า คงไม่ได้ใช้วิธีอ้างอิงตำแหน่งของข้อมูลแบบนี้ครับ)
Indexed  ข้อมูลจะถูกอ้างอิงผ่านระบบการชี้  IX กับ IY
Inherent   ข้อมูลจะอยู่ในเรจิสเตอร์

 

การแบ่งหน่วยความจำ

                ตัวไมโครคอนโทรลเลอร์ 68HC811E2 นั้น มีการจัดระบบหน่วยความจำ ที่ค่อนข้างซับซ้อนกว่า ไมโครคอนโทรลเลอร์ตระกูล MCS-51 แต่ผมจะไม่ลงรายละเอียดมากนัก จะขออธิบายเพียงสรุปส่วนสำคัญ ส่วนรายละเอียดลึกๆนั้น คงต้องอาศัยการศึกษาเพิ่มเติมกันตามสมควรครับ

                หน่วยความจำของ 68HC811E2 นั้น สามารถอ้างอิงได้สูงสุด 64 KB แต่เราจะไม่สามารถใช้ได้ทั้งหมด เนื่องจาก 68HC811E2 นั้น ทำการแบ่งหน่วยความจำออกเป็นหลายส่วน เพื่อใช้เก็บข้อมูลต่างๆ ที่จำเป็นในการทำงาน

 

หมายเหต  อย่าลืมว่า 68HC811E2 นั้นเป็นไมโครคอนโทรลเลอร์ ไม่ใช่ไมโครโปรเซสเซอร์ ดังนั้น ในตัวมันเองจึงมีทั้ง ส่วนประมวลผล, หน่วยความจำ, ส่วนควบคุม รวมทั้ง I/O อยู่ในตัวของมันเอง

                 โดยส่วนสำคัญที่ผมอยากแนะนำคือ

ตำแหน่ง หน้าที่
0000h – 00FFh เป็นส่วนของ RAM ที่เราสามารถใช้ในการเขียนโปรแกรม
F800h – FFFDh เป็นส่วนของหน่วยความจำที่เก็บโปรแกรม ที่เรียนขึ้นมา มีขนาดประมาณ 2KB
FFFEh – FFFFh เป็นส่วนที่เก็บตำแหน่งของรหัสโปรแกรม ที่จะเริ่มทำงานเมื่อเกิดการ Reset ระบบ

       

สรุป

                จากบทความตอนนี้ จะทำให้เรารู้ว่า ใน 68HC811E2 นั้นมีเรจิสเตอร์พื้นฐานชื่ออะไร และมีขนาดเท่าไร และนอกจากนี้ เราจะทราบแล้วล่ะว่า ทำไมในบทความก่อนหน้านี้ผมใช้  ORG  0000h,  ORG  0F800h และ ORG   0FFFEh  ทั้งนี้เพราะ ทั้ง 3 ตำแหน่งนี้ เป็นตำแหน่งหน่วยความจำ ที่ใช้เก็บข้อมูล (มีขนาด 256ไบต์) , เก็บรหัสโปรแกรม (ประมาณ 8KB) และ เก็บตำแหน่งของหน่วยความจำ ที่จะให้ 68HC811E2 เรียกขึ้นมาทำงาน หลังจากที่เกิดการ Reset ระบบ

                ในตอนต่อไป ผมจะกล่าวถึงเรื่องของพอร์ตของ 68HC81E2 พร้อมทั้ง มีตัวอย่างโปรแกรมเริ่มต้นสำหรับ ส่งข้อมูลออกทางพอร์ต เพื่อไปขับ LED ... ถ้าถามว่าทำไมต้องใช้ LED คำตอบนั้นก็คือ ก่อนหน้านี้ผมได้บอกไปแล้วว่า ผมจะใช้ LED เป็นส่วนแสดงผลการทำงานของโปรแกรมที่ผมเขียน ทั้งนี้เพราะ สะดวกต่อการต่อวงจร และ เพียงพอต่อการศึกษาการเขียนโปรแกรมภาษาแอสเซมบลีของ 68HC811E2

                บทความนี้คงเพียงเท่านี้ก่อนครับ ใครที่ยังสนใจ ก็อ่านต่อได้คราวหน้าครับ ... สวัสดีครับ

  


เขียนโดย : ศุภชัย  บุศราทิจ
Author : Supachai  Budsaratij
วันที่ทำการปรับปรุง : ๑๕ ต.ค. ๒๕๔๕