Login | thai-learning | Privacy Policy | About Us |

Thai Learning | ทฤษฎี IS ขั้นสูง | เว็บไทย | สารสนเทศวิทยานิพนธ์ | หนังสือรามคำแหงทั้งหมด | เกี่ยวกับผู้จัดทำ | บทกลอน |
วิชาที่เรียน 1/2555
   เมนูหลักวิชาเรียน 1/2555
   การโปรแกรมเว็บสารสนเทศ ฯ
   การโปรแกรมงานภูมิศาสตร์ ฯ
   โปรแกรมสำหรับงานสารสนเทศ
   อินเตอร์เน็ตและการบริการ สารสนเทศบนเว็บ
   บรรยากาศ เทอม 1-2555
โปรแกรมที่ผมพัฒนาครับ
   เมนูหลักโปรแกรมที่ผมพัฒนา
   ถอดรหัสผ่าน M$-Access
   ระบบการเข้าเรียนและให้คะแนน
   การทำงานของ Adder Logic
   ปรับระดับเสียงโวลุ่ม ด้วย CLI
   เกมส์เลื่อนภาพแสนสนุก vb6
บทความที่ผมเขียนครับ
   เมนูบทความ
   ภาษาซีสำหรับผู้เริ่มต้น
   ไมโครคอนโทรเลอร์เบื้องต้น
   ไมโครคอนโทรลเลอร์จำลอง
   การกำเนิดกระแสไฟฟ้าอย่างง่าย
   ควบคุมแรงดัน 0-220 โวลท์
   Graphics LCD ด้วย CCSC
   การออกแบบ PCB ด้วย Orcad
   การออกแบบ PCB ด้วย Protel
   ไพธอนส่งเมล์ด้วย GPRS
   ไพธอนควบคุม LCD ผ่าน LPT
   ควบคุม LPT ด้วย Labview
   อิมเมจโปรเซสซิ่ง ตอน 1/3
   อิมเมจโปรเซสซิ่ง ตอน 2/3
   อิมเมจโปรเซสซิ่ง ตอน 3/3
   ภาษาซีบนลินุกซ์สมองกลฝังตัว
   การใช้งาน MinGW เบื้องต้น
   ภาษาซี ARM-LPC2368
   ออกแบบ FPGA ด้วย Schematic
   ออกแบบ FPGA ด้วยภาษา VHDL
   ออกแบบ PCB เทคนิค Dryfilm
   เขียนโปรแกรม Python GUI
   การติดตั้ง NumPy 1.6.1
   เขียนไพธอนถอดรหัส MDB
   วิชวลเบสิค ควบคุมกล้อง
   สังเคราะห์ภาพกราฟิก pov-ray
   อิมพอร์ท MySQL ด้วย BigDump
   ติดตั้ง postgresql และ phppgadmin บน centos linux
   การใช้งานเธรดด้วยภาษา PHP
   การสังเคราะห์สีให้ไวยากรณ์ภาษา
   การสร้าง Search Engine
   เขียนไพธอน Client/Server
   การสร้างพาทิชั่นที่ใหญ่กว่า 3TB บนลินุกซ์ (Ubuntu)
   การรันสคริปต์ CGI ด้วยภาษาไพธอน
   การใช้งานคำสั่ง DD บน Ubuntu - Linux
   การใช้งาน Raspberry Pi
   การเอ็กซีคิวส์ + การจัดเรียงแอพฯในลินุกซ์
   X11 ด้วย Xming และ Putty
   TITAN5 บน Ubuntu - Linux
   รหัสจังหวัดทั่วโลก + เรดาร์
   การควบคุมเว็บบราวเซอร์ผ่าน SELENIUM ด้วยภาษาไพธอน
โปรแกรมภาษา
   เมนู VB-Classic
   ฟังก์ชั่น Visual Basic
   คำสั่ง Visual Basic
   ตัวแปรภาษาไพธอน (ขั้นสูง)
   โมดูลต่าง ๆ ภายในภาษาไพธอน
ข่าวสารไอที
   กูเกิ้ลเปิดตัว Tablet 7 นิ้ว
   อินเดีย IIT เปิดตัว Tablet
   RaspBerry PI สมองกลฝังตัว
   คอมพิวเตอร์จิ๋ว
บริการสารสนเทศ
   ไทยเว็บ 2012
   เว็บไทย
   ฐานข้อมูล วิทยานิพนธ์
   รวมคำศัพท์ภาษาไทย
   เคยฟังมั้ย - เพลงมาร์ช มมส
   ประวัติศาสตร์ชาติไทย หลวงปู่ฤาษีลิงดำ
   เพลงน้อมใจปล่อยวาง 1
   เพลงน้อมใจปล่อยวาง 2
   เพลงน้อมใจปล่อยวาง 3
