AVR 마이크로컨트롤러 입출력 포트 특징

 * AVR 마이크로컨트롤러 입출력 포트 특징

 – 6개의 8비트 I/O 포트와 1개의 5비트 I/O 포트로 구성되어 있다.
 – 출력포트의 버퍼는 많은 유입전류와 유출전류를 사용(최대 40mA)할 수 있다.
 – 모든 포트 핀은 개별적으로 내부 풀업 저항을 사용할 수 있다.
 – 모든 I/O핀은 VCC와 GND 사이에 다이오드를 접속하여 포트를 보호한다.
 – Read-Modify-Write기능을 가지고 있어, 비트 단위의 포트 설정이 자유롭다.
 – 각 포트에 대한 데이터 출력용 레지스터(PORTx)와 데이터 입출력 방향 지정용 레지스터(Data Direction Register : DDRx), 그리고 입력용 레지스터 (PINx)를 가지고 있다.

 * AVR 마이크로컨트롤러는 입출력 포트를 제어하기 위해서, DDxn, PORTxn, PINxn의 3개의 레지스터를 사용한다.

 * DDRx 레지스터
 – 입출력의 방향설정을 하기 위한 레지스터이다. DDRA ~ DDRG 레지스터의 입출력포트에 대응하는 해당 비트에 1을 쓰면 그 해당 핀이 출력으로, 0을 쓰면 입력으로 설정된다. 초기값을 0으로 설정되어 있다. 비트별로 만약 포트 A의 비트3를 출력으로 설정하려면 DDRA = 0x08로 하면 되고, 포트 A를 전부 출력으로 설정하려면 DDRA = 0xff로 하면 된다.

 * PORTx 레지스터
 – 데이터를 출력하기 위한 레지스터이다. DDRx의 값을 세팅하여 출력으로 설정된 경우 출력을 원하는 데이터값을 PORTx 레지스터에 넣어주면 된다. PORTx 레지스터는 읽기와 쓰기가 모두 가능하다. 비트별로 설정하려면 PORTx = 1의 형태로 하면 된다( x는 A ~ G). 만약 포트 B의 비트3에 1을 출력하려면 PORTB = 0x08로 하면 된다.

 * PINx 레지스터
 – 데이터 입력용 레지스터이다. 입출력 핀이 입력으로 설정된 경우 PINx 레지스터에 해당하는 값을 읽으면 된다. 해당 핀의 값을 읽어 들인다. 읽기만 가능하며 쓰기는 금지되어 있다. 비트별로 읽어 들이려면 PINx를 사용하면 된다. 비트별로 만약 포트C의 비트3값을 읽어 들여 led3라는 비트값에 할당하려면 led3 = (PINC & 0x08)로 하면 된다.

 * ATMega128 마이크로콘트롤러는 6개의 8비트 입출력 포트와 1개의 5비트 입출력 포트로 구성되어 있다. 출력 포트들은 임베디드 시스템을 설계할 때 그 용도에 맞게 적절히 기능을 부여하게 된다. 시스템에서 요구되는 기능에 따라 내장할 주변 소자들과 외부 인터페이스를 결정하고, 그 주변 소자와 외부 인터페이스들을 마이크로컨트롤러의 각 입출력 포트에 적절히 배분하여 연결해 주어야 한다. 예를 들어 UART 인터페이스를 필요로 하는 외부 인터페이스는 포트 D나 포트 E의 UART 포트에 연결하면 되고, PWM 제어가 필요한 모터는 포트 B의 PWM 포트에, AD변환이 필요한 센서등은 포트 F의 ADC 포트에 연결하면 된다. 만약 외부에 대용량의 메모리를 붙여야 한다면 포트 A, 포트 C, 포트 G에 있는 외부 메모리 연결 포트를 사용해야 한다.

 * 포트 A(PA7 ~ PA0 : 핀 44 ~ 51)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, 외부 메모리를 둘 경우에는 주소버스(A7-A0)와 데이터버스(D7-D0)로 사용된다. 이때 어드레스 버스와 데이터 버스를 구분하기 위해서는 ALE 신호를 사용한다. 다음은 외부 메모리를 둘 경우 각 핀 역할을 정리한 것이다.
 * 포트 A의 부가기능
 PA7 : AD7(외부 메모리 인터페이스 주소와 데이터 비트 7)
 PA6 : AD6(외부 메모리 인터페이스 주소와 데이터 비트 6)
 PA5 : AD5(외부 메모리 인터페이스 주소와 데이터 비트 5)
 PA4 : AD4(외부 메모리 인터페이스 주소와 데이터 비트 4)
 PA3 : AD3(외부 메모리 인터페이스 주소와 데이터 비트 3)
 PA2 : AD2(외부 메모리 인터페이스 주소와 데이터 비트 2)
 PA1 : AD1(외부 메모리 인터페이스 주소와 데이터 비트 1)
 PA0 : AD0(외부 메모리 인터페이스 주소와 데이터 비트 0)

 * 포트 B(PB7 ~ PB0 : 핀 10 ~ 17)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, GPIO로 사용되지 않을 경우에는 타이머/카운터나 SPI용 단자 혹은 PWM 단자로도 사용된다. 다음은 특수용도로 사용될 경우 포트 B의 각 핀의 기능을 정리한 것이다.
 * 포트 B의 부가기능
 PB7 : OC2/OC1C(출력비교 또는 타이머/카운터2의 PWM 출력, 또는 출력비교와 타이머/카운터2의  PWM출력 C)
