ATmega128 LED Blink
- ATmega128 모듈에 LED 8개를 연결하고, 이를 Microchip Studio를 통해 제어 동작
1. LED Blink
2. LED Left Shift
3. LED Left Shift <-> Right Shift 왕복
* ATmega128A과 Microchip Studio ver. 7.0.2594를 기준으로 작성되었습니다.
H/W 설정
- 사용 MCU: ATmega128A
- 사용 H/W: 330Ω 저항 8개, LED 8개(적색 2개, 황색 3개, 녹색 3개)
- ATmega128의 port D 0~7 pin 사용
- 각 핀마다 330Ω의 저항과 LED 연결
* LED 연결
- LED는 LED의 최대 전압(정격 전압)을 넘으면 과전류로 인해 LED 부품이 손상될 수 있음
/ 반대로 전압이 너무 낮아 LED의 최소 구동 전압보다 작을 경우는 LED의 빛이 흐리거나 켜지지 않음
- ATmga128A에 5V의 정격 전압이 흐르게 되므로, LED의 최대사용전압을 맞추기 위해 사이에 저항을 연결해야 함
- LED 연결 저항 값 산정
* 공급전압은 ATmega128의 정격전압, LED의 전압과 전류는 일반적인 제품 값을 기준으로 계산
ATmega128 정격전압: 5V
적색 LED _ (순방향)전압: 1.8V / (순방향)전류: 20mA (LED 순방향 전압 -> LED를 키는데 필요한 최소 전압)
녹색 LED _ (순방향)전압: 3V / (순방향)전류: 20mA (LED 순방향 전압 -> LED를 키는데 필요한 최소 전압)

적색과 녹색의 LED 연결 저항 값이 위와 같이 나오므로, 계산된 최소 저항 값보다 큰 저항을 사용 (최소전력의 2배 이상 사용 권장)

