วันพุธที่ 26 ธันวาคม พ.ศ. 2555

โปรแกรมสวิตซ์กดติด-ปล่อยดับ

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

ขั้นตอนที่ 1

 ประกอบวงจรตามรูปด้านล่าง ลงในโปรแกรม Proteus ครับ



คำสั่งที่ใช้ในการโปรแกรม

while()  เป็นคำสั่งทำงานซ้ำแบบมีเงื่อนไขครับ ซึ่งจะทำงานวนซ้ำไปเรื่อยๆจนกว่าเงื่อนไขจะเป็นเท็จ


output_x(...)   เป็นคำสั่งส่งข้อมูลออกทางเอาต์พุตในพอร์อตที่ต้องการตามค่าที่กำหนด เช่น output_b(0x01);

delay_ms(...)  เป็นคำสั่งหน่วงเวลา เช่น delay_ms(500); โปรแกรมจะหน่วงเวลา 500ms ซึ่งค่านี้เราสามารถเปลี่ยนแปลงได้ตามความต้องการครับ


set_tris_x()  เป็นคำสั่งกำหนดพอร์ตใช้งานให้พอร์ตอินพุต หรือเอาต์พุต โดยการกำหนดค่าให้กับฟังก์ชัน set_tris_x() เช่น set_tris_b(0x00); , set_tris_a(0xff);


value = input() เป็นคำสั่งอ่านข้อมูลจากพอร์ตอินพุตที่ต้องการ เช่น a=!input(pin_a0);

output_bit()  เป็นคำสั่งส่งข้อมูลออกทางเอาต์พุตในระดับบิต เช่น output_bit(pin_b0,a);
 

ขั้นตอนที่ 2

เริ่มเขียนโปรแกรมกันเลยครับ



#include <16F84A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT
#use fast_io(A)
#use fast_io(B)


int1 a;                                      //  คำสั่งประกาศตัวแปร a เป็นเลขจำนวนเต็มขนาน 1 บิต

void main()

{
  set_tris_a(0xff);                        //  คำสั่งกำหนดพอร์ต A เป็นพอร์ตอินพุตทั้งหมด
  set_tris_b(0x00);                      //  คำสั่งกำหนดพอร์ต B ให้เป็นพอร์ตเอาต์พุตทั้งหมด

  output_b(0b00000000);            //  คำสั่งเคลียร์พอร์ต B ให้เป็น 0 ทุกบิต
  
  while(true)                              //  คำสั่งวนซ้ำแบบมีเงื่อนไข
        {
          a=!input(pin_a0);            //  คำสั่งอ่านข้อมูลจากพอร์ตอินพุต ขา a0
          output_bit(pin_b0,a);       //  คำสั่งส่งข้อมูลออกทางเอาต์พุตขนาด 1 บิต
        }                                      //  โดยนำค่า a ส่งออกที่ขา b0
}






การทำงานของโปรแกรม

  •    เมื่อยังไม่มีการกดสวิตซ์
           input(pin_a0) มีค่าเป็นลอจิก 1 เมื่อใส่เครื่องหมายนิเสธ "!" เข้าไปจะมีการกลับสถานะข้อมูลจากลอจิก 1 เป็นลอจิก 0 (!input(pin_a0) มีค่าเป็นลอจิก 0) ดังนั้น ค่า a = 0 เมื่อนำค่า a ส่งออกไปยังพอร์ตเอาต์พุตขา b0 LED1 จึงยังไม่ติด
  •   เมื่อมีการกดสวิตซ์ 
          input(pin_a0) มีค่าเป็นลอจิก 0 เมื่อใส่เครื่องหมายนิเสธ "!" เข้าไปจะมีการกลับสถานะข้อมูลจากลอจิก 0 เป็นลอจิก 1 (!input(pin_a0) มีค่าเป็นลอจิก 1) ดังนั้น ค่า a = 1 เมื่อนำค่า a ส่งออกไปยังพอร์ตเอาต์พุตขา b0 LED1 จึงติด


        หรือถ้าหากต้องการให้ LED1 ทำงานเป็นตรงกันข้าม คือ กดดับ-ปล่อยติด เราก็สามารถที่จะแก้โปรแกรมที่บรรทัด a=!input(pin_a0); ให้เป็น a=input(pin_a0); ได้เช่นกันครับ

        เมื่อรู้ผลกันแล้วทุกท่านคงจะพอเข้าใจการใช้งานพอร์ตอินพุตของ ไมโครคอนโทรลเลอร์ PIC 
กันบ้างแล้ว ขอให้สนุกกับการเขียนโปรแกรมไมโครคอนโทรลเลอร์นะครับ แล้วเจอกันในบทความหน้าครับ

วันอังคารที่ 25 ธันวาคม พ.ศ. 2555