PB6 : OC1B(출력비교 또는 타이머/카운터1의  PWM출력 B)
PB5 : OC1A(출력비교 또는 타이머/카운터1의 PWM 출력 A)
PB4 : OC0(출력비교 뚀는 타이머/카운터0의 PWM 출력)
PB3 : MISO(SPI 버스 마스터 입력/종속 출력)
PB2 : MOSI(SPI 버스 마스터 출력/종속 입력)
PB1 : SCK(SPI 버스 직렬 클럭)
PB0 : /SS(SPI 종속 선택 입력)

 * 포트 C(PC7 ~ PC0 : 핀 35 ~ 42)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, 외부메모리를 둘 경우에는 주소버스(A15 ~ A8)로 사용된다. 다음은 외부 메모리를 둘 경우 각 핀 역할을 정리한 것이다.
 * 포트 C의 부가기능
 PC7 : AD7(외부 메모리 인터페이스 주소 비트 15)
 PC6 : AD6(외부 메모리 인터페이스 주소 비트 14)
 PC5 : AD5(외부 메모리 인터페이스 주소 비트 13)
 PC4 : AD4(외부 메모리 인터페이스 주소 비트 12)
 PC3 : AD3(외부 메모리 인터페이스 주소 비트 11)
 PC2 : AD2(외부 메모리 인터페이스 주소 비트 10)
 PC1 : AD1(외부 메모리 인터페이스 주소 비트 9)
 PC0 : AD0(외부 메모리 인터페이스 주소 비트 8)

 * 포트 D(PD7 ~ PD0 : 핀 25 ~32)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, 타이머용 단자 혹은 외부인터럽트 단자로도 사용된다. 다음은 특수용도로 사용될 경우 각 핀의 기능을 정리한 것이다.
 * 포트 D의 부가기능
 PD7 : T2(타이머/카운터2 클럭 입력)
 PD6 : T1(타이머/카운터1 클럭 입력)
 PD5 : XCK1(USART1 외부 클럭 입/출력)
 PD4 : IC1(타이머/카운터1 입력 캡쳐 트리거)
 PD3 : INT3/TXD1(외부 인터럽트3 입력 또는 USART1 전송 핀)
 PD2 : INT2/RXD1(외부 인터럽트2 입력 또는 USART1 수신 핀)
 PD1 : INT1/SDA(외부 인터럽트1 입력 또는 TWI 직렬 데이터)
 PD0 : INT0/SCL(외부 인터럽트0 입력 또는 TWI 직렬 클럭)

 * 포트 E(PE7 ~ PE0 : 핀 2 ~ 9)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, 타이머용 단자, 외부인터럽트, 아날로그 비교기, USART용 단자로도 사용된다. 다음은 특수용도로 사용될 경우 각 핀의 기능을 정리한 것이다.
 * 포트 E의 부가기능
 PE7 : INT7/IC3(외부 인터럽트 7입력 또는 타이머/카운터3 입력 캡쳐 트리거)
 PE6 : INT6/T3(외부 인터럽트 6입력 또는 타이머/카운터3 클럭 입력)
 PE5 : INT5/OC3C(외부 인터럽트 5 입력 또는 타이머/카운터3의 출력 챕쳐와 PWM 출력 C)
 PE4 : INT4/OC3B(외부 인터럽트 4 입력 또는 타이머 카운터 3의 출력 챕쳐와 PWM 출력 B)
 PE3 : AIN1/OC3A(아날로그 비교 반대입력 또는 타이머/카운터3의 출력 비교와 PWM 출력 A)
 PE2 : AIN0/XCK0(아날로그 비교 입력 또는 USART0 외부 클럭 입/출력)
 PE1 : PD)/TXD0(프로그램 데이터 출력 또는 UART0 전송 핀)
 PE2 : PDI/RXD0(프로그램 데이터 입력 또는 UART0 수신 핀)

 * 포트 F(PF7 ~ PF0 : 핀 54 ~ 61)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, AD변환기 혹은 JTAG 인터페이스용 단자로도 사용된다. 다음은 AD 변환이나, JTAG용도로 사용될 경우의 각 핀 역할을 정의한 것이다.
 * 포트 F의 부가기능
 PF7 : ADC7/TDI(ADC 입력 채널 7 또는 JTAG Test Data Input)
 PF6 : ADC6/TDO(ADC 입력 채널 6 또는 JTAG Test Data Output)
 PF5 : ADC5/TMS(ADC 입력 채널 5 또는 JTAG Test Mode Select)
 PF4 : ADC4/TCK(ADC 입력 채널 4 또는 JTAG Test Clock)
 PF3 : ADC3(ADC 입력 채널 3)
 PF2 : ADC2(ADC 입력 채널 2)
 PF1 : ADC1(ADC 입력 채널 1)
 PF0 : ADC0(ADC 입력 채널 0)

 * 포트 G(PG4 ~ PG0, 핀 19, 18, 43, 34, 33)
 – 내부 풀업 저항이 있는 8비트 양방향 입출력 단자로서, 외부 메모리 접속을 위한 스트로브 신호용, RTC(Real Time Counter) 타이머용 발진기 단자로도 사용된다.
 * 포트 G의 부가기능
 PG4 : TOSC1(RTC 오실레이터 타이머/카운터 0)
 PG3 : TOSC2(RTC 오실레이터 타이머/카운터 0)
 PG2 : ALE(외부메모리에 주소 래치 인에이블)
 PG1 : RD(외부메모리에 스트로브 읽기)
 PG0 : WR(외부메모리에 스트로브 쓰기)

