지금까지 LED제어, 푸쉬버튼 감지 그리고 DS18B20과 통신하기 위하여 거의 모든 코드에서 delay함수를 사용하여 일정 시간동안 프로그램의 진행을 잠시 멈추는 기능을 수행하였다. 임베디드 시스템에서는 이와 같이 상당히 많은 부분에서 시간과 관련된 코드가 들어가게 된다. _delay_ms()나 _delay_us() 함수는 거의 정확한 시간동안 시간지연 기능을 수행해 준다. 그러나 이 함수들은 치명적인 단점이 있다. 특정 시간동안 delay를 주기 위하여 함수 인자로 시간지연값을 넣어 주는데 이 값들은 반드시 상수이어야만 한다는 것이다. LED 제어 1에서 만든 코드를 가지고 이 말이 무슨뜻인지 설명해 보도록 하겠다. int main(void) { DDRB = 0x03; PORTB= 0x03; whil..
DS18B20은 섭씨 -55 ~ +125도까지의 온도를 측정할 수 있다. 이 범위는 8비트 데이터로 충분히 처리할 수 있는 값이다. 즉, 8개의 LED로 표현이 가능하다는 뜻이다. 그러나 LED로 표시되는 온도값은 2진수이므로 사람이 직관적으로 현재 온도값을 알기가 쉽지 않다. 그래서 이번 글에서는 DS18B20에서 읽어 온 온도값을 좀 더 쉽게 알아볼 수 있는 방법에 대해서 설명하도록 하겠다. 아무래도 사람이 현재 온도를 한눈에 인식하려면 수은주처럼 막대그래프 모양이 좋을것 같다. 따라서 이번 프로젝트는 현재 온도값을 막대그래프 형태로 표시하는 방법에 대해서 알아볼 것이다. LED의 개수가 많으면 현재 온도값만큼 LED를 켜면 좋겠지만, 가지고 있는 보드에는 단지 8개의 LED밖에 없으므로 최대한 8개..
이번 글에서는 실제로 DS18B20에서 온도 데이터를 읽어 오는 기능을 구현해 보도록 하겠다. 프로그램을 작성하기 이전에 한가지 생각해 봐야 하는 점이 있다. 블로그의 첫번째 글인 "hello, world"에서 언급한 바와 같이 프로그래머가 예상했던대로 보드에서 결과가 나오는 경우는 모든 것이 문제가 없는 단 한가지의 경우에 해당되고, 제대로 동작되지 않을 경우는 무수히 많다. 특히 클럭 신호도 없는 단 하나의 신호선을 통해서 데이터 송수신이 이루어 진다면 더더욱 그 결과를 신뢰하기가 어렵게 된다. 이미 앞의 글에서 설명했듯이 신호가 유지되는 길이를 이용하여 데이터값이 '0'인지 '1'인지 판단해야 되는 DS18B20의 경우 내장된 크리스탈도 없으므로 정확한 시간에 맞춰 동작된다는 보장도 없다. 이러한 ..