เกี่ยวกับเรา
   เกี่ยวกับผู้ก่อตั้ง
   บทกลอนที่ผมแต่งครับ..
   แลกลิงค์กับเรา ที่นี่
   รายละเอียดแม่ข่าย
   ดาต้าเซนเตอร์ (Data Center)
   เงื่อนไขการใช้งาน

  
 

การเขียนโปรแกรมไฟกระพริบด้วยภาษาซีเพื่อทำงานบนซีพียู ARM LPC 2368
เขียนโดย อ.จักรกฤษณ์ แสงแก้ว สาขาสารสนเทศศาสตร์ คณะวิทยาการสารสนเทศ มหาวิทยาลัยมหาสารคาม

สำหรับวันนี้ จะนำท่านศึกษาการเขียนโปรแกรมบนไอซี LPC 2368 ซึ่งเป็นผลิตภัณฑ์ของบริษัทฟิลิปต์ (ปัจจุบัน Phillips เปลี่ยนชื่อเป็น NXP) ชิป LPC 2368 อยู่ในตระกูล ARM7 ซึ่งผู้เขียนเลือกใช้บอร์ดทดลอง CP-JR ARM7 LPC2368 ของบริษัท ETประเทศไทย นับเป็นนิมิตหมายอันดีของการพัฒนาอีกก้าวของอิเล็กทรอนิกส์ในประเทศไทย ผมเชื่อว่านับจากนี้ไป ประเทศไทยจะมีนักอิเล็กทรอนิกส์ที่สามารถสร้างสรรค์งาน และนำไปประยุกต์ใช้ในวงการต่าง ๆ ได้อย่างกว้างขวาง ผมขอเป็นกำลังใจและเป็นส่วนหนึ่งของการพัฒนาประเทศ ตามกำลังและความสามารถที่มีอยู่ โดยไม่หวังผลตอบแทนใด ๆ และเผยแพร่ออกไป โดยไม่คิดมูลค่า เริ่มต้นเนื้อหาของบทความ ดังนี้

วัตถุประสงค์
1. สามารถติดตั้งโปรแกรม Keil ได้
2. สามารถติดตั้งโปรแกรม Flash Magic ได้
3. สามารถสร้างโปรเจ็คและคอมไพล์ได้
4. สามารถทดสอบผลการทำงานได้

เครื่องมือในการศึกษา
1. โปรแกรม Keil ของบริษัท Keil co., Ltd
2. โปรแกรม Flash Magic


รูป : บอร์ดทดลอง CP-JR ARM7 LPC2368 ของบริษัท ETประเทศไทย

ขั้นตอนการดำเนินการ
1. การประกาศค่าเริ่มต้นให้กับ LPC2368
โฟล์ชาร์ตของการกำหนดค่าเริ่มต้นใกับ LPC2368 แสดงได้ดังนี้

รูป : แสดงการกำหนดค่าเริ่มต้นให้กับวงจรไฟกระพริบ ด้วยโปรแกรม Keil

ขั้นตอนการประกาศค่าเริ่มต้นให้กับ LPC2368 สามารถอธิบายด้วยลำดับขั้นได้ดังนี้
ขั้นที่ 1 :ประกาศส่วนหัวด้วยไฟล์ LPC23xx.h ด้วยคำสั่ง
#include "LPC23xx.H"

ขั้นที่ 2 หลอด LED P3.25 ซึ่งอยู่บนบอร์ดทดลอง ตั้งชื่อเพื่อให้ใช้งานสะดวก โดยตั้งเป็น LED1 ซึ่งตำแหน่งที่ 25 (กำหนดให้มีค่าเป็น 1) ดังนั้นเขียนเป็นเลขฐาน 16 คือ 0x02000000 ดังนี้


ดังนั้นเขียนเป็นโค๊ดด้วยคำสั่ง
#define LED1    0x02000000

ขั้นที่ 3 หลอด LED P3.26 ซึ่งอยู่บนบอร์ดทดลอง ตั้งชื่อเพื่อให้ใช้งานสะดวก โดยตั้งเป็น LED2 ซึ่งตำแหน่งที่ 26 (กำหนดให้มีค่าเป็น 1) ดังนั้นเขียนเป็นเลขฐาน 16 คือ 0x02000000 ดังนี้


ดังนั้นเขียนเป็นโค๊ดด้วยคำสั่ง
#define LED2    0x04000000

ขั้นที่ 4 คำสั่ง FIO3CLR คือคำสั่ง เคลียส์บิตของ PORT3
เมื่อสั่งให้ FIO3CLR LED1 มีค่าเท่ากับคำสั่ง FIO3CLR 0x02000000 ซึ่งเป็นตำแหน่งของหลอด LED1 (Port 3 หมายเลข 25)