ATMega128 핀 기능.


 – RESET(핀20) : 입력단자로 ‘0’ 레벨이 입력되면 리셋되어 PC(Program Counter)는 일반적으로 0번지를 가르키고 0번지부터 프로그램이 시작된다. 리셋시 대부분의 레지스터는 초기화된다.
 – XTAL1, XTAL2(핀24, 23) : 발진용 증폭기 입력 및 출력 단자.
 – Vcc(핀21, 51) : 전원 입력 단자
 – GND(핀22, 53, 63) : 그라운드 입력 단자.
 – AVCC(핀 64) : AD변환기 및 포트 F에 대한 공급 전압
 – AREF(핀 62) : ADC 참조 전압(Reference Voltage)
 – PEN(핀1) : SPI를 활성화시키는 단자로 일반적인 동작모드에서는 사용하지 않고 파워 온 리셋시 0상태로 유지해 SPI를 허용하게 한다.
 – 포트A(PA7 ~ PA0 : 핀 44-51) : 내부 풀업 저항이 있는 8비트 양방향 입출력 단자. 외부 메모리를 둘 경우에는 주소버스(A7-A0)와 데이터버스(D7-D0)로 사용.
 – 포트B(PB7 ~ PB0 : 핀 10-17) : 내부 풀업 저항이 있는 8비트 양방향 입출력 단자. SPI용 단자 혹은 PWM단자로도 사용된다.
 – 포트C(PC7 ~ PC0 : 핀 35-42) : 내부 풀업 저항이 있는 8비트 양방향 입출력 단자. 외부메모리를 둘 경우에는 주소버스(A15-A8)로 사용된다.
 – 포트D(PD7 ~ PD0 : 핀 25-32) : 내부 풀업 저항이 있는 8비트 양방향 입출력 단자. 타이머용 단자 혹은 외부입터럽트용 단자로도 사용된다.
 – 포트E(PE7 ~ PE0 : 핀 2-9) : 내부 풀업 저항이 있는 8비트 양방향 입출력 단자. 타이머용 단자, 외부 인터럽트, 아날로그 비교기, USART용 단자로도 사용된다.
 – 포트F(PF7 ~ PF0 : 핀 54-61) : 내부 풀업 저항이 있는 5비트 양방향 입출력 간자. AD 변환기 혹은 JTAG 인터페이스용 단자로도 사용된다.
 – 포트G(PG4~PG0 : 핀 19, 18, 43, 34, 33) : 내부 풀업 저항이 있는 8비트 양방향 입출력 단자. 외부 메모리 접속을 위한 스트로브 신호용, RTC(Real Time Counter) 타이머용 발진기 단자로도 사용된다.

 
 ATmega128 포트와 핀 : 입출력 포트(I/O) 별 설명

