다시 정리하는 마이크로프로세서..

최민재·2022년 6월 28일
1

Micro Controller 살펴보기

Processor Unit

CPU (Central Processing Unit)

  • 논리연산장치(Arithmetic Login Unit : ALU) : 비교, 판단, 연산
  • 제어 유닛(Contro Unit : CU) : 명령어 해석, 판단 실행, H/W 모듈
  • 레지스터 세트(Register Set) : CPU 내부 기억장치, 비교/판단/연산 결과 일시적 저장

MPU (Micro Processor Unit)

  • 1969년 미국 Intel사에서 만든 것
  • CPU를 단일 IC 칩에 집적시켜서 만든 반도체 소자
  • 메모리 제외한 연산창치, 제어장치, 각종 레지스터를 1개의 IC 칩에 직접
  • 범용 목적

MCU (Micro Controller Unit)

  • 단일 IC 칩에 CPU, 기억장치 ROM, RAM, I/O 제어 인터페이스, Timer/Counter, Interrupt 처리기 등 모두 집적
  • 1970년대 중반부 만듬
  • MPU와 달리 기본적인 산술, 논리 연산 뿐만 아니라 부가적인 요소들을 모두 통합
  • 특정 기기 제어용

Memory & Processor

시스템 버스(SYSTEM BUS)

  • 시스템 구성 요소들을 서로 서로 연결해 주는 통로
  • 종류
    • 주소 버스(Address Bus)
    • 데이터 버스(Data Bus)
    • 제어 버스(Control Bus)

폰노이만(Von Neumann) 버스 구조

  • 프로그램 내장 방식의 CISC 기반 Process의 버스 구조
  • 메모리에 명령어/데이터 같이 저장
  • 명령어 읽는 동시에 데이터 읽거나 쓸 수 없음
  • 1개의 Address Bus / Data Bus 존재
  • 고속의 컴퓨터에서는 병목현상 발생

폰노이만(Von Neumann) 버스 구조

하버드(Harvard) 버스 구조

  • RISC 기반 Process의 버스 구조
  • 메모리 공간을 나누어 명령어/데이터 따로 저장
  • 명령어는 프로그램 메모리 / 데이터는 데이터 메모리에 저장
  • CPU가 명령어를 읽으면서 동시에 데이터 읽거나 저장 가능
  • 2개의 Address Bus / Data Bus 존재
  • 처리 속도가 빠름

하버드(Harvard) 버스 구조

Instruction & Processor

명령어

종류

AVR 살펴보기

AVR이란?

  • 미국의 ATMEL사에서 만든 8비트 RISC 구조로 되어 있는 MCU
  • Alf-Egil Bogen과 Vegard Wollan의 RISC 기술의 첫 글자 -> AVR 명명
  • 혹자는 Advanced Virtual RISC의 약자
  • ATMEL사의 강점 플래시 메모리 기술과 접목
  • chip내 프로그램 코드용으로 플래시 메모리를 내장
  • 프로그램 쉽게 다운로드 하도록 ISP(In-System Programming) 방식 적용

AVR 특징

  • 명령어는 16비트로 H/W로 처리되고 데이터는 8비트 워드 길이 처리
  • RISC와 파이프라인 러치 방식, 소비전력 적고 대부분 명령어 단일 클럭 실행
  • 32개의 레지스터를 가지는 레지스터 중심형 구조
  • 단순한 어드레싱 모드와 간결한 프로그램 코드 사이즈
  • 하버드 구조를 사용하여 명령어 메모리와 데이터 메모리 동시 액세스
  • 프로그램 메모리는 내장 플래스 메모리만 사용
  • 직렬방식의 ISP기능 이용해서 쉽게 프로그램 다운로드 가능
  • 외부에는 데이터 메모리용의 버스만 존재
  • 시리즈 모델에 따라서 64Byte ~ 4KB까지의 EEPROM 내장 및 SRAM 내장
  • 시리즈 모델에 따라서 다양한 I/O 기능 제공
  • 시리즈 모델이 따라서 약 90 ~ 130개의 명령어 존재
  • 고성능 모델에는 H/W 곱셈기 내장하여 2 클록 사이클에 곱셈 명령 사용
  • 슬립 모드라 불리는 여러 가지의 파워절략 모드 지원
  • 다양한 분야에 적합한 다양한 모델 제공

AVR 종류

인터페이싱

GPIO

GPIO란?

  • General Purpose Input/Output 약자
  • HIGH/LOW 2개 신호로 구성된 디지털 데이터 입력/출력 제어 하는 방식
  • 모든 핀(PIN)의 기본 제어 방식
  • 관련 레지스터
  • 입출력 동작모드 설정 레지스터
  • 출력 데이터 설정 레지스터
  • 입력 데이터 설정 레지스터

