레지스터를 이용한 인터페이스 -...
TRANSCRIPT
36/49
Pxn 핀 방향 설정을 위한 레지스터 비트명과 신호
Pxn 핀 출력 설정
• DDxn(x는 A~G, n은 0~7) 플립플롭에 1을 기록
• Three-state Buffer는 정상적으로 동작
• PORTxn(x는 A~ G, n은 0~7) 플립플롭 값이 Pxn 핀으로 출력
Section 04 ATmega128의 포트 구성과 레지스터를 이용한 인터페이스
37/49
Pxn 핀 입력 설정
• DDxn(x는 A~G, n은 0~7) 플립플롭에 0을 기록
• Three-state Buffer는 고저항(High-impedance) 상태
• Pxn 핀의 디지털 전압레벨은 슈미트 트리거 버퍼를 통해 잡음에 둔감
• PINx 레지스터의 PINxn 비트를 읽는 순간, 내부 데이터 버스로 입력
• 내부 풀업저항 연결
» PUD는 0이고, PORTxn이 1이면 내부 풀업용 스위칭 트랜지스터가 ON되어 내부 풀업저항 연결
• 내부 풀업저항 개방
» PUD는 1 혹은 PORTxn이 0이면 내부 풀업용 스위칭 트랜지스터가 OFF되어 풀업저항이 연결되지 않음
Section 04 ATmega128의 포트 구성과 레지스터를 이용한 인터페이스
38/49
ATmega128 디지털 I/O 레지스터 역할과 포트 구성
DDRx 레지스터
• 데이터 방향 레지스터(Data Direction Register)로서, 포트에 포함된 핀의 입출력 방향 결정
PORTx 레지스터
• 포트에 대한 데이터 레지스터(Data Register)
• 출력 방향일 때, 논리값을 디지털 전압레벨로 출력
• 0이 되어 핀이 입력 방향일 때, PORTxn 값이 1로 설정되면 ATmega128 내부에서 Pxn 핀에 풀업저항 연결
PINx 레지스터
• 입력 핀 레지스터
• 핀이 입력 방향일 때, 핀의 디지털 전압레벨을 논리값으로 읽음
Section 04 ATmega128의 포트 구성과 레지스터를 이용한 인터페이스
39/49
레지스터와 포트 구성
• 53개 Pxn과 연결된 DDRx, PORTx, PINx 레지스터가 8비트 버스와 연결
• A포트에서 F포트까지는 DDRx 레지스터, PORTx 레지스터, PINx 레지스터가 8비트로 구성
• G포트는 하위 5비트만 사용할 수 있게 구성
Section 04 ATmega128의 포트 구성과 레지스터를 이용한 인터페이스
40/49
DDRx, PORTx, PINx 레지스터
• DDRx 레지스터의 초깃값이 0이므로 최초 설정은 모두 입력
• 입력인 상황에서 PORTx 레지스터의 초깃값이 0
• Pxn 핀은 풀업저항이 연결되지 않은 고저항(High-impedance)인 입력 핀
• Pxn 핀에 인가되는 초기 전압은 예측할 수 없어 PINx 초깃값이 N/A
Section 04 ATmega128의 포트 구성과 레지스터를 이용한 인터페이스
42/49
입력 핀 설정과 I/O 핀의 디지털 전압레벨을 논리값으로 입력
• PINxn 입력 핀의 전압레벨 검사
» HIGH 디지털 전압레벨 : 0이 아닌 값(TRUE) » LOW 디지털 전압레벨 : 0(FALSE)
Section 05 논리값과 I/O 핀의 디지털 전압레벨과 변환
43/49
#include <avr/io.h> 문장을 프로그램 앞에 넣어 정의된 레이블 사용
• DDxn, Pxn, PINxn 모두 같은 상수로 정의 되어 있음
• 간단히 Pxn으로 사용해도 무방
Section 05 논리값과 I/O 핀의 디지털 전압레벨과 변환
44/49
디지털 I/O 핀의 입출력을 위한 비트 매스킹
DDRx 레지스터, PORTx 레지스터, PINx 레지스터의 비트 설정
상수를 사용한 핀 방향 설정
Section 05 논리값과 I/O 핀의 디지털 전압레벨과 변환
• 출력 방향 설정 핀 : PA7, PA6, PA5, PA4
• 입력 방향 설정 핀 : PA3, PA2, PA1, PA0
• 하나 또는 두 핀만의 방향을 설정하려고 해도 8비트 모두 설정
• 다른 비트들보다 앞서 설정된 정보 추적이 필요
• 가독성이 떨어짐
45/49
비트 명칭과 비트 연산을 사용한 핀 방향 설정
• 다른 비트와 상관없이 비트 7과 비트 6만을 1로 만들 수 있음
• 기존 비트 설정을 추적할 필요가 없음
• C 언어 실행 순서에 따라 연산
Section 05 논리값과 I/O 핀의 디지털 전압레벨과 변환
❷
❶
47/49
출력 포트 설정 값 변경 (하위 4비트는 그대로 둔 채 상위 4비트를 clear, update)
❶ 괄호부터 처리 PORTA와 0xF를 AND시켜 0 위치를 클리어함
Section 05 논리값과 I/O 핀의 디지털 전압레벨과 변환
❷ 1 << PA7
❸ 1 << PA6
48/49
❹ (PORTA & 0xF) | 1 << PA7 | 1 << PA6
• PORTA의 8비트 중 상위 4비트 PA7, PA6, PA5, PA4 핀만 갱신
» 갱신 전압레벨은 HIGH, HIGH, LOW, LOW » PA3, PA2, PA1, PA0는 출력값이 변하지 않음
Section 05 논리값과 I/O 핀의 디지털 전압레벨과 변환
49/49
PINx 레지스터로 특정 핀의 논리값을 변수값으로 받아들이는 방법
• 입력 PA7, PA6 두 핀의 디지털 전압레벨을 value의 하위 두 비트로 입력
❶ DDRA = DDRA & ~(1 << PA7) & ~(1 << PA6);
» A포트의 PA7과 PA6 핀은 입력 방향으로 설정
❷ PINA >> PA6
» >>의 논리 천이 동작이 PA6회, 즉 6회 수행될 때 최상위 비트는 0으로 채워짐 » value 변수는 PA7, PA6 핀의 논리값을 하위 비트로 갖게 됨
Section 05 논리값과 I/O 핀의 디지털 전압레벨과 변환
50/49
PINx 레지스터로 특정 핀의 디지털 전압레벨 판정
• if(조건식) 문에서 조건식이 0이면 거짓, 0이 아니면 참으로 판별
» PA5 핀이 HIGH 전압레벨이면, 조건식이 0이 아니므로 참 » PA5 핀이 HIGH 전압레벨이면, 조건식이 0이므로 거짓
Section 05 논리값과 I/O 핀의 디지털 전압레벨과 변환
51/49
ATmega128에 연결된 회로의 디지털 입출력 설정
상수를 사용한 입출력 핀 방향 설정
비트 명칭을 사용한 핀 방향 설정
Section 05 논리값과 I/O 핀의 디지털 전압레벨과 변환
52/49
실험 목적
B포트에 연결된 스위치와 LED를 이용하여 입출력 동작 수행
• 스위치가 눌릴 때 LED ON
• 스위치 S0 LED D0, D1을 ON/OFF
• 스위치 S1 LED D2를 ON/OFF
• 스위치 S2 LED D3을 ON/OFF
스위치 동작
• 눌리지 않으면 HIGH 전압레벨
• 눌리면 LOW 전압레벨
Section 06 B포트를 이용한 LED 점멸
55/49
조별 과제 : 프로그램 수정
• 스위치 S0, S1, S2가 눌릴 때 led D0, D1, D2가 각각 ON되도록 한다. 세 스위치가 모두 눌렸을 때는 led D3을 추가로 ON 시키고, 하나도 눌리지 않았을 때는 led D4를 ON 시키는 프로그램을 작성하고, 동작을 보여라.
Section 06 B포트를 이용한 LED 점멸