기능구분 : 핀 이름 : 핀 번호 : 핀 명칭 : 기능
================================================================================================
기능 : I/O 또는 Address
핀 이름 : PA0(AD0) ~ PA7(AD7)
핀 번호 : 51 ~ 44
핀 명칭 : PortA
기능 :
[PA0 ~ PA7 으로 사용] 일반 범용 I/O로 사용시 신호 방향(DDRA), 출력될 데이터 저장(PORTA), 입력된 데이터 저장(PINA) 3개의 레지스터 설정을 통해 제어되는 양방향 범용 I/O (GPIO) 포트로 사용.
[AD0 ~ AD7 으로 사용] 외부 메모리를 접근하기 위해 사용 될 때는 하위 어드레스 버스로 사용, ALE 신호에 의해 상위 어드레스와 분리.
================================================================================================
기능 : I/O
핀 이름 : PB0 ~ PB7
핀 번호 : 10 ~ 17
핀 명칭 : PortB
기능 : [PB0 ~ PB7 으로 사용] Port A 와 마찬가지로 DDRB, PORTB, PINB 레지스터들에 의해 제어되는 양방향 범용 I/O 포트로 사용
[다른 용도로 사용될 때] Port A 와는 달리 각 핀마다 서로 다른 용도 (PWM 출력, SPI로 사용)
================================================================================================
기능 :  I/O 또는 Address
핀 이름 : PC0(A8) ~ PC7(A15)
핀 번호 : 35 ~ 42
핀 명칭 : PortC
기능 : [PC0 ~ PC7으로 사용] DDEC, PORTC, PINC 레지스터들에 의해 제어되는 야방향 범용 I/O 포트로 사용.
[A8 ~ A15 으로 사용] 외부 메모리를 접근하기 위해 사용될 수 있으며, Port A 가 하위 어드레스버스로 사용된 것과 달리 Port C 는 상위 어드레스 버스로 사용됨
================================================================================================
기능 : I/O
핀 이름 : PD0 ~ PD7
핀 번호 : 25 ~ 32
핀 명칭 : PortD
기능 : [PD0 ~ PD7 으로 사용] DDRD, PORTD, PIND 레지스터들에 의해 제어되는 양방향 범용 I/O 포트로 사용
[다른 용도로 사용될 때] 각 핀마다 서로 다른 용도(Timer, USART, TWI)로 사용
================================================================================================
기능 : I/O
핀 이름 : PE0 ~ PE7
핀 번호 : 2 ~ 9
핀 명칭 : PortE
기능 : [PE0 ~ PE7 으로 사용] DDRE, PORTE, PINE 레지스터들에 의해 제어되는 양방향 범용 I/O 포트로 사용.
[다른 용도로 사용될 때] 각 핀마다 서로 다른 용도(Timer, USART)로 사용
================================================================================================
기능 : I/O 또는 ADC
핀 이름 : PF0(ADC0) ~ PF7(ADC7)
핀 번호 : 61 ~ 54
핀 명칭 : PortF
기능 : [PF0 ~ PF7 으로 사용] DDRF, PORTF, PINF 레지스터들에 의해 제어되는 양방향 범용 I/O 포트로 사용.
[ADC0 ~ ADC7 으로 사용] ATmega128 내부에 있는 8채널(0~7)의 10-bit ADC의 아날로그 입력으로 사용
================================================================================================
기능 : I/O
핀 이름 : PG0 ~ PG4
핀 번호 : 33, 34, 43, 18, 19
핀 명칭 : PortG
기능 : [PG0 ~ PG7 으로 사용될 때] DDRG, PORTG, PING 레지스터들에 의해 제어되는 양방향 범용 I/O 포트로 사용.
[다른 용도로 사용될 때] 각 핀마다 서로 다른 용도(Timer, 외부 메모리 I/F 제어신호)로 사용
================================================================================================