Bitwise Operation

  • 최상위(MSB) 비트 & 최하위(LSB) 비트
  • And & 연산
  • OR | 연산
  • XOR ^ 연산
  • NOT ~ 연산
  • Shift << 연산
  • Shift >> 연산
  • Bit Set
    4번 비트 1로 설정

    ex)
LED = LED | (1<<4)
LED |= (1<<4)
  • Bit Clear
    4번 비트 0으로 설정
LED = LED & ~(1<<4)
LED &= ~(1<<4)
  • Bit Toggle
    4번 비트 0으로 설정
LED = LED ^ (1<<4)
LED ^= (1<<4)

PUSH BUTTON

크기, 모양에 상관없고, 손으로 누르거나 발로 밟는 것 등등 버튼을 눌러서 회로를 절단 또는 접속시키는 스위치 총칭

  • 구조
  • 연결
  • 연결 -Pull-up 방식


  • 연결 -Pull-down 방식


  • Chatterring 현상
    스위치 접점이 닫히거나 열리는 순간에 기계적인 진동에 의해 매우 짧은 시간안에 스위치가 붙었다가 떨어지는 것을 반복하는 현상
  • 해결방법 -> Debounce 처리
    • SW적 처리
      Debounce Delay값을 주어 짧은 시간 연속 입력값 무시
    • HW적 처리
      콘덴서(커패시터)를 디지털핀과 GND핀을 끼워주는 방법

IRQ

Interrupt

  • MCU 실행 중에 내/외부에서 장상적인 요청이나 비정상적인 오류가 발생하는 경우 즉시 처리해야 하는 특수한 이벤트
  • 인터럽트 서비스 루틴
    • 인터럽트를 처리해주는 함수
  • 발생 원인에 따른 분류
  • 차단 가능성에 따른 분류
  • 감지 및 처리 방법에 따른 분류

  • 트리거(Trigger) 신호
    • 인터럽트 발생 시키는 신호

Interrupt

설정 레지스터


INT 레지스터

  • EICRA (External Interrupt Control Register A) : 0 ~ 3번 설정
  • EICRB (External Interrupt Control Register B) : 4 ~ 7번 설정
  • EIFR (External Interrupt Flag Register) : 허용/금지 설정
    • INT7~0핀에 인터럽트 신호 입력되어 인터럽트 트리거(trigger) 되면 H/W에 의해서 자동 set
    • MCU가 IVT를 인출하여 서비스 루틴으로 점프하면 '0'으로 Clear

WinAVR 라이브러리

Interrupt 관련 함수는 avr/interrupt.h

Interrupt vector 상수 avr/iom128.h

구현 코드

// Interrupt 관련 함수 -----------------
void init_EINT() {
	EICRB |= ((1<<ISC41) | (1<<ISC40));		// - INT4 Rising Edge Interrupt
    EIMSK |= (1<<INT4);						// - External Interrupt4 Enable
}

// 외부인터럽트 처리 함수 --------------------
// - Rising Edge시 마다 자동 실행
ISR(INT4_vect) {
	// - 인터럽트 시 처리 코드
}
// Entry Point 함수
int main(void) {
	// 초기화
    init_EINT();
    
    // Global Interrupt 활성화
    sei();
    
    while(1) {
    	;
    }
    return 0;
}

USART

USART - REGISTER

  • USART I/O Data Register - UDRn
    - 송수신 데이터 저장
  • USART Control and Status Register A - UCSRnA
    • 송수신 버퍼 상태, 송수신 완료 상태 등 정보
  • USART Control and Status Register B - UCSRnB
    - 송신 여부, 수신 여부, 인터럽트 활성화 여부 설정
  • USART Control and Status Register C - UCSRnC
    - 데이터 프레임 설정
  • USART Baud Rate Registers - UBRRnH, UBRRnL
    - 전송 속도 설정

TEXT LCD

