[ บทความ : ทดลองเขียนโปรแกรมภาษาซี กับ MCS-51 ] |
ในการเขียนโปรแกรมเพื่อใช้กับ microcontroller นั้น โดยมากเรามักจะหันไปใช้ภาษา assembly กัน เสียเป็นส่วนใหญ่ แต่จากการเขียนโปรแกรมกับ microcontroller หลาย ๆ เบอร์ หรือ โปรแกรมที่เขียนนั้น มีความซับซ้อนมาก ๆ เราก็จะ ประสบปัญหาในเรื่องของ การพัฒนาที่ใช้เวลามากขึ้นไปด้วยพอมองหาภาษาที่จะเอามาแทนภาษา assembly เราก็จะเห็นว่ามีด้วยกันหลายภาษา ได้แก่ BASIC, Pascal, C แต่เพื่อ ใช้เข้ากลุ่มข้ามระบบ (Cross platform) เขามักจะบอกว่า ภาษาที่เหมาะก็คือ ภาษา C ดังนั้น ในบทความตอนนี้ ผมขอใช้ ภาษา C ครับ
ตอนนี้ก็เหลือเรื่อง hardware ที่เราจะเอามาใช้ เพื่อความสะดวก ในการพัฒนา ผมขอเลือกใช้ Single Board ของ ETT หรือ ถ้าใครใช้ รุ่นอื่น ๆ ก็สามารถ นำไปดัดแปลง ได้ตามความต้องการครับ
หลังจากเกริ่นมาหลาย ๆ ประโยค เอาเป็นว่า ตอนนี้เราจะมาลองเขียนโปรแกรม สำหรับ แสดงตัวเลข 0-9 ที่ user LED ซึ่งเป็น 7-Segment ที่ติดมากับ Single Board (ET-8032 V2.0) โดยโปรแกรมจะทำการแสดงตัวเลข 0, 1, 2, .. ,9 หลังจากนั้นก็วนมาแสดง 0, 1, 2, ..., 9 ต่อไปเรื่อย ๆ
เนื่องจากผมเขียนโปรแกรมโดยใช้ memory model แบบ tiny ซึ่ง Micro-C จะใช้ memory model แบบนี้ สำหรับ การพัฒนา ROM หรือ ใช้กับ Single CHIP ดังนั้น การที่จะทดสอบโปรแกรมนี้ แนะนำว่าควรเอา EPROM ของบอร์ด ออกไปก่อน แล้วเขียน EPROM ขึ้นมาใหม่ หรือจะให้สะดวก ก็ควรใช้ EPROM Emulator จะสะดวกกว่ามาก หลังจากนั้น ก็ Load โปรแกรมไปที่ EPROM emulator หลังจากนั้นก็ reset แล้วโปรแกรมจึงเริ่มทำงาน
ตัวอย่างโปรแกรมก็เป็นดังนี้ครับ
/*-------------------------------------------------------------------------- Filename : usrled.c Author : Supachai Budsaratij (e-mail: satanraek@yahoo.com) Date : 22 November 1999 Note : Testing user LED (7-Segment) with poke() function. The address place of user LED is 0xE060. Notice : This software use for ET-8032 Single Board version 2 only. Compiler : Micro-C version 2.4 cc51 usrled -iof m=t --------------------------------------------------------------------------*/ #include /mc/8051io.h delayX() { unsigned char inner_loop; unsigned char outer_loop; for (outer_loop=0; outer_loop < 80; outer_loop++) { for (inner_loop=0; inner_loop < 255; inner_loop++) { } } } main() { unsigned char led_data[10]; unsigned char pnt; pnt = 0; led_data[0] = 0x3F; led_data[1] = 0x06; led_data[2] = 0x5B; led_data[3] = 0x4F; led_data[4] = 0x66; led_data[5] = 0x6D; led_data[6] = 0x7D; led_data[7] = 0x07; led_data[8] = 0x7F; led_data[9] = 0x6F; for(;;) { poke(0xE060, led_data[pnt]); pnt++; if (pnt == 10) { pnt = 0; } delayX(); } }เป็นอย่างไรครับ เขียนง่ายกว่าภาษา assembly ไหมครับ การใช้ภาษาซี นั้นอาจจะขัดกับความ "คุ้นเคย" แต่พอชิน จะพบว่า เวลาที่เสียไปกับการฝึกภาษา ซี นั้น กำลังแลกกับความรวดเร็วในการพัฒนาซอฟท์แวร์ ที่ดีขึ้น อย่างนี้ต้องเลือกเอาเองครับ ว่าจะเปลี่ยน หรือจะใช้ assembly ต่อไป ... แต่ที่แน่ ๆ บทความตอนต่อ ๆ ไป ผมจะใช้ภาษา ซี ต่อไปเรื่อย ๆ ครับ ... ส่วนจะเป็นเรื่องอะไร ก็รอดูต่อไปครับ
แต่อย่างไรก็ตามนะครับ เราก็ต้องเข้าใจการทำงานของไมโครคอนโทรลเลอร์เบอร์นั้นเป็นอย่างดีด้วย เพราะในระดับลึก ๆ นั้น เรามักหนีภาษา assembly ไม่พ้นครับ ... ปกติผมใช้ภาษาซีสำหรับควบคุมการทำงานของ algorithm เป็นหลักครับ ส่วน การควบคุมระดับลึก ๆ มักต้องใช้ภาษา assembly เข้ามาช่วย แต่อย่างไรก็ตาม อย่าลืมว่าภาษาซียอมให้เราเขียนโค้ดระดับ assembly ได้ในตัวเอง ดังนั้น ถ้าเราเขียนรวมทั้งสองภาษาได้ในโปรแกรมเดียว ตัวโปรแกรมของเราก็จะทำงานได้เร็วขึ้น ทั้งด้านการทำงาน และเวลาที่ใช้ในการพัฒนาครับ