AVR Studio 사용법…

 AVR Studio를 사용하던 중…다음의 오류가 발생하였다.

 make: Makefile: No such file or directory

 이유인즉…Makefile 을 찾을 수 없다는 이야기이다.

 왜 그럴까….답을 금방 찾았는데…..역시나 간단했다.

 윈도우에서의 프로젝트의 경로를 지정할때, 경로에 한글이 들어가 있다면 안되는것이다.

 구 버전에는 문제가 없는듯 하지만….버전업이 되면서 발생하는 문제인것 같았다.

 즉, 해결법은….. 영어로 된 경로에 프로젝트 폴더를 위치하면 된다.

install qtopia….

   1.   Unpack Qtopia...

tar xfz qtopia-free-1.7.x.tar.gz
cd qtopia-1.7.x
export QPEDIR=$PWD
cd ..


2. Install Qt/Embedded...

tar xfz qt-embedded-2.3.x.tar.gz
cd qt-2.3.x
export QTDIR=$PWD
export QTEDIR=$QTDIR
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
cp $QPEDIR/src/qt/qconfig-qpe.h src/tools/
./configure -qconfig qpe -qvfb -depths 4,8,16,32
make sub-src
cd ..


You may also want to use the configure options
-system-jpeg and -gif for jpeg and gif support.

3. Install Qt/X11 2.3.2... Note that you must use
2.3.x, not 3.x, as this step is done to provide Qt 2
tools.

tar xfz qt-x11-2.3.2.tar.gz
cd qt-2.3.2
export QTDIR=$PWD
export PATH=$QTDIR/bin:$PATH
export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH
./configure
make
make -C tools/qvfb
mv tools/qvfb/qvfb bin
cp bin/uic $QTEDIR/bin
cd ..


You may also pass other configure options such
as -no-opengl or -no-xft as suitable to your
environment. Use ./configure -help for more
information. You may also want to build Qt Designer
(in tools/designer/).

4. Build Qtopia...

cd qtopia-1.7.x
export QTDIR=$QTEDIR
export QPEDIR=$PWD
export PATH=$QPEDIR/bin:$PATH
cd src
./configure
make
cd ../..


....하지만 실행 중 다음과 같은 오류가 발생할 수 있다.
In file included from kernel/qt_x11.h:76,
from kernel/qpsprinter.cpp:97:
/usr/X11R6/include/X11/Xft/Xft.h:35:31:
freetype/freetype.h: No such file or directory
In file included from kernel/qt_x11.h:76,
from kernel/qpsprinter.cpp:97:
/usr/X11R6/include/X11/Xft/Xft.h:52: syntax error
before `;' token
/usr/X11R6/include/X11/Xft/Xft.h:86: 'FT_UInt' is used
as a type, but is not
defined as a type.
/usr/X11R6/include/X11/Xft/Xft.h:93: 'FT_UInt' is used
as a type, but is not
defined as a type.
/usr/X11R6/include/X11/Xft/Xft.h:190: parse error
before `*' token
/usr/X11R6/include/X11/Xft/Xft.h:295: parse error
before `*' token
/usr/X11R6/include/X11/Xft/Xft.h:354: parse error
before `*' token
/usr/X11R6/include/X11/Xft/Xft.h:393: parse error
before `*' token
/usr/X11R6/include/X11/Xft/Xft.h:399: parse error
before `*' token
/usr/X11R6/include/X11/Xft/Xft.h:408: type specifier
omitted for parameter `
FT_UInt'
/usr/X11R6/include/X11/Xft/Xft.h:408: parse error
before `,' token
/usr/X11R6/include/X11/Xft/Xft.h:418: parse error
before `*' token
/usr/X11R6/include/X11/Xft/Xft.h:461: parse error
before `*' token
make[2]: *** [kernel/qpsprinter.o] Error 1
make[2]: Leaving directory `/home/qt-2.3.2/src'
make[1]: *** [sub-src] Error 2
make[1]: Leaving directory `/home/qt-2.3.2'
make: *** [init] Error 2
이는 freetype 관련 파일을 찾지 못해 생기는 현상이다. redhat9 이라면 다음과 같이 하면 문제를 해결할 수 있다.

cd /usr/include
ln -s freetype2/freetype freetype