โปรแกรมไฟวิ่ง

     บทความนี้เราจะมาศึกษาโปรแกรมไฟวิ่งกันครับ หลังจากที่ได้ทดลองเขียน โปรแกรมไฟกระพริบ LED 2 ดวง กันไปแล้ว ทีนี้เรามาทดลองเขียนโปรแกรมไฟวิ่งกันบ้างครับ ซึ่งจะใช้ LED ทั้งหมด 8 ดวงต่อเข้ากับพอร์ตเอาต์พุต B ทั้งหมด เพื่อที่จะให้ท่านที่เขียนไมโครคอนโทรลเลอร์มือใหม่ ได้เข้าใจการใช้งานเอาต์พุตพอร์ตดิจิตอลทั้ง 8 บิตควบคุม LED 8 ดวง มาเริ่มกันเลยครับ

ขั้นตอนที่ 1

 ประกอบวงจรตามรูปด้านล่าง ลงในโปรแกรม Proteus ครับ



คำสั่งที่ใช้ในการโปรแกรม

while()  เป็นคำสั่งทำงานซ้ำแบบมีเงื่อนไขครับ ซึ่งจะทำงานวนซ้ำไปเรื่อยๆจนกว่าเงื่อนไขจะเป็นเท็จ


for() เป็นคำสั่งทำงานซ้ำที่มีจำนวนลูปที่แน่นอน และจะหยุดทำซ้ำเมื่อเงื่อนไขเป็นเท็จ เช่น
for(i=1;i<=9;i++)

output_x(...)   เป็นคำสั่งส่งข้อมูลออกทางเอาต์พุตในพอร์อตที่ต้องการตามค่าที่กำหนด เช่น output_b(0x01);

delay_ms(...)  เป็นคำสั่งหน่วงเวลา เช่น delay_ms(500); โปรแกรมจะหน่วงเวลา 500ms ซึ่งค่านี้เราสามารถเปลี่ยนแปลงได้ตามความต้องการครับ


set_tris_b()  เป็นคำสั่งกำหนดให้พอร์ต B เป็นเอาต์พุตทั้งหมดนั่นเอง โดยการกำหนดค่าให้กับฟังก์ชัน set_tris_b() เท่ากับ 0x00 เช่น set_tris_(0x00);


ขั้นตอนที่ 2

เริ่มเขียนโปรแกรมกันเลยครับ



#include <16F84A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT,NOPROTECT
#use fast_io(A)
#use fast_io(B)

void main()
{
  char i,j;                                   //  กำหนดตัวแปร i,j
  set_tris_b(0x00);                      //  คำสั่งกำหนดพอร์ต B ให้เป็นพอร์ตเอาต์พุตทั้งหมด
  output_b(0b00000000);            //  คำสั่งเคลียร์พอร์ต B ให้เป็น 0 ทุกบิต
  
  while(true)                              //  คำสั่งวนซ้ำแบบมีเงื่อนไข
        {
           j=1;                               //  กำหนดตัวแปร j=1
           for(i=1;i<=8;i++)           //  คำสั่งทำซ้ำโดยกำหนดให้ i=1,i<=8,i=i+1
              {
                output_b(j);               //  กำหนดให้เอาต์พุตพอร์ต B = j
                j=j<<1;                    //  ให้ตัวแปร j เลื่อนบิตไปทางซ้าย 1 ตำแหน่ง
                delay_ms(1000);        //  คำสั่งหน่วงเวลา 1 วินาที
              }
         }
  }
      



การทำงานของโปรแกรม

      เมื่อ
โปรแกรมไฟวิ่งเริ่มทำงาน LED 1 จะติดโดยหน่วงเวลา 1 วินาทีถึงจะดับ พร้อมกันนี้ LED 2 ก็จะติดด้วยโดยหน่วงเวลา 1 วินาทีเช่นกัน เป็นอย่างนี้ไปเรื่อยๆ จนถึง LED 8 แล้วก็จะวนซ้ำกลับมาติดที่ LED 1 อีกครั้ง

    เป็นยังไงบ้างครับโปรแกรมไฟวิ่ง เมื่อได้ลองกันแล้วง่ายมากเลยใช่มั๊ยครับ
    ทีนี้ก็ลองแก้โปรแกรมที่บรรทัด for(i=1;i<=8;i++) ให้เป็น for(i=1;i<=5;i++) แล้วทำการคอมไพล์โปรแกรมใหม่ดูบ้างนะครับว่าLED 1 ถึง LED 8จะมีการเปลี่ยนแปลงยังไงบ้าง

    แล้วลองแก้ที่บรรทัด  j=1; ให้เป็น j=3; แล้วทำการคอมไพล์โปรแกรมใหม่เช่นกัน แล้วสังเกตุดูการเปลี่ยนแปลงของ LED 1 ถึง LED 8 ว่ามีการเปลี่ยนแปลงยังไงบ้าง

   อีกบรรทัดครับ แก้ j=j<<1; ให้เป็น j=j<<2; แล้วทำการคอมไพล์โปรแกรมใหม่ สังเกตุดูการเปลี่ยนแปลงของ LED 1 ถึง LED 8 ว่ามีการเปลี่ยนแปลงยังไงบ้าง 

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

  
 

วันจันทร์ที่ 24 ธันวาคม พ.ศ. 2555

