(เรียบเรียงใหม่ ... มีนาคม 2544 เกรียงศักดิ์ บุญเสริมสุวงศ์) การพัฒนางานทางด้านไมโครคอนโทรลเลอร์ด้วยภาษา Assembly นั้น ถือว่ายังเป็นที่นิยมอยู่มาก ในบ้านเรา เรียกได้ว่าเป็นส่วนใหญ่เลย ในขณะที่ต่างประเทศนั้น ภาษา Assembly จะนิยมรอง ลงมาจากภาษา C ที่ใช้กันเป็นอันดับหนึ่ง อาจจะเป็นเพราะว่าความคุ้นเคย หรือเพราะความตรง ไปตรงมาของภาษา Assembly ที่เป็นจุดเด่นอย่างหนึ่งก็ได้ ไม่ว่าจะอย่างไรก็ตาม การเข้าถึง ภาษา Assembly ได้นั้น ถือว่าเป็นการเรียนรู้และเข้าใจได้ลึกซึ้งที่สุด และถ้ารู้จักนำมาประยุกต์ ใช้งานให้เหมาะสมแล้ว ก็จะเป็นประโยชน์ต่อการพัฒนาเทคโนโลยีต่าง ๆ เป็นอย่างมาก สำหรับชิพตระกูล MCS-51 นั้น (ขอย้ำ ... ตระกูลครับ ... ไม่ใช่เบอร์ 51 ... แต่มากันเป็นร้อย ๆ เบอร์) จากประสบการณ์ที่ได้สะสมมา พอจะสรุปเป็นประเด็นต่าง ๆ ได้ 10 ประเด็น ที่นักพัฒนาทั้งหลาย ควรจะจดจำไว้ให้แม่น เพื่อจะช่วยให้การพัฒนาเป็นไปได้อย่างไม่ติดขัด ... ดังนี้ครับ
| |
1. Internal RAM พื้นที่ยุทธศาสตร์ |
MCS-51 ถูกออกแบบให้มี Internal RAM ภายใน 128 Byte (เบอร์ 8051) หรือ 256 Byte (เบอร์ 8052) และนี่เป็นความตั้งใจของผู้ผลิตที่จะให้ใช้พื้นที่ส่วนนี้เพื่อการทำงานต่าง ๆ คือเป็น Working Area ไม่ว่าจะ เป็นส่วน Register, Stack, และ Buffer ชุดคำสั่งเกือบจะทั้งหมดจะกระทำกับ Internal RAM นี้ ถ้าเรา จะพยายามใช้ส่วนของ External RAM เป็นพื้นที่ในรูปแบบ Working Area ก็จะเป็นเรื่องที่ยุ่งยากเกินไป ส่วน External RAM เหมาะสำหรับการเก็บข้อมูลแบบต่อเนื่อง หรือทำเป็น Buffer จำนวนมาก ๆ เท่านั้น เพราะเนื่องจากมีคำสั่งที่ใช้งานได้ไม่กี่คำสั่ง เช่น MOVX A,@DPTR ในส่วน Internal RAM นั้น เรา สามารถใช้งานโดยตรงได้โดยไม่ต้องใช้ Register ให้ยุ่งยากเลย ตัวอย่างเช่น
MOV COUNT,#18H LOOP: ... ... ... DJNZ COUNT,LOOP ในที่นี้ COUNT คือชื่อที่อ้างถึงพื้นที่ Internal RAM ที่กำหนดจากคำสั่ง EQU หรือ DS อีกที สังเกตุว่าเรา ใช้งานได้เสมือนกับเป็น Register R0-R7 เลย อีกประเด็นหนึ่งที่เกี่ยวกับ Internal RAM ก็คือ การอ้าง ถึงพื้นที่ RAM ตั้งแต่ Address 80-FFH (เบอร์ 8052) ซึ่งมี Address ซ้อนทับกับส่วน SFR 80-FFH ด้วย จะต้องแยกด้วยคำสั่งที่ใช้งาน ถ้าเป็นกรณีอ้างถึง RAM ที่ตำแหน่ง A0H จะต้องใช้คำสั่งแบบ Indirect ดังนี้ MOV R0,#0A0H MOV A,@R0 แต่ถ้าเป็นกรณีอ้างอิงถึง SFR ที่ตำแหน่ง A0H เช่นกัน จะต้องใช้คำสั่งแบบ Direct ดังนี้ MOV A,0A0H
| |
2. ระบบ Stack และการเรียงข้อมูล |
ระบบ Stack ของ MCS-51 จะเป็นแบบนับขึ้น โดยมีค่าเริ่มต้นหลังจาก Reset เป็น 07H เสมอ ถ้ามีการใช้ คำสั่ง PUSH หรือ CALL ค่า Stack จะเพิ่มขึ้นก่อน แล้วจึงเก็บข้อมูลลงไป ซึ่งก็จะเป็น Address 08H เป็น ตัวแรก ระบบ Stack สามารถโยกย้ายไปที่ใดก็ได้ใน Internal RAM ซึ่งรวมไปถึงส่วน Address 80-FFH ด้วย โดยจะไม่ปะปนกับส่วน SFR แต่อย่างใด ... ส่วนการเรียงลำดับข้อมูลขนาด 16 บิทในคำสั่งต่าง ๆ จะเรียงจาก High ไป Low เสมอ เช่นการใช้คำสั่ง LJMP ไปที่ Address 87FFH จะแปลงเป็น Op-Code คือ 02H,87H,FFH อ่านต่อ.. |