เริ่มต้นใช้งาน PIC Microcontroller

เริ่มต้นใช้งาน PIC Microcontroller

(1/5) > >>

kiano♥:
กระทู้สำหรับผู้เริ่มต้น และผู้สนใจทั่วไป ที่สนใจจะเริ่มเรียนเริ่มใช้งาน  PIC
จะพยายามเขียนแบบศัพท์ชาวบ้านเลยนะครับ เปิ่นๆบ้างแต่เอาเป็นว่า อ่านแล้วใช้งานได้ปุ๊บปั๊บเลยครับ

- PIC Microcontroller คืออะไร
- ต้องมีอะไรบ้าง ถึงจะใช้งาน PIC ได้
- ขั้นตอนการสร้างโครงงาน PIC

- PIC Microcontroller คืออะไร
มันเป็นเหมือนคอมพิวเตอร์เครื่องหนึ่งครับ ประกอบไปด้วยส่วนสำคัญๆคือ อินพุต ส่วนประมวณผล และเอาพุต แล้วการทำงานของมันก็จะทำงานตามโปรแกรมที่อยู่ในตัวมัน ลองนึกภาพดูนะครับ ว่าเราซื้อคอมมาใหม่ ประกอบเสร็จแล้ว แต่ไม่มีวินโดว์ มันจะทำงานอะไรได้ไหม ก็เหมือน pic ที่ซื้อมาใหม่ จะต้องลงโปรแกรมให้มันก่อนมันถึงจะทำงานได้

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

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

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

kiano♥:
ถ้าในเครื่องใช้ไฟฟ้ายกตัวอย่างเครื่องซักผ้า การทำงานก็จะประกอบด้วย

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

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

kiano♥:
- ต้องมีอะไรบ้าง ถึงจะใช้งาน PIC ได้

อุปกรณ์เครื่องไม้เครื่องมือที่จำเป็นสำหรับการใช้งาน PIC มีดังนี้ครับ

1. เครื่องคอมพิวเตอร์ และโปรแกรมวินโดว์
2. โปรแกรมสำหรับเขียนโค๊ด PIC และโปรแกรมจำพวกซิมูเลเตอร์
3. เครื่องเบิร์นโค๊ดลง PIC และโปรแกรมสำหรับเบิร์น

1.   เครื่องคอมพิวเตอร์

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

2.   โปรแกรมสำหรับเขียนโค๊ด PIC

รวมไปถึงโปรแกรมสำหรับจำลองการทำงานของ PIC ด้วย โปรแกรมที่เขียนโค๊ดจะขึ้นอยู่กับภาษาที่ใช้เขียนโค๊ด เวลาเขียนก็เขียนด้วยภาษาใดภาษาหนึ่ง หรือจะเขียนด้วยกันทั้งสองภาษาเลยก็ได้

MikroC เป็นโปรแกรมสำหรับเขียนโค๊ดด้วยภาษาซี ดูการใช้งานโปรแกรมและดาวโหลดโปรแกรมได้จากที่นี่
http://www.ubmthai.com/leksoundsmf3/index.php?topic=67451.0

Mplab IDE เป็นโปรแกรมสำหรับเขียนโค๊ดด้วยภาษาแอสเซมบลี ดูการใช้งานโปรแกรมและดาวโหลดโปรแกรมได้จากที่นี่
http://www.ubmthai.com/leksoundsmf3/index.php?topic=67452.0

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

Proteus เป็นโปรแกรมวาดรูปวงจรอิเล็กทรอนิกส์ ออกแบบลายวงจร PCB แต่ที่ใช้บ่อยคือจำลองการทำงานของวงจร PIC ทำให้ไม่ต้องเสียเวลาไปต่อวงจรจริงๆ เขียนโค๊ดเสร็จก็เอาโค๊ดเข้ามาโปรแกรมนี้ดูการทำงานได้เลย ถ้าไม่เป็นไปตามที่ต้องการ ก็กลับไปแก้โค๊ดใหม่ ดูการใช้งานโปรแกรมและโหลดโปรแกรมได้จากที่นี่
http://www.ubmthai.com/leksoundsmf3/index.php?topic=67453.0

