MCU ์ ์ด๋ฅผ ์ํ ๋นํธ ์ฐ์ฐ
ํ์จ์ด๋ ํ๋์จ์ด๋ฅผ ์ ์ดํ๋ ์ํํธ์จ์ด๋ก, ๋ณดํต ์๋ฒ ๋๋ ์์คํ
, ๋ง์ดํฌ๋ก์ปจํธ๋กค๋ฌ, ๋ค์ํ ์ ์ ์ฅ๋น ๋ฑ์์ ์๋ํ๋ค.
ํ์จ์ด ๊ฐ๋ฐ์์ ํ๋์จ์ด์ ์ธ๋ฐํ ์ ์ด๊ฐ ํ์ํ ๋, ๋นํธ ์ฐ์ฐ์ ๊ทธ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์ค ํ๋์ด๋ค. C์ธ์ด์ ๋นํธ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ์ง์คํฐ ์ค์ ๊ณผ ๊ฐ์ ์ ์์ค ์์
์ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌํ ์ ์๋ค. ์ด๋ฌํ ์ฐ์ฐ์์๋ AND(&), OR(|), XOR(^), NOT(~), ๋นํธ ์ํํธ(<<, >>) ๋ฑ์ด ์๋ค. ๊ฐ ์ฐ์ฐ์์ ์ฌ์ฉ ์๋ฅผ ํตํด, ์ด๋ป๊ฒ ์ด๋ค์ ํ์ฉํ์ฌ ํ์จ์ด ์ฝ๋๋ฅผ ์์ฑํ๋์ง ์ดํด๋ณธ๋ค.
โญ1. ๋นํธ ์ฐ์ฐ์ ์ฅ์
- ์ง์ ์ ์ธ ํ๋์จ์ด ์ ์ด: ๋นํธ ๋จ์๋ก ํ๋์จ์ด ๋ ์ง์คํฐ๋ฅผ ์ง์ ์กฐ์ํ ์ ์๋ค.
- ๋ฉ๋ชจ๋ฆฌ ๋ฐ ์ฒ๋ฆฌ ์๋ ํจ์จ์ฑ: ๋ถํ์ํ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ค์ด๊ณ , CPU์ ๋นํธ ์ฐ์ฐ ์ฒ๋ฆฌ ์๋๋ฅผ ํ์ฉํ ์ ์๋ค.
- ์ฝ๋ ์ต์ ํ: ์ปดํ์ผ๋ฌ๊ฐ ์ต์ ํํ๊ธฐ ์ฌ์์ ธ, ์คํ ํจ์จ์ด ํฅ์๋๋ค.
โญ2. ๋นํธ ์ฐ์ฐ์ ์์
2.1. AND ์ฐ์ฐ (&)
ํน์ ๋นํธ๋ฅผ 0์ผ๋ก ์ค์ ํ๊ฑฐ๋ ์ํ๋ฅผ ํ์ธํ ๋ ์ฌ์ฉํ๋ค. (ํน์ ๊ธฐ๋ฅ์ ๋นํ์ฑํ์ํฌ ๋ ์ฃผ๋ก ์ฌ์ฉ๋จ.)
unsigned char reg = 0b11110000; // ์ด๊ธฐ ๋ ์ง์คํฐ ๊ฐ
unsigned char mask = 0b11111100; // ๋ง์คํฌ: ํ์ 2๋นํธ๋ฅผ ์ ์ธํ ๋ชจ๋ ๋นํธ๋ฅผ ์ ์ง
reg = reg & mask; // ํ์ 2๋นํธ๋ฅผ 0์ผ๋ก ์ค์
2.2. OR ์ฐ์ฐ (|)
ํน์ ๋นํธ๋ฅผ 1๋ก ์ค์ ํ ๋ ์ฌ์ฉํ๋ค. (ํน์ ๊ธฐ๋ฅ์ ํ์ฑํ์ํฌ ๋ ์ฃผ๋ก ์ฌ์ฉ๋จ.)
unsigned char reg = 0b11001100; // ์ด๊ธฐ ๋ ์ง์คํฐ ๊ฐ
unsigned char mask = 0b00000011; // ๋ง์คํฌ: ํ์ 2๋นํธ๋ฅผ 1๋ก ์ค์
reg = reg | mask; // ํ์ 2๋นํธ๋ฅผ 1๋ก ์ค์
2.3. XOR ์ฐ์ฐ (^)
ํน์ ๋นํธ๋ฅผ ํ ๊ธ(๋ฐ์ )ํ ๋ ์ฌ์ฉํ๋ค.
unsigned char reg = 0b11001100; // ์ด๊ธฐ ๋ ์ง์คํฐ ๊ฐ
unsigned char mask = 0b00000011; // ๋ง์คํฌ: ํ์ 2๋นํธ๋ฅผ ํ ๊ธ
reg = reg ^ mask; // ํ์ 2๋นํธ๋ฅผ ๋ฐ์
2.4. NOT ์ฐ์ฐ (~)
๋ชจ๋ ๋นํธ๋ฅผ ๋ฐ์ ์ํฌ ๋ ์ฌ์ฉํ๋ค.
unsigned char reg = 0b11001100; // ์ด๊ธฐ ๋ ์ง์คํฐ ๊ฐ
reg = ~reg; // ๋ชจ๋ ๋นํธ ๋ฐ์
2.5. ๋นํธ ์ํํธ ์ฐ์ฐ (<<, >>)
๋นํธ๋ฅผ ์ข์ธก ํน์ ์ฐ์ธก์ผ๋ก ์ด๋์ํจ๋ค.
unsigned char reg = 0b00000001; // ์ด๊ธฐ ๋ ์ง์คํฐ ๊ฐ
reg = reg << 4; // 4๋นํธ ์ผ์ชฝ์ผ๋ก ์ํํธ, ๊ฒฐ๊ณผ: 0b00010000
๋นํธ ์ฐ์ฐ์์ ์๊ฐ๋ ์ข ์ข C์ธ์ด ๊ต์ฌ์ ์ด๋ฐ๋ถ์์ ์ด๋ฃจ์ด์ง์ง๋ง, ์ค์ง์ ์ผ๋ก ํ์จ์ด ๊ฐ๋ฐ ์ธ์ ๋ถ์ผ์์ ๊ทธ ํ์ฉ๋๋ ์๋์ ์ผ๋ก ๋ฎ์ ํธ์ด๋ค. ์ปดํจํฐ ๊ณตํ ๊ต์ก ๊ณผ์ ์์ ์๋์ด๋ ธ์ ๊ฐ์ ํ๋ซํผ์ ํตํด ํ๋์จ์ด ๊ฐ๋ฐ์ ๊ธฐ์ด๋ฅผ ๋ค์ง๋ ๊ณผ์ ์์๋, ๋นํธ ์ฐ์ฐ์ ์ฌ์ฉ์ ๋๋ฌผ๊ฒ ๋ํ๋๋ค. ์๋์ด๋ ธ๊ฐ ๊ต์ก์ฉ์ผ๋ก AVR์ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ๋์์์๋ ๋ถ๊ตฌํ๊ณ , ์ด๋ ๋๋ถ๋ถ์ ์์ ์์ ๋ ์ง์คํฐ ์ง์ ์ ์ด๋ฅผ ์๊ตฌํ์ง ์๊ธฐ ๋๋ฌธ์ด๋ค. AVR์ด๋ ARM ๊ฐ์ ๋ณด๋ค ์ ๋ฌธํ๋ ํ๋์จ์ด ๊ฐ๋ฐ์์์ผ ๋น๋ก์ ๋ ์ง์คํฐ๋ฅผ ์ง์ ์กฐ์ํ ํ์์ฑ์ด ์๊ธด๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ , ๋นํธ ์ฐ์ฐ์ ์ปดํจํฐ ๊ณตํ์ ๊ธฐ๋ณธ ์๋ฆฌ ์ค ํ๋๋ก์, ๊ทธ ์ดํด๋ ํ์์ ์ด๋ค.
โญ3. ์์
ํ๊ธฐ AVR ํ์ด๋จธ ์์ ์ ๊ฐ์ด ๋นํธ ์ฐ์ฐ์๊ฐ ์ฌ์ฉ๋๋ค .
#include <mega128.h>
unsigned int cnt=0;
void main()
{
TIMSK = 0b00000001; // TOIE0 = 1; ํ์ด๋จธ/์นด์ดํฐ0 OVF ๋ชจ๋ ์ธํฐ๋ฝํธ ์ธ์์ด๋ธ
TCCR0 = 0b00000111; // ์ผ๋ฐ๋ชจ๋, ํ๋ฆฌ์ค์ผ์ผ = CK/1024
TCNT0 = 0b00000000; // ํ์ด๋จธ/์นด์ดํฐ0 ๋ ์ง์คํฐ ์ด๊ธฐ๊ฐ == 0;
SREG = 0b10000000; // ์ ์ญ ์ธํฐ๋ฝํธ ์ธ์์ด๋ธ ๋นํธ I ์
}
// 1/16us x 1024 x 256 = 16.384ms
interrupt [TIM0_OVF] void timer_int0(void) //ํ์ด๋จธ/์นด์ดํฐ0 ์ธํฐ๋ฝํธ ๋ฌธ
{
cnt++;
if(cnt == 31) { // 16.384ms x 31 = 0.5sec
led = led ^ 0xFF; // led ํ ๊ธ (xor์ฐ์ฐ)
PORTA = led; // PORTA์ ๋ฃ์ด์ค์ผ LED์ผ์ง
cnt = 0; // cnt 0์ผ๋ก ์ด๊ธฐํ
}
}
์ ์ฝ๋๋ ๊นํ๋ธ์์ ์๋ฌด๊ฑฐ๋ ๊ฐ์ ธ์จ ์ฝ๋์ด๋ค. ํ์ง๋ง .์ ์ง์ฌ์ง ์ฝ๋๋ ์๋๋ค. main ํจ์๋ฅผ ์๋์ ๊ฐ์ด ์ํํธ ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ๋ณ๊ฒฝํ ์ ์๋ค.
void main()
{
// TOIE0 = 1; ํ์ด๋จธ/์นด์ดํฐ0 OVF ๋ชจ๋ ์ธํฐ๋ฝํธ ์ธ์์ด๋ธ
TIMSK = 1 << TOIE0; // TOIE0์ ์ ์๊ฐ 0์ด๋ผ๊ณ ๊ฐ์ ํ ๋
// ์ผ๋ฐ๋ชจ๋, ํ๋ฆฌ์ค์ผ์ผ = CK/1024
// CS02, CS01, CS00 ๋นํธ๋ฅผ ์ค์ ํ์ฌ ํ๋ฆฌ์ค์ผ์ผ ๊ฐ์ ์ค์
TCCR0 = (1 << CS02) | (1 << CS00); // CS02๊ฐ 2, CS00์ด 0์ผ๋ก ์ ์๋ ๊ฒ์ผ๋ก ๊ฐ์
// ํ์ด๋จธ/์นด์ดํฐ0 ๋ ์ง์คํฐ ์ด๊ธฐ๊ฐ == 0;
TCNT0 = 0; // ์ํํธ ์ฐ์ฐ์ ํ์ ์์
// ์ ์ญ ์ธํฐ๋ฝํธ ์ธ์์ด๋ธ ๋นํธ I ์
SREG = 1 << 7; // I ๋นํธ๊ฐ 7๋ฒ์งธ ์์นํ๋ค๊ณ ๊ฐ์
}
์๋ ์ฝ๋๋ ์ํํธ ์ฐ์ฐ์๊ฐ ์๋ AND, OR ์ฐ์ฐ์๋ฅผ ์ด์ฉํด ํํํ๋ค.
void main()
{
// TOIE0 = 1; ํ์ด๋จธ/์นด์ดํฐ0 OVF ๋ชจ๋ ์ธํฐ๋ฝํธ ์ธ์์ด๋ธ
// OR ์ฐ์ฐ์(|)๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๋นํธ๋ง์ 1๋ก ์ค์
TIMSK |= 1 << TOIE0; // TOIE0์ ์ ์๊ฐ 0์ด๋ผ๊ณ ๊ฐ์ ํ ๋
// TCCR0 ๋ ์ง์คํฐ ์ค์ ์ ์ํด ๋จผ์ ๋ชจ๋ ๊ด๋ จ ๋นํธ๋ฅผ 0์ผ๋ก ํด๋ฆฌ์ดํ๊ณ ํ์ํ ๋นํธ๋ฅผ 1๋ก ์ค์
// AND ์ฐ์ฐ์(&)์ NOT ์ฐ์ฐ์(~)๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๋นํธ ํด๋ฆฌ์ด
// ์ด ์์ ์์๋ ํ๋ฆฌ์ค์ผ์ผ ๊ด๋ จ ๋นํธ๋ง ์กฐ์ํ๊ธฐ ๋๋ฌธ์ ๋ณ๋์ AND ์ฐ์ฐ์ผ๋ก ํด๋ฆฌ์ดํ๋ ๊ณผ์ ์ ์๋ต
// OR ์ฐ์ฐ์(|)๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฆฌ์ค์ผ์ผ ๊ฐ์ ์ค์ ํ๋ ๋นํธ๋ฅผ 1๋ก ์ค์
TCCR0 |= (1 << CS02) | (1 << CS00); // CS02๊ฐ 2, CS00์ด 0์ผ๋ก ์ ์๋ ๊ฒ์ผ๋ก ๊ฐ์
// TCNT0 ๋ ์ง์คํฐ ์ด๊ธฐ๊ฐ == 0; ๋นํธ ์ฐ์ฐ ํ์ ์์
TCNT0 = 0;
// ์ ์ญ ์ธํฐ๋ฝํธ ์ธ์์ด๋ธ ๋นํธ I ์
// OR ์ฐ์ฐ์(|)๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ๋นํธ๋ง์ 1๋ก ์ค์
SREG |= 1 << 7; // I ๋นํธ๊ฐ 7๋ฒ์งธ ์์นํ๋ค๊ณ ๊ฐ์
}
๋ณธ ์์ ๋ฅผ ํตํด ๋ณด์๋ฏ์ด, ์ํํธ ์ฐ์ฐ์์ ํจ๊ป AND ๋ฐ OR ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ ์ง์คํฐ์ ํน์ ๋นํธ ๊ฐ์ ์ค์ ํ๊ฑฐ๋ ํด๋ฆฌ์ดํ๋ ๋ฐ ๋งค์ฐ ํจ๊ณผ์ ์ด๋ค. ๋น๋ก ์ปดํจํฐ ๊ณตํ ๊ต์ก ๊ณผ์ ์ด๋ ์๋์ด๋ ธ์ ๊ฐ์ ๊ต์ก์ฉ ํ๋์จ์ด ๊ฐ๋ฐ์์ ๋นํธ ์ฐ์ฐ์ ์ฌ์ฉ ๋น๋๊ฐ ๋์ง ์์ ์ ์์ง๋ง, AVR, ARM๊ณผ ๊ฐ์ ์ ๋ฌธํ๋ ํ๋์จ์ด ๊ฐ๋ฐ๊ณผ ์ปดํจํฐ ๊ตฌ์กฐ์ ์ดํด๋ฅผ ์ํด์ ์ด๋ฌํ ๋นํธ ์ฐ์ฐ์ด ์ค์ํ ์ญํ ์ ํ๋ค.
'๐ท C์ธ์ด 30๊ฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[C/C++ Tip] 15. extern ๊ธฐ๋ณธ (0) | 2024.11.02 |
---|---|
[C/C++ Tip] 14. ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น (0) | 2024.10.29 |
[C/C++ Tip] 12. ํฌ์ธํฐ๊ฐ ํท๊ฐ๋ฆด ์ ๋ฐ์ ์๋ ์ด์ : ๋ณ(*)์ ์ข ๋ฅ์ ์ ์ฒด (1) | 2024.09.21 |
[C/C++ Tip] 11. C์ธ์ด ํฌ์ธํฐ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ (1) | 2024.09.19 |
[C/C++ Tip] 10. Call by Value vs Call by Reference (0) | 2024.09.14 |