앞절에서 ATmega128의 특징을 분석해 보았으니 이제 하나씩 접근해 보도록 합시다.
일단 가장 기본적으로 I/O 포트에 대해 정리해 보도록 하지요.
아래의 128의 핀맵을 보도록 해보시죠.
전의 강좌에서 봤던 그림이군요.
VCC,GND처럼 전원관련된 것이나 XTAL1,2의 클럭입력, /RESET,/PEN 핀을 제외하고
Pxx라고 되어있는 핀들은 모두 I/O 포트라고 할 수 있겠지요.
또한 각 핀에는 괄호안에 알수없는 표시들이 되어있습니다.
예를 들어 RXD0,PDI, INTx, SCK, MOSI 등등등등~~
이런 것들은 각 핀에서 Alternate한 기능들을 말하고 있는 것이죠.
다시 말하면 PORTE0 핀과 같은 경우는 UART(RS232통신)에서 데이터를 읽어오는 기능을 한다던가,
추가적으로 PDI라고 해서 128의 플래쉬에 프로그램을 넣을 때 Program Data Input(PDI)로 동작한다던가
하는 추가적인 기능으로 사용할 수 있다는 것이죠.
하지만 기본적으로 모든 포트는 어떤 값을 Read하는 Input 핀이나, 어떤 값을 출력하는 Output 핀으로
사용할 수 있다는 것이죠.
아래 그림을 보면 더 이해가 가실 듯 해요.
음.. 잘못하면 더 이해가 힘들수도 있겠군요..;;
이해하기 쉽도록 간단하게 정리해 보도록 하죠.
일단 위의 그림은 하나의 포트핀에 대해 내부의 회로적 블럭다이어그램으로 표시한 것이고 신호들에 대해서는 간
략하게 설명이 이미 나와있네요.
기능들에 대해 살짝 검토해 볼까요~
1) PUD를 통해 내부 Pull-up의 Enable/Disable을 설정하는 군요.
2)DDO에서는 해당 핀을 출력핀으로 사용하는지, 입력핀으로 사용하는지 설정하네요.
3) PVO에서는 해당 핀의 출력이 High인지 Low인지 설정하는군요.
4) DIEO에서는 해당 핀의 입력을 DIGITAL 입력으로 사용하는 것에 대해 설정하네요.
즉, ADC로 사용하는 경우인지 아닌지 판별하는 경우가 되겠네요.
5) PUD는 전체 Pull-up Disable에서 들어오는 신호군요. 앞절에 전체 풀업의 사용설정을 할 수 있다고
나와있었죠~
6) WD는 DDRx레지스터의 해당 비트값을 넣어주는 것이구요. 따라서 앞쪽의 DDO와 연관되네요~
7) RD는 해당 포트가 DDRx 레지스터나 WD의 값을 통해 출력인지 입력인지 판별할 수 있게 되는군요.
8) RR과 RP에서 보면 해당 핀의 PORT상태(즉, Low인지 High인지)를 읽어올 수 있어요.
다시 말하면 코드에서 PORT.x = 1; 이라고 해놓고 PIN.x로 해당 핀의 상태를 읽게 되면 1이라고 나오게 되
는 것이죠. 더 쉽게 말하면 내가 값을 줘놓고 해당 값이 제대로 나가고 있는지 체크할 수 있다는 것이죠.
아니면 외부에서의 영향으로 해당 값이 바뀔 수도 있으니까 그 상태를 사용자가 읽고 싶을 때 사용됩니다.
9) CLK는 동기화를 위한 클럭인데요.
그림에서 보면 Synchronizer라고 해서 동기화 시키는 장치가 있어요. 또한 플립플롭으로 구성되었네요.
예를 들어 설명하면 외부의 신호가 순간적으로 상태가 빠르게 바뀐다면 그 타이밍에 따라 신호를 읽기가
굉장히 힘들지요. 소스에서는 바로바로 읽으라고 했는데 내부적으로 그 신호를 못따라갈 수 있으니 해당
신호를 약간 Delay 시켜서 상태값을 읽어올 수 있도록 하는 것이죠. 또한 앞쪽에 슈미트 트리거를 달아서
노이즈신호에도 영향을 덜 받게 하고 있네요.
10) 그림에서 보면 맨 위쪽의 왼쪽을 보면 TR처럼 생기고 VCC랑 연결되는 그림이 있어요.
이쪽 부분이 내부적 Pull-up을 위한 회로가 되겠지요. 즉, 해당 TR그림의 Base(또는 Gate)에 신호가 들어
오게 되면 아래쪽 저항과 VCC가 연결되어 Pull-up 상태가 되겠지요~
위와 같이 각 I/O 핀 하나에도 여러가지 신호가 오고 가고 있고, 해당 값들은 8bit 데이터 버스를 통해 전달되고
있습니다.
중간에서 DDR, PORT, PIN이라는 말이 나왔는데 이 3가지는 각 핀(또는 포트)에 개별적으로 가지고 있는
레지스터에요.
아래 그림처럼요~
즉, 위의 괕아 각 핀에는 DDR, PORT, PIN의 레지스터를 가지고 있고 한 핀당 한 bit를 차지하고 있습니다.
예를 들어 위의 그림과 같이 포트A의 0번(PA0)핀은 DDRA레지스터의 0번비트, PORTA레지스터의 0번비트, PINA
레지스터의 0번 비트와 연관된다는 거에요.
각 레지스터의 기능은 아래와 같아요.
1) DDRx : 값이 0이면 해당 핀을 입력으로 사용하고, 1로 설정하면 출력으로 사용함.
2) PORTx : 0으로 설정하면 해당 핀의 출력이 Low이고, 1로 설정하면 High를 출력함.
만약 해당 포트를 입력으로 설정하고 PORT값을 1로 설정하면 내부 Pull-up이 동작합니다.
3) PINx : 해당 포트의 상태값을 읽어옵니다. Low면 0으로 읽고, High라면 1로 읽어서 PIN 레지스터에
저장됩니다.
여기서 중요한 것은 해당 PIN레지스터는 PORT 값이 변경될때마다 새롭게 갱신되는 것이 아니라
사용자가 PINx의 명령을 주게 되면 그 때마다 레지스터의 값이 갱신됩니다.
일단 위의 각 DDR,PORT,PIN은 소스코드에서 그대로 사용하는 명령어라는 것을 꼭 알아두시길 바래요~
즉, 소스코드에서 DDRA = 0xFF; 라고 하면 포트 A를 모두 출력으로 설정한다는 의미로 그대로 소스에 사용한다는
말이에용~
| 번호 | 제목 | 닉네임 | 조회 | 등록일 |
|---|---|---|---|---|
![]() |
[AVR] 3. I/O (Input/Output) 포트에 대해서
|
![]() |
3887 | 2010-11-11 |
| 22 |
[AVR] 2. 초음파센서(SRF05)로 거리측정하기
|
![]() |
7585 | 2010-11-08 |
| 21 |
[AVR] 1. ATmega128의 특징분석
|
![]() |
6895 | 2010-11-05 |
| 20 |
[하드웨어] 20. TR로 전류증폭이란?
|
![]() |
4137 | 2010-11-05 |
| 19 |
[하드웨어] 19. Regulator, Buck, Boost, Boost-Buck Convertor
|
![]() |
10353 | 2010-09-30 |
| 18 |
[하드웨어] 18. Flash Memory의 물리적 동작과 NAND/NOR 플래쉬 메모리
|
![]() |
6466 | 2010-09-30 |
| 17 |
[하드웨어] 17. SCR(Silicon Controlled Rectifier), DIAC, TRIAC
|
![]() |
3505 | 2010-09-30 |
| 16 |
[하드웨어] 16. MOSFET(Metal Oxide Semiconductor Field-Effect Transistor)
|
![]() |
6132 | 2010-09-30 |
| 15 |
[하드웨어] 15. J-FET에 대하여
|
![]() |
3760 | 2010-09-30 |
| 14 |
[하드웨어] 14.BJT(Bipolar Junction Transistor)
|
![]() |
6082 | 2010-09-30 |
| 13 |
[하드웨어] 13. PN Junction과 다이오드
|
![]() |
5324 | 2010-09-30 |
| 12 |
[하드웨어] 12.반도체의 기초
|
![]() |
3696 | 2010-09-30 |
| 11 |
[하드웨어] 11. 캐패시터(Capacitor)에 대하여
|
![]() |
4304 | 2010-09-30 |
| 10 |
[하드웨어] 10. 변압기(Transformer)에 대해서
|
![]() |
3178 | 2010-09-30 |
| 9 |
[하드웨어] 9. Inductor 인덕터에 관해서
|
![]() |
4241 | 2010-09-30 |