PIC SimulatorIDE เป็นโปรแกรมซิมมูเลเตอร์อีกตัว ที่ดูการทำงานของ PIC แบบเข้าถึงทุกตำแหน่งความจำ หรือเรียกว่า Register ได้ทุกตำแหน่ง
ดูการใช้งานโปรแกรมและโหลดโปรแกรมได้จากที่นี่ http://www.ubmthai.com/leksoundsmf3/index.php?topic=67454.0

3.   เครื่องเบิร์นโค๊ดลง PIC และโปรแกรมสำหรับเบิร์น
เครื่องเบิร์น PIC ที่ผมใช้อยู่และขอแนะนำคือรุ่น PX-200 ดูรายละเอียดได้จาก http://www.inex.co.th/micro/programmer.html
หรือดูได้จากที่นี่  http://www.es.co.th/search.asp?Word=px%2D200&PC=037004&Mode=1&tb=&stk=&pb=&view=Selection&pic=checked

บริษัทที่ผลิต PIC ออกมาขายชื่อ บริษัทไมโครซิฟ และเขาได้ผลิตเครื่องโปรแกรม PIC มาขายด้วย เรียกว่า PICKIT2 แต่จุดประสงค์หลักของเขาคือการขายตัว PIC เขาเลยทำเครื่องโปรแกรมมาขายแบบโอเพ่นซอร์ส คือบอกทุกรายละเอียดเกี่ยวกับเครื่องโปรแกรม ทั้งวงจรทั้งการใช้งานต่างๆ เลยมีคนผลิตออกมาขายบ้าง แต่ไม่ได้ใช้ชื่อว่า PICKIT2 ใช้ชื่อเรียกต่างๆกัน แล้วแต่จะตั้งขึ้นมา แต่การทำงานเหมือนกับ PICKIT2 ทุกอย่าง ใช้ชิฟตัวเดียวกัน ใช้วงจรเหมือนกัน รวมทั้งใช้ซอฟแวร์ในการเบิร์นโค๊ดลง PIC ตัวเดียวกันด้วย แต่ที่สำคัญ ราคาถูกกว่ามากมาย PICKIT2 จะขายอยู่ที่ 3,500 บาท แต่ตัวที่ทำเป็น OEM ออกมาขายราคาจะอยู่ที่ 1,000 บาท ซึ่งนั่นก็คือเครื่องรุ่นที่แนะนำคือ PX-200 นั่นเอง
รายละเอียดของ PICKIT2 ดูได้จาก http://www.es.co.th/search.asp?Word=pickit2&PC=037004&Mode=1&tb=&stk=&pb=&view=Selection&pic=checked

kiano♥:
- ขั้นตอนการสร้างโครงงาน PIC

เริ่มจากคิดโปรเจคที่จะทำก่อนเลยครับ ขอยกตัวอย่างโปรเจคง่ายๆนะครับ เช่น
"ไฟวิ่ง 3 รูปแบบ"
รูปแบบที่แสดงผลออกมาคือ จะมีไฟวิ่งเลือกรูปแบบได้ 3 รูปแบบโดยการเลือกรูปแบบการวิ่งนั้นกดเลือกที่ SW1

ขั้นตอนที่ 1 คิดวงจร จะได้วงจรออกมาตามภาพครับ เป็นวงจรพื้นฐานของ PIC คือใช้พอร์ต B ทั้งหมดเป็น เอาต์พุต แล้วต่อเข้ากับหลอด LED

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


ขั้นตอนที่ 2 เขียนโฟว์ชาร์ทการทำงานของโค๊ด จะได้โฟว์ชาร์ตการทำงานตามภาพด้านล่างครับ

จากรูปโฟว์ชาร์ทการทำงาน จะเห็นว่าแยกออกเป็น 3 ส่วน

