โปรแกรมแรก กับ ATmega32 Board
สำหรับไมโครคอนโทรลเลอร์ Atmega328 เป็นไอซีไมโครคอนโทรลเลอร์ของบริษัท Atmel มีโครงสร้าง ภายในเป็นแบบ RISC (Reduced instruction set Computer) มีหน่วยความจำโปรแกรมภายในเป็นแบบแฟลช สามารถเขียน-ลบโปรแกรมใหม่ได้หลายครั้ง โปรแกรมข้อมูลเป็นแบบ In-System programmable
ในโลกของการเขียนโปรแกรม “Hello World” คือ คำที่นิยมใช้เวลาเริ่มเขียนโปรแกรมแรก (มักเป็นโปรแกรมง่ายๆ เพื่อทดสอบการทำงาน ว่าสามารถทำงานได้จริง) ในโลกของอิเล็กทรอนิกส์ก็เช่นกัน “Hello World” ก็คือ การทำ “ไฟกระพริบ” ด้วยตัวอย่างโปรแกรมแรก กับ ATmega32 Board โดยการเขียนโปรแกรม ให้ไฟกระพริบ ซึ่งมีพร้อมอยู่ในบอร์ดแล้ว สลับ ติด-ดับ
รายการอุปกรณ์
ขั้นตอนการทํางาน
1 : ติดตั้ง Atmel Studio 7.0
ดาวน์โหลดซอฟต์แวร์ Atmel Studio 7.0 ได้ที่ :
การติดตั้งเหมือนกับโปรแกรมทั่วๆไป
2 : ลงไดร์เวอร์ให้ เครื่องโปรแกรม AVR รุ่น USBasp
เสียบ USBasp ไปที่ USB ของ คอมพิวเตอร์
คลิกขวา ที่ Start เลือกไปที่ Device Manager
แสดงการติดตั้งไดรเวอร์ที่ยังไม่สมบูรณ์
ดาวน์โหลดไดร์เวอร์ USBasp ตามลิงค์ด้านล่าง
เมื่อดาว์นโหลดไฟล์เสร็จแล้ว ให้คลายไฟล์นำไปวางไว้ในโฟลเดอร์
คลิก เลือกไฟล์ InstallDriver เพื่อติดตั้งไดรเวอร์
คลิก Next >
คลิก Finish
ตรวจสอบไดร์เวอร์ USBasp หลังติดตั้ง ต้องแสดงการติดตั้งไดรเวอร์ USBasp ที่พร้อมใช้งานแล้ว
3 : เชื่อมต่อ USBasp กับ ATmega32 Board
เชื่อมต่อ USBasp กับ ATmega32 Board ที่ช่อง ISP
4 : สร้างโปรเจคสำหรับเขียนโค้ดภาษา C
เมื่อเปิดโปรแกรม Atmel Studio 7.0 ขึ้นมา ให้คลิกที่เมนู File -> New -> Project..
เลือกเป็น C/C++ -> GCC C Executable Project -> ตั้งชื่อโปรเจค เป็น ATmega32-LED -> OK
ไมโครคอนโทรลเลอร์ ที่ใช้เป็น ATmega32A
ที่ Device Family : จึงเลือกเป็น ATmega -> ATmega32A -> OK
โปรแกรมจะสร้าง ไฟล์โค้ด main.c ให้โดยอัตโนมัติ
5 : เขียนโค้ดภาษา C
โค้ดตัวอย่างเป็นการทำให้ LED ที่อยู่เชื่อมต่ออยู่ที่ ขา PA4 ของ ATmega32A กระพริบได้ ด้วยการหน่วงเวลา หรือเว้นระยะ จะใช้วิธีที่เรียกว่า Software Delay Loop
จากรูปด้านบน การเขียนโค้ดกำหนดขาของ ATmega32A การเรียกใช้งานขาต่างๆ ซึ่งต้องใช้คำสั่งระดับบิต (bit) ตัวอย่าง ขา PA0 ถึง PA7 ได้ดังนี้
ขา PA0 เขียนเป็น 0B00000001 // PORTA0
ขา PA1 เขียนเป็น 0B00000010 // PORTA1
ขา PA2 เขียนเป็น 0B00000100 // PORTA2
ขา PA3 เขียนเป็น 0B00001000 // PORTA3
ขา PA4 เขียนเป็น 0B00010000 // PORTA4
ขา PA5 เขียนเป็น 0B00100000 // PORTA5
ขา PA6 เขียนเป็น 0B00100000 // PORTA6
ขา PA7 เขียนเป็น 0B01000000 // PORTA7
หน่วยข้อมูลคอมพิวเตอร์ ที่เล็กที่สุด เรียกว่า บิต (bit) ซึ่งเมื่อข้อมูลรวมกันถึงขนาด 8 บิต เราจะเรียกว่า 1 ไบต์ (Byte) สังเกต : ถ้ามี 1 อยู่ตำแหน่ง บิต (bit) ไหน จะเป็นการกำหนดให้เป็นขาที่เรียกใช้งาน
ตัวอย่างโค้ด : ที่เขียนคำสั่งให้ ขา PA4 เป็นขา Output มี 2 ตัวอย่าง ซึ่งได้ผลลัพธ์ เหมือนกัน
เขียนด้วย Atmel Studio แบบที่ 1
DDRA |= 0B000010000;
ใช้ภาษาซีมาตรฐาน โดย DDRA เป็น Direction Register ของ DDRA ใช้ประโยชน์ในการบ่งบอกแต่ละ bit ใน Direction Register ว่า เป็น input หรือ output โดย เขียน 1,0 ลงใน Direction Register ถ้า 1 ปรากฎใน Direction Register bit ใด แสดงว่า Direction Register นั้น จะเป็น Output ถ้าเป็น 0 ก็จะหมายถึงว่า เป็น Input
เขียนด้วย Atmel Studio แบบที่ 2
DDRA |= 1<<4;
1<<4 คือ เลื่อน bit ไปทางซ้าย (Shift Left) 4 ตำแหน่ง เริ่มที่ 0B00000001 เมื่อเลื่อน bit ไปทางซ้าย 4 ตำแหน่ง ก็จะได้ 0B00010000 เหมือนการเขียน แบบที่ 1
เมื่อพิจารณาดูแล้ว การเขียนด้วย Atmel Studio แบบที่ 2 น่าจะเป็นการเขียนและอ่านโค้ดได้ง่ายกว่า ดังนั้นบทความนี้จึงเลือก Atmel Studio แบบที่ 2 เป็นแนวทางในการเขียนโค้ด
เขียนโปรแกรมตามโค้ดด้านล่างนี้
#define F_CPU 16000000UL // Used a 16Mhz Crystal as Clock Source
#include <avr/io.h> // Contains all the I/O Register Macros
#include <util/delay.h> // Generates a Blocking Delay
int main(void)
{
DDRA |= 1<<4; // Configuring PA4 as Output
while (1)
{
PORTA |= 1<<4; // Writing HIGH to PA4
_delay_ms(1000); // Delay of 1 Second
PORTA &= ~(1<<4); // Writing LOW to PA4
_delay_ms(1000); // Delay of 1 Second
}
}
คอมไพล์โค้ด โดย คลิก Build -> Build Solution
Build succeeded. แสดงว่า โค้ดไม่มีปัญหาอะไร
6 : ปรับแต่ง Atmel Studio 7 เพื่ออัพโหลดโค้ด ด้วย USBasp
ดาวน์โหลด AVRDUDE.
https://mirror.freedif.org/GNU-Sa/avrdude/avrdude-6.3-mingw32.zip
คลายซิป
เข้าไปในโฟลเดอร์ avrdude-6.3-mingw32 จะพบ 2 ไฟล์ ให้ copy 2 ไฟล์นี้ ไปยัง
C:\Program Files (x86)\Atmel\Studio
ไปที่ Tools -> External Tools…
ที่ Title: ในตัวอย่างตั้งชื่อเป็น ATmega32-Upload
ที่ Command:
C:\Program Files (x86)\Atmel\Studio\avrdude.exe
ที่ Arguments:
-c usbasp -p atmega32 -Uflash:w:"$(ProjectDir)Debug\$(TargetName).hex":i
ติ๊กเลือก Use Output window -> OK
7 : อัพโหลดโค้ด
เมื่อต้องการอัพโหลด ไปที่ Tools -> ATmega32-Upload (ที่ตั้งชื่อไว้)
ที่ Output ด้านล่างซ้ายมือ แสดง avrdude.exe done. Thank you. แสดงว่าการอัพโหลดสำเร็จแล้ว
ไฟ LED ที่เชื่อมต่อที่ขา PA4 ของ ATmega32 Board สลับ ติด-ดับ แสดงว่า การทดสอบการทำงานอัพโหลดโค้ด เข้าบอร์ด ATmega32 สําเร็จแล้ว