티스토리 뷰

입문

UART 온도계

Just4Fun 2016. 4. 3. 23:52

힘들게 구현했던 LED 온도계를 이번에는 UART를 이용하여 컴퓨터 화면에 숫자로 현재 온도를 출력하는 프로젝트를 진행해 보도록 하겠다.  출력되는 온도 해상도는 소수점 세자리로 표시하도록 하겠다.

DS18B20을 제어하는 driver 파일인 ds18b20.c 파일은 다음과 같이 작성한다.

전체 코드는 첨부파일을 참조하면 되고, 여기에서는 ds18b20_init() 함수와 get_current_temperatue() 함수만 설명하도록 하겠다.

ds18b20_init() 함수는 DS18B20의 ROM code를 읽어 첫번째 바이트 값이 0x28인지 확인한다.  DS18B20의 부품 코드가 0x28이다.  이값이 제대로 읽히지 않다는 것은 뭔가 회로에 문제가 있다는 뜻이므로 에러 처리를 할 수 있도록 함수의 리턴값을 -1로 돌려준다.

get_current_temperature()는 현재 온도값을 읽어 오는 함수이다.  Scratchpad레지스터의 0번 레지스터를 하위바이트값으로, 1번 레지스터를 상위 바이트값으로 처리하여 16비트 값을 만들어 리턴해 준다.  이때 읽은 scratchpad레지스터의 값에 대한 CRC검사를 하여 오류가 발생하면 0xF000값을 리턴해 주도록 되어 있다.  이값은 정상적으로 데이터를 읽어 왔을 때에는 절대 나오지 않는 데이터 값이다.  그러므로 만일 get_current_temperature() 함수의 리턴값이 0xF000이면 데이터의 오류가 있으니까 별도의 처리를 해주어야 한다.

읽어온 온도값을 출력해 주는 것은 main.c파일에서 수행한다.

setup() 함수에서 uart 초기화 함수를 부른다음 프로젝트명을 화면에 출력한다.  이 때 9번 라인을 잘 보면 "__DATE__"와 "__TIME__"을 볼 수 있다.  이것은 컴파일 할 때의 날짜와 시간을 출력해주기 위하여 사용된다.  이렇게 빌드시간을 출력해 주는 이유는 매우 중요한 역할을 해주기 때문이다.

실제로 임베디드 프로젝트를 개발하다 보면, 뭔가 잘 동작되지 않거나, 기능을 보완하는 코드를 만들었는데도 불구하고 전혀 반응이 없는 경우가 발생한다.  나중에 알고 봤더니 실제로 코드를 수정하여 새로 빌드된 결과물을 보드에 적용한 것이 아니라, 전혀 엉뚱한 곳에 있는 실행 파일을 보드에 내리는 경우가 있기 때문이다.  설마 그러기야 하겠냐라고 생각할 수도 있겠지만 임베디드 프로젝트를 진행해 본 경험이 있는 개발자라면 누구나 한번쯤은 이런 경험을 했을것이다.  그리고 때로는 이런 문제를 며칠이 지나도록 발견 못하고 헤매는 경우도 있다.

이러한 터무니 없는 에러를 방지하고자 컴파일 할 때의 날짜와 시간을 프로젝트 시작할 때 출력해 주면, 새로 빌드된 파일이 실행되고 있는지, 아니면 옛날에 만들었던 파일이 실행되는지 즉시 확인할 수가 있다.  따라서 반드시 이러한 프로젝트 빌드 타임을 출력하는것을 넣어 주는 습관을 들이도록 하여야 한다.

프로젝트를 컴파일 하여 실행 시켜 보고, DS18B20의 온도값이 제대로 출력되는지 확인해 본다.


ds18b20.c


ds18b20.h


main.c


uart.c


uart.h


입문 과정 목차

'입문' 카테고리의 다른 글

인터럽트 - UART  (0) 2016.04.06
인터럽트 - 개념  (1) 2016.04.04
UART - "hello, world"  (11) 2016.04.03
UART - stdio  (1) 2016.04.03
UART - sprintf, my_printf  (0) 2016.04.03
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2025/04   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함