ส่วนที่ 1 จะกำหนดพอร์ตต่างๆของ PIC คือกำหนดว่าพอร์ตไหนเป็น อินพุต หรือ เอาต์พุด

ส่วนที่ 2 คือส่วนรับคำสั่งจากสวิทช์ จะเห็นว่า เมื่อเรากดสวิทช์ SW1 ค่าของตัวแปร P จะเพิ่มขึ้น 1 ค่า แล้วเข้ามาเงื่อนไขตรวจสอบสวิทช์อีกเพื่อดูว่า ปล่อยมือจากสวิทช์แล้วหรือยัง ถ้าเรายังไม่ปล่อยมือจากสวิทช์ SW1 หลอด LED จะติดทุกหลอดเพื่อแสดงให้เห็นว่า ปล่อยมือได้แล้ว รับคำสั่งเรียบร้อยแล้ว...อิอิ สังเกตุให้ดีครับ จะเห็นว่าตรงนี้ลูกศรชี้วนไปที่จุดเริ่มวนลูป นั่นคือ ถ้าเรายังไม่ปล่อยมือจากสวิทช์ โปรแกรมก็จะทำงานวนอยู่ในลูปนี้ แล้วหลังจากที่ปล่อยมือจากสวิทช์ โปรแกรมจะออกจากลูป แล้วมาที่เงื่อนไขต่อไป คือตรวจสอบค่าของตัวแปร P ถ้าค่าของตัวแปร มากกว่า 2 หรืออีกอย่างคือ P มีค่าตั้งแต่ 3 4 5 6 ... ไปจะกำหนดให้ P มีค่าเป็น 0 แต่ถ้า P มีค่า 2  1  0 ก็ผ่านไปได้แล้ววิ่งไปตามลูกศรเลยครับ

ส่วนที่ 3 จะเป็นการตรวจสอบเงือนไขรูปแบบไฟวิ่ง โดยจะตรวจสองค่าของตัวแปร P ถ้ามีค่าเป็น 0 เงือนไขที่ 1 จะเป็นจริงแล้วจะไปทำงานไฟวิ่งรูปแบบที่ 1 แต่ถ้าไม่เป็นจริงก็จะตรวจสอบว่า ค่าของ P เป็น 1 หรือไม่ ถ้าเป็นจริง ก็จะทำงานไฟวิ่งรูปแบบที่ 2 สุดท้าย ถ้าค่าของ P ไม่ได้มีค่าเป็น 0 หรือ 1 ก็จะทำงานไฟวิ่งรูปแบบที่ 3

อ่านแล้วงงใช่ไหมครับ... อิอิ ผมก็เริ่มงงแล้ว

