์. ์ ๋ฒ ๊ธ์์ delay ํจ์๋ฅผ ํตํด LED๋ฅผ 1์ด ๊ฐ๊ฒฉ์ผ๋ก Blinking ํ๋ ์์ ๋ฅผ ๋ง๋ค์ด๋ณด์๋ค.
ํ์ง๋ง ๊ทธ ๋จ์ ์ผ๋ก delay ๋์ ๋ค๋ฅธ ๋์์ ํ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉํ ๋ ์กฐ์ฌํด์ผ ํ๋ค ํ์ผ๋ฉฐ, ํ์ด๋จธ๋ผ๋ ๊ฒ์ ํตํด ๋๊ฐ์ด Blinking ์ ๊ตฌํํ๋ค๊ณ ํ์๋ค.
ํ์ด๋จธ๋ ๋ฌด์์ธ๊ฐ?
๋ง ๊ทธ๋๋ก ํ์ด๋จธ๋ ์๊ฐ์ ์ฌ๋ ๊ฒ์ด๋ค. ์๋ ๊ทธ๋ฆผ์ ๋ด๋ณด์. ๋๋ง๊ฐ์ง ๋ง๋๋กํ์. ๋ฅํ๊ฒ ๋ค์ด๊ฐ๋๊ฑด ๋ค์์ด์ง๋ง ๋์ถฉ Timer/Counter๊ฐ ์ด๋ป๊ฒ ํด์ ์๊ฐ์ ์ฌ๋์ง ์ ๋์ ํ๋ก์ฐ๋ง ์ดํดํ์ผ๋ฉด ํด์ ๋ฐ์ดํฐ ์ํธ์ ๊ทธ๋ฆผ์ ์ฒจ๋ถํ๋ค.
์๋์ด๋ ธ ์ฐ๋ ธ ๋ณด๋๋ฅผ ์์ธํ ๋ณด๋ฉด, ์๋์ ๊ฐ์ด ์ธ๋ถ ๋ฐ์ง๊ธฐ๊ฐ ์กด์ฌํ๋ค. ๋น์ฐํ Atmega328P ์นฉ ๋ด์๋ ๋ด๋ถ ๋ฐ์ง๊ธฐ๊ฐ ์กด์ฌํ๋ ์ธ๋ถ ๋ฐ์ง๊ธฐ๊ฐ ์์ ์ฑ๊ณผ ์ ํ๋๊ฐ ๋ ๋์ผ๋ฏ๋ก ๋ณดํต ๋ณด๋๋ฅผ ์ฌ๋ฉด ์ธ๋ถ ๋ฐ์ง๊ธฐ๊ฐ ๊ฑฐ์ ์กด์ฌํ๋ค.
์ธ๋ถ ๋ฐ์ง๊ธฐ์์ ํด๋ญ์ ์์ฑํ๋๋ฐ Clock MultiPlexer์ ์ญํ ์ ๊ฐ๋จํ๋ค. ๋ค์ํ ์ธ๋ถ ๋ฐ์ง๊ธฐ๋ค์ด ์๋๋ฐ ๊ทธ ์ค ํ๋๋ฅผ ๊ณจ๋ผ์ฃผ๋ ๊ฒ์ด๋ค. ์, Multiplexer(๋ถ๋ฐฐ๊ธฐ)์์ ๋์จ ํด๋ญ์ด Prescaler(๋ถ์ฃผ๊ธฐ)๋ก ํ๋ฌ๋ค์ด๊ฐ๋ค. ํ๋ฆฌ์ค์ผ์ผ๋ฌ๋ ๋ฌด์์ผ๊น?
์... ์ด๋ป๊ฒ ์ค๋ช ํด์ผํ ๊น? ํด๋ญ ์ฃผํ์๋ฅผ ์ชผ๊ฐ์ด ๋ ๊ธด ์๊ฐ ๊ฐ๊ฒฉ์ ์ด ์ ์๊ฒ๋ ํ๊ธฐ ์ํ ์ฅ์น๋ผ๊ณ ์๊ฐํ๋ฉด ์ดํด๋ฅผ ํ ์์์๊น? ์๋ ์์๋ฅผ ์ ๊น ๋ค์ด๋ณด์๋๋ฐ, ์ดํดํ๊ธฐ ์ฝ์ง ์๋ค. ๊ทธ๋ฅ ํด๋ญ ์ฃผํ์๋ฅผ ์ชผ๊ฐ ๋ค๋ ๊ฐ๋ ์ผ๋ก๋ง ์ดํดํด์ค๋ ํฌ๊ฒ ๋ฌธ์ ๋ ๊ฑด ์๋ค. ๊ตฌํํ๋ค๋ณด๋ฉด์ ์์ฐ์ค๋ฝ๊ฒ ์ดํด๋๊ธฐ ๋๋ฌธ์ด๋ค.
- 16๋นํธ ํ์ด๋จธ ์์:
=65,535 (16๋นํธ๋ก ํํํ ์ ์๋ ๊ฐ์ฅ ํฐ ๊ฐ)- 16MHz ํด๋ญ → 4.096μs๋น ์ค๋ฒํ๋ก → 0.27ms ๋ฐ์ ์ธก์ ๋ถ๊ฐ
- ๋ถ์ฃผ๊ธฐ 1024 ์ ์ฉ → 16MHz/1024 = 15.625kHz → 4.194์ด ์ธก์ ๊ฐ๋ฅ
ํ๋ฆฌ์ค์ผ์ผ๋ฌ์์ ์ถ๋ ฅ๋ ํด๋ญ์ด Control Unit์ ๋ค์ด๊ฐ ์ต์ข ์ฌ์ฉ๋๋ ํ์ด๋จธ, ADC ๋ฑ ์ฌ๋ฌ ์ฌ์ฉ๋๋ ๊ณณ์ด๊ธฐ ๋๋ฌธ์ ์ด ํด๋ญ ๊ฐ๋ ์ ๊ต์ฅํ ์ค์ํ๋ค.
ํ์ด๋จธ๋ก 1์ด ๋ง๋ค๊ธฐ
ํ๋ก๋ ์ ๋ฒ์ด๋ ๋์ผํ๊ณ ์ฝ๋๋ฅผ ๋จผ์ ๋ณด์ฌ์ฃผ๊ฒ ๋ค.
#define F_CPU 16000000UL // CPU ํด๋ญ ์๋
#include <avr/io.h>
#include <avr/interrupt.h>
#define LED_RED 2
void Timer1_Init() {
TCCR1B |= (1 << WGM12); /* CTC ๋ชจ๋ ์ค์ (Clear Timer on Compare Match) */
TCCR1B |= (1 << CS12) | (1 << CS10); /* ํ๋ฆฌ์ค์ผ์ผ๋ฌ 1024 ์ค์ */
OCR1A = 15624; /* ๋น๊ต ๊ฐ ์ค์ (16MHz / 1024 / 1Hz - 1) */
TIMSK1 |= (1 << OCIE1A); /* ๋น๊ต ๋งค์น ์ธํฐ๋ฝํธ ํ์ฑํ */
}
void Task10ms_Init(){
Timer1_Init(); /* ํ์ด๋จธ ์ด๊ธฐํ */
DDRD |= (1 << LED_RED); /* PD2 ํ์ ์ถ๋ ฅ์ผ๋ก ์ค์ */
PORTD &= ~(1 << LED_RED); /* ์ด๊ธฐ LED OFF */
}
void Task10ms_Main(){
PORTD ^= (1 << LED_RED); /* PD2 ํ ํ ๊ธ (LED ON/OFF) */
}
ISR(TIMER1_COMPA_vect) {
Task10ms_Main();
}
int main(void) {
Task10ms_Init();
sei(); /* ์ ์ญ ์ธํฐ๋ฝํธ ํ์ฑํ */
while (1) {
}
return 0;
}
์ฝ๋๋ Timer1_Init() ํจ์๋ฅผ ์ดํดํ๋ฉด ์ค๋ ํฌ์คํ ๋ ๋์ด๋ค.
void Timer1_Init() {
TCCR1B |= (1 << WGM12); // CTC ๋ชจ๋ ํ์ฑํ
TCCR1B |= (1 << CS12) | (1 << CS10); // ๋ถ์ฃผ๊ธฐ 1024
OCR1A = 15624; // ๋น๊ต๊ฐ ์ค์
TIMSK1 |= (1 << OCIE1A); // ๋น๊ต ๋งค์น ์ธํฐ๋ฝํธ ํ์ฑํ
}
CTC ๋ชจ๋ : ํ์ด๋จธ๊ฐ OCR1A ๊ฐ ๋๋ฌํ์ ๋ ์๋ ๋ฆฌ์ ๋๋ ๋ชจ๋
๋ถ์ฃผ๊ธฐ ๊ณ์ฐ์ ์๋์ ๊ฐ๋ค.
๋ถ์ฃผ๋ ํด๋ญ์ 15,625์ธ๋ฐ OCR1A๋ 15,624์ผ๊น?
์ด์ ๋ ๊ฐ๋จํ๋ค. ์ปดํจํฐ๋ 0๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ ๋ฐ์ดํฐ ์ํธ์ ๊ด๋ จ ์ฑํฐ๋ค์ ํ์ํ ๋ถ๋ถ๋ง ์ฒดํฌํ์ฌ ๋ฃ์ด๋จ์ผ๋ ํ ๋ฒ ์ฝ์ด๋ณด๊ธธ ๋ฐ๋๋ค.
ISR(TIMER1_COMPA_vect) {
Task10ms_Main();
}
ํ์ด๋จธ๊ฐ 1์ด๋ฅผ ์ง๋๋ฉด ์ธํฐ๋ฝํธ๊ฐ ๋ฐ์ํ์ฌ ISR (์ธํฐ๋ฝํธ ์๋น์ค ๋ฃจํด)์ ๋ฐ์์ํจ๋ค. ์ด์ ๊ทธ ํธ์ถ๋๋ ํจ์์ LED ๋ธ๋งํน ๋ก์ง์ ์ถ๊ฐํ๋ฉด ๋๋ค.
10ms, 100us ๋ฑ ๋ค์ํ ํ์ด๋จธ๋ฅผ ๊ณ์ฐํ์ฌ ๋ง๋ค ์ ์๋๋ฐ, ๊ณ์ฐ๋ง ์ํ๋ฉด ์ถฉ๋ถํ ๊ตฌํํ ์ ์๋ค. ํ์ง๋ง ๋ฐ์ดํฐ์ํธ๋ฅผ ๋ณด๊ฒ๋๋ฉด ๋ค์ํ ๋ชจ๋๋ค์ด ์๋๋ฐ CTC ๋ฟ๋ง ์๋๋ผ FAST PWM ๋ฑ ๋ค์ํ ๋ชจ๋๋ค์ด ์๋ค. ๊ฒฐ๊ตญ ์๋ฆฌ๋ง ์ดํดํ์ฌ ๋ฐ์ดํฐ ์ํธ๋ง ์ ๋ถ์ํ๋ฉด ๋๊ตฌ๋ ์ค๊ณ๋ฅผ ํ ์ ์๋ค. ์๋ฆฌ๋ ์๊ฐ์ ์ฐ๋ค ๊ทธ ์ด์ ๊ทธ ์ดํ๋ ์๋๋ค.
์ฐธ๊ณ
CTC ๋ชจ๋์ ๊ดํด ์ฌ๋ ค๋์์ผ๋ ์ฝ์ด๋ณด๊ธธ ๋ฐ๋๋ค.
'๐ฆพAVR' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
4. ์๋์ด๋ ธ ์ฐ๋ ธ ATmega328P LED ์ถ๋ ฅํ๊ธฐ (DDR, PORT) (0) | 2025.01.29 |
---|---|
3. ์๋์ด๋ ธ ์ฐ๋ ธ ๊ด๋ จ ์๋ฃ ์๊ฐ (0) | 2025.01.28 |
2. ์๋์ด๋ ธ ์๊ฐ & Atmel Studio7 ํ๋ก์ ํธ ์์ฑํ๊ธฐ (0) | 2025.01.27 |
1. ์๋ฒ ๋๋ SW ์ทจ์ ์ ๊ด์ฌ ์๋ ์ทจ์ค์์ ์ํ์ฌ. (0) | 2025.01.26 |
[AVR] ์๋์ด๋ ธ ์ฐ๋ ธ UART ํต์ ํ๊ธฐ (0) | 2023.06.20 |