370 likes | 767 Views
Microcontroller. ไมโครคอนโทรลเลอร์เป็นอุปกรณ์อิเล็กทรอนิกส์ที่ใช้ควบคุมอุปกรณ์ไฟฟ้า หรือระบบ อิเล็กทรอนิกส์ต่างๆ ไมโครคอนโทรลเลอร์ นั้นเปรียบเสมือนคอมพิวเตอร์ขนาด เล็กที่ต้องการให้ทำอะไรก็ เขียนโปรแกรม ที่ต้องการใส่ ลง ไปโดยที่ต้องมีความสัมพันธ์กันระหว่างอุปกรณ์และโปรแกรม.
E N D
Microcontroller • ไมโครคอนโทรลเลอร์เป็นอุปกรณ์อิเล็กทรอนิกส์ที่ใช้ควบคุมอุปกรณ์ไฟฟ้าหรือระบบอิเล็กทรอนิกส์ต่างๆ • ไมโครคอนโทรลเลอร์นั้นเปรียบเสมือนคอมพิวเตอร์ขนาดเล็กที่ต้องการให้ทำอะไรก็เขียนโปรแกรมที่ต้องการใส่ลงไปโดยที่ต้องมีความสัมพันธ์กันระหว่างอุปกรณ์และโปรแกรม
Reduced Instruction Set Computer (RISC) • เป็นไมโครโพรเซสเซอร์ชนิด หนึ่งที่มีชุดคำสั่งจำนวนไม่มากนัก ตรงข้ามกับ CISC (Complex Instruction Set Computer) คอมพิวเตอร์แบบ RISC สามารถกระทำการตามคำสั่งได้อย่างรวดเร็วมากเพราะคำสั่งจะสั้น นอกจากนั้นชิพแบบ RISC ยังผลิตได้ง่ายกว่าอีกด้วย (เนื่องจากใช้จำนวนทรานซิสเตอร์น้อยกว่า) ตัวอย่างชิพประเภทนี้ได้แก่ ARM, DEC Alpha, PA-RISC, SPARC, MIPS, และ PowerPC
RISC • เป็นสถาปัตยกรรมคอมพิวเตอร์ที่ นิยมใช้ในปัจจุบัน และยังมีแนวโน้มจะเพิ่มมากขึ้นเป็นลำดับในอนาคต ทั้งนี้เพราะการใช้สถาปัตยกรรมแบบนี้เป็นวิธีหนึ่งที่ทำให้คอมพิวเตอร์ทำงาน เร็วขึ้น ปกติ หากพิจารณาจำนวนบิตที่เท่ากันระหว่างสถาปัตยกรรม • คอมพิวเตอร์แบบ CISCกับ RISC แล้ว จะพบว่าคอมพิวเตอร์แบบ RISC จะเร็วกว่าแบบ CISC ประมาณ 3 เท่า หลักการอย่างง่ายของเครื่องคอมพิวเตอร์แบบ RISC คือ ออกแบบให้ซีพียู (CPU) ทำงานในวงรอบสัญญาณนาฬิกา (Cycle) ที่แน่นอน โดยพยายามลดจำนวนคำสั่งลงให้เหลือเป็นคำสั่งพื้นฐานมากที่สุด
RISC • ใช้หลักการไปป์ไลน์ (pipeline) คือ การทำงานแบบคู่ขนานชนิดเหลื่อมกัน (overlap) ปกติแล้วการทำงานใน 1 ชุดคำสั่งจะใช้เวลามากกว่า 1 วงรอบสัญญาณนาฬิกา (cycle) หากแต่การทำคำสั่งเหล่านั้นให้มีการทำงานในลักษณะเป็นแถว (pipe) และขนานกันด้วย จึงทำให้ได้ค่าเฉลี่ยโดยรวมของเวลาเป็นคำสั่งละหนึ่งวงรอบสัญญาณนาฬิกา (cycle)
AVR • AVR เป็นไมโครคอนโทรลเลอร์ตระกูลหนึ่งผลิตโดยบริษัท Atmel AVR มีสถาปัตยกรรมแบบ RISC มีความเร็วในการประมวลผล 1 คำสั่ง ต่อ 1 สัญญาณนาฬิกา ใช้พลังงานต่ำโดยบางรุ่นใช้ไฟเพียง 1.5 V - 5.5 V เท่านั้นและยังมีโหมดประหยัดพลังงานอีก 6 โหมด ในบทความนี้ผมจะใช้ AVR เบอร์ ATmega48 ซึ้งเป็นรุ่นเล็กสุดในกลุ่ม ATmega
คุณสมบัติของ ATmega48/88/168 -มีหน่วยความจำสำหรับเก็บโปรแกรมแบบแฟลช(ROM) ขนาด 4 กิโลไบต์ สามรถเขียน-ลบได้ประมาณ 10,000 ครั้ง-มีหน่วยความจำข้อมูล(RAM) ขนาด 512 ไบต์-มีหน่วยความจำข้อมูลอีอีพรอม(EEPROM) ขนาด 256 ไบต์ สามรถเขียน-ลบได้ประมาณ 100,000 ครั้ง
คุณสมบัติของ ATmega48/88/168 -มีพอร์ตอินพุตเอาต์พุตให้ใช้งานจำนวน 23 ขา (PB0 ถึง PB7, PC0 ถึง PC6, PD0 ถึง PD7)-มีความเร็วในการประมวนผลสูงสุด 20 ล้านคำสั่งต่อ 1 วินาทีที่ความถี่ 20 MHz-มีโมดูลแปลงสัญญาณอะนาลอกเป็นดิจิตอล(Analog-to-Digital Converter) ขนาด 10 บิต 6 ช่องสำหรับตัวถังแบบ PDIP และ 8 ช่องสำหรับตัวถังแบบ TQFP และ MLF
คุณสมบัติของ ATmega48/88/168 -มีโมดูลสร้างสัญญาณ Pulse width Modulator(PWM) 3 ชุด 6 ช่องสัญญาณ -มี Timer/Counters ขนาด 8 บิต 2 ตัว และ 16 บิต 1 ตัว
ตำแหน่งขาของ ATmega48 ตัวถังแบบ PDIP
ภาษาที่ใช้เขียนโปรแกรมไมโครคอนโทรลเลอร์ภาษาที่ใช้เขียนโปรแกรมไมโครคอนโทรลเลอร์ • ภาษาที่ใช้เขียนโปรแกรมไมโครคอนโทรลเลอร์มีหลายภาษา เช่น ภาษาเครื่อง,Assembly, BASIC, C เป็นต้น แต่ละภาษาก็มีข้อดีข้อเสียแตกต่างกันไป ในที่นี้จะใช้ภาษา C เนื่องจากเขียนง่ายแก้ไขเปลี่ยนแปลงได้ง่าย(ความจริงเขียนเป็นแต่ภาษา C
โปรแกรมเขียนภาษา C สำหรับไมโครคอนโทรลเลอร์ • สำหรับโปรแกรมที่ใช้เขียนนั้นผมจะใช้ …..C for AVR (โหลดทึ่นี่http://www.esnack.ne) เนื่องจากเป็นโปรแกรมที่ใช้งานง่ายมีไลบรารีให้ใช้เพียบเหมาะสำหรับมือใหม่ การเขียนภาษา C นั้นเข้าไปอ่านที่ < http://www.vcharkarn.com/varticle/18065 >
โปรแกรมเขียนภาษา C สำหรับไมโครคอนโทรลเลอร์ • ผู้ที่มีพื้นฐานภาษา C อยู่แล้วคงไม่ต้องอ่านแค่เรียนรู้รีจิสเตอร์ต่างๆของไมโครคอนโทรลเลอร์เพิ่มเติมเท่านั้นเริ่มต้นด้วยการลงโปรแกรม C for AVR ก่อนคงไม่ยากสำหรับทุกคนในนี้ เมื่อเปิดโปรแกรมครั้งแรกในพื้นที่ทำงามมันจะมีตัวอย่างการเขียนโปรแกรมก็ ให้ปิดไปเลยครับ เริ่มโปรเจคใหม่โดยเลือกตามขั้นตอน
โปรแกรมเขียนภาษา 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
คุณสมบัติ • 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
พอร์ต 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 เท่านั้น
การกำหนดทิศทางของพอร์ตการกำหนดทิศทางของพอร์ต • เมื่อเริ่มโปรแกรม main สิ่งแรกที่ต้องทำก็คือการกำหนดทิศทางของแต่ละพอร์ต พอร์ตต่างๆนั้นสามารถที่จะให้เป็นอินพุตหรือเอาต์พุตก็ได้โดยการใส่ค่า คงที่ให้กับรีจิสเตอร์ DDRB สำหรับพอร์ต B ทั้งหมด DDRC สำหรับพอร์ต C ทั้งหมด และ DDRD สำหรับพอร์ต D ทั้งหมด
การกำหนดทิศทางของพอร์ตการกำหนดทิศทางของพอร์ต • ค่าคงที่นั้นเราจะใช้เลขฐาน2, ฐาน10หรือฐาน16ก็ได้ ถ้ากำหนดให้เป็น "0" พอร์ตนั้นก็จะเป็นอินพุตแต่ถ้าเป็น "1" พอร์ตนั้นก็จะเป็นเอาต์พุต • เช่น ต้องการให้พอร์ต D ทั้งหมดเป็นอินพุตเราก็พิมพ์ DDRD = 0x00; ลงไป 00 นั้นเป็นเลขฐาน16เมื่อแปลเป็นเลขฐาน2ก็จะได้ 00000000 โดยที่ 0 ตัวแรกนั้นจะกำหนดทิศทางของพอร์ต D7 และไล่ไปทางขวาเรื่อยๆจนถึง 0 ตัวสุดท้ายก็คือพอร์ต D0 นอกจากนี้เรายังสามารถกำหนดแบบเจาะจงพอร์ตได้โดยเติม .Bx(xคือหมายเลขพอร์ต) เช่นต้องการให้พอร์ต B1 เป็นเอาต์พุตเราก็พิมพ์ DDRB.B1 = 1; ลงไป
การกำหนดสถานะของพอร์ตเอาต์พุตการกำหนดสถานะของพอร์ตเอาต์พุต • เมื่อกำหนดพอร์ตนั้นๆให้เป็นเอาต์พุตแล้วก็จะมากำหนดสถานะของพอร์ตนั้นๆ อีกที สามารถกำหนดสถานะของพอร์ตได้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; ลงไป
การอ่านค่าจากพอร์ตอินพุตการอ่านค่าจากพอร์ตอินพุต • เมื่อเรากำหนดให้พอร์ตใดๆเป็นพอร์ตอินพุตเราจะสามารถมารถให้พอร์ตนั้นรับ สัญญาณจากอุปกรณ์อื่นได้ อย่างเช่นสวิตช์เป็น แล้วก็ทำการอ่านค่าจากพอร์ตนั้นเพื่อเอามาเป็นเงื่อนไขในการทำงาน ค่าที่เราอ่านพอร์ต1พอร์ตจะมี 1 กับ 0 เท่านั้นแต่ถ้าอ่านทั้ง 8 พอร์ตก็จะอ่านได้ทั้งหมด 256 ค่า เราสามารถอ่านค่าจากพอร์ตอินพุตได้จากรีจิสเตอร์ PINB สำหรับพอร์ต B ทั้งหมด, PINC สำหรับพอร์ต C ทั้งหมดและ PIND สำหรับพอร์ต D ทั้งหมด นอกจากนี้เรายังสามารถอ่านค่าแบบเจาะจงพอร์ตได้โดยเติม .Bx(xคือหมายเลขพอร์ต) เช่นต้องการอ่านค่าจากพอร์ต B1 ก็พิมพ์ PINB.B1
ตัวอย่างโปรแกรมพื้นฐานต่างๆตัวอย่างโปรแกรมพื้นฐานต่างๆ • โปรแกรมไฟกระพริบ 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 วินาที}}
ตัวอย่างโปรแกรมพื้นฐานต่างๆตัวอย่างโปรแกรมพื้นฐานต่างๆ • void main() //เริ่มโปรแกรมหลัก{DDRB.B0 = 1; //ให้พอร์ต B0 เป็นเอาต์พุตPORTB.B0 = 0; //ให้พอร์ต B0 มีสถานะเป็น 0while(1) //วนลูปแบบไม่รู้จบ{PORTB.B0 = ~PORTB.B0; //กลับสถานะพอร์ต B0 ให้ตรงข้ามกับสถานะเดิมDelay_ms(1000); //หน่วงเวลา 1 วินาที}}
ตัวอย่างโปรแกรมพื้นฐานต่างๆตัวอย่างโปรแกรมพื้นฐานต่างๆ • โปรแกรมไฟกระพริบ 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 วินาที}}
ตัวอย่างโปรแกรมพื้นฐานต่างๆตัวอย่างโปรแกรมพื้นฐานต่างๆ • โปรแกรมไฟวิ่ง 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วินาที}}}
อธิบายโปรแกรมไฟวิ่ง 8 ดวง • โปรแกรมนี้เป็นโปรแกรมไฟวิ่ง 8 ดวงวิ่งเรียงกันไปเรื่อยๆจนถึงดวงที่ 8 แล้วจะกลับมาดวงที่ 1 อีกทีและจะเป็นแบบนี้ไปเรื่อยๆ • โปรแกรมนี้จะมีการใช้งานตัวแปลด้วย ก่อนเริ่มโปรแกรม main จะมีการตั้งชื่อและกำหนดชนิดของตัวแปลก่อนนั้นก็คือตัวแปล iและ j
อธิบายโปรแกรมไฟวิ่ง 8 ดวง • คำสั่ง for(i=0;i<8;i++) เป็นคำสั่งวนลูปแบบตั้งเงื่อนไขเพื่อกำหนดจำนวนรอบที่ต้องให้มีการวนคำสั่ง ซ้ำ (i=0;i<8;i++) • หมายถึงในขณะเริ่มต้นให้ตัวแปล iมีค่าเท่ากับ 1 จากนั้นทำการตรวจสอบว่าตัวแปล I มีค่าน้อยกว่า 8 หรือไม่ • หากตัวแปล iมีค่าน้อยกว่า 8 ให้เพิ่มค่าตัวแปล iขึ้น 1 ค่าจนกว่าตัวแปล iจะมีค่าไม่น้อยกว่า 8 เงื่อนไขในวงเล็บก็จะเป็นเท็จคำสั่งวนลูป for(){} ก็จะหยุดทำงาน
อธิบายโปรแกรมไฟวิ่ง 8 ดวง • จากตัวอย่างกำหนดให้มีการวนลูปจำนวน 8 รอบ • คำสั่ง j = j<<1; เป็นคำสั่งให้มีการเลื่อนบิทข้อมูลของตัวแปล j ไปทางซ้าย 1 ตำแหน่ง คำสั่ง PORTB = j; ให้พอร์ต B มีค่าเท่ากับตัวแปล j