kiano♥:
หลังจากที่ได้วงจร ได้โฟว์ชาร์ทการทำงานของโปแกรมกันแล้ว ก็มาเริ่มเขียนโค๊ดโปรแกรมกันเลยครับ เริ่มจากเปิดโปรแกรมเขียนโค๊ดที่ชื่อว่า MikroC ขึ้นมาแล้วสร้างโปรเจคขึ้นมาใหม่ ตามขั้นตอนต่างๆในภาพครับ ( หรือดูขั้นตอนต่างๆได้จากกระทู้ http://www.ubmthai.com/leksoundsmf3/index.php?topic=67451.0 )

เริ่มจากสร้างโฟลเดอร์ใหม่ขึ้นมาก่อน เพื่อใช้เก็บโค๊ดที่เราจะเขียนขึ้นครับ ตามภาพด้านล่าง
 

จากนั้นเปิดโปรแกรม MikroC แล้วสร้างโปรเจคใหม่ขึ้นมาตามภาพด้านล้าง


แล้วใส่รายละเอียดต่างๆของโปรเจคตามภาพตัวอย่างครับ


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

_WDT_OFF      ปิดการทำงานของ วอทดอก ไทม์เมอร์
_LVP_OFF       ปิดการทำงานแบบ โลว์โวลเตจโปรแกรมเมอร์ เพื่อให้ใช้ขาของพอร์ต B ได้ครบทุกขา
_MCLRE_OFF   ปิดการทำงานของขารีเซ็ต เพื่อไม่ต้องต่ออาร์พูลอัพที่ขารีเซ็ต และสามารถนำขารีเซ็ตมาเป็นอินพุตได้ นั่นคือขา 4 (RA5)
_INTRC_OSC_NOCLKOUT  เลือกสัญญาณ CLK จากภายในแบบ RC และขา CLK OUT ใช้งานเป็น อิน-เอาท์พุตได้ นั่นคือขา 15 (RA6)
_HS_OSC       เลือกใช้คริสตอลความถี่สูง จากความถี่เท่าไหร่ถึงเท่าไหร่ลืมแล้วครับ ต้องเปิดอ่านในดาต้าชีท แต่ถ้าใช้ CLK ภายในไม่ต้องติ๊กตัวนี้ก็ได้

หลังจากที่เลือกตั้งค่าต่างๆของโปรเจคเสร็จแล้ว ก็เริ่มเขียนโค๊ดกันได้เลย ซึ่งโค๊ดจากด้านล่างนี้ ก๊อปไปวางไว้ที่หน้าต่างเขียนโค๊ดของ MikroC ได้เลยครับ




//************************************************************************************
//************************************************************************************
//
//   ไฟวิ่งเลือกได้ 3 รูปแบบ
//   PIC16F627A
//   http://www.ubmthai.com/leksoundsmf3/index.php?PHPSESSID=911e51fa19d3a848c23316dcb39cf132;topic=67728.msg357764#msg357764
//
//************************************************************************************

void timer(void);   //ประกาศฟังก์ชั่นใช้ร่วมกัน

main()
{
//--------------- จากโฟว์ชาร์ทส่วนที่ 1 กำหนดพอร์ตต่างๆ
  char p=0;        //กำหนดตัวแปร p เป็นแบบ char มีค่าเท่ากับ 0
  cmcon=0x07;    //รีจิสเตอร์ cmcon มีค่าเท่ากับ 00000111 เพื่อให้พอร์ต A รับสัญญาณแบบดิจิตอล
  portA=0xFF;     //ให้พอร์ต A ทุกขาเป็น อินพุต
  portB=0x00;     //ให้พอร์ต B ทุกขาเป็น เอาพุต

//--------------- จากโฟว์ชาร์ทส่วนที่ 2 ตรวจสอบการกดสวิทช์ SW1
  while(1)
  {
    if(portA.f0==0)
    {
      p++;
      while(portA.f0==0)
      {
        portB=0xFF;
        timer();
      }
      if(p>2)
      {
        p=0;
      }
    }


//--------------- จากโฟว์ชาร์ทส่วนที่ 3 ตรวจสอบค่าของ P เพื่อกำหนดรูปแบบการวิ่ง
    if(p==0)                    //ถ้า P มีค่าเท่ากับ 0 ให้วิ่งรูปแบบที่ 1
    {
      portB=0b11111111;
      timer();
      portB=0b00000000;
      timer();
    }else{
    if(p==1)                  //ถ้า P มีค่าเท่ากับ 1 ให้วิ่งรูปแบบที่ 2
    {
      portB=0b11110000;
      timer();
      portB=0b00001111;
      timer();
    }else{                   //ไฟวิ่งรูปแบบที่ 3
      portB=0b11000000;
      timer();
      portB=0b00110000;
      timer();
      portB=0b00001100;
      timer();
      portB=0b00000011;
      timer();
    }
    }
 
  } // end while-1
} // end main

void timer(void)
{
  delay_ms(100);
}

//************************************************************************************
//************************************************************************************


จากรูปด้านล่างคือการคอมไพล์โค๊ดผ่านแล้ว



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


นำร่อง

[0] ดัชนีข้อความ

[#] หน้าถัดไป