Transcript avr_io_port
ATMega128 I/O Ports
KyungHee Univ.
2-0
ATMega128 I/O Ports
6개의 8비트 양방향 병렬 I/O 포트(PORTA~F)
1개의 5비트 양방향 병렬 I/O 포트(PORTG)
각 PORT별 3개 I/O 레지스터 영역
DDR(Data Direct Register) : 입출력 방향 결정
PORT(Data Register) : 데이터 출력 PORT
PIN(Port Input Pins Register) : 포트의 입력 핀 Rg
DDR, PORT : 읽기/쓰기 가능, PIN : 읽기만 가능
KyungHee Univ.
2-1
ATMega128 I/O Ports의 특징
특징
최대 40mA 구동 전류
LED 1개 구동 가능
선택 가능한 Pull Up 저항 내장
20K – 100K Ohm
Vcc, GND 사이에 입력단 보호 Diode 내장
Read-Modified-Write Cycle 지원
다른 pin의 영향을 주지 않고 한 port 핀의 방향을
바꿀 수 있음
DDRD &= (~0x03); // Input Port : PD0, PD1
DDRF |= 0x03;
// Output Port : PF0, PF1
SBI : Set Bit in I/O Register 과
CBI : Clear Bit in I/O Register instruction 사용
KyungHee Univ.
2-2
ATMega128 I/O Ports
모든 Port는 다음과 같은 특성을 갖는다.
Bit-selectable pull-up resistors
Bit-selectable tri-state outputs
Schmitt trigger input
Synchronized to the system clock : 입력신호의
안정성에 기여(Pin Read Operation 시 1.5Cycle
이전에 Pin 신호가 안정화 되어야 함)
같은 port에 write한 다음 바로 read 시 nop
instruction 필요(1,5Cycle Delay) :
__no_operation();
Symmetrical DC drive capability
KyungHee Univ.
2-3
AVR port architecture
DDRx
pull-up resistor
PORTx
port pin
Tri_State
schmitt trigger buffer
analog switch
KyungHee Univ.
PINx
2-4
ATMega128 I/O Ports
I/O Port input structure
Protection diodes
Programmable pull-up resistor
port pin
KyungHee Univ.
pull-up resistor
2-5
IO Port Register
Port A-G 동일
6
SFIOR: Special Function IO Reg.
PUD
PUD Set 1 : Pull-Up Diable
DDxn = 0, PORTxn = 1로 설정되어도 이 bit가 우
선함
7
Port A 부가 기능
외부 memory 확장
하위 8bit address와 8bit data
ALE 신호
8
Port B 부가 기능
Timer/Counter Output
SPI Bus Interface
9
Port C 부가 기능
외부 memory 확장
상위 8bit address
10
Port D 부가 기능
Timer/Counter Input
USART Interface
External Interrupt
TWI Serial Interface
11
Port E 부가 기능
External Interrupt
Timer/Counter Input and Output
Analog Comparator
UART Interface
12
Port F 부가 기능
ADC Input
JTAG interface
13
Port G 부가 기능
RTC Oscillator
External memory interface
ALE/RD/WR
14
ATMega128 I/O Ports
Port 이용 프로그램 작성시 고려 할 점
Input pins 1.5 clock cycle delay를 갖는다.
Read Operation을 실행하기 1.5 clock cycle
전에 Input Pin의 상태가 안정 되어야 한다.
I/O 관련 프로그램을 보다
Transportable,
Readable,
More bug free
하게 작성 하기 위한 예
• Timer/Counter0 Overflow Interrupt를 Enable 하는
경우
TIMSK |= b00000001; 와 같이 코딩 하는 것 보다
아래 와 같이 코딩 하는 것이 보다 적정 하다.
TIMSK |= (1<<TOIE0);
15
AVR I/O port programming
WinAVR\avr\include\avr\iom128.h File에 Port
사용에 관련된 정의가 있다.
예
/*Data Register, Port B */
#define PORTB _SFR_IO8(0x18)
// SFR: Special Function Registers
// _SFR_IO8(0x18): Memory $32($20 + $18) 번지,
//
I/O Port $18번지 + SFR Offset($20)
……
/*Port B Data Register – PORTB */
#define PB7 7
#define PB6 6
#define PB5 5
#define PB4 4
#define PB3 3
#define PB2 2
#define PB1 1
#define PB0 0
16
AVR I/O port programming
iom128.h에서 #define을 이용하여 정의한 Symbol은
아래와 같이 이해하기 쉬운 프로그램 작성을 가능하
게 한다.
예
PORTB = 0x05;
DDRB = 0x0A;
SPCR = (1<<SPE) | (1<<MSTR);
DDRB |= (1<<DDB2) | (1<<DDB0);
temp0 = PINB;
17
AVR I/O port programming
AND, OR, XOR 논리 연산을 이용한 Bit Operation
예
//toggle bit 5
PORTB = PORTB ^ 0x20; // invert
PORTB ^= 0x20; // invert again another way
//Set bits 7 and 2
PORTB = PORTB | 0x84;
PORTB |= (1<<PB7)|(1<<PB2) ; //shorter, more
portable
//Clear bit 0 and 1, but nothing else
PORTB = PORTB & 0xfc;
PORTB &= ~((1<<PB0)|(1<<PB1)); //more portable
18
AVR I/O port programming
Mask를 사용 하여 개별 Bit 값을 알 수 있다.
예
//Port D 의 D0 bit 가 1 인가를 Test 한다.
if(PIND & 0x01){take_some_action();}
위 예에서 0x01을 mask 라 한다.
D5 Bit가 0 인가를 Test 한다.
if(~PIND & 0x20){take_action();}
avr-libc function bit_is_set() 과 bit_is_clear() 를
사용 하여 아래와 같이 프로그램 할 수도 있다.
if (bit_is_set(PINC, PC2) {return 0;}
while (bit_is_clear(SPSR,SPIF)) {}
19
AND, OR, Shift Operation과 Mask을
이용 한 programming 예
BCD Packing
Unsigned char x3, x2, x1, x0 에 10진 수 4, 3, 2,1
이 저장 되어 있다. 이 를 unsigned char y1, y0 에
BCD Code로 Packing 하라.
BCD UnPacking
Unsigned char y1, y0 에 Packed BCD 수 0x34,
0x12 가 저장 되어 있다. 이 를 unsigned char x3,
x2, x1, x0 에 UnPacking 하라.
20
AVR I/O port programming 예
#include <avr/io.h>
void port_init(void){
PORTD |= 0x03;
DDRD &= (~0x03);
PORTF = 0x00;
DDRF = 0xff;
}
// External SW Pull Up
// Input Port
// Output Port
int main(void){
port_init();
// PINA 의 상태을 PORTF에 출력 한다.
while(1){
PORTF = PIND;
}
}
21
AVR I/O port interfacing
Pull-ups 기능은 Switch를 외부 저항 없이 Input
Port에 Interface 할 수 있게 한다. 그러나 Leakage
current 가 증가 할 우려가 있다.
외부 조건(정전기, 부하에 의한 고전압 발생 등)에
대한 I/O Port protection에 대한 고려가 필요 함.
LED Drive Circuits
적절한 Current Limit Resistors의 선택이 필요함.
Motor or relay drive circuits
Inductive에 의한 고전압을 제거 하는 Diode 필요
5V to 3.3V or 3.3V to 5V interfacing
Voltage thresholds 가 같은 logic families Chip을
사용 하거나,
Interface Chip : 74LVC244, TXB0108 등 이용
22