|
[ บทความ : โปรแกรมจำลองการทำงานของ MCS-51 ] |
ปกติแล้วในการเขียนโปรแกรมกับระบบไมโครคอนโทรลเลอร์ เรานิยมใช้ภาษาแอสเซมบลีเขียน และเมื่อเขียนเสร็จก็จะ นำมาทดสอบการทำงานบนโปรแกรมที่มีหน้าที่จำลองการทำงานของชิพ ทั้งนี้เพื่อเป็นการประหยัดค่าใช้จ่ายในการซื้อเครื่องมือทดสอบ โปรแกรมในตัวชิพ ซึ่งตัวอย่าง โปรแกรมที่ผมเอามาแนะนำในคราวนี้เป็นโปรแกรม TS Controls Emulator 8051 รุ่นทดลอง .. โดยถ้า ผู้อ่านสนใจใช้งานโปรแกรม หรือจะซื้อโปรแกรมตัวนี้มาใช้งานก็สามารถเข้าไปดาวน์โหลด และหารายละเอียด เกี่ยวกับราคาได้ที่ www.tscontrols.com ซึ่งหน้าตาของโปรแกรมเป็นดังนี้ครับ
![]()
ก่อนที่จะมาทดลองใช้โปรนแกรมกัน ตอนนี้เรามาเขียนโปรแกรมเพื่อใช้ในการทดลองกันก่อนครับ ... รายละเอียดของโปรกรม เป็นดังนี้ครับ
* Filename : test01.asm * Assembler : ASM51 (Assembler in Micro-C51 suite) * ORG $0000 MAIN MOV A,#$00 LOOPS INC A CJNE A,#$07,LOOPS QUIT SJMP QUITเมื่อคีย์โปรแกรมเรียบร้อยแล้วก็เข้าสู่ขั้นตอนของการสั่งแปลภาษาแอสเซมบลีให้เป็น machine code โดยสั่งดังนี้ครับ
asm51 test01 -iส่วนถ้าผู้อ่านใช้ assembler ตัวอื่นที่ไม่ใช่ assembler ในชุด Micro-C51 ก็ให้แก้ไขส่วนของโปรแกรมให้เหมาะสม กับ assembler ที่ท่านใช้อยู่ด้วยนะครับ (เดี๋ยวทำงานไม่ได้แล้วจะมาโทษว่าผมวางยาไม่ได้นะครับ :-D) ... เมื่อทำการคอมไพล์เสร็จก็จะได้ไฟล์ .HEX มา ตอนนี้เราก็พร้อมจะใช้งานโปรแกรมจำลองการทำงาน ของชิพ MCS-51 กันแล้ว (แต่ก่อนอื่น ผู้อ่านจะต้อง download โปรแกรม และติดตั้งโปรแกรมให้เรียบร้อยก่อนนะครับ) ... เมื่อเราเรียกโปรแกรม TS Controls Emulator 8051 มาใช้งาน ก็จะแสดงหน้าจอเหมือนรูปด้านบนครับ เสร็จแล้วเราสั่ง เปิดไฟล์ แล้วจะมีหน้าต่างดังรูปด้านล่าง
![]()
ตอนนี้ให้ click ที่ปุ่ม ... แล้วจะแสดงหน้าต่างดังนี้
![]()
ในขั้นตอนนี้ให้เราเปิดไฟล์ test01.hex ที่เราได้คอมไพล์เสร็จแล้วขึ้นมา หลังจากนั้นก็กด OK ไปเรื่อยๆ จน กว่าจะกลับมาที่หน้าจอหลักของโปรแกรม .... เมื่อเรากลับมาที่หน้าจอหลักของโปรแกรม ให้สังเกต หน้าจอที่เขียน title ว่า disassembler code ... ก็จะเห็นว่า มันแสดงข้อมูลของโปรแกรมของเราขึ้นมา และที่น่าสังเกตก็คือ ที่บรรทัด 0000 ... มีพื้นเป็นสีดำ และตัวอักษรสีขาว นั่นแสดงว่า บรรทัดนั้นเป็นบรรทัดเริ่มต้นทำงาน ดังรูปด้านล่าง
![]()
และหน้าต่างที่สำคัญอีกที่หนึ่งก็คือ หน้าต่างที่แสดงข้อมูลใน register ดังรูปด้านล่างครับ
![]()
มาถึงตรงนี้แสดงว่าเราพร้อมแล้วที่จำทำการทดลองให้โปรแกรมทำงาน ... ปุ่มที่เราจะใช้สำหรับสั่งให้โปรแกรม ทำงานทีละคำสั่งก็จะเป็นปุ่มด้านซ้ายสุดของรูปด้านล่างนี้ครับ
![]()
แต่ถ้าเราต้องการให้ reset แล้วเริ่มโปรแกรมใหม่ ก็สามารถสั่งได้จากเมนู คือ Run แล้ว เลือก Reset (ดูรูปด้านล่างประกอบ) หลังจากนั้นโปรแกรมก็จะเริ่มต้นใหม่ทั้งหมด
![]()
เอาล่ะครับ มาทดลอง debug โปรแกรมกัน ให้กดปุ่ม Step Info Next Instruction หรือกดแป้น F11 ก็ได้ แล้วแถบสีดำก็จะเลื่อนไป อยู่ที่ตำแหน่ง 0002 ดังรูปด้านล่าง แล้วให้สังเกตที่หน้าต่างของรีจิสเตอร์ด้วยนะครับว่า PC จะเปลี่ยนค่าจาก 0000 เป็น 0002
![]()
เมื่อกด F11 อีกครั้ง โปรแกรมก็จะเลื่อนไปที่ 0003 โดยสังเกตจากรูปด้านล่างดูจะเห็นว่า PC เปลี่ยนเป็น 0003 และ ACC เปลี่ยนเป็น 01 เหตุที่ ACC เปลี่ยนจากเดิม คือ 00 เป็น 01 ก็เพราะเราได้เขียนโปรแกรมที่ตำแหน่ง 0002 เอาไว้ว่า INC A ซึ่งมีความหมายว่า ให้เพิ่มค่า ACC ขึ้น 1 หรือเขียนเป็นภาษาซีได้เป็น ACC = ACC+1 นั่นเอง
![]()
เมื่อสั่งทำงานอีก 1 คำสั่ง ก็จะเป็นดังรูปด้านล่าง จะเห็นว่า PC เปลี่ยนเป็น 0002 และโปรแกรมกลับไปทำงานที่ ตำแหน่ง 0002 อีกครั้ง ทั้งนี้เพราะที่ตำแหน่ง 0003 เราสั่งเอาไว้ว่า CJNE A,#07,0002 ซึ่งหมายความว่าให้ทำการตรวจสอบว่า ค่าที่เก็บใน ACC หรือ A นั้นมีค่าเป็น 7 หรือไม่ ถ้าไม่ใช่ให้กระโดดไปทำงานที่ตำแหน่ง 0002 (CJNE = Compare Jump if Not Equal) ...
![]()
เมื่อเราสั่งทำงานทีละบรรทัดไปเรื่อย ๆ จะเห็นว่าค่าของ ACC จะเพิ่มขึ้นมาทีละ 1 จนสูดท้ายเมื่อ ACC เป็น 07 ดังรูปด้านล่าง
![]()
แล้วเราสั่งทำงานต่อ ก็จะเห็นว่าโปรแกรมก็จะกระโดดมาทำงานที่ 0006 (ดังรูปด้านล่าง) แทนที่จะเป็น 0002 ทั้งนี้ เพราะตอนนี้ ACC เท่ากับ 07 ตามเงื่อนไขแล้วนั่นเอง ... ตอนนี้ไม่ว่าเราจะกดสั่งให้โปรแกรมทำงานสักกี่ครั้งก็ตาม ผลที่ได้ก็คือ จะไม่มีการกระโดดไปทำงานที่ใดเลย ทั้งนี้เนื่องจากเราเขียนโปรแกรมเอาไว้ว่า SJMP 0006 ซึ่งหมายความว่าให้กระโดด ไปทำที่ตำแหน่ง 0006 ซึ่งก็คือตำแหน่งที่คำสั่ง SJMP 0006 อยู่นั่นเอง ทำให้โปรแกรมกระโดดมาที่นี่เรื่อยๆ ไม่รู้จบ สาเหตุที่ต้องทำอย่างนี้ก็เพราะว่า ใน MCS-51 ไม่มีคำสั่งให้ไมโครคอนโทรลเลอร์หยุดทำงาน เราจึงจำเป็นที่จะต้องสั่งอย่างนี้ เพื่อให้โปรแกรมของเราหยุดทำงาน
![]()
เป็นอย่างไรบ้างครับกับโปรแกรมจำลองการทำงานของชิพ MCS-51 ... จะเห็นว่า ถ้าเราอยากศึกษาเขียนโปรแกรม ภาษาแอสเซมบลีกับ MCS-51 เราก็ไม่จำเป็นที่จะต้องมีบอร์ดคอนโทรลเลอร์ก็ได้ ลองทดลองศึกษาคำสั่งต่างๆ จากโปรแกรม จำลองการทำงานดูก่อน เมื่อเข้าใจดีแล้วค่อยจัดหาบอร์ดมาใช้งานกันอีกครั้งก็ยังไม่สายครับ ... บทความนี้คงจบเพียงเท่านี้ก่อน ครับ ... คราวหน้าผมจะเอาโปรแกรมทดลองติดต่อกับ KEY Pad บนบอร์ด ET-BOARD V6 ด้วยภาษาซี มาเป็นตัวอย่างให้ นำไปศึกษาครับ ...