3. --33--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-1 I/O 포트의 기본 구조 1
⊙ 6개의 8비트 양방향 병렬 I/O포트 (A ~ F) 와 1개의 5비트 병렬 I/O포트(G)로 구성
⊙ Read-Modify-Write 동작 가능(A ~ E)
⊙ H상태의 source drive 와 L상태의 sink drive 능력이 대칭적
⊙ 최대 구동전류 (sinks up to 40 mA)
⊙ 풀업저항의 사용 여부를 설정(Pinwise Controlled Pull-Up Resistors)
⊙ 데이터 입출력방향을 설정(Pinwise Controlled Data Direction)
⊙ Three Control/Status Bits per Bit/Pin
4. --44--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-1 I/O 포트의 기본 구조 2
☞ 각 포트는 3개의 I/O 레지스터 영역으로 구성
⊙ DDRx (Data Direction Register) : 입출력의 방향을 설정
⊙ PORTx (Data Register) : 데이터 출력에 해당하는 PORTx 레지스터
⊙ PINx (Port Input Pins Address) : 포트 입력 핀에 해당하는 PINx 레지스터
⊙ DDR, PORT 는 읽고 쓰는 것이 가능, PIN은 읽는 것만 가능한 레지스터
⊙ I/O포트의 풀업저항은 SFIOR 레지스터의 PUD(Pull-up Disable) 비트를 1로 셋하여 금지
내부 풀업 저항을 사용하려면 PUD비트를 0로 설정(DDRx = 0, PORTx = 1)
5. --55--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-2 I/O 포트의 기본 동작
☞ I/O 포트 핀의 동작 설정
H출력(source)NoOutputX11
L출력(sink)NoOutputX01
3-State(하이 임피던스)NoInput110
내부 풀업YesInput010
3-State(하이 임피던스)NoInputX00
비고Pull-upI/OPUDPORTxnDDRxn
9. --99--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-3 I/O 포트의 부수적 동작
① 포트포트 AA
▶ 외부메모리를 인터페이스 위한 데이터버스 및 어드레스 버스의 하위 바이트로 동작
▶ 어드레스 버스를 분리하는데 ALE(Address Latch Enable)신호를 사용
AD0 (External memory interface address and data bit 0)PA0
AD1 (External memory interface address and data bit 1)PA1
AD2 (External memory interface address and data bit 2)PA2
AD3 (External memory interface address and data bit 3)PA3
AD4 (External memory interface address and data bit 4)PA4
AD5 (External memory interface address and data bit 5)PA5
AD6 (External memory interface address and data bit 6)PA6
AD7 (External memory interface address and data bit 7)PA7
부수적인 기능I/O PIN
10. --1010--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-3 I/O 포트의 부수적 동작
② 포트포트 BB
▶ 타이머/카운터나 SPI 기능을 위한 신호들로 동작
/SS (SPI Slave Select Input)PB0
SCK (SPI Bus Serial Clock)PB1
MOSI (SPI Bus Master Output/Slave Input)PB2
MISO (SPI Bus Master Input/Slave Output)PB3
OC0 (Output compare and PWM Output for Timer/Counter0)PB4
OC1A (Output compare and PWM Output A for Timer/Counter2)PB5
OC1B (Output compare and PWM Output B for Timer/Counter1)PB6
OC2/OC1C (Timer/Counter2 or Timer/Counter1)PB7
부수적인 기능I/O PIN
11. --1111--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-3 I/O 포트의 부수적 동작
③ 포트포트 CC
▶ 외부 메모리를 인터페이스하기 위한 어드레스 버스의 상위 바이트로 동작
A8 (External memory interface address and data bit 8)PC0
A9 (External memory interface address and data bit 9)PC1
A10 (External memory interface address and data bit 10)PC2
A11 (External memory interface address and data bit 11)PC3
A12 (External memory interface address and data bit 12)PC4
A13 (External memory interface address and data bit 13)PC5
A14 (External memory interface address and data bit 14)PC6
A15(External memory interface address and data bit 15)PC 7
부수적인 기능I/O PIN
12. --1212--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-3 I/O 포트의 부수적 동작
④ 포트포트 DD
▶ 타이머/카운터나 외부 인터럽트 또는 USART1, TWI 직렬통신 포트 기능을 위한 신호들로 동작
INT0/SCL(External Interrupt0 Input or TWI Serial Clock)PD0
INT1/SDA(External Interrupt1 Input or TWI Serial Data)PD1
INT2/RXD1(External Interrupt2 Input or USART1 Receive Data)PD2
INT3/TXD1(External Interrupt3 Input or USART1 Transmit Data)PD3
ICP1(Timer/Counter1 Input Capture Pin)PD4
XCK1(USART1 External Clock Input/Output)PD5
T1(Timer/Counter1 Clock Input)PD6
T2(Timer/Counter2 clock Input)PD 7
부수적인 기능I/O PIN
13. --1313--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-3 I/O 포트의 부수적 동작
⑤ 포트포트 EE
▶ 타이머/카운터나 외부인터럽트 또는 USART0 직렬통신포트, 아날로그 비교기, ISP 기능을 위한 신호로 동작
PDI/RXD0(ISP Programming Data Input or USART0 Receive Data)PE0
PDO/TXD0(ISP Programming Data Output or USART0 Transmit Data)PE1
AIN0/ACK0 (Analog Comparator Positive Input or
USART0 External Clock Input/Output)
PE2
AIN1/OC3A(Analog Comparator Negative Input or Output Compare and
PWM Output A for Timer/Couter3)
PE3
INT4/OC3B(External Interrupt4 Input or Output compare and
PWM Output B for Timer/Counter3)
PE4
INT5/OC3C(External Interrupt5 Input or Output compare and
PWM Output C for Timer/Counter3)
PE5
INT6/T3(External Interrupt6 Input or Timer/Counter3 Clock Input)PE6
INT7/ICP3(External Interrupt7 Input or Timer/Couter3 Input Capture Pin)PE 7
부수적인 기능I/O PIN
14. --1414--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-3 I/O 포트의 부수적 동작
⑥ 포트포트 FF
▶ A/D 컨버터, JTAG 인터페이스를 위한 신호로 동작
ADC0 (ADC Input Channel 0)PF0
ADC1 (ADC Input Channel 1)PF1
ADC2 (ADC Input Channel 2)PF2
ADC3 (ADC Input Channel 3)PF3
ADC4/TCK (ADC Input Channel 4 or JTAG Test Clock)PF4
ADC5/TMS (ADC Input Channel 5 or JTAG Test Mode Select)PF5
ADC6/TDO (ADC Input Channel 6 or JTAG Test Data Output)PF6
ADC7/TD I(ADC Input Channel 7 or JTAG Test Data Input)PF 7
부수적인 기능I/O PIN
15. --1515--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-3 I/O 포트의 부수적 동작
⑦ 포트포트 GG
▶ PG4 ~ PG0의 5비트만 사용되며 부수적인 기능은 외부메모리 인터페이스나 타이머/카운터로 동작
/WR (Write Strobe to External Memory)PG0
/RD (Read Strobe to External Memory)PG1
ALE (Address Latch Enable to External Memory)PG2
TOSC2 (RTC Oscillator Output for Timer/Counter0)PG3
TOSC1 (RTC Oscillator Input for Timer/Counter0)PG4
부수적인 기능I/O PIN
16. --1616--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-4 I/O 포트의 제어 실습 1
☞ 포트B에 LED를 연결하고 왼쪽으로 이동하며 순차적으로 ON/OFF하는 프로그램
#include <mega128.h>
#include <delay.h>
void main(void)
{
unsigned char led = 0xfe ; // 변수의 정의
DDRB = 0xff ; // 포트B를 모두 출력으로 정의
PORTB = 0x00 ; // 처음 동작은 PORTB에 연결된 LED 모두 켜기
delay_ms(5000); // delay()함수를 이용하여 약 5초가 LED ON 상태 유지
while (1)
{
PORTB = led ; // PORTB에 LED 출력 지정
delay_ms(3000); // 3초 딜레이
led << = 1 ; // 좌쉬프트 1BIT
led |= 0x01 ; // 1비트 좌 SHIFTE 후 0X01 값을 논리합으로 함으로써
// 0의 값을 1로 셋트함
if (led == 0xff)
led = 0xfe ; // 모든 값이 1일 되면 LED ON 이 되지 않으므로
// LED 변수 초기화
}
}
17. --1717--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-4 I/O 포트의 제어 실습 2
☞ 포트B에 LED를 연결하고 좌우 쉬프트 ON/OFF 하는 프로그램
#include <mega128.h>
#include <delay.h>
void main(void)
{
unsigned char led = 0xfe ; // 변수의 정의
DDRB = 0xff ; // 포트B를 모두 출력으로 정의
PORTB = 0x00 ; // 처음 동작은 PORTB에 연결된 LED 모두 켜기
delay_ms(3000); // delay()함수를 이용하여 약 3초간 LED ON 상태 유지
while (1)
{
do // do ~ while문 실행
{
PORTB = led ; // PORTB에 LED 출력 지정
delay_ms(1000);
led << = 1 ; // 좌쉬프트 1BIT
led |= 0x01 ; // 1비트 좌 SHIFTE 후 0X01 값을 논리합으로 함으로써 0의 값을 1로 셋트함
} while (led != 0x7f) ; // led가 좌측 쉬프트 마지막에 오면 다음 루틴을 실행
do
{
PORTB = led ; // PORTB에 LED 출력 지정
delay_ms(1000) ;
led >>= 1 ; // 우쉬프트 1BIT
led |= 0x80 ; // 1비트 우 SHIFTE 후 0X80 값을 논리합으로 함으로써 0의 값을 1로 셋트함
} while (led != 0xfe) ; // led가 우측 쉬프트 마지막에 오면 다음 루틴을 실행
}
}
18. --1818--20062006--0303--2929
Embedded AVR ProgrammingEmbedded AVR Programming
1-4 I/O 포트의 제어 실습 3
☞ 포트 C로 외부 신호를 입력 받아 포트 B로 데이터 값을 반전시켜 출력하는 프로그램
#include <mega128.h>
void main(void)
{
unsigned char key ; // key입력 변수 선언
MCUCR = 0x00; // 외부 메모리 디스에이블
DDRB = 0xff; // 포트 B를 출력으로 설정
DDRC = 0x00; // 포트 C를 입력으로 설정
PORTC = 0xff; // 내부 풀업저항 사용
while (1)
{
key = PINC; // 스위치가 눌릴 때 포트 C의 값을 읽어와서 key에 저장
PORTB = ~key; // key값을 포트 B에 LED출력
};
}