Você está na página 1de 18

임베디드 마이크로프로세서

프로그래밍 실전

제작 : 네 로 테 크
강의 : 김 종 형
Embedded AVR Programming

ATMEGA128 I/O 제어

1. Input/Output 처리 방법
2. I/O 제어 프로그램 실습

2006-
2006-03-
03-29 -2-
Embedded 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

2006-
2006-03-
03-29 -3-
Embedded 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)

2006-
2006-03-
03-29 -4-
Embedded AVR Programming

1-2 I/O 포트의 기본 동작

☞ I/O 포트 핀의 동작 설정

DDRxn PORTxn PUD I/O Pull-up 비고


0 0 X Input No 3-State(하이 임피던스)

0 1 0 Input Yes 내부 풀업

0 1 1 Input No 3-State(하이 임피던스)

1 0 X Output No L출력(sink)

1 1 X Output No H출력(source)

2006-
2006-03-
03-29 -5-
Embedded AVR Programming

1-2 I/O 포트의 기본 동작 1 Default Configuration

DDx

0 Pull-Up

PORTx

PINx Physical Pin

? ?

Direction: INPUT
Pull-Up: OFF

2006-
2006-03-
03-29 -6-
Embedded AVR Programming

1-2 I/O 포트의 기본 동작 2 Switch On Pull-Up

DDx

0 Pull-Up

PORTx

PINx Physical Pin

? ?

Direction: INPUT
Pull-Up: ON
2006-
2006-03-
03-29 -7-
Embedded AVR Programming

1-2 I/O 포트의 기본 동작 3 Port is Output

DDx

1 Pull-Up

PORTx

PINx Physical Pin

1 1

Direction: OUTPUT
Pull-Up: OFF
2006-
2006-03-
03-29 -8-
Embedded AVR Programming

1-3 I/O 포트의 부수적 동작

① 포트 A
▶ 외부메모리를 인터페이스 위한 데이터버스 및 어드레스 버스의 하위 바이트로 동작

▶ 어드레스 버스를 분리하는데 ALE(Address Latch Enable)신호를 사용

I/O PIN 부수적인 기능


PA7 AD7 (External memory interface address and data bit 7)
PA6 AD6 (External memory interface address and data bit 6)
PA5 AD5 (External memory interface address and data bit 5)
PA4 AD4 (External memory interface address and data bit 4)
PA3 AD3 (External memory interface address and data bit 3)
PA2 AD2 (External memory interface address and data bit 2)
PA1 AD1 (External memory interface address and data bit 1)
PA0 AD0 (External memory interface address and data bit 0)

2006-
2006-03-
03-29 -9-
Embedded AVR Programming

1-3 I/O 포트의 부수적 동작

② 포트 B
▶ 타이머/카운터나 SPI 기능을 위한 신호들로 동작

I/O PIN 부수적인 기능


PB7 OC2/OC1C (Timer/Counter2 or Timer/Counter1)
PB6 OC1B (Output compare and PWM Output B for Timer/Counter1)
PB5 OC1A (Output compare and PWM Output A for Timer/Counter2)
PB4 OC0 (Output compare and PWM Output for Timer/Counter0)
PB3 MISO (SPI Bus Master Input/Slave Output)
PB2 MOSI (SPI Bus Master Output/Slave Input)
PB1 SCK (SPI Bus Serial Clock)
PB0 /SS (SPI Slave Select Input)

2006-
2006-03-
03-29 -10-
10-
Embedded AVR Programming

1-3 I/O 포트의 부수적 동작

③ 포트 C
▶ 외부 메모리를 인터페이스하기 위한 어드레스 버스의 상위 바이트로 동작

I/O PIN 부수적인 기능


PC 7 A15(External memory interface address and data bit 15)
PC6 A14 (External memory interface address and data bit 14)
PC5 A13 (External memory interface address and data bit 13)
PC4 A12 (External memory interface address and data bit 12)
PC3 A11 (External memory interface address and data bit 11)
PC2 A10 (External memory interface address and data bit 10)
PC1 A9 (External memory interface address and data bit 9)
PC0 A8 (External memory interface address and data bit 8)

