1 / 29

Microcontroller

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

alden
Télécharger la présentation

Microcontroller

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


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

  2. Reduced Instruction Set Computer (RISC) • เป็นไมโครโพรเซสเซอร์ชนิด หนึ่งที่มีชุดคำสั่งจำนวนไม่มากนัก ตรงข้ามกับ CISC (Complex Instruction Set Computer) คอมพิวเตอร์แบบ RISC สามารถกระทำการตามคำสั่งได้อย่างรวดเร็วมากเพราะคำสั่งจะสั้น นอกจากนั้นชิพแบบ RISC ยังผลิตได้ง่ายกว่าอีกด้วย (เนื่องจากใช้จำนวนทรานซิสเตอร์น้อยกว่า) ตัวอย่างชิพประเภทนี้ได้แก่ ARM, DEC Alpha, PA-RISC, SPARC, MIPS, และ PowerPC

  3. RISC • เป็นสถาปัตยกรรมคอมพิวเตอร์ที่ นิยมใช้ในปัจจุบัน และยังมีแนวโน้มจะเพิ่มมากขึ้นเป็นลำดับในอนาคต ทั้งนี้เพราะการใช้สถาปัตยกรรมแบบนี้เป็นวิธีหนึ่งที่ทำให้คอมพิวเตอร์ทำงาน เร็วขึ้น ปกติ หากพิจารณาจำนวนบิตที่เท่ากันระหว่างสถาปัตยกรรม • คอมพิวเตอร์แบบ CISCกับ RISC แล้ว จะพบว่าคอมพิวเตอร์แบบ RISC จะเร็วกว่าแบบ CISC ประมาณ 3 เท่า หลักการอย่างง่ายของเครื่องคอมพิวเตอร์แบบ RISC คือ ออกแบบให้ซีพียู (CPU) ทำงานในวงรอบสัญญาณนาฬิกา (Cycle) ที่แน่นอน โดยพยายามลดจำนวนคำสั่งลงให้เหลือเป็นคำสั่งพื้นฐานมากที่สุด

  4. RISC • ใช้หลักการไปป์ไลน์ (pipeline) คือ การทำงานแบบคู่ขนานชนิดเหลื่อมกัน (overlap) ปกติแล้วการทำงานใน 1 ชุดคำสั่งจะใช้เวลามากกว่า 1 วงรอบสัญญาณนาฬิกา (cycle) หากแต่การทำคำสั่งเหล่านั้นให้มีการทำงานในลักษณะเป็นแถว (pipe) และขนานกันด้วย จึงทำให้ได้ค่าเฉลี่ยโดยรวมของเวลาเป็นคำสั่งละหนึ่งวงรอบสัญญาณนาฬิกา (cycle)

  5. AVR • AVR เป็นไมโครคอนโทรลเลอร์ตระกูลหนึ่งผลิตโดยบริษัท Atmel AVR มีสถาปัตยกรรมแบบ RISC มีความเร็วในการประมวลผล 1 คำสั่ง ต่อ 1 สัญญาณนาฬิกา ใช้พลังงานต่ำโดยบางรุ่นใช้ไฟเพียง 1.5 V - 5.5 V เท่านั้นและยังมีโหมดประหยัดพลังงานอีก 6 โหมด ในบทความนี้ผมจะใช้ AVR เบอร์ ATmega48 ซึ้งเป็นรุ่นเล็กสุดในกลุ่ม ATmega

  6. คุณสมบัติของ ATmega48/88/168 -มีหน่วยความจำสำหรับเก็บโปรแกรมแบบแฟลช(ROM) ขนาด 4 กิโลไบต์ สามรถเขียน-ลบได้ประมาณ 10,000 ครั้ง-มีหน่วยความจำข้อมูล(RAM) ขนาด 512 ไบต์-มีหน่วยความจำข้อมูลอีอีพรอม(EEPROM) ขนาด 256 ไบต์ สามรถเขียน-ลบได้ประมาณ 100,000 ครั้ง

  7. คุณสมบัติของ ATmega48/88/168 -มีพอร์ตอินพุตเอาต์พุตให้ใช้งานจำนวน 23 ขา (PB0 ถึง PB7, PC0 ถึง PC6, PD0 ถึง PD7)-มีความเร็วในการประมวนผลสูงสุด 20 ล้านคำสั่งต่อ 1 วินาทีที่ความถี่ 20 MHz-มีโมดูลแปลงสัญญาณอะนาลอกเป็นดิจิตอล(Analog-to-Digital Converter) ขนาด 10 บิต 6 ช่องสำหรับตัวถังแบบ PDIP และ 8 ช่องสำหรับตัวถังแบบ TQFP และ MLF

  8. คุณสมบัติของ ATmega48/88/168 -มีโมดูลสร้างสัญญาณ Pulse width Modulator(PWM) 3 ชุด 6 ช่องสัญญาณ -มี Timer/Counters ขนาด 8 บิต 2 ตัว และ 16 บิต 1 ตัว

  9. ตำแหน่งขาของ ATmega48 ตัวถังแบบ PDIP

  10. การต่อใช้งาน

  11. ภาษาที่ใช้เขียนโปรแกรมไมโครคอนโทรลเลอร์ภาษาที่ใช้เขียนโปรแกรมไมโครคอนโทรลเลอร์ • ภาษาที่ใช้เขียนโปรแกรมไมโครคอนโทรลเลอร์มีหลายภาษา เช่น ภาษาเครื่อง,Assembly, BASIC, C เป็นต้น แต่ละภาษาก็มีข้อดีข้อเสียแตกต่างกันไป ในที่นี้จะใช้ภาษา C เนื่องจากเขียนง่ายแก้ไขเปลี่ยนแปลงได้ง่าย(ความจริงเขียนเป็นแต่ภาษา C

  12. โปรแกรมเขียนภาษา C สำหรับไมโครคอนโทรลเลอร์ • สำหรับโปรแกรมที่ใช้เขียนนั้นผมจะใช้ …..C for AVR (โหลดทึ่นี่http://www.esnack.ne) เนื่องจากเป็นโปรแกรมที่ใช้งานง่ายมีไลบรารีให้ใช้เพียบเหมาะสำหรับมือใหม่ การเขียนภาษา C นั้นเข้าไปอ่านที่ < http://www.vcharkarn.com/varticle/18065 >

  13. โปรแกรมเขียนภาษา C สำหรับไมโครคอนโทรลเลอร์ • ผู้ที่มีพื้นฐานภาษา C อยู่แล้วคงไม่ต้องอ่านแค่เรียนรู้รีจิสเตอร์ต่างๆของไมโครคอนโทรลเลอร์เพิ่มเติมเท่านั้นเริ่มต้นด้วยการลงโปรแกรม C for AVR ก่อนคงไม่ยากสำหรับทุกคนในนี้ เมื่อเปิดโปรแกรมครั้งแรกในพื้นที่ทำงามมันจะมีตัวอย่างการเขียนโปรแกรมก็ ให้ปิดไปเลยครับ เริ่มโปรเจคใหม่โดยเลือกตามขั้นตอน

  14. โปรแกรมเขียนภาษา C สำหรับไมโครคอนโทรลเลอร์ • Software Download • WinAVR-20100110 • AVR Studio 4.18 • AVR Studio 4 Service Pack 2 • Khazama AVR Programmer v.1.6.2 • Driver • USBasp-windriver.2011-05-28.zip

  15. Introduction to eSnack

  16. คุณสมบัติ • 1 x ATmega 88 Microcontroller • 8 x LED • 5 x Reflex Sensors with LEDs status • 1 x Buzzer • 20 pin GPIO/Expansion • Download Program via mini USB Cable

  17. พอร์ต i/o ต่างๆของ ATmega48 • ตามมาตรฐานสากลจะเรียกขาอินพุตเอาต์พุต(ใช้ i/o แทนอินพุตเอาต์พุต)ว่า."พอร์ต" ATmega8 นั้นมีพอร์ต i/o อิสระให้ใช้งานทั้งหมด 23ขา โดยแบ่งออกเป็น3กลุ่มคือ พอร์ต B มี 8ขา (PB0 ถึง PB7), พอร์ต C มี 7ขา (PC0 ถึง PC6)และพอร์ต D มี 8ขา (PD0 ถึง PD7) แต่เนื่องจาก PC6 นั้นเป็นขา Reset ไม่สามารถเอามาใช้งานได้จึงเหลือพอร์ตให้ใช้งาน 22พอร์ต ความจริงก็เอา PC6 มาใช้เป็นพอร์ต i/o ได้เหมือนกันแต่มันจะไม่สามารถโปรแกรมแบบ ISP ได้อีกต้องโปรแกรมแบบ High Voltage เท่านั้น

  18. การกำหนดทิศทางของพอร์ตการกำหนดทิศทางของพอร์ต • เมื่อเริ่มโปรแกรม main สิ่งแรกที่ต้องทำก็คือการกำหนดทิศทางของแต่ละพอร์ต พอร์ตต่างๆนั้นสามารถที่จะให้เป็นอินพุตหรือเอาต์พุตก็ได้โดยการใส่ค่า คงที่ให้กับรีจิสเตอร์ DDRB สำหรับพอร์ต B ทั้งหมด DDRC สำหรับพอร์ต C ทั้งหมด และ DDRD สำหรับพอร์ต D ทั้งหมด

  19. การกำหนดทิศทางของพอร์ตการกำหนดทิศทางของพอร์ต • ค่าคงที่นั้นเราจะใช้เลขฐาน2, ฐาน10หรือฐาน16ก็ได้ ถ้ากำหนดให้เป็น "0" พอร์ตนั้นก็จะเป็นอินพุตแต่ถ้าเป็น "1" พอร์ตนั้นก็จะเป็นเอาต์พุต • เช่น ต้องการให้พอร์ต D ทั้งหมดเป็นอินพุตเราก็พิมพ์ DDRD = 0x00; ลงไป 00 นั้นเป็นเลขฐาน16เมื่อแปลเป็นเลขฐาน2ก็จะได้ 00000000 โดยที่ 0 ตัวแรกนั้นจะกำหนดทิศทางของพอร์ต D7 และไล่ไปทางขวาเรื่อยๆจนถึง 0 ตัวสุดท้ายก็คือพอร์ต D0 นอกจากนี้เรายังสามารถกำหนดแบบเจาะจงพอร์ตได้โดยเติม .Bx(xคือหมายเลขพอร์ต) เช่นต้องการให้พอร์ต B1 เป็นเอาต์พุตเราก็พิมพ์ DDRB.B1 = 1; ลงไป

  20. การกำหนดสถานะของพอร์ตเอาต์พุตการกำหนดสถานะของพอร์ตเอาต์พุต • เมื่อกำหนดพอร์ตนั้นๆให้เป็นเอาต์พุตแล้วก็จะมากำหนดสถานะของพอร์ตนั้นๆ อีกที สามารถกำหนดสถานะของพอร์ตได้2แบบคือ 1(ไฟบวก)และ 0(ไฟลบ) • โดยกำหนดได้จากรีจิสเตอร์ PORTB สำหรับพอร์ต B ทั้งหมด • PORTC สำหรับพอร์ต C ทั้งหมด • และ PORTD สำหรับพอร์ต D ทั้งหมด ค่าคงที่นั้นเราจะใช้เลขฐาน2, ฐาน10หรือฐาน16ก็ได้ ถ้ากำหนดให้เป็น "0" พอร์ตนั้นก็จะมีสถานะเป็น 0(ไฟลบ) แต่ถ้าเป็น "1" พอร์ตนั้นก็จะมีสถานะเป็น 1(ไฟบวก) ยกตัวเช่น ต้องการให้พอร์ต D ทั้งหมดมีสถานะเป็น 0 เราก็พิมพ์ PORTD = 0x00; ลงไป นอกจากนี้ยังสามารถกำหนดแบบเจาะจงพอร์ตได้โดยเติม .Bx(xคือหมายเลขพอร์ต) เช่นต้องการให้พอร์ต B1 มีสถานะเป็น 0 เราก็พิมพ์ PORTB.B1 = 0; ลงไป

  21. การอ่านค่าจากพอร์ตอินพุตการอ่านค่าจากพอร์ตอินพุต • เมื่อเรากำหนดให้พอร์ตใดๆเป็นพอร์ตอินพุตเราจะสามารถมารถให้พอร์ตนั้นรับ สัญญาณจากอุปกรณ์อื่นได้ อย่างเช่นสวิตช์เป็น แล้วก็ทำการอ่านค่าจากพอร์ตนั้นเพื่อเอามาเป็นเงื่อนไขในการทำงาน ค่าที่เราอ่านพอร์ต1พอร์ตจะมี 1 กับ 0 เท่านั้นแต่ถ้าอ่านทั้ง 8 พอร์ตก็จะอ่านได้ทั้งหมด 256 ค่า เราสามารถอ่านค่าจากพอร์ตอินพุตได้จากรีจิสเตอร์ PINB สำหรับพอร์ต B ทั้งหมด, PINC สำหรับพอร์ต C ทั้งหมดและ PIND สำหรับพอร์ต D ทั้งหมด นอกจากนี้เรายังสามารถอ่านค่าแบบเจาะจงพอร์ตได้โดยเติม .Bx(xคือหมายเลขพอร์ต) เช่นต้องการอ่านค่าจากพอร์ต B1 ก็พิมพ์ PINB.B1

  22. ตัวอย่างโปรแกรมพื้นฐานต่างๆตัวอย่างโปรแกรมพื้นฐานต่างๆ • โปรแกรมไฟกระพริบ 1 ดวง • void main() //เริ่มโปรแกรมหลัก{DDRB.B0 = 1; //ให้พอร์ต B0 เป็นเอาต์พุตwhile(1) //วนลูปแบบไม่รู้จบ{PORTB.B0 = 0; //ให้พอร์ต B0 มีสถานะเป็น 0 LED ดับDelay_ms(1000); //หน่วงเวลาให้ LED ดับ 1 วินาทีPORTB.B0 = 1; //ให้พอร์ต B0 มีสถานะเป็น 1 LED ติดสว่างDelay_ms(1000); //หน่วงเวลาให้ LED ติดสว่าง 1 วินาที}}

  23. ตัวอย่างโปรแกรมพื้นฐานต่างๆตัวอย่างโปรแกรมพื้นฐานต่างๆ • void main() //เริ่มโปรแกรมหลัก{DDRB.B0 = 1; //ให้พอร์ต B0 เป็นเอาต์พุตPORTB.B0 = 0; //ให้พอร์ต B0 มีสถานะเป็น 0while(1) //วนลูปแบบไม่รู้จบ{PORTB.B0 = ~PORTB.B0; //กลับสถานะพอร์ต B0 ให้ตรงข้ามกับสถานะเดิมDelay_ms(1000); //หน่วงเวลา 1 วินาที}}

  24. ตัวอย่างโปรแกรมพื้นฐานต่างๆตัวอย่างโปรแกรมพื้นฐานต่างๆ • โปรแกรมไฟกระพริบ 2 ดวงติดสลับกัน • void main() //เริ่มโปรแกรมหลัก{DDRB = 0x03; //ให้พอร์ต B0 และ B1 เป็นเอาต์พุตPORTB.B0 = 0; //ให้พอร์ต B0 มีสถานะเป็น 0PORTB.B1 = 1; //ให้พอร์ต B1 มีสถานะเป็น 1while(1) //วนลูปแบบไม่รู้จบ{PORTB.B0 = ~PORTB.B0; //กลับสถานะพอร์ต B0 ให้ตรงข้ามกับสถานะเดิมPORTB.B1 = ~PORTB.B1; //กลับสถานะพอร์ต B1 ให้ตรงข้ามกับสถานะเดิมDelay_ms(1000); //หน่วงเวลา 1 วินาที}}

  25. ตัวอย่างโปรแกรมพื้นฐานต่างๆตัวอย่างโปรแกรมพื้นฐานต่างๆ • โปรแกรมไฟวิ่ง 8 ดวง • void main() //เริ่มโปรแกรมหลัก{DDRB = 0xFF; //ให้พอร์ต B ทั้งหมดเป็นเอาต์พุตwhile(1) //คำสั่งวนลูปแบบไม่รู้จบ{j = 1; //ให้ตัวแปล j มีค่าเท่ากับ 1for(i=0;i<8;i++) //คำสั่งวนลูปนี้ 8 รอบ{PORTB = j; //ให้พอร์ต B เท่ากับตัวแปล jj = j<<1; //เลื่อนข้อมูลของตัวแปล j ไปทางซ้าย 1 บิทDelay_ms(100); //หน่วงเวลา 0.1วินาที}}}

  26. อธิบายโปรแกรมไฟวิ่ง 8 ดวง • โปรแกรมนี้เป็นโปรแกรมไฟวิ่ง 8 ดวงวิ่งเรียงกันไปเรื่อยๆจนถึงดวงที่ 8 แล้วจะกลับมาดวงที่ 1 อีกทีและจะเป็นแบบนี้ไปเรื่อยๆ • โปรแกรมนี้จะมีการใช้งานตัวแปลด้วย ก่อนเริ่มโปรแกรม main จะมีการตั้งชื่อและกำหนดชนิดของตัวแปลก่อนนั้นก็คือตัวแปล iและ j

  27. อธิบายโปรแกรมไฟวิ่ง 8 ดวง • คำสั่ง for(i=0;i<8;i++) เป็นคำสั่งวนลูปแบบตั้งเงื่อนไขเพื่อกำหนดจำนวนรอบที่ต้องให้มีการวนคำสั่ง ซ้ำ (i=0;i<8;i++) • หมายถึงในขณะเริ่มต้นให้ตัวแปล iมีค่าเท่ากับ 1 จากนั้นทำการตรวจสอบว่าตัวแปล I มีค่าน้อยกว่า 8 หรือไม่ • หากตัวแปล iมีค่าน้อยกว่า 8 ให้เพิ่มค่าตัวแปล iขึ้น 1 ค่าจนกว่าตัวแปล iจะมีค่าไม่น้อยกว่า 8 เงื่อนไขในวงเล็บก็จะเป็นเท็จคำสั่งวนลูป for(){} ก็จะหยุดทำงาน

  28. อธิบายโปรแกรมไฟวิ่ง 8 ดวง • จากตัวอย่างกำหนดให้มีการวนลูปจำนวน 8 รอบ • คำสั่ง j = j<<1; เป็นคำสั่งให้มีการเลื่อนบิทข้อมูลของตัวแปล j ไปทางซ้าย 1 ตำแหน่ง คำสั่ง PORTB = j; ให้พอร์ต B มีค่าเท่ากับตัวแปล j

More Related