이번 포스팅에서는 마이크로 컨트롤러의 외부인터럽트에 대해서 다뤄보자. 인터럽트 인터럽트란 프로그램이 진행될때 특별한 신호를 받으면 해당 신호를 먼저 처리하는 과정을 얘기한다. 위와같이 4번째 프로그램이 실행되다가 인터럽트(특별한 신호)가 발생하면 특정 과정이 진행되는데 이를 인터럽트 서비스루틴(ISR)이라고 한다. 즉, 우선순위는 진행되는 프로그램보다 인터럽트가 더 먼저 된다는 뜻이다. 인터럽트의 예는 TV리모컨과같이 우리가 어떤 채널을 보든 리모컨은 TV화면에서 나오는 영상보다 우선시 되기 때문에 이때 ISR은 리모컨 신호라고 할 수 있다. AVR입장에서 보면 인터럽트는 크게 2종류가 있다. 1. 외부 인터럽트 2. 타이머 인터럽트(타이머/카운터) 외부 인터럽트는 말 그대로 외부의 신호를 받아서 프로그..
임베디드 개발을 하기 위해서 하드웨어 보드를 간단하게 만들 수 있는 방법이 많다. 대표적으로 아두이노, 라즈베리파이 등 교육용 개발보드를 빵판이랑 연결해서 만들 수 있다. 이렇게 교육용 보드로 쉽게 원하는 작업을 만들 수는 있지만 제품을 양산하기 위해서는 프로젝트에 맞는 칩을 선정하고 보드를 직접 제작을 해야한다. pcb설계를 하면 반드시 테스트를 거치고 양산을 해야 한다. 따라서 제품을 만들기까지 개발과정은 다음과 같다. 1. pcb설계 후 테스트보드에 납땜하기 연구보안상의 이유로 보드사진은 모자이크처리를 하였다. 간략한 목표 동작은 Atmega8 칩 위에 적외선 센서를 연결하여 리모컨으로 수신을 받을 수 있도록 구현시켜야 한다. 이번 프로젝트에서는 타이머 인터럽트(카운터), 외부인터럽트(적외선 신호 ..
이번에는 아두이노에서 사용되는 칩셋 Atmega328P와 PC간 시리얼 통신하는법을 배워보자. 원칙적으로 UART통신을 하려면 별개의 단자를 이용해야 하지만 아두이노의 USB b타입 단자를 연결하면 업로드와 UART가 동시에 된다. (왜 이렇게 되는지 원리를 아시는분은 댓글로 설명좀...) UART 란? UART란 다양한 직렬(serial)통신방식중 하나이다. 대표적으로 시리얼통신방식으로 UART, SPI, I2C등이 있지만 이번에는 UART를 이용해서 putty로 통신하는것을 확인해보려고 한다. 직렬통신방식이 있으니 당연히 병렬(parallel)통신 방식도 있다. 직렬, 병렬통신은 각각의 장단점이 있다. 병렬통신 병렬통신을 이용하면 간단한 프로젝트를 할 때는 쉽고 직관적으로 코드를 작성 할 수 있으며 ..
아두이노는 원하는 작업을 쉽게 구현을 하고 편리한 IDE프로그램을 이용해 코딩도 쉽게 할 수 있다. 그러나 이는 단순히 '쉽게'구현 할 수 있을 뿐 실제 임베디드 개발을 하기 위해서는 제약이 많다. 그래서 이제부터 아두이노 언어를 사용하지 않고 AVR코딩을 하도록 습관을 갖자. 아두이노 - Microchip Studio 연동 아두이노에서 사용하는 칩셋은 Atmel사에서 제작한 'Atmega328P'이다. 자세한 데이터시트는 다음과 같으며 회로도도 보면서 설계하면 많은 도움이 된다. ATmega328P (microchip.com)(데이터시트) arduino-uno-schematic.pdf(회로도) 또, 아두이노와 마이크로칩스튜디오와 연동하기 위해서 다음 블로그를 참고하자. Microchip Studio를 ..
이번에는 AVR의 Atmel Studio를 사용하는 방법을 알아보고 레지스터 제어하는 법과 시뮬레이터 디버깅을 해보자. (이 회사는 인수되고 이름이 중구난방이 되버렸다....처음엔 AVR Studio였다가 Atmel Studio로 바뀌고 이젠 Microchip Studio란다....난는 뭔가 Atmel Studio가 더 편하고 친근하다.) 환경 설정 Atmel Studio7 설치 후 File - New - Project 을 누르면 칩을 선택하는 화면이 나온다. 여기서 사용할 칩을 선택하면 되는데 가장 많이 사용하고 교육용으로도 사용되는 흔하디 흔한 ATmega128을 사용해보자. 칩을 선택하면 비주얼스튜디오와 비슷한 화면을 맞이 할수 있다. 이제 여기서 신나게(?)코딩을 해주면 된다. AVR코딩은 C언어..
레지스터 구조 앞서 AVR의 범용레지스터는 R0 ~ R31 총 32개라고 얘기했다. 레지스터 하나당 8비트의 공간이 있으며 각각의 비트에 값을 저장 할 수 있도록 플립플롭(기억회로)으로 구성되어 있다. 따라서 하나의 레지스터에 8개의 플립플롭이 구성되어 있고 AVR 범용레지스터에만 256개가 내장되어있다. MCU구조 우리가 컴퓨터로 게임, 영상시청, 문서작업 등 다양한 작업을 할 때 CPU가 매우 대단한 연산을 하는 것 같지만 사실 0과 1로 더하기, 빼기 연산밖에 하지 않는다. (0과 1만 더하고 빼는데 이런 작업을 할 수 있다는게 대단하긴 하지...) 이런 기본적인 연산이 어떻게 이루어지는지 MCU의 내부구조를 확인해보자. 우선 "ADD Rd, Rr" 이라는 명령을 내리면 레지스터 두개가 사용되며 더..
앞에서 변수를 선언하고 연산을 했다면 내부적으로 어떻게 연산이 이루어지는지 알아보자. AVR은 분명 8비트 운영체제인데 변수를 char로 선언하면 8비트에 딱 맞게 저장 할 수 있지만 이보다 큰 자료형은 저장공간을 어떻게 할당하며 내부 연산이 이루어질까? 예를들어 short a;라는 변수를 만들었다고 가정하자. short는 16비트라 하나의 레지스터(8비트) 안에 들어가지 못한다. 이를 해결하기 위해서는 다음 레지스터 공간을 같이 할당해주면 된다. 이와같이 short자료형은 R0, R1을 동시에 할당해 주면 된다. 덧셈 연산은 각각의 MSB부와 LSB부를 맞춰서 연산을 한다. 내부적으로 위와 같은 연산이 이루어짐을 결과를 통해 확인 할 수 있다. 그러나 위의 코드만 작성을 하면 문제점이 발생한다. 예를들..
우리가 C언어에서 변수를 선언 할 때 어떤 메모리 공간에 변수를 넣을지 모른 상태로 그냥 선언을 한다. 그러나 메모리단위로 제어를 하는 MCU에서는 특정 공간을 지정 후 변수선언을 하든지 연산을 해야한다. 기본적인 어셈블리명령어와 문법을 알아보자. 1. LDI Rd, K : 상수 K를 Rd에 대입(Load Immediate, Rd
컴퓨터, 전자, 전기, 기계 가릴것 없이 공학도라면 피할 수 없는 마이크로프로세서(마이크로컨트롤러)를 배워보자. Q. 마이크로프로세서란 무엇인가? A. 마이크로프로세서란 초소형 연산처리장치이다. 우리가 흔히 사용하는 PC, 스마트폰 안에 들어있는 연산처리장치 즉 CPU가 마이크로프로세서이다. 그러나 이런 CPU는 단독적으로 사용이 불가능하다. 칩이 특정기능을 사용 수 있도록 명령을 내려야 하고 결과를 확인 할 수 있어야 한다. 마이크로프로세서에 입력과 출력 인터페이스를 결합한 칩을 마이크로컨트롤러(MCU)라고 한다. 따라서 엄밀히 말하자면 우리는 칩셋에 입출력을 전부 수행하는 마이크로컨트롤러를 배운다고 하는것이 맞는 표현이다. 처음 프로그래밍을 배울 때 보통 C, 파이썬 등을 배웠을 것이다. (필자는 C..