ไมโครคอนโทรลเลอร์เบื้องต้น ปฏิบัติการเกี่ยวกับวิศวกรรมคอมพิวเตอร์ (01204223) ผศ.ดร.ชัยพร ใจแก้ว ภาควิชาวิศวกรรมคอมพิวเตอร์ คณะวิศวกรรมศาสตร์ มหาวิทยาลัยเกษตรศาสตร์
ไมโครคอนโทรลเลอร์ คอมพิวเตอร์ขนาดเล็กที่ถูกรวมไว้ในชิปเดียว ประกอบด้วย หน่วยประมวลผลกลาง (CPU) วงจรอินพุท/เอาท์พุท หน่วยความจำแรม รอม แฟลช ตัวจับเวลา ตัวนับ ฯลฯ
ภายในไมโครคอนโทรลเลอร์ ROM Flash Memory RAM CPU I/O Ports Timers Analog to Digital Converter
สถาปัตยกรรม AVR สถาปัตยกรรมแบบ 8 บิต RISC ถูกพัฒนาขึ้นโดยบริษัท Atmel ในปี 1996 ซีรีส์ต่าง ๆ ของไมโครคอนโทรลเลอร์ตระกูล AVR tinyAVR เช่น ATtiny12, ATtiny24 megaAVR เช่น ATmega8, ATMega168 XMEGA เช่น ATxmega128A1, ATxmega384A1
รีจีสเตอร์ หน่วยความจำขนาดเล็กภายใน CPU ตั้งค่าและอ่านค่าได้จากโปรแกรม รีจีสเตอร์แต่ละตัวมีหน้าที่ได้แตกต่างกัน เป็นที่พักข้อมูล ที่อ่านจาก RAM/Flash เพื่อเตรียมประมวลผล ที่เป็นผลลัพธ์จากการคำนวณและเตรียมเก็บลง RAM เก็บสถานะและกำหนดพฤติกรรมของ uC เช่น กำหนดให้ขาไอซีเป็นอินพุทหรือเอาท์พุท อ่านลอจิกของขาอินพุท และเขียนลอจิกของขาเอาท์พุท
รีจีสเตอร์ในสถาปัตยกรรม AVR General purpose registers 32 ตัว ตัวละ 8 บิต I/O registers ทั้งหมดถูกอ้างถึงได้ผ่านตำแหน่งของหน่วยความจำ
ตำแหน่งหน่วยความจำสำหรับอ้างอิง รีจีสเตอร์ R0 0x0000 R1 0x0001 General Purpose Registers R2 0x0002 : : R29 0x001D R30 0x001E R31 0x001F Data Memory Space 0x00 0x0020 0x01 0x0021 0x02 0x0022 I/O Registers : : 0x3D 0x005D 0x3E 0x005E 0x3F 0x005F : :
ตัวอย่างรีจีสเตอร์ DDRD – I/O รีจีสเตอร์หมายเลข 0x0A PORTD – I/O รีจีสเตอร์หมายเลข 0x0B แต่ละบิตกำหนดลอจิกให้ขาแต่ละขาของพอร์ท D ที่ถูกกำหนดเป็นเอาท์พุท PIND – I/O รีจีสเตอร์หมายเลข 0x09 แต่ละบิตเก็บค่าลอจิกที่อ่านได้จากขาแต่ละขาของพอร์ท D ที่ถูกกำหนดให้เป็นอินพุท
โปรแกรมตัวอย่าง โค้ดต่อไปนี้กำหนดให้ขา PD3 เป็นเอาท์พุทและส่งลอจิก 0 ไปที่ขานี้ ทำให้ LED สีเขียวติดค้าง int main() { *((uint8_t*)0x2A) = 0b00001000; *((uint8_t*)0x2B) = 0b00000000; while(1) ; }
โปรแกรมตัวอย่าง หมายเลขรีจีสเตอร์นั้นยากต่อการจำ และอาจเปลี่ยนตำแหน่งเมื่อใช้ uC เบอร์อื่น ไฟล์เฮดเดอร์ avr/io.h เตรียมนิยามรีจีสเตอร์เหล่านี้ไว้ให้เพื่อความสะดวก #include <avr/io.h> int main() { DDRD = 0b00001000; PORTD = 0b00000000; while(1) ; }