이번에는 UART를 이용하여 AVR에서 인터럽트를 발생 시키는 방법과 인터럽트가 발생하여 현재 수행중인 프로그램을 멈추고 인터럽트 벡터 주소로 점프하여 인터럽트를 처리한 후, 다시 인터럽트로 인하여 멈추어진 프로그램을 다시 실행 시키는 절차에 대하여 설명하도록 하겠다. 이전에 설명하였던 UART 글들을 참조하여 다음과 같은 메시지가 출력되도록 한다. #include #include "uart.h" void setup(void) { uart_init(); printf("UART RX Interrupt Test Program. [%s %s]\n",__DATE__,__TIME__); } void loop(void) { } int main(void) { setup(); while (1) { loop(); } }..
이번 글에서는 프로그램이 정상적인 흐름대로 실행되고 있는 도중에, 어떤 이유에 의해서 수행중인 프로그램을 멈추고 특정 위치에서 명령어를 읽어 와서 실행하는 인터럽트에 대해서 설명하도록 하겠다. 사실, 인터럽트는 이게 전부다. 수행중인 프로그램을 멈추고 지정된 주소에서 프로그램을 실행하도록 하는거. 문제를 해결한 다음엔 멈춘 위치로 다시 돌아가 아무일 없는듯이 정상적인 동작을 계속하도록 한다. 그럼 AVR에서는 어떤 경우에 수행중인 프로그램을 중단시키는지 그 이유를 알아보겠다. 위에 보이는 표가 ATmega328에서 사용가능한 인터럽트 종류이다. 모두 26개의 인터럽트가 있다. 만약 UART로 데이터가 수신되면 19번 인터럽트가 발생하고 그에 따라 CPU는 0x0024번지에서부터 명령어를 수행하게 된다. ..
힘들게 구현했던 LED 온도계를 이번에는 UART를 이용하여 컴퓨터 화면에 숫자로 현재 온도를 출력하는 프로젝트를 진행해 보도록 하겠다. 출력되는 온도 해상도는 소수점 세자리로 표시하도록 하겠다. DS18B20을 제어하는 driver 파일인 ds18b20.c 파일은 다음과 같이 작성한다. int ds18b20_init(void) { uint8_t rom[8]; int ret = 0; read_rom_code(rom); if (crc8(rom, sizeof(rom)) == 0) { if(rom[0] != DS18B20_CODE) ret = -1; } else { ret = -1; } return ret; } int16_t get_current_temperature(void) { int16_t tempera..