บทความยอดนิยม

วันพฤหัสบดีที่ 8 ธันวาคม พ.ศ. 2554

ควบคุมไมโครคอนโทรลเลอร์ด้วยภาษาซี ตอนที่1

ในการควบคุมไมโครคอนโทรลเลอร์ให้ทำงานตามที่เราออกแบบไว้นั้นจะต้องเขียน โปรแกรมควบคุมขึ้นมา จะด้วยภาษาใดก็ได้มีหลายภาษาด้วยกัน เช่น ภาษาเบสิก ภาษาซี ภาษาปาสคาล และภาษาโลโก้ หรือภาษาโฟลว์ชาร์ทก็แล้วแต่ ล้วนทำได้หมดทั้งสิ้น เพียงแต่ปัจจัยที่สำคัญนั้นอยู่ที่ตัวคอมไพเลอร์ของแต่ละยี่ห้อนั้นจะทำเน้น ในภาษาใดเท่านั้น

 ในที่นี้ขอกล่าวถึงภาษาซี เพราะเป็นภาษาที่ได้รับความนิยมทุกยี่ห้อทุกตระกูลไมโครคอนโทรลเลอร์ มันสามารถแก้ไขได้ง่าย เพราะโครงสร้างง่ายต่อการสร้างโมดูลาร์(Modular) เมื่อเรียนรู้ของตระกูลใดๆแล้ว การศึกษาการควบคุมไมโครคอนโทรลเลอร์ในตระกูลอื่นก็ง่าย เพราะรูปแบบพื้นฐานที่เหมือนกัน จะแตกต่างกันเฉพาะคำสั่งเฉพาะของไมโครคอนโทรลเลอร์แต่ละตระกูลเท่านั้น
พื้นฐานที่จำเป็นของภาษาซี
ตัวดำเนินการเลขคณิตในภาษาซี
-              การลบ                                   x-y
+             การบวก                                 x+y
*             การคูณ                                  x*y
/             การหาร                                  x/y
%            การหารเอาเฉพาะเศษไว้             9%2= เศษ 1 , 1 คือผลลัพธ์
- -             การลดค่าครั้งละ 1                   x- - หรือ - -x  จะมีค่าเหมือนกับ x=x-1
++             การเพิ่มค่าครั้งละ 1                 x++ หรือ ++x จะมีค่าเหมือนกับ x=x+1
จากข้างต้น ในภาษาซีจะมีลำดับในการประมวลผลก่อนและหลัง หากมีการใช้ตัวดำเนินการมากๆในหนึ่งนิพจน์ ดังนี้
()                                            ลำดับที่1
++,- -                                       ลำดับที่2
* / %                                       ลำดับที่3
+-                                            ลำดับที่4
+= , -= , *= , /= , %=               ลำดับที่5
ตัวดำเนินการในภาษาซีทั้งหมดมีดังนี้()                                            Function call
[]                                            array element
.                                             structure member
->                                           pointer to structure member
!                                             Logical
-                                             Minus
+                                            Add
- -                                           Decrement
++                                          Increment
&                                            address of
=                                            content of
*                                             Multiply
/                                             Divide
%                                           Modulus
<<                                         (left shift)
>>                                         (right shift)
<                                            less than
<=                                          less than or equal to
>                                            greater than
>=                                          greater than or equal to
==                                          equality
!=                                            not equal
&                                             AND (bit by bit)
^                                             XOR (bit by bit)
!                                              OR (bit by bit)
&&                                            logical AND
||                                             logical OR
?:                                             Conditional
=                                             Assignment
*=/=%=+=                              compound assignment
-=<<=>>=                              compound assignment
&=^=!=                                   compound assignment
,                                              comma operator

 

