[ บทความ : มาเขียนโปรแกรมกับ 68HC11 กันเถอะ ตอนที่ 3 ] เรจิสเตอร์และหน่วยความจำของ 68HC811E2 |
จากบทความตอนที่แล้ว
เราได้รู้ถึงวิธีการใช้งาน
Edit, Cross-32 รวมทั้งโปรแกรมอัพโหลดข้อมูลลงบอร์ดทดลอง
(น่าจะเรียกว่าอัพโหลดลงชิพมากกว่าแฮะ...
:D) ไปเรียบร้อยแล้ว
หลายๆท่านคงจะคันไม้คันมือกันแล้วใช่ไหมครับ
... ฮาๆๆ
บทความนี้ยังไม่มีการเขียนโปรแกรมครับ
แต่ผมจะมาคุย (โม้)
เรื่องรายละเอียด
ที่เราต้องรู้เพื่อใช้ประกอบการเขียนโปรแกรมกันครับ
นั่นก็คือเรื่องของ เรจิสเตอร์
และหน่วยความจำของ 68HC811E2 ไงครับ
...
หลายท่านบอกว่าเริ่มจากการเขียนโปรแกรมไปเลยไม่ได้หรือ
... อืม...
เท่าที่ผมทดลองและศึกษาการเขียนโปรแกรม
ผมพบว่า
การจะเขียนโปรแกรมอะไรสักอย่างหนึ่งนั้น
อย่างน้อยเราต้องรู้ว่า
เรากำลังเขียนอะไร
และเขียนบนระบบอะไรก่อนครับ
ไม่อย่างนั้น
มันเหมือนพวกตาบอดคลำทางครับ
ดังนั้น เพื่อไม่ให้เสียเวลา
จนอาจจะหลงทางว่าจะต้องรู้แค่ไหน
ปกติผมก็นิยมใช้วิธี
รู้จากเปลือกนอกก่อนแล้วค่อยทำความเข้าใจเพิ่มขึ้นทีละนิดๆ
แล้วมันก็จะรู้มากขึ้นเรื่อยๆ
จริงไหมครับ ... ว่าแล้ว
เรามาเริ่มเรียนรู้แบบทีละนิดละน้อย
กันเถอะครับ ... ลุยล่ะ..
จุดประสงค์
ศึกษาภาพรวมของเรจิสเตอร์ที่มีความสำคัญต่อการเขียนโปรแกรม
และศึกษา
การจัดระบบหน่วยความจำของ 68HC811E2 เพื่อเป็นพื้นฐานสำหรับการเขียนโปรแกรม
ในตัว 68HC811E2 นั้นจะมีเรจิสเตอร์ด้วยกันหลายประเภท
แต่ในที่นี้ผู้เขียน
ขอกล่าวถึงเฉพาะเรจิสเตอร์ที่เราต้องใช้ในกาเขียนโปรแกรมเป็นหลัก
ซึ่งได้แก่
รายละเอียดของเรจิสเตอร์แต่ละตัวเป็นดังนี้ครับ
A | เป็น Accumulator (ใช้ในการคำนวณ) ขนาด 8 บิต |
B | เป็น Accumulator (ใช้ในการคำนวณ) ขนาด 8 บิต |
D | เป็น Register ขนาด 16 บิต ที่เกิดจากการนำ A กับ B มารวมกัน โดยมองว่า A เป็น Hi-Byte และ B เป็น Low-Byte |
IX | เป็นเรจิสเตอร์ขนาด 16 บิต ใช้เป็นตัวชี้ (Index-X) |
IY | เป็นเรจิสเตอร์ขนาด 16 บิต ใช้เป็นตัวชี้ (Index-Y) |
SP | |
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
บทความนี้คงเพียงเท่านี้ก่อนครับ
ใครที่ยังสนใจ
ก็อ่านต่อได้คราวหน้าครับ ...
สวัสดีครับ