LCD (Liquid Crystal Display)

  • 모든 ASCII 문자 표현 가능하여 가단한 무자 출력에 사용
  • LED처럼 자체 발광능력 있지 않아 조도가 낮거나 각도에 따라 보이지 않음
  • LCD 표시부에 조명 부착한 백라이트(Backlight)형 LCD가 많이 사용
  • 종류
  • 구성요소 -> LCD 패널 + 컨트롤러 + 드라이버
  • ex) HITACHI HD44780
  • 핀 기능
  • 제어핀(Control Pin)
    • RS : Register Select, 명령어와 데이터 레지스터 선택 핀
      H : 데이터 레지스터
      L : 명령어 레지스터
    • R/W : Read/Write data, 데이터 읽기/쓰기 설정 핀
      H : 읽기
      L : 쓰기
    • E : Enable Pulse, LCD <-> MCU 데이터 교환 가능여부 설정 핀
      H : 교환 가능
      L : 교환 불가능
  • RS = 0, R/W = 0 : IR쓰기 (각종 제어 명령 쓰기)
  • RS = 0, R/W = 1 : BF읽기, AC읽기
  • RS = 1, R/W = 0 : DR쓰기
  • RS = 1, R/W = 1 : DR 읽기
  • 데이터핀(Data Pin)
    • RS : Register Select, 명령어와 데이터 레지스터 선택 핀
      H : 데이터 레지스터
      L : 명령어 레지스터
    • R/W : Read/Write data, 데이터 읽기/쓰기 설정 핀
      H : 읽기
      L : 쓰기
    • E : Enable Pulse, LCD <-> MCU 데이터 교환 가능여부 설정 핀
      H : 교환 가능
      L : 교환 불가능
  • 제어 명령어
    • LCD 모듈 동작이 MCU에 비해서 많이 느리기 때문에 명령이나 데이터 보내기 전 지연 시간 필요


  • Clear Display : 0b0000 0001 (0x01)
    - 전체 화면을 지우고 DDRAM 주소를 0으로 설정한 후 커서를 홈 위치로 옮기면 DDRAM 어드레스 카운트를 0으로 한다.
    - 데이터 버스에는 0000 0001 (0x01)이 전송


  • Return Home : 0b0000001x (0x02)
    - 커서를 홈 위치로 옮긴다. DDRAM 주소 카운터를 0으로 하고 디스플레이 시프트 된 것을 본래의 위치로 되돌린다.


  • Entry Mode Set
    - MCU가 LCD 모듈에 데이터를 Read/Write할 경우에 커서의 위치를 오른쪽으로 증가, 왼쪽으로 감소할 것인지 결정


  • Display On/Off
    - DDRAM 내용이 화면에 표시되도록 On/Off 설정하거나, 커서를 On/Off하거나, 커서 위치의 문자를 깜빡이게 할 것인지 설정


  • Cursor or Display Shift
    - DDRAM 내용 변경하지 않고 화면 또는 커서 오른쪽/왼쪽 쉬프트


  • Function Set
    - MCU와 LCD 모듈 사이에 인터페이스 설정
    - 데이터 길이, 화면 표시 행수, 문자 폰트 크기를 설정

ADC

ADC란?

  • Analog 형태 Data를 binary형 Digital 신호로 변환해 주는 장치
  • 특징
    • 10bit의 분해능
    • 13 ~ 260us 변환 시간 설정
    • PortF의 총 8개의 Pin(0~7번 Pin)이 ADC0 ~ ADC7까지의 8 채널
    • 단일입력, 자동입력 두 가지 입력 방법 존재
    • 결과 값을 최상위 bit 또는 최하위 bit부터 쓸 것인지 선택
    • 변환 완료 인터럽트 발생 가능
    • 내부 2.56V 전압, 외부에서 들어오는 외부전압 중 하나 선택
  • 변환모드
    • 한번 변환 모드(Single Conversion Mode)
      • ADEN=1, ADSC=1로 설정하는 동시에 A/D변환 시작 지시
        • 첫 번째로 오는 ADC_Clock 사이클에 Rising Edge에서 A/D변환 시작
        • Sample & Hold 포함 전체 과정에서 25 클럭 주기가 소요
        • 변환결과는 레지스터에 저장, ADIF=1 셋팅 되었으면 변환 완료 인터럽트 요청 ADSC 비트는 자동으로 클리어
    • 최초 변환 (First Conversion Mode)
      • A/D변환 결과 읽어 들인 후 다시 ADCSRA[ADSC]=1 설정
        • 변환이 초기화, ADC Clock 다음 상승 엣지에서 처음 변환 시작
        • 그 이후 13클럭에 변환 완료
    • 계속 변환 모드(Free Running Mode)
      • ADC 변환 결과가 ADCH, ADCL에 저장된 후 ADCSRA[ADSC]=1 유지하고 있으며 즉시 다음 변환이 시작되는 모드

ATmega128 Board

  • 초기화 함수
void Init_ADC() {
	// - ADC1 채널, AREF 기준 전압
    ADMUX = 1;
    
    // - 채널, 활성화, 프리스케일 설정
    ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0);
}
  • 변환 시작 함수
unsigned int CDS_StartADConverter() {
	unsigned int result;
    
    cli();		// -ADC 변환 중 인터럽트 금지
    
    ADCSRA |= (1<<ADSC);		// -ADC 변환 시작
    while(!(ADCSRA & (1<<ADIF)));	// -ADC 변환 완료 신호 대기
    
    result = ADCL;				// - 변환 결과 저장
    result |= ((ADCH & oxo3) << 8);
    
    sei();			// - 인터럽트 허용
    
    return result;
}
profile
응애 Android 개발자

0개의 댓글