ตัวแปรและการประกาศตัวแปร ตัวแปรคือตัวแทนค่าตัวเลข อักษร ข้อความ ที่ใช้ในการประมวลผล ในการเขียนโปรแกรมจะต้องประกาศตัวแปรก่อนดำเนินการคำสั่งอื่น ซึ่งเป็นการแจ้งต่อคอมไพเลอร์ว่าตำแหน่งใดคือค่าอะไร ชื่ออะไรเป็นต้น
Char  ตัวอักษร 8 บิท  เก็บรหัสแอสกี้
Float  ตัวเลขทศนิยม 32 บิท 3.4x(10)-38 ถึง 3.4x(10)38
Short  ตัวเลข 1 บิท  0 , 1
Long  ตัวเลข 16 บิท  0 - 65,535
Int  ตัวเลข 8 บิท   0 - 255
Int1  ตัวเลข 1 บิท  0 , 1
Int8  ตัวเลข 8 บิท  0 - 255
Int16  ตัวเลข 16 บิท  0 - 65,535
Int32  ตัวเลข 32 บิท  0 - 4,294,967,295
ตัวอย่าง เช่น  int k=0;  หมายถึง กำหนดค่าคงที่ ชื่อ k มีค่าเท่ากับ  0  เป็นต้น
ตัวแปรแบบอาเรย์ เมื่อต้องการประกาศตัวแปรหลายๆตัวเพื่อใช้ เก็บข้อมูลที่มีหลายอย่าง เราสามารถใช้ตัวแปรชนิดนี้ได้ เพราะตัวแปรชนิดนี้สามารถเก็บตัวแปรไดจำนวนมากและยังเข้าถึงกลุ่มข้อมูลได้ รวดเร็ว อีกด้วย
รูปแบบที่1เป็นการประกาศตัวแปรที่เป็นชื่อเดียวกันที่สามารถเก็บค่าได้ 5 ตัว
 ชนิดของตัวแปร  ชื่ออาเรย์ [ขนาดของอาเรย์]
เช่น       int money[5];
           คือ money[0] , money[1] , money[2] , money[3] , money[4]
รูปแบบที่2เป็นการประกาศตัวแปรที่เป็นชื่อเดียวกัน 5 ตัว โดยแต่ละตัวแปรมีค่าอยู่
เช่น       int number[5] = {0,1,2,3,4};
           คือ number[0]=0 , number[1]=1 , number[2]=2 , number[3]=3 , number[4]=4
รูปแบบที่3เป็นการประกาศที่ไม่กำหนดขนาดของอาเรย์ในระบบจะจองหน่วยความจำเอาไว้เท่ากับจำนวนค่าที่ประกาศเอาไว้
เช่น    unsigned char number[ ] = {P,E,T,E,R};
         unsigned char number[ ] = "PETER CORP";

โครงสร้างของภาษาซีคอมไพเลอร์ไดเร็คทีฟ(Compiler directive) คือส่วนหัวของโปรแกรมนั่นเอง ซึ่งจะเป็นการบอกแหล่งไฟล์อ้างอิงประเภท head file ที่จำเป็นนำมาใช้ในการประมวลผลในโปรแกรมนั้น
รูปแบบคือ    #include <ชื่อไฟล์อ้างอิง.h>
ตัวอย่าง       #include <16F877.h>  หมายถึง โปรแกรมนี้มีการอ้างอิงข้อมูลจากไฟล์ 16F877.h ซึ่งเป็นข้อมูลเกี่ยวกับไมโครคอนโทรลเลอร์เบอร์ 16F877 นั่นเอง
ตัวโปรแกรม(Body)
 ในส่วนที่โปรแกรมเริ่มประมวลคำสั่งจริงๆจะอยู่ในส่วนนี้ ซึ่งจะเป็นตัวกำหนดขอบเขตของโปแกรม
รูปแบบคือ void main()
  {
   คำสั่งต่างๆ ;
  }
สำหรับฟังก์ชั่นย่อย  เขียนดังนี้
  void ชื่อโปรแกรม(ชนิดตัวแปร  ชื่อตัวแปรคืนค่า)
  {
   คำสั่งต่างๆ และตัวแปร ;
  }
ส่วนอธิบายโปรแกรม ในการเขียนส่วนอธิบายโปรแกรมจะต้องมีขอบเขตเช่นกัน ดังนี้
 / *   ข้อความอธิบาย   */