โปรแกรมแรก กับ ATmega32 Board

สำหรับไมโครคอนโทรลเลอร์ Atmega328 เป็นไอซีไมโครคอนโทรลเลอร์ของบริษัท Atmel มีโครงสร้าง ภายในเป็นแบบ RISC (Reduced instruction set Computer) มีหน่วยความจำโปรแกรมภายในเป็นแบบแฟลช สามารถเขียน-ลบโปรแกรมใหม่ได้หลายครั้ง โปรแกรมข้อมูลเป็นแบบ In-System programmable

โปรแกรมแรก กับ ATmega32 Board

ในโลกของการเขียนโปรแกรม “Hello World” คือ คำที่นิยมใช้เวลาเริ่มเขียนโปรแกรมแรก (มักเป็นโปรแกรมง่ายๆ เพื่อทดสอบการทำงาน ว่าสามารถทำงานได้จริง) ในโลกของอิเล็กทรอนิกส์ก็เช่นกัน “Hello World” ก็คือ การทำ “ไฟกระพริบ” ด้วยตัวอย่างโปรแกรมแรก กับ ATmega32 Board โดยการเขียนโปรแกรม ให้ไฟกระพริบ ซึ่งมีพร้อมอยู่ในบอร์ดแล้ว สลับ ติด-ดับ

 รายการอุปกรณ์


ขั้นตอนการทํางาน


1 : ติดตั้ง Atmel Studio 7.0


ดาวน์โหลดซอฟต์แวร์ Atmel Studio 7.0 ได้ที่ :


การติดตั้งเหมือนกับโปรแกรมทั่วๆไป



2 : ลงไดร์เวอร์ให้ เครื่องโปรแกรม AVR รุ่น USBasp


เสียบ USBasp ไปที่ USB ของ คอมพิวเตอร์

เสียบ USBasp ไปที่ USB ของ คอมพิวเตอร์

คลิกขวา ที่ Start เลือกไปที่ Device Manager

ลงไดร์เวอร์ให้ เครื่องโปรแกรม AVR รุ่น USBasp



แสดงการติดตั้งไดรเวอร์ที่ยังไม่สมบูรณ์

เครื่องโปรแกรม AVR รุ่น USBasp



ดาวน์โหลดไดร์เวอร์ USBasp ตามลิงค์ด้านล่าง


เมื่อดาว์นโหลดไฟล์เสร็จแล้ว ให้คลายไฟล์นำไปวางไว้ในโฟลเดอร์

คลายไฟล์นำไปวางไว้ในโฟลเดอร์



คลิก เลือกไฟล์ InstallDriver เพื่อติดตั้งไดรเวอร์

คลิก เลือกไฟล์ InstallDriver เพื่อติดตั้งไดรเวอร์

คลิก Next >

คลิก Next >

คลิก Finish

คลิก Finish


ตรวจสอบไดร์เวอร์ USBasp หลังติดตั้ง ต้องแสดงการติดตั้งไดรเวอร์ 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

DDRB |= 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 สําเร็จแล้ว

โปรแกรมแรก กับ ATmega32 Board