การประกาศ #define LED1_ON() FIO3CLR = LED1 จึงหมายถึงการประกาศให้คำว่า LED1_ON() ไปทำงานคำสั่ง FIO3CLR = LED1 ซึ่งคือคำสั่งเคลียส์บิต P3.25

ขั้นที่ 5 คำสั่ง FIO3SEคือคำสั่ง กำหนดค่าบิตของ PORT3
เมื่อสั่งให้ FIO3SET LED1 มีค่าเท่ากับคำสั่ง FIO3SET 0x02000000 ซึ่งเป็นตำแหน่งของหลอด LED1 (Port 3 หมายเลข 25)

การประกาศ #define LED1_OFF() FIO3SET = LED1 จึงหมายถึงการประกาศให้คำว่า LED1_OFF() ไปทำงานคำสั่ง FIO3SET = LED1 ซึ่งคือคำสั่งกำหนดค่าให้บิต P3.25 มีสถานะเป็น 1

ขั้นที่ 6 คำสั่ง FIO3CLR คือคำสั่ง เคลียส์บิตของ PORT3
เมื่อสั่งให้ FIO3CLR LED2 มีค่าเท่ากับคำสั่ง FIO3CLR 0x04000000 ซึ่งเป็นตำแหน่งของหลอด LED2 (Port 3 หมายเลข 26)

การประกาศ #define LED2_ON() FIO3CLR = LED2 จึงหมายถึงการประกาศให้คำว่า LED2_ON() ไปทำงานคำสั่ง FIO3CLR = LED2 ซึ่งคือคำสั่งเคลียส์บิต P3.26

ขั้นที่ 7 คำสั่ง FIO3SEคือคำสั่ง กำหนดค่าบิตของ PORT3
เมื่อสั่งให้ FIO3SET LED2 มีค่าเท่ากับคำสั่ง FIO3SET 0x04000000 ซึ่งเป็นตำแหน่งของหลอด LED2 (Port 3 หมายเลข 26)

การประกาศ #define LED2_OFF() FIO3SET = LED2 จึงหมายถึงการประกาศให้คำว่า LED2_OFF() ไปทำงานคำสั่ง FIO3SET = LED2 ซึ่งคือคำสั่งกำหนดค่าให้บิต P3.26 มีสถานะเป็น 1

ขั้นที่ 8 : ประกาศฟังก์ชั่น delay()

2. ฟังก์ชั่น delay()
ฟังก์ชั่น delay() ทำหน้าที่หน่วงเวลา โดยใช้หลักการวนรอบนับ จาก 1 ถึง 4294967296 (นับ 1 ถึงประมาณ 4 พันล้าน) เขียนเป็นโฟลต์ชาร์ตได้ดังนี้

รูป : แสดงวงจรการวนลูปสร้างขึ้นเป็นฟังก์ชั่น delay()

3. เริ่มต้นทำงานที่ฟังก์ชั่น main()
โฟล์ชาร์ตของการดำเนินงานแสดงได้ดังนี้

รูป : แสดงการทำงานหลักของวงจรไฟกระพริบด้วย LPC 2368

ขั้นที่ 1 : การกำหนดรีจีสเตอร์ PINSEL7
ขอให้พิจารณาตารางการทำงานต่อไปนี้

พบว่า Port 3 หมายเลข 25 และ 26 มีการทำงาน 4 การทำงานขึ้นอยู่กับการตั้งค่า ได้แก่
00 ทำหน้าที่เป็น GPIO
01 ทำหน้าที่เป็น Data
10 ทำหน้าที่เป็น MAT
11 ทำหน้าที่เป็น PWM

ดังนั้น หากต้องการกำหนดให้ P3.25 และ P3.26 ทำหน้าที่เป็น GPIO ต้องกำหนดข้อมูล ให้รีจีสเตอร์ PINSEL7 ดังนี้


คำสั่ง
PINSEL7 &= 0XFFC3FFFF;
มีความหมายเดียวกับ PINSEL7 = PINSEL7 & 0xFFC3FFFF;

หมายความว่า ค่าใน PINSEL7 มีค่าเท่าใด ให้นำค่าดังกล่าวมาทำโอเปอร์เรเตอร์ AND กับ 0xFFC3FFFF ซึ่งเป็นการกำหนดให้ P3.25 และ P3.26 ทำหน้าที่เป็น GPIO