- LED 렌즈 내부의 프레임 면적이 좁거나 다리가 긴 곳이 (+) 극, 프레임 면적이 넓거나 다리가 짧은 쪽이 (-) 극을 나타냄
<H/W 연결>
ATmega128a Port D의 0부터 7까지에 LED를 연결하기 위해 330Ω 저항을 연결하고, MCU와 저항쪽에 LED의 +극(단자)을 연결 / LED의 -극(단자)에 GND(0V)를 연결
(왼) LED 구조 (출처: Pixabay Clker-Free-Vector-Images)
(오) H/W 연결
> Microchip Studio AVR LED 동작 코드 작성
- 소스 코드
1. LED 켜기, 끄기, 4개씩 켜고 끄는 동작 코드
#define F_CPU 16000000UL //delay 설정 _꼭 avr/io.h 포함 전 설정해줘야 함
#include <avr/io.h>
#include <util/delay.h> //delay 이용을 위한 헤더파일 포함
int main(void)
{
/* DDR Data Direction */
DDRD = 0xff; //DDR D포트를 출력(0xff)으로 설정
//LED Blink 동작
while (1)
{
PORTD = 0xff; //PORTD: Port D의 / 0xff -> LED 켜기
_delay_ms(500);
PORTD = 0x00; //PORTD: Port D의 / 0x00 -> LED 끄기
_delay_ms(500);
_delay_ms(1000);
PORTD = 0b11110000; //0b11110000 -> 상위 4개 켜짐,하위 4개 꺼짐
_delay_ms(500);
PORTD = 0b00001111; //0x00001111 -> 상위 4개 꺼짐, 하위 4개 켜짐
_delay_ms(500);
}
return 0;
}
코드설명
: 포트 D를 출력으로 설정.
포트 D에 연결되어 있는 LED 전체를 약 5초간 켰다가 5초간 끄고,
10초 후 상위 4개의 LED만 5초 동안 킨 후, 5초 동안 상위 4개는 꺼지고 하위 4개만 켜지는 동작을 반복 실행함.
2. LED를 하나씩 차례로 켜는 (Left shift) 동작 코드
#define F_CPU 16000000UL //delay 설정 _꼭 avr/io.h 포함 전 설정해줘야 함
#include <avr/io.h>
#include <util/delay.h> //delay 이용을 위한 헤더파일 포함
int main(void)
{
/* DDR Data Direction */
DDRD = 0xff; //DDR D포트를 출력(0xff)으로 설정
int LED = 0x00; //LED 초기 점등 데이터를 0b00000000로 설정
//LED Left shift 동작 _for문, 비트연산자 사용
while (1)
{
LED = 0x01; //첫번째 LED를 킴 / 0b 0000 0001
for (int i=0; i<=7; i++)//i의 초기값을 0으로 설정, i가 7과 같을 때까지 증가 -> 0에서 7까지 7회 동작 반복
{
PORTD = LED; //PORTD에 LED 변수를 넣어 LED라는 변수로 PORTD 출력을 제어
LED = LED << 1; //LED에 LED 값에 1을 shift한 값을 넣어 LED가 하나씩 옮겨가며 켜지게 설정
_delay_ms(1000); //10초 동안 켜지고 for문을 위에서부터 다시 돔
}
}
return 0;
}
코드설명
: 포트 D를 출력으로 설정, LED라는 정수형 변수를 선언하고, 초기값을 꺼짐으로 설정함 ->LED 변수로 Port D를 제어
첫번째 LED를 켜고, for문을 이용하여 첫 번째 LED부터 8번째 LED까지 차례대로 옮겨가며 하나씩 켜지도록 함.
for문이 0에서 7까지 도는 동안 1(On)을 하나씩 하나씩 밀며 10초 동안 켜지는 동작을 반복 실행함.
<shift 동작 설명 이미지 추가 예정>
3. LED가 하나씩 켜지는 것을 왕복하는 (Left shift <-> Right shift 왕복) 동작 코드
#define F_CPU 16000000UL //delay 설정 _꼭 avr/io.h 포함 전 설정해줘야 함
#include <avr/io.h>
#include <util/delay.h> //delay 이용을 위한 헤더파일 포함
int main(void)
{
/* DDR Data Direction */
DDRD = 0xff; //DDR D포트를 출력(0xff)으로 설정
int LED = 0x00; //LED 초기 점등 데이터를 0b00000000로 설정
int LED_8 = 0x80; //8번째 LED를 변수 LED_8로 지정
int LED_1 = 0x10; //1번째 LED를 변수 LED_1로 지정
//LED left<->right 왕복 동작 _for문, 비트연산자 사용
while (1)
{
LED = 0x01;
if (LED_8 != 1) //만약 LED_8가 1(On)이 아니면 _8번 LED가 켜질 때까지 for문 동작
{
for (int i=0; i<7; i++) //i가 0에서 7이 될 때까지 값을 증가
{
PORTD = LED;
LED = LED << 1; //LED에 LED를 하나 왼쪽(아래로)으로 미는 값 넣음
_delay_ms(1000); //10초 동안 동작 후 for문 반복
}
}
else
break;
if(LED_1 != 1) //만약 LED_1이 1(On)이 아니면 _1번 LED가 켜질 때까지 for문 동작
{
for (int i=0; i<7; i++) //i가 0에서 7이 될 때까지 값을 증가
{
PORTD = LED;
LED = LED >> 1; //LED에 LED를 하나 오른쪽(위로)으로 미는 값 넣음
_delay_ms(1000);//10초 동안 동작 후 for문 반복
}
}
else
break;
}
return 0;
}
코드설명
: 포트 D를 출력으로 설정, LED라는 정수형 변수를 선언하고, 초기값을 꺼짐으로 설정함 ->LED 변수로 Port D를 제어
1번 LED와 8번째 LED를 추가로 변수 선언하여 각각 끝의 LED가 켜질 때 if문을 나갈 수 있도록 함
첫번째 LED를 켜고, for문을 이용하여 첫 번째 LED부터 8번째 LED까지 차례대로 옮겨가며 하나씩 켜지도록 함.
for문이 0에서 7까지 도는 동안 1(On)을 하나씩 하나씩 밀며 10초 동안 켜지는 동작을 반복 실행함.
<shift 왕복 동작 설명 이미지 추가 예정>
- 동작 영상
3. LED가 왕복하며 하나씩 켜지는 (Left shift <-> Right shift) 동작 영상
동영상 서비스가 종료되어 해당 콘텐츠를 재생할 수 없습니다.
(1, 2번 동작에 대한 영상이 남아있지 않아 추가하지 않음)
주요내용
- AVR 프로그래밍을 통해 LED 동작을 설정, 제어 실습 (코드)
- LED 구조와 연결 방법에 대한 이론
참고자료
[DviceMart] LED 저항값 계산하기 (Feat. LED 데이터시트)
https://devicemart.blogspot.com/2019/05/led-featled.html
https://www.devicemart.co.kr/goods/catalog?code=000600020001
[Digi-Key Electronics] LED에 맞는 올바른 저항 고르기
https://forum.digikey.com/t/led/11346
'Programming > AVR(ATmega128)' 카테고리의 다른 글
| [AVR] (0) | 2023.03.29 |
|---|---|
| [AVR] ATmega128과 Microchip studio (0) | 2023.03.06 |
댓글