โปรแกรมไฟกระพริบสลับกัน LED 2 ดวง

  บทความที่แล้วเราทำโปรแกรม โปรแกรมไฟกระพริบ LED 2 ดวง กันไปแล้วโดย LED ติดดับพร้อมกันไม่ยากอย่างที่คิดเลยใช่มั๊ยล่ะครับ ทีนี้เรามาเขียนโปรแกรมให้ LED ติดดับสลับกันบ้างครับ

ขั้นตอนที่ 1

 ประกอบวงจรตามรูปด้านล่าง ลงในโปรแกรม Proteus ครับ



คำสั่งที่ใช้ในการโปรแกรม

while()  เป็นคำสั่งทำงานซ้ำแบบมีเงื่อนไขครับ ซึ่งจะทำงานวนซ้ำไปเรื่อยๆจนกว่าเงื่อนไขจะเป็นเท็จ

output_x(...)   เป็นคำสั่งส่งข้อมูลออกทางเอาต์พุตในพอร์อตที่ต้องการตามค่าที่กำหนด เช่น output_b(0x01);

delay_ms(...)  เป็นคำสั่งหน่วงเวลา เช่น delay_ms(500); โปรแกรมจะหน่วงเวลา 500ms ซึ่งค่านี้เราสามารถเปลี่ยนแปลงได้ตามความต้องการครับ


ขั้นตอนที่ 2

เริ่มเขียนโปรแกรมกันเลยครับ


#include<16F84A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT

void main()
{
  while(true)                      // คำสั่งวนซ้ำแบบมีเงื่อนไข
         {
           output_b(0x01);     // คำสั่งส่งข้อมูลออกทางเอาต์พุตพอร์ต b0
           delay_ms(1000);    // คำสั่งหน่วงเวลา 1 วินาที
           output_b(0x02);     //
คำสั่งส่งข้อมูลออกทางเอาต์พุตพอร์ต b1
           delay_ms(1000);    // คำสั่งหน่วงเวลา 1 วินาที
         }
}






การทำงานของโปรแกรม

      เมื่อโปรแกรมเริ่มทำงาน LED ทั้งสองดวง จะติดและดับสลับกัน โดยหน่วงเวลาในการติด 1 วินาที และหน่วงเวลาในการดับ 1 วินาที 

วันอาทิตย์ที่ 23 ธันวาคม พ.ศ. 2555

โปรแกรมไฟกระพริบ LED 2 ดวง


 โปรแกรมไฟกระพริบ LED 2 ดวง

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



ขั้นตอนที่ 1

ประกอบวงจรตามรูปด้านล่าง ลงในโปรแกรม Proteus ครับ




คำสั่งที่ใช้ในการโปรแกรม

while()  เป็นคำสั่งทำงานซ้ำแบบมีเงื่อนไขครับ ซึ่งจะทำงานวนซ้ำไปเรื่อยๆจนกว่าเงื่อนไขจะเป็นเท็จ

output_x(...)   เป็นคำสั่งส่งข้อมูลออกทางเอาต์พุตในพอร์อตที่ต้องการตามค่าที่กำหนด เช่น output_b(0x01);

delay_ms(...)  เป็นคำสั่งหน่วงเวลา เช่น delay_ms(500); โปรแกรมจะหน่วงเวลา 500ms ซึ่งค่านี้เราสามารถเปลี่ยนแปลงได้ตามความต้องการครับ


ขั้นตอนที่ 2

  เมื่อเราต่อวงจรใน Proteus เสร็จแล้วก็มาเขียนโปรแกรม โดยใช้โปรแกรม CCS C Compiler กันครับแต่ต้องศึกษา
วิธี การใช้งาน ccs compiler ก่อนนะครับ

เริ่มกันเลยครับ


#include<16F84A.h>
#use delay(clock=4000000)
#fuses XT,NOWDT

void main()
{
  while(true)                      // คำสั่งวนซ้ำแบบมีเงื่อนไข
         {
           output_b(0x03);     // คำสั่งส่งข้อมูลออกทางเอาต์พุตพอร์ต b0 และ b1
           delay_ms(1000);    // คำสั่งหน่วงเวลา 1 วินาที
           output_b(0x00);     // คำสั่งให้เอาต์พุตพอร์ต b ทั้งหมดเป็นลอจิก 0
           delay_ms(1000);    // คำสั่งหน่วงเวลา 1 วินาที
         }
}






การทำงานของโปรแกรม

      เมื่อโปรแกรมเริ่มทำงาน LED ทั้งสองดวง จะติดและดับพร้อมๆกันครับ โดยหน่วงเวลาในการติด 1 วินาที และหน่วงเวลาในการดับ 1 วินาที
                    

วันเสาร์ที่ 22 ธันวาคม พ.ศ. 2555

เริ่มต้นใช้งาน ไมโครคอนโทรลเลอร์ PIC

  

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

1. โปรแกรม CCS C Compiler
    ใช้สำหรับเขียนโปรแกรมให้กับไมโครคอนโทรลเลอร์ PIC

2. โปรแกรม Proteus 7.xx
    ใช้สำหรับจำลองการทำงานของโปรแกรมที่เราเขียนขึ้นมาครับ