ไมโครคอนโทรลเลอร์เบื้องต้น ปฏิบัติการเกี่ยวกับวิศวกรรมคอมพิวเตอร์ (01204223) ผศ.ดร.ชัยพร ใจแก้ว ภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเกษตรศาสตร์
ไมโครคอนโทรลเลอร์ คอมพิวเตอร์ขนาดเล็กที่ถูกรวมไว้ในชิปเดียว ประกอบด้วย หน่วยประมวลผลกลาง (CPU) วงจรอินพุท/เอาท์พุท หน่วยความจำแรมและแฟลช ตัวจับเวลา ตัวนับ ฯลฯ
ส่วนประกอบภายในและการใช้งาน Flash Memory RAM อุปกรณ์ภายนอก (เช่น LED, จอ LCD, สวิตช์, ตัววัดแสง, มอเตอร์, รีเลย์ ฯลฯ) CPU I/O Ports Registers Timers & Counters Analog to Digital Converter แหล่งจ่ายไฟ (เช่น พอร์ท USB, ถ่านไฟฉาย, Power Bank)
สถาปัตยกรรม AVR สถาปัตยกรรมแบบ 8 บิต RISC ถูกพัฒนาขึ้นโดยบริษัท Atmel ในปี 1996 ซีรีส์ต่าง ๆ ของไมโครคอนโทรลเลอร์ตระกูล AVR tinyAVR เช่น ATtiny12, ATtiny24 megaAVR เช่น ATmega8, ATmega168 XMEGA เช่น ATxmega128A1, ATxmega384A1 1 KB RAM 16 KB Flash
วงจรบอร์ดไมโครคอนโทรลเลอร์
กระบวนการพัฒนาเฟิร์มแวร์ สร้างซอร์สไฟล์ 1 เท็กซ์เอดิเตอร์ (gedit, vim ฯลฯ) ซอร์สโค้ด (.c, .cpp, .s) คอมไพล์โปรแกรม 2 ครอสคอมไพเลอร์ (avr-gcc) ไฟล์ executable (.elf) สกัดรหัสภาษาเครื่อง 3 โปรแกรมสกัดโค้ด (avr-objcopy) 010101 011101 110110 รหัสภาษาเครื่อง (.hex) อัพโหลดเฟิร์มแวร์ ลงชิป 4 โปรแกรมอัพโหลด (avrdude) ชิปโปรแกรมเมอร์
เฟิร์มแวร์ตัวแรก สั่งให้ LED สีเขียวบนเมนบอร์ดติดและดับสลับกันไปทุก ๆ ครึ่งวินาที เริ่มต้น กำหนดให้ขา PD3 เป็นเอาท์พุท ส่งลอจิก 1 ไปยังขา PD3 หน่วงเวลา 500 ms ส่งลอจิก 0 ไปยังขา PD3 หน่วงเวลา 500 ms
การสั่งงานไมโครคอนโทรลเลอร์ โดยมากใช้ภาษาแอสเซมบลี้ หรือภาษาซี อ่านและเขียนค่าผ่าน "รีจีสเตอร์"
รีจีสเตอร์ หน่วยความจำขนาดเล็กภายใน CPU ตั้งค่าและอ่านค่าได้จากโปรแกรม เป็นที่พักข้อมูล ที่อ่านจาก RAM/Flash เพื่อเตรียมประมวลผล ที่เป็นผลลัพธ์จากการคำนวณและเตรียมเก็บลง RAM เก็บสถานะและกำหนดพฤติกรรมของ uC เช่น กำหนดให้ขาไอซีเป็นอินพุทหรือเอาท์พุท อ่านลอจิกของขาอินพุท และเขียนลอจิกของขาเอาท์พุท
รีจีสเตอร์ในสถาปัตยกรรม AVR แบ่งเป็นสองประเภท General purpose registers 32 ตัว ตัวละ 8 บิต I/O registers ทั้งหมดถูกอ้างถึงได้ผ่านตำแหน่งของหน่วยความจำ ไฟล์เฮดเดอร์ avr/io.h นิยามชื่อรีจีสเตอร์ไว้เพื่อความสะดวกในการเขียนโปรแกรม
ตัวอย่างรีจีสเตอร์ของ ATmega168 DDRD แต่ละบิตกำหนดทิศทาง (อินพุทหรือเอาท์พุท) ให้ขาแต่ละขาของพอร์ท D PORTD แต่ละบิตกำหนดลอจิกให้ขาแต่ละขาของพอร์ท D ที่ถูกกำหนดเป็นเอาท์พุท PIND แต่ละบิตเก็บค่าลอจิกที่อ่านได้จากขาแต่ละขาของพอร์ท D ที่ถูกกำหนดให้เป็นอินพุท
โปรแกรมตัวอย่าง: first.c ระวังอย่าให้โปรแกรมที่เขียนขึ้น สำหรับไมโครคอนโทรลเลอร์ จบการทำงานออกจากฟังก์ชัน main() ระบุว่าชิปทำงานที่ความถี่ 16 MHz #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main() { DDRD = 0b00001000; while (1) PORTD = 0b00001000; _delay_ms(500); PORTD = 0b00000000; } return 0; กำหนดให้ PD3 เป็นเอาท์พุท ส่งลอจิก 1 ไปยังขา PD3 ส่งลอจิก 0 ไปยังขา PD3
การคอมไพล์และสกัดโค้ดภาษาเครื่อง ดูรายละเอียดจากวิกิ [[การพัฒนาเฟิร์มแวร์สำหรับไมโครคอนโทรลเลอร์]] ใช้คำสั่ง avr-gcc เพื่อคอมไพล์โปรแกรมสำหรับ MCU เบอร์ ATMega168 สกัดโค้ดภาษาเครื่องออกจากไฟล์ executable $ avr-gcc -mmcu=atmega168 -O -o first.elf first.c $ avr-objcopy -j .text -j .data -O ihex first.elf first.hex
การอัพโหลดเฟิร์มแวร์ โค้ดภาษาเครื่องต้องถูกโปรแกรมลงไปในหน่วยความจำแฟลชของไมโครคอนโทรลเลอร์ ทำได้โดยใช้ "ชิปโปรแกรมเมอร์"
การอัพโหลดเฟิร์มแวร์ด้วย Boot Loader เข้าสู่ Boot Loader โดยกดปุ่ม รีเซ็ตในขณะที่มีจั๊มเปอร์ เสียบอยู่ที่ขา Boot Loader ใช้คำสั่ง avrdude เพื่ออัพโหลดโค้ดภาษาเครื่องลงสู่ไมโครคอนโทรลเลอร์ $ avrdude -p atmega168 -c usbasp -U flash:w:first.hex
การทำงานของ Boot Loader
แบบฝึกหัด แก้ไขโปรแกรม first.c เพื่อให้ LED สีเขียวบนบอร์ดติดดับเป็นจังหวะดังนี้ ติด 1 วินาที และดับ 2 วินาที สลับกันไป
การบ้าน เขียนโปรแกรมให้ LED ทั้งสามสี ติดไล่วนเป็นลำดับ เขียว -> เหลือง -> แดง -> เขียว … LED แต่ละดวงติดค้างเป็นเวลา .5 วินาที หมายเหตุ: แก้ไขโปรแกรมจากตัวอย่างในวิกิ อย่าลืมระบุ F_CPU
แบบฝึกหัด เขียนโปรแกรมให้ LED ทั้งสามสี ติดไล่วนเป็นลำดับ เขียว -> เหลือง -> แดง -> เขียว … LED แต่ละดวงติดค้างเป็นเวลา .5 วินาที