<LED를 켜기 위한 코드>
본 글은 Atmega128L, Osc 12Mhz 보드에서 실험하였다.
준비물:
LED가 연결된 port 확인! (portA, portB, portC....),
각 port에 해당되는 Data Direction Register(DDR) 확인!
DDR의 각 비트는 입/출력 방향을 결정하는 비트이며, 각 비트의 입/출력은 해당되는 port의 각 pin의 입/출력을 결정짓는다.
특정 핀에 해당하는 DDR 레지스터 값이 1이면 출력 용도로 사용 할 핀임을 의미하며, 반대로 0이면 입력 용도로 사용 할 핀임을 의미한다.
Atmega 128L에서 PORTA의 주소는
PORTA에서 $1B($3B)라고 hex값으로 주소가 나와있는데 괄호 밖의 주소는 Atmega103 호환모드로 사용할 때의 주소라서 괄호 안의 주소를 사용하기로 한다. 즉, 0x3B를 사용한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include <util/delay.h>
#define DDRA (*((volatile unsigned char*)0x3A))
#define PORTA (*((volatile unsigned char*)0x3B))
#define PORTA0 0
#define PORTA1 1
#define PORTA2 2
#define PORTA3 3
#define PORTA4 4
#define PORTA5 5
#define PORTA6 6
#define PORTA7 7
int main(void)
{
DDRA = 0xFF;
PORTA = (PORTA & (1<<PORTA1)) | (PORTA & (1<<PORTA2)) | (PORTA & (1<<PORTA3)) | (PORTA & (1<<PORTA4)) | (PORTA & (1<<PORTA5)) | (PORTA & (1<<PORTA6)) | (PORTA & (1<<PORTA7));
while(1)
{
#if 1
_delay_ms(5000);
PORTA = ~PORTA;
#endif
}
return 0;
}
|
_delay_ms함수를 사용하기 위해 #include <util/delay.h> 헤더파일을 추가했으며, 나머지는 레지스터 주소를 직접 건드리는 방식으로 코드를 사용했다.
PORTA에 값을 입력하면 LED가 켜지는 줄 알았지만 PORT0을 1로 설정을 안 했는데도 모든 LED가 다 켜져서 PORT0과 PORT7만 1로 설정을 하고 나머지를 모두 0으로 해보았다. 그런데도 모든 불빛이 다 들어와서 DDR 레지스터의 값을 LED0번과 LED7번만 켜지게 바꿨더니 원하는대로 동작이 되었다. PORTA는 영향을 안 미치는 줄 알았는데 while문에서 PORTA의값을 틸트(~) 시켰는데 LED가 on/off되는 것을 보면 좀 더 공부해봐야 알 것 같다. (LED가 DDR 셋팅으로만 불이 켜지는 이유가 회로도를 몰랐기 때문인데 현재 보드의 LED는 Vcc에
연결돼 있어서 PORTA의 initial value가 0이므로 ground와 비슷한 효과를 내서 LED가 켜지는 것이다. 만약 LED가 ground에 연결돼 있었다면 PORTA에 값을 넣었을 때 데이터시트
처럼 정상 작동하는 것을 확인할 수 있을 것 같다.)
새로 작성한 LED 0번과 LED 7번을 켜는 코드는 다음과 같다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
#include <util/delay.h>
#define DDRA (*((volatile unsigned char*)0x3A))
#define PORTA (*((volatile unsigned char*)0x3B))
#define PORTA0 0
#define PORTA1 1
#define PORTA2 2
#define PORTA3 3
#define PORTA4 4
#define PORTA5 5
#define PORTA6 6
#define PORTA7 7
int main(void)
{
DDRA = 0x81;
PORTA = 0x00;
//PORTA = (PORTA & (1<<PORTA0)) | (PORTA & (1<<PORTA7));
while(1)
{
#if 1
_delay_ms(5000);
PORTA = ~PORTA;
#endif
}
return 0;
}
|
'언어 > 큐브인턴(Embedded)' 카테고리의 다른 글
PINA, PORTA, DDRA 설명(LED관련) (0) | 2016.10.31 |
---|---|
UART LED가 정상 작동을 안 하는 경우 (0) | 2016.10.28 |
printf 함수 리턴 (0) | 2016.09.30 |
하버드 구조 VS 폰 노이만 구조 (0) | 2016.09.21 |
MCU, MIPS (0) | 2016.09.04 |