2006-
2006-03-
03-29 -11-
11-
Embedded AVR Programming

1-3 I/O 포트의 부수적 동작

④ 포트 D
▶ 타이머/카운터나 외부 인터럽트 또는 USART1, TWI 직렬통신 포트 기능을 위한 신호들로 동작

I/O PIN 부수적인 기능


PD 7 T2(Timer/Counter2 clock Input)
PD6 T1(Timer/Counter1 Clock Input)
PD5 XCK1(USART1 External Clock Input/Output)
PD4 ICP1(Timer/Counter1 Input Capture Pin)
PD3 INT3/TXD1(External Interrupt3 Input or USART1 Transmit Data)
PD2 INT2/RXD1(External Interrupt2 Input or USART1 Receive Data)
PD1 INT1/SDA(External Interrupt1 Input or TWI Serial Data)
PD0 INT0/SCL(External Interrupt0 Input or TWI Serial Clock)

2006-
2006-03-
03-29 -12-
12-
Embedded AVR Programming

1-3 I/O 포트의 부수적 동작

⑤ 포트 E
▶ 타이머/카운터나 외부인터럽트 또는 USART0 직렬통신포트, 아날로그 비교기, ISP 기능을 위한 신호로 동작

I/O PIN 부수적인 기능


PE 7 INT7/ICP3(External Interrupt7 Input or Timer/Couter3 Input Capture Pin)
PE6 INT6/T3(External Interrupt6 Input or Timer/Counter3 Clock Input)
INT5/OC3C(External Interrupt5 Input or Output compare and
PE5
PWM Output C for Timer/Counter3)
INT4/OC3B(External Interrupt4 Input or Output compare and
PE4
PWM Output B for Timer/Counter3)
AIN1/OC3A(Analog Comparator Negative Input or Output Compare and
PE3
PWM Output A for Timer/Couter3)
AIN0/ACK0 (Analog Comparator Positive Input or
PE2
USART0 External Clock Input/Output)
PE1 PDO/TXD0(ISP Programming Data Output or USART0 Transmit Data)
PE0 PDI/RXD0(ISP Programming Data Input or USART0 Receive Data)

2006-
2006-03-
03-29 -13-
13-
Embedded AVR Programming

1-3 I/O 포트의 부수적 동작

⑥ 포트 F
▶ A/D 컨버터, JTAG 인터페이스를 위한 신호로 동작

I/O PIN 부수적인 기능


PF 7 ADC7/TD I(ADC Input Channel 7 or JTAG Test Data Input)
PF6 ADC6/TDO (ADC Input Channel 6 or JTAG Test Data Output)
PF5 ADC5/TMS (ADC Input Channel 5 or JTAG Test Mode Select)
PF4 ADC4/TCK (ADC Input Channel 4 or JTAG Test Clock)
PF3 ADC3 (ADC Input Channel 3)
PF2 ADC2 (ADC Input Channel 2)
PF1 ADC1 (ADC Input Channel 1)
PF0 ADC0 (ADC Input Channel 0)

2006-
2006-03-
03-29 -14-
14-
Embedded AVR Programming

1-3 I/O 포트의 부수적 동작

⑦ 포트 G
▶ PG4 ~ PG0의 5비트만 사용되며 부수적인 기능은 외부메모리 인터페이스나 타이머/카운터로 동작

I/O PIN 부수적인 기능


PG4 TOSC1 (RTC Oscillator Input for Timer/Counter0)
PG3 TOSC2 (RTC Oscillator Output for Timer/Counter0)
PG2 ALE (Address Latch Enable to External Memory)
PG1 /RD (Read Strobe to External Memory)
PG0 /WR (Write Strobe to External Memory)

2006-
2006-03-
03-29 -15-
15-
Embedded 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 변수 초기화
}
}

2006-
2006-03-
03-29 -16-
16-
Embedded 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가 우측 쉬프트 마지막에 오면 다음 루틴을 실행
}
}
2006-
2006-03-
03-29 -17-
17-
Embedded 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출력


};
}

2006-
2006-03-
03-29 -18-
18-

Você também pode gostar