ขั้นที่ 2 รีจีสเตอร์ FIO3DIR เป็นการกำหนดให้ Port 3 ของ ARM 2368 มีค่าเป็น Input / Outpuโดยหากกำหนดให้เป็น 0 มีค่าเป็น Inpuและหากกำหนดเป็น 1 หมายถึงเป็น Outpuดังนั้น
ในตัวอย่างนี้กำหนดให้ P3.25 เ็ป็น Outpuต้องกำหนดให้มีค่าเป็น 1 ดังนั้น กำหนด
FIO3DIR |= 0x02000000 หรือมีค่าเท่ากับ FIO3DIR = FIO3DIR | 0x02000000
ปล. ในตอนต้นได้มีการประกาศ #define LED1 0x02000000 ดังนั้น จึงเขียนโปรแกรมได้อีกอย่างดังนี้
FIO3DIR |= LED1




ขั้นที่ 3 รีจีสเตอร์ FIO3DIR เป็นการกำหนดให้ Port 3 ของ ARM 2368 มีค่าเป็น Input / Outpuโดยหากกำหนดให้เป็น 0 มีค่าเป็น Inpuและหากกำหนดเป็น 1 หมายถึงเป็น Outpuดังนั้น
ในตัวอย่างนี้กำหนดให้ P3.26 เ็ป็น Outpuต้องกำหนดให้มีค่าเป็น 1 ดังนั้น กำหนด
FIO3DIR |= 0x04000000 หรือมีค่าเท่ากับ FIO3DIR = FIO3DIR | 0x04000000
ปล. ในตอนต้นได้มีการประกาศ #define LED2 0x04000000 ดังนั้น จึงเขียนโปรแกรมได้อีกอย่างดังนี้
FIO3DIR |= LED2



ขั้นที่ 4 เป็นการวนรอบซ้ำไม่สิ้นสุด
เริ่มกำหนดให้ LED1_ON() และ LED2_OFF()
จากนั้นหน่วงเวลา 5000000 (นับ 5ล้านครั้งในหนึ่งวินาที)
กำหนดให้ LED2_ON() และ LED1_OFF()
หน่วงเวลา 5000000 (นับ 5 ล้านครั้งในหนึ่งวินาที)

การคอมไพล์(Compile)
ในขั้นตอนการคอมไพล์เป็นการแปลความหมายของโค๊ดภาษา C ให้อยู่ในโค๊ดภาษาเครื่อง ซึ่งตอนนี้กำหนดให้เป็นภาษาเครื่องของไอซี LPC 2368 (ARM7 Processor) ให้ท่านเลือก Project -> Rebuild All Target Files ดังนี้

รูป : แสดงการเลือกคอมไพล์โปรเจ็ค

การโหลด HEX ลงบนไอซี (การโปรแกรมชิป)
ให้ท่านติดตั้งโปรแกรม Flash Magic ลงในเครื่อง จากนั้นตั้งค่าตามตัวอย่างด้านล่าง


ท่านต้องแน่ใจว่าเลือก COM Porตรงกับการเชื่อมต่อในระบบคอมพิวเตอร์ของท่าน
เลือก Hex Filซึ่งเป็นผลลัพธ์จากการคอมไพล์ โดยให้คลิ๊ก Browsเพื่อเลือกไฟล์ที่เป็นผลลัพธ์จากการคอมไพล์
จากนั้นคลิ๊กเลือกปุ่ม Starเพื่อโหลด Hex Filลงในไอซี LPC2368

สรุป
บทความนี้ผู้เขียนได้บรรยายการสร้างโปรแกรมไฟกระพริบบนไอซี ARM LPC 2368 ด้วยภาษาซี โดยใช้คอมไพล์เลอร์ของ Keil ท่านได้ศึกษาขั้นตอนตั้งแต่เริ่มต้น คือกำหนดค่าต่าง ๆ ให้กับรีจีสเตอร์ จากนั้นเขียนโปรแกรมให้ทำงานไม่สิ้นสุดด้วยลูป FOR และการสร้างฟังก์ชั่น delay เพื่อหน่วงเวลา และเรียกใช้คำสั่ง LED1_ON() , LED1_OFF(), LED2_ON() และ LED2_OFF() ซึ่งเนื้อหาในบทความนี้ค่อนข้างทำความเข้าใจได้ยากมากสำหรับผู้เริ่มต้น อย่างไรขอเป็นกำลังใจให้กับทุก ๆ ท่านที่กำลังเริ่มศึกษาการเขียนโปรแกรมด้วย C เพื่อควบคุมโปรเซสเซอร์ ARM7 ทุกท่าน ขอความสุข สวัสดีมีชัย จงมีแด่ท่านผู้อ่านที่รัก ทุกท่าน สวัสดีครับ.....!!




All trademarks and trade names are the property of their respective owners and used here for identification purposes only.
Privacy Policy | Terms of service | Report a Policy Violation (0.0027 sec)