6 폴링과 인터럽트를 이용한 장치 인터페이스 마이크로컨트롤러 AVR ATmega128
학습목표 폴링과 인터럽트를 이해하고 폴링으로 에지를 검출할 수 있는 능력을 가질 수 있다. 폴링과 인터럽트를 이해하고 폴링으로 에지를 검출할 수 있는 능력을 가질 수 있다. 폴링을 이용하여 EEPROM을 쓰고 읽는 방법을 이해할 수 있다. 외부 인터럽트를 사용하는 방법을 이해하고 사용할 수 있는 능력을 키울 수 있다. 주 프로그램과 인터럽트 서비스 루틴 사이를 요청/응답 인터페이스로 연결함으로써 상태도 기반 알고리즘 구성을 이해할 수 있다. 포토인터럽터, LCD 디스플레이 인터페이스에 폴링과 인터럽트를 적용할 수 있다.
목 차 폴링을 이용한 장치 인터페이스 인터럽트를 이용한 장치 인터페이스 인터럽트 활성화와 인터럽트 서비스 루틴 연결 외부 인터럽트 주 프로그램과 인터럽트 서비스 루틴의 요청/응답 인터페 이스 포토인터럽터 인터페이스 (동영상) LCD 문자 디스플레이 인터페이스 (동영상) EEPROM, 포토인터럽터, LCD 디스플레이 통합 인터페이 스 (동영상) 3
Section 01 폴링을 이용한 장치 인터페이스 ATmega128 다양한 연결 장치를 구동시킴 시스템을 쉽게 제어할 수 있도록 많은 주변 장치를 포함한 단일칩 메모리, 타이머/카운터, 아날로그 비교기, ADC, 와치독 타이머, 시리얼 통신, SPI 통신, 2선 직렬통신, JTAG 기능 등을 포함 내부 또는 외부 장치의 동작은 제어 프로그램에 의해 통제 장치 상태 확인 방법 • 폴링 • 인터럽트
Section 01 폴링을 이용한 장치 인터페이스 폴링을 이용한 외부 장치 인터페이스 폴링 내부 또는 외부 장치의 동작은 제어 프로그램에 의해 통제 주 프로그램 안에서 CPU 명령어로 반복적으로 장치 상태 검사 상태를 감지하기 위한 폴링 구분 레벨감지 폴링 : 전압레벨 값을 감지하기 위한 폴링 에지감지 폴링 : 디지털 전압레벨 값의 변경(에지) 감지 레벨감지와 에지감지
Section 01 폴링을 이용한 장치 인터페이스 레벨감지를 위한 폴링 코드 핀의 논리값(전압레벨)이 1(HIGH)일 때를 감지하기 위한 코드 핀의 논리값(전압레벨)이 0(LOW)일 때를 감지하기 위한 코드
Section 01 폴링을 이용한 장치 인터페이스 에지감지를 위한 폴링 코드 상승에지 감지하는 코딩 사례 플로차트 이전 장치값을 prev 변수에, 검사 시점의 장치값을 now 변수에 넣고 검사
Section 01 폴링을 이용한 장치 인터페이스 폴링을 이용한 내부 장치 EEPROM 인터페이스 내장된 장치 EEPROM의 특징 EEPROM(Electrically Erasable and Programmable ROM)은 전기적으로 지우고 다시 기록할 수 있음 데이터 메모리에 해당 4K바이트의 크기 100,000회 이상 읽기/쓰기 가능 전원 공급이 되지 않아도 기록된 데이터가 소멸되지 않는 비활성 메모리 (예시) 가정용 텔레비전을 안방에서 전원을 분리하여 거실로 이동해도 가족이 설정한 값을 그대로 유지 SRAM과 달리 특수한 쓰기/읽기 방법을 사용해야 함 EEPROM 쓰기/읽기 동작에 필요한 주요 레지스터 EEARH, EEARL, EEDR, EECR 레지스터
Section 01 폴링을 이용한 장치 인터페이스 EEAR : EEPROM 주소 레지스터(EEPROM Address Register) 주소를 지정하기 위한 12비트 설정 레지스터 4K바이트 0x000부터 0x3FF 사이로 지정 #include <avr/io.h>를 포함해 unsigned int 자료형 EEAR로 사용 가능
Section 01 폴링을 이용한 장치 인터페이스 EEDR : EEPROM 데이터 레지스터(EEPROM Data Register) 특정 주소 EEAR에 기록할 8비트 데이터 설정 특정 주소 EEAR에서 읽은 8비트 데이터를 보관 #include <avr/io.h>를 포함해 unsigned char 자료형 EEDR로 사용 가능
Section 01 폴링을 이용한 장치 인터페이스 EECR : EEPROM 제어 레지스터(EEPROM Control Register) EEPROM 쓰기/읽기를 제어하기 위한 상태 및 제어 비트 포함
Section 01 폴링을 이용한 장치 인터페이스 폴링을 이용한 EEPROM 쓰기 동작
Section 01 폴링을 이용한 장치 인터페이스 ❶ EECR 레지스터의 EEWE 비트가 0이 될 때까지 기다림 ❷ SPMCSR 레지스터의 SPMEN 비트가 0이 될 때까지 기다림 부트로더에서 CPU가 플래시 프로그램 메모리에 쓰기 동작을 하는 경우에만 검사 필요 ❸ 사용할 EEPROM 주소를 EEAR 레지스터에 기록 ❹ 기록할 EEPROM 데이터를 EEDR 레지스터에 기록 ❺ EECR 레지스터의 EEWE 비트에 0을 쓰고, EEMWE 비트에 1을 기록 ❻ EEMWE를 1로 설정한 후, 4 클록 사이클 안에 EEWE에 1을 기록 ➎와 ➏ 단계 사이에 인터럽트가 발생하면, 쓰기 동작 실패 이를 위해 ➌ ~ ➏ 단계 동안 cli( ) 함수로 전체 인터럽트를 비활성화하는 것이 바람직함
Section 01 폴링을 이용한 장치 인터페이스
Section 01 폴링을 이용한 장치 인터페이스 폴링을 이용한 EEPROM 읽기 동작
Section 02 인터럽트를 이용한 장치 인터페이스 내부 장치의 개별 인터럽트, 전역 인터럽트 활성화 비트를 1로 셋 해당 사건이 감지되면 인터럽트 플래그가 셋 인터럽트 서비스 루틴이 자동으로 실행 인터럽트는 외부 또는 내부에서 발생되는 사건에 대하여 CPU 하드웨어의 도움을 받아 자동으로 감지되고, 인터럽트 서비스 루틴이 자동으로 실행되는 메커니즘
Section 02 인터럽트를 이용한 장치 인터페이스 ATmega128 인터럽트 발생 유형 및 원인 내부 또는 외부에서 예기치 않은 사건이 발생하면, 적절하게 자동 반응 특정 위치에서 프로그램을 시작하는 예외 처리 하드웨어를 가짐 범용 마이크로프로세서의 인터럽트 발생 유형 내부 또는 외부 요인에 의한 리셋이 발생하는 경우 0으로 나누는 등 불가능한 연산을 방지하기 위한 경우 멀티프로그래밍 지원을 위한 명령어 예외 처리의 경우 멀티프로그래밍 지원을 위한 메모리 보호 또는 가상 메모리를 위한 경우 I/O 장치 처리를 위한 장치의 상태 변화로 유발되는 경우 타이머를 이용한 자원 관리를 위한 경우
Section 02 인터럽트를 이용한 장치 인터페이스 ATmega128의 인터럽트 인터페이스 범용 마이크로프로세서가 아닌 장치 제어로 시스템을 효과적으로 관리 I/O 장치 처리를 강화하기 위한 인터럽트를 많이 제공 외부 장치 인터페이스 외부에 연결될 장치와의 인터럽트 인터페이스로 8개의 외부핀 인터럽트 제공 내부 장치 인터페이스 EEPROM, USART 등 내장된 장치와 인터럽트를 통한 인터페이스 타이머 인터페이스 타이머/카운터0 ~3과 관계된 인터럽트 인터페이스
Section 02 인터럽트를 이용한 장치 인터페이스 유형별 ATmega128 인터럽트와 발생 원인
Section 02 인터럽트를 이용한 장치 인터페이스
Section 02 인터럽트를 이용한 장치 인터페이스
Section 02 인터럽트를 이용한 장치 인터페이스 인터럽트 발생과 인터럽트 서비스 루틴 실행 ① 1단계 SREG의 I-비트를 0으로 클리어, 현재 실행 중인 명령어를 실행 완료 ② 2단계 스택 포인터(SP)를 감소 ③ 3단계 PC를 SP가 가리키는 스택에 보관 ④ 4단계 PC에 인터럽트 벡터 주소를 넣고, 인터럽트 발생 플래그를 0으로 클리어 ⑤ 5단계 변경된 PC에서부터 인터럽트 서비스 루틴이 수행
Section 02 인터럽트를 이용한 장치 인터페이스 자동 처리 과정 1단계 SREG의 I-비트를 0으로 클리어, 현재 실행 중인 명령어를 실행 완료
Section 02 인터럽트를 이용한 장치 인터페이스 2단계 다음 실행될 명령어 주소를 간직한 PC를 스택에 보관하기 위해 스택 포인터(SP)를 감소
Section 02 인터럽트를 이용한 장치 인터페이스 3단계 PC를 SP가 가리키는 스택에 보관 인터럽트 서비스 프로그램이 종료되면, 돌아갈 주소가 스택에 저장됨
Section 02 인터럽트를 이용한 장치 인터페이스 4단계 PC에 발생된 인터럽트 벡터 주소 V1을 넣음 개별 인터럽트 발생 플래그를 0으로 클리어
Section 02 인터럽트를 이용한 장치 인터페이스 5단계 PC 주소 V1에서 명령어 JMP를 명령어 레지스터(IR)에 인출하면서 JMP 명령을 실행하여 인터럽트 서비스 프로그램을 수행 ATmega128은 35개의 인터럽트가 있고, 프로그램 메모리 0번지부터 인터럽트 벡터 순으로 JMP 명령을 놓아 해당 서비스 루틴으로 JMP ATmega128은 상태 레지스터를 프로그래머가 저장할 필요가 있음 gcc 컴파일러가 상태 레지스터와 범용 레지스터를 저장함
Section 02 인터럽트를 이용한 장치 인터페이스 인터럽트 서비스 루틴에서 주 프로그램으로 복귀 IRET 명령어를 이용한 복귀 처리 과정 1단계 PC가 지칭하는 메모리에서 인출된 명령어를 디코딩 IRET에 해당되면 주 프로그램으로 복귀 동작이 수행되기 시작
Section 02 인터럽트를 이용한 장치 인터페이스 2단계 스택포인터(SP)가 가리키는 스택에서 값을 읽어 PC로 옮겨 놓음 전역 인터럽트 I-비트를 1로 만들어 다시 인터럽트 발생을 허용
Section 02 인터럽트를 이용한 장치 인터페이스 3단계 PC의 위치가 P로 복원되었으므로, 주소 P에서 명령어 ADD를 명령어 레지스터(IR)에 인출하여, 중단되었던 프로그램을 계속 수행
Section 02 인터럽트를 이용한 장치 인터페이스 인터럽트 서비스 루틴 진입과 종료 시 레지스터 보관과 복구 PC는 인터럽트 처리 과정에서 자동 보관과 복구 SREG와 범용 레지스터는 PUSH/POP 명령으로 보관과 복구 필요 인터럽트와 CPU 레지스터의 보관과 복구
Section 03 인터럽트 활성화와 인터럽트 서비스 루틴 연결 인터럽트 설정과 활성화 내부 장치 동작 활성화 ATmega128은 처음 시작될 때 대부분의 내부 장치의 동작은 활성화되어 있지 않음 내부 장치를 작동시키려면, 관련 특수 레지스터의 활성화 비트를 셋해야 함 아날로그 비교기는 예외 초기에 활성화되어 있으며, 1로 셋하면 비활성화됨
Section 03 인터럽트 활성화와 인터럽트 서비스 루틴 연결
Section 03 인터럽트 활성화와 인터럽트 서비스 루틴 연결 장치에 대한 인터럽트 설정과 활성화 내부 장치에 대한 특수 레지스터 존재 장치의 특성을 반영한 동작 설정용 또는 상태 관찰용 비트로 구성 인터럽트 사건의 발생 패턴을 설정해야 함 인터럽트 활성화 비트를 1로 셋하여, 인터럽트 발생을 허락 전제, 전역 인터럽트 활성화 비트가 1로 셋 되었을 때 ATmega128 인터럽트 서비스, 개별 인터럽트 활성화 비트 및 레지스터
Section 03 인터럽트 활성화와 인터럽트 서비스 루틴 연결
Section 03 인터럽트 활성화와 인터럽트 서비스 루틴 연결
Section 03 인터럽트 활성화와 인터럽트 서비스 루틴 연결 개별 인터럽트가 활성화되고, 전역 인터럽트 비트(SREG의 I-비트)가 1로 셋되어 있을 때, 인터럽트 서비스 루틴이 실행됨 인터럽트 사건이 발생하면, 해당 인터럽트 플래그가 1로 설정되고, 인터럽트 서비스 루틴이 개시되면, 그 인터럽트 플래그는 클리어됨
Section 03 인터럽트 활성화와 인터럽트 서비스 루틴 연결 인터럽트 서비스 루틴의 연결 #include <avr/interrupt.h>를 앞에 적어 인터럽트 관련 레이블과 매크로 정의 ISR( ) 함수 인수 위치에 인터럽트 서비스 루틴 명칭을 넣어 작성 ISR(INT0_vect) ISR(ADC_vect)
Section 03 인터럽트 활성화와 인터럽트 서비스 루틴 연결 인터럽트 대기와 실행 동시에 여러 인터럽트가 요청되었을 때는, 작은 숫자의 벡터 값의 인터럽트가 높은 우선순위를 가짐 일반적인 마이크로프로세서 높은 우선순위의 인터럽트가 발생하면, 현재 인터럽트 서비스 루틴을 중단하고, 새로운 인터럽트 서비스 루틴을 실행 ATmega128 우선순위가 더 높은 인터럽트가 발생하더라도, 현재 인터럽트 서비스 루틴을 중단하지는 않음 인터럽트 서비스 루틴이 종료되면, 대기 인터럽트 중에서 우선순위가 높은 인터럽트 서비스 루틴을 수행
Section 03 인터럽트 활성화와 인터럽트 서비스 루틴 연결 인터럽트 서비스 프로그램 중 요청된 인터럽트 처리 인터럽트 1 발생, 인터럽트 1 플래그 셋 인터럽트 1 서비스 루틴이 실행되면서, SREG의 I-비트와 인터럽트 1의 플래그가 클리어됨 인터럽트 2 발생, 인터럽트 2 플래그 셋 인터럽트 1 서비스 루틴 종료까지 대기 인터럽트 1 서비스 루틴이 종료하면 SREG의 I-비트가 다시 1로 셋 인터럽트 2 서비스 루틴이 실행되면서, 인터럽트 2 서비스 루틴이 종료되면, SREG의 I-비트가 다시 1로 셋
Section 03 인터럽트 활성화와 인터럽트 서비스 루틴 연결 인터럽트 플래그 비트 인터럽트 플래그가 1이 되어 대기 인터럽트 서비스 루틴이 실행되면, 대부분의 인터럽트 플래그는 자동으로 클리어됨 몇 가지는 별도의 동작으로 인터럽트 플래그 클리어 만일 대기 중인 인터럽트 플래그에 소프트웨어적으로 1을 기록하면, 인터럽트 플래그는 클리어 대기 중인 인터럽트 해지
Section 03 인터럽트 활성화와 인터럽트 서비스 루틴 연결 개별 인터럽트 활성화 비트와 인터럽트 플래그 비트
Section 03 인터럽트 활성화와 인터럽트 서비스 루틴 연결
Section 04 외부 인터럽트 외부 인터럽트 설정과 활성화 디지털 I/O 핀의 디지털 전압레벨을 외부 인터럽트로 감지 EIMSK : 외부 인터럽트 마스크 레지스터 (External Interrupt Mask Register) 외부 인터럽트 INT0~INT7를 개별적으로 활성화시킬 수 있음
Section 04 외부 인터럽트 EICRA, EICRB : 외부 인터럽트 제어 레지스터 (External Interrupt Control Register) 인터럽트 발생 순간을 ISCnx(n은 0~7, x는 0~1) 비트로 설정
Section 04 외부 인터럽트 외부 인터럽트와 외부 인터럽트 서비스 루틴과의 연결 외부 인터럽트 서비스 루틴을 작성하여, 주 프로그램과 인터럽트를 연결 EIFR : 외부 인터럽트 플래그 레지스터 (External Interrupt Flag Register) 활성화된 외부 인터럽트는 전역 인터럽트가 활성화되어 있고, 설정된 발생 조건을 만족하면, 외부 인터럽트 플래그 비트를 1로 셋하고, 인터럽트 서비스 루틴 실행 절차가 수행
Section 04 외부 인터럽트 인터럽트 서비스 루틴 실행 절차(인터럽트 플래그 관점) ❶ EICRA, EICRB 레지스터에 설정된 조건이 만족되어 인터럽트 사건 발생 ❷ EIFR 레지스터의 해당 인터럽트 플래그 비트(INTF0~INT7)가 1로 셋됨 (인터럽트 사건이 발생된 시점에 다른 인터럽트 서비스 루틴이 실행 중이면, 그 인터럽트 서비스 루틴이 종료될 때까지 대기) ❸ 인터럽트 서비스 루틴으로 진입되면, 인터럽트 플래그 비트는 클리어됨 ❹ 만일 ②번 단계에서 해당 인터럽트 플래그 비트를 1로 기록하면, ③번 단계를 수행하지 않고, 인터럽트 플래그 비트는 클리어됨
Section 05 주 프로그램과 인터럽트 서비스 루틴의 요청/응답 인터페이스 인터럽트 서비스 루틴과 요청/응답 인터페이스 절차 인터럽트 서비스 루틴과 요청/응답 인터페이스 ❶ 주 프로그램은 인터럽트 서비스 루틴과 약속된 전역 변수에 요청을 기록 ❷ 인터럽트가 발생하고 인터럽트 서비스 루틴이 실행되면, 요청 동작을 수행한 후 전역 변수에 요청에 대한 응답을 기록 ❸ 주 프로그램은 응답을 확인하고, 알고리즘의 진행 단계를 조정
Section 05 주 프로그램과 인터럽트 서비스 루틴의 요청/응답 인터페이스 주 프로그램의 인터럽트와 요청/응답 인터페이스에 의한 상태 천이 주 프로그램에서 req_m 변수에 y 값을 넣어 인터럽트 응답 동작 요청 인터럽트 서비스 루틴에서 응답되기를 기다림 A로 응답 되면 그에 해당되는 req_a 요청 사례 B로 응답 되면 그에 해당되는 req_b 요청 사례
Section 05 주 프로그램과 인터럽트 서비스 루틴의 요청/응답 인터페이스 주 프로그램과 인터럽트 서비스 사이의 변수 공유 인터페이스 변수는 volatile 지시어를 사용하여 전역 변수로 선언 C 컴파일러는 최적화 과정으로 목적 프로그램으로 간소화 volatile 지시어를 선언하지 않으면, 간소화에 의해 인터럽트 서비스 루틴과 상호 연관성이 끊어질 수 있음 [예제 6-1] SW0, SW1 각 스위치가 연속으로 5회 이상 눌리면 LED를 반전 주 프로그램 요청부 volatile로 선언된 req_INT0, req_INT1 변수로, 인터럽트 서비스 루틴과 인터페이스 인터럽트 서비스 루틴이 REPLY로 응답했을 때 LED 반전 LED 반전 명령 PORTA ^= 1<<PA0;
Section 05 주 프로그램과 인터럽트 서비스 루틴의 요청/응답 인터페이스 main( ) 함수의 인터럽트 서비스 루틴과 인터페이스부 while(1){ if(req_INT0 = = REPLY){ PORTA ^= 1<<PA0; // INT0에서 응답하면 PA0 비트값 반전 req_INT0 = NOT_REQUEST; // req_INT0 요청 해지 req_INT1 = REQUEST; // req_INT1 요청 }else if(req_INT1 = = REPLY){ PORTA ^= 1<<PA0; // INT1에서 응답하면 PA0 비트값 반전 req_INT0 = REQUEST; // req_INT0 요청 req_INT1 = NOT_REQUEST; // req_INT1 요청 해지 }
Section 05 주 프로그램과 인터럽트 서비스 루틴의 요청/응답 인터페이스 인터럽트 서비스 루틴 응답부 ISR(INT0_vect){} 사례 req_INT0 변수에 REQUEST 요청이 있을 때 동작 - event 변수를 인터럽트가 발생할 때마다 증가 - NUM_EVENT 이상 발생되면 REPLY로 응답 volatile int req_INT0 = REQUEST, req_INT1 = NOT_REQUEST; ISR(INT0_vect) { static long event = 0; if(req_INT0 = = REQUEST){ event++; if(event>=NUM_EVENT){ event = 0; req_INT0 = REPLY; }
Section 05 주 프로그램과 인터럽트 서비스 루틴의 요청/응답 인터페이스 요청/응답 인터페이스와 인터럽트 과부하 절감 인터럽트 발생 빈도와 주 프로그램 수행 인터럽트 발생 빈도가 높아지면 원하는 시스템 동작이 되지 않을 수 있음 대기하던 인터럽트 서비스 루틴만 실행되고, 주 프로그램이 거의 수행되지 못할 수 있음 인터럽트 서비스 루틴에 머무르는 시간을 가능한 짧게 하고 인터럽트의 발생 빈도를 적게 하는 것이 바람직함 인터럽트 서비스 루틴은 수행 시간이 짧은 장치와 관계된 조작 명령, 상태 확인 등과 관련된 간단한 동작을 수행 상태 결과에 따른 주된 동작은 요청/응답 인터페이스로, 주 프로그램에서 수행하는 것이 바람직함
Section 05 주 프로그램과 인터럽트 서비스 루틴의 요청/응답 인터페이스 [예제 6-2] 인터럽트 서비스 루틴의 과부하 절감을 요청/응답 인터페이스 사례 인터럽트 감지 순간을 결정하는 비트가 ISC01 = 0, ISC00 = 0일 때, LOW 디지털 전압레벨이면 인터럽트가 계속 발생 강제 시간 지연 delay( ) 함수 위치에 따른 반응 관찰 인터럽트 서비스 루틴 안에서 delay( ) 함수를 실행하는 경우와, 주 프로그램에서 delay( ) 함수를 실행하는 경우의 차이점 확인
Section 05 주 프로그램과 인터럽트 서비스 루틴의 요청/응답 인터페이스 #ifdef Ⓐ --- A --- #else --- B --- #endif Ⓐ라는 이름의 레이블이 정의되어 있으면, --- A --- 부분을 수행 그렇지 않으면, --- B --- 부분을 수행하라는 매크로 #define DELAY_IN_ISR로 DELAY_IN_ISR을 정의하면 ISR(INT0_vect) 인터럽트 서비스 루틴에서 delay( ) 함수 실행 //#define DELAY_IN_ISR로 DELAY_IN_ISR을 정의해 놓지 않으면 main( ) 함수의 while( ) 반복문에서 delay( ) 함수 실행
Section 05 주 프로그램과 인터럽트 서비스 루틴의 요청/응답 인터페이스
Section 05 주 프로그램과 인터럽트 서비스 루틴의 요청/응답 인터페이스 결과 관찰 스위치를 누르지 않으면, 매우 빠르게 PA0에 연결된 LED를 반전시킴 너무 빨라 LED가 항상 켜진 것처럼 보임 스위치 SW0을 누르면, 지속적으로 인터럽트가 요청되어, 인터럽트 서비스 루틴이 수행 DELAY_IN_ISR을 4번 라인 위치에 두고, 매크로 정의하여, 프로그램 컴파일/링크/다운로드 후 관찰 DELAY_IN_ISR을 4번 라인 위치에서 삭제하여, 매크로 정의를 없앤 후, 프로그램 컴파일/링크/다운로드 후 관찰 LED의 점멸 주기의 빠른 정도를 관찰하여, 주 프로그램의 실행 정도를 간접적으로 알 수 있음
Section 06 포토인터럽터 인터페이스 사전 지식 포토인터럽터는 포토다이오드와 포토트랜지스터를 일체형으로 만든 부품 포토인터럽터 SG-207[(주)광전자 제품]을 중심으로 주요 규격 검토 약 940[nm]의 적외선이 포토트랜지스터의 베이스로 투과 베이스 단자에 전압이 생성되고, 이미터로 충분한 순방향 전류가 흐름 컬렉터와 이미터 사이의 스위치를 ON시킴 포토다이오드와 포토트랜지스터 간격에 적외선을 차단시켜 센서 동작
Section 06 포토인터럽터 인터페이스 특성곡선 ATmega128 내부 풀업저항 20[kΩ] 이상 가정
Section 06 포토인터럽터 인터페이스 적외선 관통 포토트랜지스터에 도달되면 ON, LOW 디지털 전압레벨 다이오드 순방향 전류 계산 12[mA]에 의한 적외선 관통 예측 광전류 트랜지스터 ON 트랜지스터의 포화동작을 만족시킴 입력 핀 PD0는 전압 VCE(Sat)이 되어 LOW 디지털 전압레벨 핀에서 인식되는 논리값은 ‘0’ 적외선이 차단되면 포토트랜지스터 OFF, HIGH 디지털 전압레벨 적외선이 차단되었을 때, 광전류 IL은 0[mA] 따라서, 핀에 인가되는 전압은 VCC이 되어 HIGH 디지털 전압레벨 핀에서 인식되는 논리값은 ‘1’
Section 06 포토인터럽터 인터페이스 실험 목적 및 동작 (1) 포토인터럽터의 회로 동작 이해 (2) 빛 차단과 투과가 포토트랜지스터의 ON/OFF로 출력에 미치는 영향 (3) 포토인터럽터 출력 신호가 상승하는 에지를 폴링으로 감지하는 방법 PD0 핀에 연결된 포토인터럽터 간격에 물체로 빛을 차단할 때, PA0에 연결된 LED를 반전하기 위한 회로
Section 06 포토인터럽터 인터페이스 폴링에 의한 포토인터럽터 에지 검사 // PD0가 HIGH 면 1을 취함
Section 06 포토인터럽터 인터페이스 인터럽트 방식에 의한 포토인터럽터 에지 검출
Section 06 포토인터럽터 인터페이스 포토인터럽터 인터페이스 (video.zip 참고 / 6-6)
Section 07 LCD 문자 디스플레이 인터페이스 사전 지식 16×2 문자 LCD는 2줄에 16글자의 문자를 디스플레이 가능
Section 07 LCD 문자 디스플레이 인터페이스 레지스터 명령 레지스터와 데이터 레지스터 존재 RS 핀으로 구별 0 : 명령 레지스터 1 : 데이터 레지스터 주소 카운터(AC) 문자 디스플레이 커서 위치를 정함 윗줄은 좌측부터 0x00~0x0F 데이터 값으로 결정 아랫줄은 좌측부터 0x40~0x4F 데이터 값으로 결정
Section 07 LCD 문자 디스플레이 인터페이스 동작 명령과 인터페이스 신호
Section 07 LCD 문자 디스플레이 인터페이스
Section 07 LCD 문자 디스플레이 인터페이스 동작 유의사항 다음 동작 명령을 실행하려면, BF(Busy Flag)가 0이 될 때까지 대기 LCD 디스플레이 장치에 데이터를 쓰거나 읽기 위한 파형 형태 E 신호 스트로브 HIGH 구간은 0.5[usec] 이상 유지
Section 07 LCD 문자 디스플레이 인터페이스 실험 목적 (1) LCD 문자 디스플레이의 특정 위치에 문자를 디스플레이하는 방법 이해 (2) 외부 장치의 핀을 통해 인터페이스하는 방법 이해 (3) 외부 장치의 busy 상태를 폴링으로 검사하는 방법 이해
Section 07 LCD 문자 디스플레이 인터페이스 레이블 정의 E 스트로브 발생 함수 시간지연을 위한 for(;;) 함수가 간소화되지 않도록, 반복용 변수 i를 volatile 지시어로 사용하여 선언하고 있음 E 신호를 0.5[usec]이상 HIGH 전압레벨로 출력 유지
Section 07 LCD 문자 디스플레이 인터페이스 BF 비트(데이터의 비트 7(PC7))가 0이 될 때 까지 대기하는 함수
Section 07 LCD 문자 디스플레이 인터페이스 명령 레지스터에 명령 값을 기록하기 위한 함수 데이터 레지스터에 데이터 값을 기록하기 위한 함수
Section 07 LCD 문자 디스플레이 인터페이스 8비트 인터페이스, 2줄 표시, 문자 5x10 도트 0x3C 0x02 0x01 0x06 0x0F
Section 07 LCD 문자 디스플레이 인터페이스 한 글자씩 문자를 디스플레이하는 동작 r=0인 마지막 문자열에서는 두번째 줄에 디스플레이 해야 함 LCD_command(0xc0) 명령으로 DDRAM 커서 위치(AC6~AC0)에 0x40 값을 기록하여 커서 위치를 아랫줄 첫 번째 칸으로 이동시킴
Section 07 LCD 문자 디스플레이 인터페이스 LCD 문자 디스플레이 인터페이스 (video.zip 참고 / 6-7)
Section 08 EEPROM, 포토인터럽터, LCD 디스플레이 통합 인터페이스 실험 목적 (1) ATmega128에서 EEPROM의 읽기/쓰기 프로그램을 이해하고, 사용 (2) EEPROM 레지스터를 이용한 내부 장치 읽기/쓰기 폴링을 이해하고, 사용 (3) 포토인터럽터의 에지감지 폴링 동작을 확인하고, 사용 (4) LCD 문자 디스플레이 인터페이스 폴링 동작을 확인하고, 사용 (5) EEPROM 읽기와 쓰기 동작, 포토인터럽터 폴링 동작, LCD 문자 디스플레이 장치 인터페이스를 결합하는 프로그래밍 능력
Section 08 EEPROM, 포토인터럽터, LCD 디스플레이 통합 인터페이스
Section 08 EEPROM, 포토인터럽터, LCD 디스플레이 통합 인터페이스 함수 호출 관계 int main(void) void LCD_init(void) void LCD_command(unsigned char data) void wait_BusyFlag(void) void gen_E_strobe(void) void LCD_data_write(unsigned char data) main.c lcd.h lcd.c void eeprom_write_byte(unsigned int address, unsigned char data) unsigned char eeprom_read_byte(unsigned int address) eeprom.c eeprom.h void LCD_string_write() void set_cursor()
Section 08 EEPROM, 포토인터럽터, LCD 디스플레이 통합 인터페이스 main( ) 함수의 반복 동작 차단 순간 감지 EEPROM에 기록 기록한 값 읽기 결과를 lcd_string[] 문자열에 기록 문자열을 LCD에 디스플레이 EEPROM 주소증가 기록할 데이터 감소
Section 08 EEPROM, 포토인터럽터, LCD 디스플레이 통합 인터페이스 EEPROM, 포토인터럽터, LCD 디스플레이 통합 인터페이스 (video.zip 참고 / 6-8)
IT CookBook, 마이크로컨트롤러 AVR ATmega128 Thank You IT CookBook, 마이크로컨트롤러 AVR ATmega128