์ฒ์ ์ฝ๋ฉ ๊ณต๋ถ๋ฅผ ์์ํ ๋, CMD ์ฐฝ์ Hello World!๋ฅผ ๊ฐ์ฅ ๋จผ์ ์ถ๋ ฅํด๋ณธ๋ค.
๊ณผ์ฐ ์๋ฒ ๋๋ ์ธ๊ณ์์๋ ์ด๋จ๊น?
์๋ฒ ๋๋ ์ค๊ณ์์ Hello World๋ ๊ต์ฅํ ์ด๋ ค์ด ์ผ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์๋ฒ ๋๋ ๊ณต๋ถ๋ฅผ ์ฒ์ ์์ํ ๋, ํด๋ณด๋ ๊ฒ์ ๋ญ๊น?
๋ฐ๋ก LED ์ผ๋ณด๊ธฐ์ด๋ค.
๊ทธ๋์ ์ฐ๋ฆฌ๋ LED๋ฅผ ์ผ๋ณด๋ ค๊ณ ํ๋ค.
๊ฐ์ฅ ์ธ๊ณ ํํ ๋ฐ๊ด ๋ค์ด์ค๋์ด๋ค.
ํ๋๋ง ๊ธฐ์ตํ์. ์ ๊ธฐ๋ (+) → (-) ๋ก ํ๋ฅด๋ ๊ฒ๋ง ๊ธฐ์ตํ๊ณ ์ ํญ์ด ์์ผ๋ฉด LED๊ฐ ๋ฒํธ ์ ์์ผ๋ฏ๋ก ์ ํญ์ ์ ๋นํ๊ฑฐ ํ๋ ANODE ์ชฝ์ ๋ฌ์์ฃผ์.
์๋ ๊ทธ๋ฆผ์ฒ๋ผ ํ๋ก๋ฅผ ๊ตฌ์ฑํ์๋ค.
ํ๋ main.c ์ฝ๋๋ฅผ ๋ณต๋ถํ ํ, ๋น๋๋ฅผ ํด๋ณด์. ๋น๋ Success๊ฐ ๋จ๊ณ object, hex, elf ํ์ผ์ด ์๊ฒผ์ ๊ฒ์ด๋ค. ๋์ค์ ํ๋ํ๋ ์ค๋ช ํ ๊ฒ์ด๋ ์ผ๋จ์ ๋์ด๊ฐ์.
#define F_CPU 16000000L // CPU ํด๋ญ ์๋
#include <avr/io.h>
#include <util/delay.h>
int main(void) {
DDRD = 0x04U; // PD2๋ฅผ ์ถ๋ ฅ์ผ๋ก ์ค์
while (1) {
PORTD = 0x04U; // LED ON
_delay_ms(1000); // 1์ด ๋๊ธฐ
PORTD = 0x0U; // LED OFF
_delay_ms(1000); // 1์ด ๋๊ธฐ
}
return 0;
}
AVRISP mkII ISP ํ๋ก๊ทธ๋๋จธ๋ฅผ ์ฐ๊ฒฐํด๋ณธ๋ค. Apply๋ฅผ ๋๋ฌ๋ณด๋ฉด, Interface Settings์ ISP Clock์ด ์ ์ผ ๋จผ์ ๋ณด์ผ ๊ฒ์ด๋ค.
ISP๋ SPI ๋ผ๊ณ ๊ฐ๋จํ ์๊ฐํ๊ณ , ์๋ ๋ฌธ๊ตฌ๋ฅผ ๋ณด๊ฒ ๋๋ฉด device์ ์ฃผํ์์ 1/4๋ณด๋ค ๋ฎ์ ๊ฐ์ผ๋ก ์ค์ ํ๋ผ๊ณ ํ๋ค. Atmega328P ์นฉ์ ๋ด๋ถ ์ค์ค๋ ์ดํฐ ์ฃผํ์๊ฐ 8MHz ์ด๋ฏ๋ก ๋๋ต 2MHz๋ณด๋ค ๋ฎ์ผ๋ฉด ๋๋ค. (ํ์ง๋ง ์๋์ด๋ ธ ์ฐ๋ ธ ๋ณด๋์ ๊ฒฝ์ฐ, ์ธ๋ถ ์ค์ค๋ ์ดํฐ 16MHz๋ฅผ ์ฌ์ฉํ๋ Fuse bit๋ฅผ ์ค์ ํ์ฌ ์ด๋ฅผ ์กฐ์ ํ ์ ์๋ค. ๊ทผ๋ฐ 125kHz๋ ์ถฉ๋ถํ ๋น ๋ฅด๋ ๋ด๋น๋์.)
Memories ๋ก ๊ฐ๋ณด๋ฉด Flash (32KB) ๊ฐ ๋ณด์ผ ๊ฒ์ด๋ค. ์ค์ ํ๋ ์ฌ ์์ญ์ ์ฐ๋ฆฌ๊ฐ ๋น๋ํ Hex ํ์ผ์ ISP ๋ฐฉ์์ผ๋ก ์ง์ด ๋ฃ๋ ๊ฒ์ด๋ค. Program์ ๋๋ฅด๋ฉด Flash ์์ญ์ ํ๋ฒ ์น 0xFF๋ก ๋ฐ์ด๋ฒ๋ฆฐ ํ, Hex๋ฅผ ์ง์ด๋ฃ์ผ๋ฏ๋ก ๊ธฐ์กด ์๋์ด๋ ธ ๋ถํธ๋ก๋๋ฅผ ๋ ๋ผ๊ฐ ๊ฒ์ด๋ค. ๋ ์ด์ ์ฐ๋ฆฌ๊ฐ ์๋ ์๋์ด๋ ธ ๋ฐฉ์์ผ๋ก๋ ๊ฐ๋ฐ์ ํ ์ ์๋ค. ใ ใท (ISP๋ก ๋ถํธ๋ก๋ ๋ค์ ์ง์ด๋ฃ์ผ๋ฉด ๋จ)
https://youtube.com/shorts/vJ8pUajn1kU?si=OGNoKXAHvJf-BCJp
_delay_ms๋ ๋ง ๊ทธ๋๋ก MCU๋ฅผ ๊ฐ์ ๋ก ์ง์ฐ์ํค๋ ๊ฒ์ด๊ณ , ์ฐ๋ฆฌ๊ฐ ์์์ผ ํ๋ ํค์๋๊ฐ 2๊ฐ์ง๊ฐ ์๋ค.
DDR
DDR์ ๋ํด ์์๋ณด์. ์ด์ ๋ Atmega328P์ ๋ฐ์ดํฐ์ํธ๋ฅผ ํ์ธํด์ผ ํ๋ค.
DDR ์ค์
- 1: ์ถ๋ ฅ ์ค์
- 0: ์ ๋ ฅ ์ค์
DDRB = 0xFF; // PORTB์ ๋ชจ๋ ํ์ ์ถ๋ ฅ์ผ๋ก ์ค์
DDRC = 0x00; // PORTC์ ๋ชจ๋ ํ์ ์
๋ ฅ์ผ๋ก ์ค์
DDRD |= (1 << PD7); // PORTD์ 7๋ฒ ํ๋ง ์ถ๋ ฅ์ผ๋ก ์ค์
DDRD &= ~(1 << PD0); // PORTD์ 0๋ฒ ํ๋ง ์
๋ ฅ์ผ๋ก ์ค์
์ ์ฒ๋ผ ์ฌ์ฉ๋๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค. ์ ์ถ๋ ฅ ๊ฒฐ์ ํ๋ค.
์ฝ๋๋ฅผ ๋ณด๋ฉด ๋๋ PD2๋ฅผ ์ถ๋ ฅ ๋ชจ๋๋ก ์ฌ์ฉํ์๋ค.
PORT
์ถ๋ ฅ๋ชจ๋์ผ ๋ (DDRx = 1)
- PORT = 1: HIGH (5V) ์ถ๋ ฅ
- PORT = 0: LOW (0V) ์ถ๋ ฅ
PD2๋ฒ์ LED๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ ์ดํ๊ณ ์์ผ๋ฏ๋ก ๋น์ฐํ PORTD2 ๋นํธ๋ง ์ ์ดํ์ฌ LED๋ฅผ ์ ์ดํ๋ค. ํฌ๊ฒ ์ด๋ ต์ง ์๋ค. ๊ตณ์ด ์ค๋ช ํ ํ์๋ ์๋ฌ๊น?
ํ์ง๋ง ๊ตณ์ด LED Blinking์ ๋จผ์ ํ ์คํธํ ์ด์ ๋ ์ฒซ ๋น๋ ๋ชฉ์ ๋ ์์ง๋ง delay_ms ๋๋ฌธ์ด๋ค.
MCU ์ ์ฅ์์ delay๋ ์ ๋ง ์กฐ์ฌํด์ผํ๋ ๋์์ด๋ค.
MCU๋ ๊ฒฐ๊ตญ ์ปดํจํฐ์ด๋ค. ์ด์ํ ์ปดํจํฐ.
MCU๋ ํด๋ญ์ ์ํด ์์ง์ด๋๋ฐ, ํด๋ญ์ ์ฌ๋์ ์ฌ์ฅ ๋ฐ๋์ผ๋ก ๋น๊ตํ๋ค. ๋ชธ์ ์์ง์ด์ง ์์ ๋๋ ์ฌ์ฅ ๋ฐ๋์๊ฐ ๋ด๋ ค๊ฐ๊ณ ๋ฌ๋ฆฌ๊ธฐ๋ฅผ ํ๋ฉด ์ฌ์ฅ ๋ฐ๋์๊ฐ ๊ธ๊ฒฉํ๊ฒ ๋ด๋ค.
Atmega328P๋ผ๋ MCU ์นฉ์ 8MHz ๋ผ๋ ํด๋ญ(์ฌ์ฅ ๋ฐ๋)์ ๊ฐ์ง๊ณ ์๋ค. 1์ด์ 8,000,000 ๋ฒ์ ๋ฐ๋ ๊ฒ์ด๋ค. (์ฌ๋์ ๊ธฐ๊ปํด์ผ 1์ด์ 60 ~ 120๋ฒ ์ ๋ ๋ธ ๊ฒ์ด๋ค. ) ๊ทธ๋งํผ ์ํ ์นฉ์ผ์ง์ธ์ ์ปดํจํฐ๋ ์์ฒญ๋ ์๋๋ก ์ฐ์ฐ์ ํ๊ณ ์๋ค. ์ด ์์ฒญ๋ ์๋๋ก ์ธํด 0, 1์ ์์ฒญ๋๊ฒ ๋น ๋ฅธ ์๋๋ก ์ฒ๋ฆฌํ๋ฏ๋ก ์ฐ๋ฆฌ๋ ๋์์ ์์ง์ด๋ ๊ฒ์ฒ๋ผ ๋ณด์ธ๋ค.
์. ๊ณผ์ฐ ์ด๋ ๊ฒ ๋น ๋ฅธ ์๋๋ก ์ฐ์ฐํ๋ MCU๋ฅผ ๊ฐ์ ๋ก delay_ms(1000)๋ฅผ ํตํด 1์ด๋ฅผ ์ฌ๊ฒ ํ๋ค. ์ฌ๋ ์ ์ฅ์์๋ ์งง์ ์๊ฐ์ด์ง๋ง ์ปดํจํฐ ์ ์ฅ์์ ์์ฒญ๋ ์๊ฐ ์์์ด๋ค. ๋ถํ์ํ ๋์์ธ ์ ์ด๋ค.
delay๋ฅผ ํ๋ค๊ณ ํด์ ๊ณผ์ฐ MCU์ ํด๋ญ ๋ํ 1์ด ๋งํผ ๋ฉ์ถ๊น? ์๋๋ค. 1์ด ๋์ ์๋ฌด๊ฒ๋ ํ์ง๋ง๊ณ ์ฌ๋ผ๋ ๋์์ ์ปดํจํฐ์๊ฒ ๋ช ๋ น์ ํ ๊ฒ์ด๋ฉฐ, 1์ด๋ผ๋ ์๊ฐ์ ์ฌ๊ธฐ ์ํด ํด๋ญ์ ๊ณ์ํด์ ๋ฐ์์ํจ๋ค.
๊ฐ๋จํ ๋์์๋ ์๊ด์์ง๋ง, ์ผ์๊ฐ ๋์ด๋๊ณ ๋ก์ง์ด ์ถ๊ฐ๋๋ฉด ์๋ชป ์ฌ์ฉ๋ delay๋ ๊ต์ฅํ ๋ฒ๊ทธ๋ฅผ ์ ๋ฐ์ํฌ ์ ์์ผ๋ฉฐ ํ์ด๋ฐ์ ์ด๊ธ๋๊ฒ ํ ์ ์๋ค.
delay๋ฅผ ์ฐ์ง๋ง๋ผ๋ ๊ฒ์ด ์๋๋ค. ์ ์ฌ์ ์์ ์ฌ์ฉ๋๋ฉด ์๊ด์์ง๋ง ์ด๋ฒ ์ฝ๋์๋ ์ ์ ์น ๋ชปํ๋ค๋ ๊ฒ์ ์ด์ผ๊ธฐํ๊ณ ์ถ์ ๊ฒ์ด๋ค.
๋ค์ ๊ธ์ Timer ๋ผ๋ ๊ฒ์ ํตํด ๋๊ฐ์ ๊ธฐ๋ฅ์ด์ง๋ง ์๋ก์ด ๋ฐฉ๋ฒ์ ์๊ฐํด๋ณด๋ คํ๋ค. delay์ ํ ๋ฒ ๋น๊ตํด๋ณด๊ธธ ๋ฐ๋๋ค.
'๐ฆพAVR' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
5. ์๋์ด๋ ธ ์ฐ๋ ธ Atmega328P ํ์ด๋จธ๋ก 1์ด ๋ง๋ค๊ธฐ. (1) | 2025.01.30 |
---|---|
3. ์๋์ด๋ ธ ์ฐ๋ ธ ๊ด๋ จ ์๋ฃ ์๊ฐ (0) | 2025.01.28 |
2. ์๋์ด๋ ธ ์๊ฐ & Atmel Studio7 ํ๋ก์ ํธ ์์ฑํ๊ธฐ (0) | 2025.01.27 |
1. ์๋ฒ ๋๋ SW ์ทจ์ ์ ๊ด์ฌ ์๋ ์ทจ์ค์์ ์ํ์ฌ. (0) | 2025.01.26 |
[AVR] ์๋์ด๋ ธ ์ฐ๋ ธ UART ํต์ ํ๊ธฐ (0) | 2023.06.20 |