<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>NTREXGO - 디바이스마트, 엔티렉스 컨텐츠 통합 사이트 &#187; 5호</title>
	<atom:link href="http://www.ntrexgo.com/archives/tag/5%ed%98%b8/feed" rel="self" type="application/rss+xml" />
	<link>http://www.ntrexgo.com</link>
	<description>엔티렉스, 디바이스마트 컨텐츠 통합 사이트</description>
	<lastBuildDate>Thu, 03 Mar 2022 06:47:11 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<item>
		<title>[5호]일본의 디바이스마트 마루츠 파츠관을 다녀와서..</title>
		<link>http://www.ntrexgo.com/archives/9822</link>
		<comments>http://www.ntrexgo.com/archives/9822#comments</comments>
		<pubDate>Mon, 17 Jan 2011 09:17:03 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[핫 뉴스]]></category>
		<category><![CDATA[5호]]></category>
		<category><![CDATA[리포트]]></category>
		<category><![CDATA[스페셜]]></category>
		<category><![CDATA[파츠관]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=9822</guid>
		<description><![CDATA[디바이스마트 매거진 5호 &#124; 후쿠오카에는 후쿠오카 타워, 야후돔 등 많은 유명한 관광지들이 있지만 필자가 여러분들에게 소개하고자 하는 곳은 바로 ‘마루츠 파츠관’이라는 곳이다.
전자부품에 관심이 많은 사람이라도 생소한 이름일 수 있는데 쉽게 얘기하자면 일본판 디바이스마트라고 보면 되겠다.]]></description>
				<content:encoded><![CDATA[<h2><span style="color: #000080"><strong><span style="font-size: large"><img class=" wp-image-9595 alignleft" alt="05SRJM001" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SRJM001-300x200.jpg" width="216" height="144" />일본의 디바이스마트</span></strong></span></h2>
<h2><span style="color: #000080"><strong><span style="font-size: large">마루츠 파츠관을 다녀와서..</span></strong></span></h2>
<p>&nbsp;</p>
<p>글 | 김동성 기자 goodluck@ntrex.co.kr</p>
<p>&nbsp;</p>
<p>영하의 날씨로 추운 한국의 12월과 달리 일본 후쿠오카에 날씨는 포근했다. 아직도 낮에는 외투를 벗고 다녀야 할 정도로 따뜻함을 느낄 수 있었다. 한국으로 보자면 가을에서 겨울로 넘어가는 즈음이랄까?</p>
<p>이곳 후쿠오카에는 후쿠오카 타워, 야후돔 등 많은 유명한 관광지들이 있지만 필자가 여러분들에게 소개하고자 하는 곳은 바로 ‘마루츠 파츠관’이라는 곳이다.</p>
<p><img class="wp-image-9595 aligncenter" alt="05SRJM001" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SRJM001-620x413.jpg" width="335" height="223" /><br />
전자부품에 관심이 많은 사람이라도 생소한 이름일 수 있는데 쉽게 얘기하자면 일본판 디바이스마트라고 보면 되겠다.<br />
필자는 후쿠오카 하카타시에 숙소를 정해서 생활했는데 가는 방법은 간단했다. 하카타역에서 지하철로 2구간인데 지요겐초구치역에서 하차 한 후 출구로 나가면 바로 앞에 ‘마루츠’가 있다.<br />
이곳은 본사가 아닌 일반 오프라인 매장이기 때문에 마음껏 들어가서 구경할 수가 있다.<br />
디바이스마트에서 운영하고 있는 구로매장이나 대전매장, 송파매장이라고 생각하면 된다.<br />
놀라운 사실은 오프라인 매장이 연중무휴라는 것이다.<br />
참고로 필자가 방문했던 날은 일요일이었다.</p>
<p><span style="color: #a1206b"><strong>마루츠 내부</strong></span></p>
<table border="0">
<tbody>
<tr>
<td><img class="alignnone size-medium wp-image-9603" alt="05SRJM009" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SRJM009-300x200.jpg" width="300" height="200" /></td>
<td><img class="alignnone size-medium wp-image-9598" alt="05SRJM004" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SRJM004-300x200.jpg" width="300" height="200" /></td>
</tr>
</tbody>
</table>
<p>문을 열고 들어가면 생소한 풍경은 아니다. 디바이스마트나 다른 전자 부품 매장에서 판매하고 있는 품목들이 진열장 위에 진열이 되어있다. 사진촬영도 가능했기 때문에 필자가 봤던 것 중에 몇 가지만 소개하겠다.</p>
<p><strong style="color: #a1206b">반도체 및 수동소자</strong></p>
<table border="0">
<tbody>
<tr>
<td><img class="alignnone size-medium wp-image-9602" alt="05SRJM008" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SRJM008-300x200.jpg" width="300" height="200" /></td>
<td><img class="alignnone size-medium wp-image-9599" alt="05SRJM005" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SRJM005-300x200.jpg" width="300" height="200" /></td>
</tr>
</tbody>
</table>
<p>우선 반도체 및 수동소자이다. AVR, 8051 등 국내에서 많이 유통되는 칩들은 일본에서는 유통이 많이 되지 않는 듯 하다. 그래서인지 많은 수량의 제품을 매장에 보유하고 있지 않았다. 하지만 다양한 제품군들을 플라스틱 케이스를 사용한 것이 아니라, 종이박스를 사용하여 진열한 점이 흥미로웠다. 앞 쪽에는 제품 이미지와 함께 품명, 스펙을 확인할 수 있도록 주기가 붙어있다.<br />
조그만 박스이기 때문에 많은 수량을 보관할 수 없지만, 깔끔하게 진열되어 있는 것이 보기 좋았다.</p>
<p><span style="color: #a1206b"><strong>공구 제품군들</strong></span></p>
<p><img class="size-medium wp-image-9601 aligncenter" alt="05SRJM007" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SRJM007-300x200.jpg" width="300" height="200" />다음은 공구 제품군들이다. Goot, Hakko, Hozan, Engineer 등 공구의 제조사 별로 진열 되어있는데, 제품 아래에는 카달로그가 함께 있어, 제품 스펙 확인이 용이하도록 되어있다. 제작, 유통이 쉬어서 일까 당연한 이야기겠지만 일본산 공구제품들이 다른 나라 공구들보다 비중이 상대적으로 높았다. Hozan 같은 비싼 공구들이 같은 일본이기 때문에 국내보다 약간 더 저렴하게 판매되고 있다는 것은 부러운 점이었다.</p>
<p><strong><span style="color: #a1206b">전선류</span></strong></p>
<table border="0">
<tbody>
<tr>
<td><img class="alignnone size-medium wp-image-9597" alt="05SRJM003" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SRJM003-300x199.jpg" width="300" height="199" /></td>
<td><img class="alignnone size-medium wp-image-9600" alt="05SRJM006" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SRJM006-300x200.jpg" width="300" height="200" /></td>
</tr>
</tbody>
</table>
<p>다음은 전선류이다. 쉽게 풀어서 사용할 수 있도록 긴 봉에 꽂아서 돌릴 수 있게 되어 있다. 디바이스마트와 비슷한 보관 방법이다. 풀어져 있는 전선 끝단에 주기를 부착하여 바로 보고 찾을 수 있도록 되어있었다. 전선을 자를 때에도 주기만 때서 원하는 길이로 자른 후 다시 끝단에 주기를 붙이면 된다. 규격을 확인 할 수 있도록 규격표도 별도로 붙어있다. 일정한 길이로 컷팅이 되어 봉지에 담겨있는 것도 있다.</p>
<p><strong><span style="color: #a1206b">브랜드 박스 종류</span></strong></p>
<p><strong><span style="color: #a1206b"><img class="size-medium wp-image-9596 aligncenter" alt="05SRJM002" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SRJM002-300x200.jpg" width="300" height="200" /></span></strong>다음은 브랜드박스 종류이다. 디바이스마트에 FIBOX, 케이스포유, NT시리즈가 있듯이 일본에서도 여러 제조사의 브랜드박스가 있었다. 브랜드박스의 비중도 커서 많은 종류의 제품이 진열 되어 있었다. 모양은 사각박스가 대부분이지만 깔끔하고 심플한 디자인이 눈길을 끈다.<br />
이 외에도 전자 키트, 전자 관련 서적, 컴퓨터 주변기기, 배터리, 사무용품 등이 판매 되고 있었다. 짧은 시간 동안 살펴 보았지만, 매장 진열 및 재고 보관 방법 등 많은 참신한 아이디어를 배울 수 있는 시간이었다. 이 소중한 경험이 더 나은 디바이스마트를 만드는 밑거름이 되기를 희망하며, 탐방기를 마친다.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/9822/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[5호]왕초보 전자회로 강좌특집 5부 &#8211; 2</title>
		<link>http://www.ntrexgo.com/archives/10555</link>
		<comments>http://www.ntrexgo.com/archives/10555#comments</comments>
		<pubDate>Mon, 17 Jan 2011 06:32:01 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[스페셜 컬럼]]></category>
		<category><![CDATA[5호]]></category>
		<category><![CDATA[데이터]]></category>
		<category><![CDATA[로거]]></category>
		<category><![CDATA[왕초보]]></category>
		<category><![CDATA[전자회로]]></category>
		<category><![CDATA[특강]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=10555</guid>
		<description><![CDATA[디바이스마트 매거진 5호 &#124; 왕초보 전자회로 특강 5부 마지막편. 데이터 로거(data logger) 에 대해서 알아보자. ]]></description>
				<content:encoded><![CDATA[<table style="width: 620px" border="0">
<tbody>
<tr>
<td><img class="size-full wp-image-10792 alignleft" alt="Scimage0" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/Scimage0.jpg" width="201" height="151" /></td>
<td><span style="font-size: x-large;color: #ee1146"><strong>왕초보 전자회로 강좌특집 5부 &#8211; 2</strong></span></p>
<p style="text-align: right"><span style="font-size: small">글 |스네일앤 스네이크</span></p>
<p style="text-align: right"><span style="font-size: small;color: #808080">※ 상기 내용은 디바이스마트와 스네일앤 스네이크의 협의를</span><br />
<span style="font-size: small;color: #808080"> 통하여 사용을 득한 내용입니다.</span></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong><span style="color: #d72844;font-size: large">내장 부트로더를 이용한 임베디드 프로그램 로딩 (loading) </span></strong></p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로설명 (circuit description)</strong></span><br />
“MY 로거” 의 실험에 들어가기 전에 “MY 로거” 내부 소프트웨어인 임베디드 프로그램을 업데이트하는 방법을 설명합니다.<br />
임베디드 프로그램, 즉 펌웨어의 업데이트는 최근의 MP3, PMP등 소형 정보기기에서 지원하고 있는 기능으로, 빠르게 변하는 정보환경에 대응하기 위한 것입니다. 왜냐하면, (마이컴을 사용한) 기기에서 기능을 변화시키려면 내부 소프트웨어의 교체가 필요하기 때문이지요.<br />
마찬가지로 “MY 로거” 도 여러가지 응용사례에 따라, 기능이 변경되거나 추가될 것이 예상되므로 펌웨어의 교체는 필수적입니다. 이를위해 “MY 로거” 는 PIC16F873A 내부 ROM안에 부트로더(bootloader)라는 작은 프로그램을 상주시켜, 펌웨어를 PC에서 다운로드 할 수 있도록 하고 있습니다 (부트로더가 없으면 프로그램 교체는 매번 롬라이터를 사용하여야 합니다) .<br />
부트로더는 마이컴 리셋(reset) 직후에 먼저 (마이컴) RS232C 통신포트를 통해, (PC에 연결된) 다운로더 프로그램의 접속을 확인해 봅니다.<br />
만일 대기하고 있는 다운로더를 발견하면 먼저 새로운 프로그램을 내려 받고나서, (새 프로그램을) 실행시킵니다. 접속된 다운로더를 찾지 못한다면 내장된 예전 프로그램을 실행시킵니다(이 확인 시간은 아주 짧으므로 사용자는 부트로더의 존재를 감지할 수 없습니다).<br />
<span style="color: #2cb3b3">※ 부트로더의 동작은 작은 OS인, (마이컴 ROM에 내장된) 모니터 프로그램을 연상시키네요.</span><br />
<span style="color: #2cb3b3"> ※ 사용한 PIC 부트로더는 Carlos Buelna씨가 개발/배포한 공개 소프트웨어 입니다. 단 PIC 전용 C 프로그램인 “HI-TECH C”의 컴파일/링크로 생성된 hex 파일만을 사용할 수 있습니다 (다른 어셈블러나 C 컴파일러에서 생성된 hex 파일은 프로그램 실행이 보증되지 않으므로 주의) .</span><br />
<span style="color: #2cb3b3"> Carlos Buelna씨의 부트로더 자료는 http://www.microchipc.com/PIC16bootload/16F87xA/ 참조.</span></p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로도 (The circuit diagram) : : 내장 부트로더를 이용한 임베디드 프로그램 로딩 (loading)</strong></span></p>
<p>“MY 로거” PIC16F873A에는 부트로더가 내장되어 판매되므로 PC에 다운로더 프로그램인 CD2m을 카피하면 준비가 완료됩니다.<br />
오른쪽 그림에 부트로더의 사용법과 CD2m 다운로더의 실행화면을 보였습니다.</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC008.jpg" rel="lightbox[10555]"><img class="alignnone  wp-image-10786" alt="05SC008" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC008.jpg" width="512" height="661" /></a><strong></strong></p>
<p>먼저 PC의 COM 포트와 “MY 로거” 를 RS232C 케이블로 연결시킵니다. 이 때 연결한 PC측 COM 포트의 번호를 확인하고, CD2m 다운로더의 “COM 포트 번호”와 일치시켜 줍니다. (디폴트값은 “COM1”입니다. 즉 COM 1번 포트에 케이블을 연결하면 셋팅을 변경할 필요가 없습니다)<br />
<span style="color: #2cb3b3">※ RS232C 통신속도를 정의하는 “보오 레이트”는 19200 bps로 변경할 수 없습니다. (따라서 CD2m 다운로더의 보오 레이트도 19200으로 셋팅합니다. 그 이유는 “MY 로거”내의 부트로더 프로그램이 19200 bps 전용이기 때문입니다)</span></p>
<p>RS232C 케이블 연결과 다운로더 셋팅이 끝나면 그림내 플로우의 ②번부터, 번호 순대로 진행하면 됩니다. 주의점은 ⑤번의 “MY 로거” 리셋 스위치 취급입니다. ⑤번에서 리셋 스위치를 누르고 있는 채로 (스위치를 손에서 떼면 안됨) ⑥번으로 가서 CD2m 다운로더 “Start” 버튼을 클릭합니다. 클릭하자마자 ⑦번으로 진행하여, 누르고 있던 “MY 로거” 리셋 스위치를 떼면 됩니다.<br />
이유는 부트로더는 리셋 직후에 동작하고, 이 때는 PC측의 다운로더가 미리 대기하고 있어야 되기 때문입니다. PB 스위치를 손에서 떼면 리셋이 풀리면서 “MY 로거” 16F873A의 부트로더가 실행되기 시작합니다 (리셋 스위치를 왼손으로 누르고 있는 것이 편리 오른손은 마우스를 사용해야 하니까요).<br />
부트로더와 CD2m 다운로드의 접속이 성공하면 “다운로드 진행바”가 증가하는 것을 볼 수 있습니다. 다운로딩이 끝나면, 바로 “MY 로거” 프로그램이 실행되는 것을 볼 수 있습니다. 한 번에 성공하지 못하면 (당황하지 말고) 두 세번 시도해서 (다운로딩) 감각을 익혀둡니다. 업로딩은 지원하지 않습니다.<br />
<span style="color: #2cb3b3">※ “MY 로거”의 리셋 버튼을 누르면 (“MY 로거”의) LED 4 가 꺼집니다. LED 1은 전원상태를 체크하며, LED 4 는 녹색으로 PIC16F873A 마이크로 콘트롤러가 “정상적으로 동작하고 있음”을 표시해 줍니다.</span><br />
<span style="color: #2cb3b3"> ※ 다운로드용 임베디드 프로그램은 *.hex 형식의 파일이어야 합니다.</span><br />
<span style="color: #2cb3b3"> ※ 시중에서 구입한 PIC16F873A는 내부 ROM이 비어 있으므로 부트로더도 들어있지 않습니다. 따라서 처음에 한 번은 (롬라이터를 사용해서) 부트로더 프로그램을 PIC16F873A ROM안에 구워 넣어야 합니다.</span><br />
<span style="color: #ff6600">※ 펌웨어 업데이트용 / MY 로거 Ver. 2.0 펌웨어 프로그램 (임베디드 프로그램) 다운로드는 http://www.circuitry.co.kr/bbs.php?table=beginner&amp;query=view&amp;uid=50&amp;p=1 페이지를 참조하세요.</span></p>
<p>&nbsp;</p>
<p><strong><span style="color: #d72844;font-size: large">&#8220;MY 로거&#8221; 통신 프로그램 + mscomm32 (ocx) 설치법</span></strong></p>
<p>&nbsp;</p>
<p><span style="color: #ff9900"><strong><span style="text-decoration: underline">▶ 회로설명 (circuit description)</span> </strong></span><br />
이번 시간에는 PC측에서 원격으로 “MY 로거”를 통제할 수 있는 통신 프로그램을 설명합니다. 먼저 시간의 “MY 로거”의 간단한 사용법에서 설명한 바와 같이, PC측 통신 프로그램은 둘 혹은 세 자리의 명령문자나 두 자리 명령문자 + 한 자리 ASCII 숫자를 사용합니다. (실제 사용법은 나중의 사례에서 살펴 볼 예정입니다) 또 명령의 종류에 따라, “MY 로거”는 결과를 PC측에 (ASCII 문자로) 알려줍니다. “MY 로거” 통신 프로그램은 명령을 송신하고, 돌아온 결과를 수신하고 처리해서 사용자에게 보여줍니다.<br />
<span style="color: #28a3a3">※ “MY 로거” 통신 프로그램은 VB 6.0 을 사용하여 작성되었습니다. VB에서는 RS232C 통신을 위해 mscomm32라는 ocx를 사용합니다. MS사에 의하면 ocx는 (유사한 dll과 달리) PC Window에 등록해야 이용할 수 있다고 되어 있습니다. 따라서 통신 프로그램을 사용하기 전에, mscomm32.ocx를 사용하는 PC에 반드시 등록해야 하며, (등록법은) mscomm32.zip 안의 txt 파일이나 아래의 그림을 참조해 주시기 바랍니다.</span><br />
<strong><span style="text-decoration: underline;color: #ff9900">▶ 회로도 (The circuit diagram) : : PC에서 사용하는 “MY 로거” 통신 프로그램</span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC009.jpg" rel="lightbox[10555]"><img class="alignnone  wp-image-10787" alt="05SC009" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC009-565x620.jpg" width="509" height="558" /></a></p>
<p>그림에서 처럼, 통신 프로그램의 사용은 정말 간단합니다. 사용자는 “MY 로거”가 연결된 COM 포트를 지정하고 오픈한 후, 송신창에서 원하는 명령을 문자와 숫자로 보냅니다. “MY 로거”는 (필요하다면) 즉각 응답할 것이며 결과는 수신창에 문자와 애스키 숫자의 두 가지 형태로 (분명하게) 나타날 것입니다.<br />
지금까지 “MY 로거”의 복잡한 설명들에 당황하신 분들도 통신 프로그램과 “MY 로거”사이의 사용법이 통합적이고 간단하다는 것을 알게되어 안도하시리라 믿습니다.<br />
필자의 생각으로는(꼼꼼하게) 잘 정의된 전략을 구사한다면, 소프트웨어건 하드웨어건 아니면 이들이 결합한 어떤 것이건 혹은 한 발 더 나아가 실험자체에 이르기까지 최종결과가 단순하고 우아한 형태로 귀착된다고 확신합니다.<br />
“MY 로거”는 일반 DAQ 보드의 성능을 일부 포기하고, 표준 애스키 문자만을 사용한다는 전략과 설계원칙을 고수함으로써 다양한 기능과 간단한 사용법이라는 두 마리 토끼를 잡는 수확을 거두게 되었습니다. 우리는 이 결과를 충분히 활용할 것이며 컴퓨터를 이용한 흥미있는 실험이라는 최종 목적에 가까워졌음을 자축할 수 있게 되었습니다.<br />
<span style="color: #ff6600">※“MY 로거” 통신 프로그램과 VB 소스 (comm_update.zip 10.6k), mscomm32.oxc mscomm32.reg, 등록방법(mscomm32.zip 51k) 다운로드는 http://www.circuitry.co.kr/bbs.php?table=beginner&amp;query=view&amp;uid=51&amp;p=1 페이지를 참조하세요.</span></p>
<p>&nbsp;</p>
<p><strong><span style="color: #d72844;font-size: large">&#8220;MY 로거&#8221; Digitial I/O (Logic In/Out) 시험</span></strong></p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로도 (The circuit diagram) :   “MY 로거” DI/O 단자 동작시험</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC010.jpg" rel="lightbox[10555]"><img class="alignnone size-large wp-image-10788" alt="05SC010" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC010-484x620.jpg" width="484" height="620" /></a></p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로설명 (circuit description)</strong></span><br />
이번 시간에는 “MY 로거”의 디지털 입/출력 동작을 시험해 보겠습니다. “MY 로거”는 2개의 외부단자 중 (아래쪽의) 2번 외부단자를 디지털 입/출력에 배정하고 있습니다.<br />
“MY 로거”는 (외부단자 2의) 4개의 디지털 단자중 두 개를 입력(DI) 단자에 두 개를 출력(DO) 단자로 배정하고 있으며, 각 단자명은 DI 1/DI 2, DO 1/DO 2, 단자 배치는 아래의 그림과 같습니다.<br />
디지털 출력 명령은 o10, o11, o20, o21의 4가지로, 처음의 ‘o’문자는 output을, 두 번째 1, 2 문자는 단자를, 세 번째 0, 1 문자는 단자상태를의미합니다. 그러므로 “o11” 명령은 DO 1단자의 상태를 High, 5V로 셋트합니다. 명령 후 테스터로 DO 1단자전압을 측정하면, 약 5V가 출력되는 것이 확인됩니다.<br />
다시 “o11”명령으로, DO 1단자상태를 Low. 0V로 환원할 수 있으며 이 때의 단자전압은 약 0V 입니다.<br />
<span style="color: #2cb3b3">※ 리턴 문자는 없습니다.</span><br />
<span style="color: #2cb3b3"> ※ 전원이 투입되거나, 리셋 버튼을 눌렀다 떼면 DO 1/DO 2출력단자는 각각 Low, 0V 초기상태로 셋트됩니다.</span></p>
<p>디지털 입력 동작 명령은 i1, i2의 두 가지로, 처음의 ‘i’문자는 input을, 두번째 1, 2문자는 단자를 의미합니다. 그러므로 &#8220;i1&#8243; 명령은 DI 1단자의 상태가 High 인지 Low 인지를 “MY 로거”에 문의하게 됩니다. 명령을 받은 “MY 로거”는 DI 1단자상태를 체크한 후, (단자상태가) High, 5V 이면 ‘T’문자로 Low, 0V 이면 ‘F’문자를 보내줍니다(‘T’ 문자는 truth, ‘F’ 문자는 false를 의미) .<br />
“i2”명령은 DI 2입력단자에 적용되며, 명령의 의미는 “i1”에서와 동일합니다. 그림에 “MY 로거” 디지털 입/출력단자와 시험회로가 나와 있습니다. 출력단자를 시험하기 위해서는 달랑 LED만 필요합니다. 전류제한 저항은 “MY 로거” 내부의 330Ω으로 충분합니다 (“MY 로거” 회로도 참조).<br />
입력단자의 시험회로도 스위치만으로 충분합니다 (그냥 선을 잇고 떼는 것으로도 O.K ) .<br />
<span style="color: #2cb3b3">※ “MY 로거”의 외부출력 단자는 튼튼한 스크류 터미널입니다. 그러므로 납땜없이 선을 연결하고 제거할 수 있어 여러가지 실험에 무척 편리합니다.</span></p>
<p>실험회로를 보면 내/외부의 전원이 전혀 필요없다는 것을 알 수 있습니다. (외부회로와 GND는 연결하여야 함) 이러한 조건은 외부 응용회로를 “MY 로거”와 무관하게 설계할 수 있도록 만들어 주므로, (인터페이스 회로 설계에서) 무척 중요한 포인트가 됩니다.<br />
DI/O 실험결과 “MY 로거”를 이용해서, PC에서 (원격으로) 디지털 출력전압을 제어하거나 입력단자의 전압을 확인하는 작업이 매우 간단하다는 것을 확인하게 되었습니다. 응용하기에는 입/출력 단자수가 부족하다는 걱정이 든다구요? 응용하기 나름이랍니다. 앞으로 여러가지 사용 예를 보실 테니까요.</p>
<p>&nbsp;</p>
<p><strong><span style="color: #d72844;font-size: large">&#8220;MY 로거&#8221; A/D (Analog to Digital Conversion) 시험 </span></strong></p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로설명 (circuit description)</strong></span><br />
이번 시간에는 “MY 로거”의 아날로그 입력 동작들을 시험해 보겠습니다. “MY 로거” 는 2개의 외부단자 중 (위 쪽의) 1번 외부단자를 아날로그 입력들에 배정하고 있습니다.<br />
“MY 로거”는 (외부단자 1의) 4개 단자에서 네 개 전부를 아날로그 입력단자로 배정하고 있으며, 각 단자명은 A/D 1, A/D 2, A/D 3, A/D 4 이고 단자 배치는 아래의 그림과 같습니다.</p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로도 (The circuit diagram)  : “MY 로거” A/D 단자 동작시험</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC011.jpg" rel="lightbox[10555]"><img class="alignnone size-large wp-image-10789" alt="05SC011" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC011-477x620.jpg" width="477" height="620" /></a><br />
아날로그 입력 명령은 a1, a2, a3, a4, a5의 다섯 가지로, 처음의 ‘a’문자는 analog를, 두 번째 1-5 문자는 단자를 의미합니다. 그러므로 ‘a1’명령은 A/D 1단자의 전압을 “MY 로거”에 문의하게 됩니다. 명령을 받은 “MY 로거”는 A/D 1단자의 전압을 체크한 후, 상위 하위의 두 문자를 보내줍니다.<br />
PC측에 위치한 통신 프로그램에서는 “MY 로거”에서 보내온 (상위, 하위) 두 문자를 각각 애스키 숫자로 변환한 후 (필요한) 계산을 거쳐 사용하게 됩니다.<br />
<span style="color: #2cb3b3">※ “a2”, “a3”, “a4”명령은 각각 A/D 2, A/D 3, A/D 4입력단자에 적용되며, 명령의미는 “a1”과 동일</span></p>
<p>명령중에 “a5” 명령은 입력 전압을 체크하는데 사용됩니다. 그러나 입력전압의 범위는 7.5 ~ 15V 까지 폭이 넓은 반면에, 16F873A의 A/D 입력범위는 0~5V 이므로 입력 전압과 측정 전압간에 범위가 일치하지 않습니다. 이 문제를 해결하기 위해 “MY 로거”에서는 저항으로 입력 전압을 1/4로 분압하여 측정하고 있습니다. 그러므로 “a5” 명령으로 측정한 전압에 4배를 해 주어야 정확한 입력 전압을 읽을 수 있습니다.<br />
<span style="color: #2cb3b3">※ “MY 로거”는 데이터 로거(Data Logger)의 특성상 독립적으로 (고립되어) 동작시킬 수 있어야 합니다. 이 경우에 전원으로는 전지나 배터리를 사용하게 되므로 항상 돌발적인 전원 전압 강하에 유의할 필요가 있습니다. 이런 이유로 16F873A의 A/D 단자중 하나를 내부전원 감시용으로 배치하였습니다.</span></p>
<p>그림에 “MY 로거” 디지털 입/출력단자와 시험회로가 나와 있습니다.<br />
아날로그 입력을 시험하기 위해서는 단지 (터미널 단자끼리) 연결만 하면 충분합니다(“MY 로거”회로도 참조).<br />
<span style="color: #2cb3b3">※ “MY 로거”의 외부출력 단자는 튼튼한 스크류 터미널입니다. 그러므로 납땜없이 선을 연결하고 제거할 수 있어 여러가지 실험에 무척 편리합니다.</span></p>
<p>실험 회로를 보면 내/외부의 전원이 전혀 필요없다는 것을 알 수 있습니다. (외부회로와 GND는 연결하여야 함) 이러한 조건은 외부 응용회로를 “MY 로거”와 무관하게 설계할 수 있도록 만들어 주므로, (인터페이스 회로 설계에서) 무척 중요한 포인트가 됩니다.<br />
A/D 실험결과 “MY 로거”를 이용해서, PC에서 (원격으로) 아날로그 입력단자의 전압을 측정하는 작업이 매우 간단하며 결과가 정확하다는 사실을 확인하게 되었습니다. “MY 로거”는 여러 응용에 충분한 4ch A/D를 갖추고 있으므로 이제부터 재미있는 사용들이 예상되지 않으시는지요.<br />
<strong><span style="color: #d72844;font-size: large">PWM 출력를 이용한 D/A (Digital to Analog Conversion) 시험</span></strong></p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로설명 (circuit description)</strong></span></p>
<p>이번 시간에는 “MY 로거” 내부의 PWM 신호를 사용한 아날로그 출력을 시험해 보겠습니다. 단 “MY 로거”에는 외부단자의 부족으로 “MY 로거” 출력단자가 없습니다. 그러므로 시험을 위해 “MY 로거” 내부의 16F873A 12, 13번 단자에서 선을 (외부로) 뽑아내야 합니다.<br />
<span style="color: #2cb3b3">※ “MY 로거” 내부에서 (외부로) 선을 끌어 내 오는데는 납땜작업이 꼭 필요합니다. 납땜작업전에 반드시 16F873A 칩을 IC 소켓에서 먼저 제거하여야 합니다.(IC 소켓에서 칩을 분리할 때는 전원을 끈 후에, 작은 드라이버를 사용하면 편리합니다. 작업후에는 16F873A 칩의 1번을 확인하고 IC 소켓에 끼우십시요. )</span></p>
<p>(PWM 신호를 사용한) 아날로그 출력 명령은 d1+숫자, d2+숫자의 두 가지로, 처음의 ‘d’ 문자는 digital to analog의 의미를, 두 번째 1, 2문자는 PWM 출력 핀을, 세 번째 “숫자”는 듀티비를 의미합니다. 듀티비는 명령 중 세 번째인 “숫자” 값 0~127에 의해 0~100%까지 변화합니다. (주파수는 변하지 않습니다) 그러므로 &#8220;d1+숫자&#8221; 명령은 16F873A 13번, PWM 1단자에서, “숫자” 값으로 듀티비를 셋팅한 펄스열이 출력되도록 “MY 로거”에 지시합니다.<br />
예를들면 “d1+0” 명령은 0%듀티비, “d1+63” 명령은 50% 듀티비, “d1+127” 명령은 100%의 듀티비를 가진 펄스열을 생성하고 PWM 1단자에서 출력되도록 만듭니다.<br />
<span style="color: #2cb3b3">※ 아날로그 출력 명령의 리턴 문자는 없습니다.</span><br />
<span style="color: #2cb3b3"> ※ 듀티비 = (펄스 1 주기의) ON 시간 / OFF 시간 x 100 (%)</span></p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로도 (The circuit diagram) :  PWM 출력을 사용한 &#8220;MY 로거&#8221; D/A 실험</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC012.jpg" rel="lightbox[10555]"><img class="alignnone size-large wp-image-10790" alt="05SC012" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC012-478x620.jpg" width="478" height="620" /></a></p>
<p>(출력된 PWM 펄스를 사용하여 직류전압을 만드는) 아날로그 출력 시험에는 “MY 로거” 외부에 2단 (로우패스) 필터 회로가 필요합니다. 필터회로는 PWM 펄스열을 입력으로 받아서, (펄스열의) 평균값에 해당하는 직류전압(DC)을 출력해 줍니다.<br />
<span style="color: #2cb3b3">※ 2단 (로우패스) 필터회로를 만들 때 “MY 로거”의 GND와 필터의 GND를 반드시 연결하십시요.</span><br />
<span style="color: #2cb3b3"> ※ 제작시 16F873A의 PWM 신호핀 순서에 주의하여야 합니다.</span></p>
<p>PWM 펄스에서 변화된 직류전압은 0% 듀티비에서 0V, 50% 듀티비에서 2.5V, 100% 듀티비에서 5V가 출력되며, 출력 직류전압은 (필터의 출력단에서) 테스터로 확인할 수 있습니다.<br />
<span style="color: #2cb3b3">※ 16F873A에서 출력된 PWM 펄스는 5V의 전압크기를 가집니다. 100%의 듀티비 펄스는 (항상) ON 상태이므로 결과적으로 직류(DC) 5V를 의미합니다. 반면에 0% 듀티비는 (항상) OFF 상태의 펄스입니다. (펄스라고 말하기도 뭐하군요.) 그러므로 0% 듀티비 펄스는 직류(DC) 0V와 같은 의미가 됩니다.</span></p>
<p>실험회로를 보면 내/외부의 전원이 전혀 필요없다는 것을 알 수 있습니다. (외부회로와 GND는 연결하여야 함) 이러한 조건은 외부 응용회로를 “MY 로거”와 무관하게 설계할 수 있도록 만들어 주므로, (인터페이스 회로 설계에서) 무척 중요한 포인트가 됩니다.<br />
D/A 실험결과 “MY 로거”를 이용해서, PC에서 (원격으로) 아날로그 단자에 원하는 전압을 출력하는 작업이 가능하다는 사실을 확인하게 되었습니다. (외부의 2 단 로우패스 필터회로 필요) “MY 로거”는 두 개의 D/A 기능을 가지고 있으므로 모터 속도제어등의 재미있는 사용들이 예상되는군요.</p>
<p style="text-align: right"><span style="color: #808080">▶왕초보 전자회로의 기초 로직회로 강의를 종료합니다.<br />
수고하셨습니다.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/10555/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[5호]왕초보 전자회로 강좌특집 5부 – 1</title>
		<link>http://www.ntrexgo.com/archives/10544</link>
		<comments>http://www.ntrexgo.com/archives/10544#comments</comments>
		<pubDate>Mon, 17 Jan 2011 06:20:51 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[스페셜 컬럼]]></category>
		<category><![CDATA[5호]]></category>
		<category><![CDATA[데이터]]></category>
		<category><![CDATA[로거]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[왕초보]]></category>
		<category><![CDATA[전자회로]]></category>
		<category><![CDATA[특강]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=10544</guid>
		<description><![CDATA[디바이스마트 매거진 5호 &#124; 왕초보 전자회로 특강 5부 1편. 데이터 로거(data logger) 에 대해서 알아보자. ]]></description>
				<content:encoded><![CDATA[<table style="width: 620px" border="0">
<tbody>
<tr>
<td><img class="size-full wp-image-10792 alignleft" alt="Scimage0" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/Scimage0.jpg" width="201" height="151" /></td>
<td><span style="font-size: x-large;color: #ee1146"><strong>왕초보 전자회로 강좌특집 5부 &#8211; 1</strong></span></p>
<p style="text-align: right"><span style="font-size: small">글 |스네일앤 스네이크</span></p>
<p style="text-align: right"><span style="font-size: small;color: #808080">※ 상기 내용은 디바이스마트와 스네일앤 스네이크의 협의를</span><br />
<span style="font-size: small;color: #808080"> 통하여 사용을 득한 내용입니다.</span></p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<p><strong><span style="color: #d72844;font-size: large">데이터 로거(data logger) 개념+ 저렴한 &#8220;나의 로거&#8221; 설계</span></strong></p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로도 (The circuit diagram) : 인터페이스란 물리세계와 컴퓨터 세계의 국경에 세워진 검문소</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC001.jpg" rel="lightbox[10544]"><img class="alignnone  wp-image-10779" alt="05SC001" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC001-620x576.jpg" width="558" height="518" /></a></p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로설명 (circuit description)</strong></span><br />
필자는 (누구나) 어떤 새로운 일을 배울 때면, (반드시) 목적이 있거나 또는 있어야 한다고 생각합니다. 예를 들면 새로운 게임을 습득하려고 할 때 화려한 그래픽, 현란한 사운드, 탄탄한 스토리, 친구들과의 협동 또는 경쟁, 승리의 기쁨 등을 마음속에 그리고 있다고 할 수 있습니다. 영화나 만화, 소설책에서는 새롭고 특이한 모험과 악의 응징, 지순하고 열렬한 사랑, 인간애 또는 무지막지한 공포와 반전을 기대합니다. 음악에서는 정열적이거나 차분하게 정리되는 마음을 월드컵 축구와 같은 운동경기에서는 (각본없는 드라마에서 느낄 수 있는) 예기치 않은 감동을 마음속에 두고 있습니다. 그렇다면 전자회로에서는 (이들과는 다른) 감동적이고 가슴 벅찬 새로운 어떤 것을 기대할 수 있을까요? 한 마디로 어떤 목적이 있기에(보통 사람들이) 전자회로를 공부할 만한 가치가 있는 것인가요?</p>
<p>답은 자연세계 안에서 여러분을 관객이 아닌 주인공으로 만들어 준다는 것입니다. 다시 설명하면 (우리가 살아가는) 물리세계의 변화나 기계의 동작을 관측하고 해석해서 그들을 (원하는 대로) 움직일 재주와 능력이 있는 주연(not 관객)이자 창작자의 반열로 여러분을 초대하는 것입니다.<br />
즉 영화의 감독, 연극 무대나 드라마의 PD, 책의 작가, 만화가, 팝이나 가요, 교향곡의 작곡가, 그림의 화가, 게임의 제작자나 스토리 메이커와 같은 수준이라고 보시면 이해하기 쉽겠지요.</p>
<p>살아가는 인생이란 연극 가운데서 주인공의 역활을 맡고자 하는 마음은 누구에게나 공통적인 욕망입니다. 문제는 나의 재능(talent)에 적합한 어떤 역활의 주인공을 선택하느냐 하는 것이지요.<br />
인생의 주인공은 인간세계와 자연세계의 크게 두 부류로 나누어 집니다. 물론 두 세계를 총괄하는 신(神)이라는 총 감독이 있기는 하지만 복잡하게 분화되어 있는 세상에서 나만의 (작은) 역활을 찾아내는 것이 그렇게 어렵지만은 않을 것입니다.<br />
“전자회로를 이해”한다는 뜻은 (자연세계 안에서) 나를 주인공으로 하여 씌여진 대본을 읽을 수 있는, 아이템(기술) 중 하나를 찾았다는 점을 의미합니다. 또 하나의 아이템은 “컴퓨터 언어”이며 마지막 아이템은 “센서와 엑튜에이터”입니다.<br />
<span style="color: #2ebbbb">※ PC 자체와 Basic, C, C++와 갈은 컴퓨터 언어는 이미 널리 보급되어 있습니다. (필요하다면 쉽게 배울 수 있는 책과 자료도 많이 있고요.) 센서는 처음부터 끝까지 (다 배우고 나서) 사용할 수 있는 것이 아닙니다.</span></p>
<p>내가 관심있는 분야가 나타나면, 그 때 집중적으로 탐구하는 형식으로 공부하는 방법이 유효합니다. (종류가 워낙 다양하기 때문이죠.) 모터와 솔레노이드로 대표되는 엑튜에이터는 몇몇만 이해하면 충분합니다. 그러므로 전자회로만 활용할 수 있으면, 여행준비의 50%는 완료되는 셈이지요.<br />
우리의 자연세계 이해와 통제(제어)를 위한 여행에서 전자회로의 습득은 “인터페이스 영역”을 담당하는 회로를 제작하는데 목적이 있습니다. “인터페이스 영역”이란 컴퓨터”세계와 물리세계의 국경선에 세워진 검문소(초소)와 같은 것으로, 그림에서 ②, ③번을 합한 부분입니다. 이 부분을 거쳐서 컴퓨터 명령은 전압과 전류로 변환되어 물리세계로 전달되며, (센서에 의해 전압/전류로 바뀐) 물리세계의 신호는 컴퓨터의 언어가 이해할 수 있는 디지털 데이터로 전환되는 것입니다.<br />
“인터페이스 영역”은 데이터 수집/제어 보드와 시그널 컨디셔너라는 고가의 장치로 판매되고 있습니다. 전용 소프트웨어도 마찬가지입니다. 이 이야기는 우리에게 들어가고 싶어도 (입장권이 비싸서) 문 앞에 서 있을 수 밖에 없는, 테마동산 앞의 어린이를 연상시킵니다. 이 어린이는 우리의 호기심을 의미합니다.<br />
오늘날 보통 사람들까지도 PC를 보유하고 있습니다. 교육에 의해 컴퓨터 언어를 구사할 수 있는 사람도 많아졌습니다. 더구나 우리나라는 세계최고의 인터넷 환경을 자랑합니다. 인터넷의 발달로 (과거에는 꿈도 꿀 수 없었던) 자료의 공유와 고급정보의 습득이 용이해졌습니다. 기술의 발달로 전자부품과 각종 센서, 모터의 종류는 나날이 풍부해지고 가격은 이미 저렴합니다. 어떻게든 인터페이스라는 (최후의) 장벽을 부수고, 새로운 공기를 맛 보고 싶지 않으십니까? 필자는 이와같은 강한 욕구와 충동을 느낍니다.</p>
<p>위의 그림에서처럼, 지금까지 소개한 전자회로와 마이컴의 지식만으로 ②, ③번 “인터페이스 영역”의 기술적 내용을 충분히 이해할 수 있습니다.<br />
필자의 전략을 말씀드리지요. ②번의 로거/콘트롤러는 (반복해서) 사용되며, 반드시 마이컴을 사용해서 개발해야 합니다. 마이컴은 초보자가 단시간에 습득하기 힘듭니다. (동작의 이해는 가능합니다) 그러므로 ②번은 전문가가 개발합니다. 단 사양 (즉 성능)을 크게 낮춰서 개발합니다. 걱정하지 마십시요. 성능을 낮춰도 80~90%의 대상에는 적용 가능합니다. 그렇게 되면 개발시간이 단축되고 개발비가 적게 들 뿐만 아니라, 만들어진 로거/컨트롤러의 가격도 함께 저렴해집니다.<br />
<span style="color: #2ebbbb">※ ②번의 로거/콘트롤러부의 정식명칭은 A/D를 중시한 DAQ (Data Acqusition) 보드와 D/A, I/O, Counter/Timer 보드입니다. 대부분의 보드(board)는 PC 슬롯에 장착되는 구조를 채택하고 있습니다.</span></p>
<p><span style="text-decoration: underline"><strong>로거(Logger)란, 본래 PC와 분리되어 독자적으로 데이터를 수집/저장하는 장치를 일컫는 용어입니다.</strong></span><br />
③번 “시그날 컨디셔닝” 부분은 ④, ⑤번의 대상에 따라 달라집니다.<br />
이 부분에 (지금까지 공부해 온) 전자회로로 직접 제작합니다. 브레드보드에 만들어도 좋고, 만능기판에 납땜해 만들어도 좋습니다. 어차피 ③번 부분은 전자회로로 구성되는 부분이니까요.<br />
<span style="color: #2ebbbb">※ ④, ⑤번 (물리세계의) 대상 선정과 측정/제어방법은, 본 홈페이지의 프로젝트 테마로 꾸분히 개발되어 나갈 것입니다. (개발된 테마의 개선과 확장에는 많은 분들의 도움이 필요하게 되겠지요.)</span></p>
<p>①번 PC 부분은 프로그래밍만 남습니다. ②번을 (표준 포트를 사용하도록 설계하면) 따로 프로그램을 작성하지 않고, (응용 프로그램 만으로) 간단히 동작을 확인할 수 있습니다. 그러나 기본 동작의 확인만으로는 성에 차지 않게 될 것입니다. 내 생각대로 동작시켜 보려면, 프로그램을 확장해서 작성하면 됩니다. 표준 통신포트를 이용하므로, 현존하는 모든 프로그램 언어를 활용할 수 있습니다. 도전 하십시요.</p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로도 (The circuit diagram) : : 나의 로거 설계전략 (MY Logger Design Strategy)</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC002.jpg" rel="lightbox[10544]"><img class="size-large wp-image-10780 aligncenter" alt="05SC002" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC002-538x620.jpg" width="538" height="620" /></a></p>
<p>지금까지 제시한 데이터 인터페이싱의 핵심을 이루는 로거/콘트롤러 (Logger/Controller)의 설계전략을 설명 하겠습니다.<br />
설계전략의 기본은,</p>
<p>1. 간단한 사용<br />
2. A/D, D/A, I/O 통합기능<br />
3. 샘플링 레이트로 수 회 samples/sec 정도를 목표 (1초에 2~3 회 자료수집과 명령수행이 가능)<br />
4. 펌 웨어 업그레이드 기능<br />
5. 저가형 설계 (안정화 전원회로를 내장한) 등으로 요약할 수 있습니다.</p>
<p>이 정도 성능이면 필요한 (초급 수준의) 신호처리 회로를 제작하고, PC에서 작성한 간단한 프로그램만으로 대다수의 (기초) 실험을 수행하면서 자료 수집과 해석 및 제어 실험을 만끽해 볼 수 있습니다.<br />
1번 목표를 위해 PC의 표준 I/O 포트인 RS-232 통신방식으로 명령을 받고, (수집한) 자료와 (명령)수행 결과를 PC로 전송하도록 설계합니다.<br />
명령과 데이터 형식은 ASCII 방식을 사용 (문자교환방식)<br />
2번 목표를 위해 5 ch A/D 컨버터가 내장된 PIC16F873A 마이크로 콘트롤러를 채택하였습니다.<br />
3번 목표를 위해 RS-232 통신/문자명령 처리등을 위한 임베디드 프로그램을, C 언어로 개발합니다.<br />
4번 목표를 위해 부트로더(boot Loader) 프로그램을 내장합니다. PIC용 부트로더는 사용법과 자료가 인터넷에 공개되어 있습니다. 부트로더를 채택함으로써 언제라도 새로운 버젼의 펌웨어를 업그레이드 할 수 있게되어 로거/콘트롤러의 활용도가 높아지고 기능변경과 개선이 용이하게 됩니다.<br />
5번 목표를 위해 다소 투박하더라도 표준형태의 부품을 사용합니다. 또 (자신에게 맞는 형태의) 로거/콘트롤러를 제작하고 싶은 사람들을 위해 부품만도 따로 공급합니다(PCB 형태의 완제품도 판매).</p>
<p>마이컴에 익숙한 사람이라면, 자신만의 로거/콘트롤러를 설계하고 만들 수 있으리라고 생각됩니다. 왜냐하면 로거/콘트롤러 프로그래밍에 특별히 어려운 부분은 없기 때문입니다(회로도는 다음 페이지에).<br />
그러나 필자의 의견으로는 굳이 로거/콘트롤러를 따로 설계해서 제작하지 않기를 권합니다. 그 이유는 (앞으로 프로젝트를 진행하면서 점차 밝혀 지겠지만) 이제부터 진행하려는 프로젝트에서, 로거/콘트롤러는 일종의 (부분적인) 부품에 불과하다는 점을 이해하게 될 것이기 때문입니다.<br />
정말 재미있고 흥미를 자아내는 주제는 실제 세상에서 데이터를 수집하고 해석해서 의미를 알아내고, 모터를 제어해서 원하는 동작을 만드는 등의 문제를 해결해 나가는 것입니다.</p>
<p>이 과정에서 로거/콘트롤러가 중요한 부품이기는 하지만, 한 편으로는 사용할 수 있으면 충분하다고 볼 수도 있는 것입니다. 왜냐하면 로거/콘트롤러 그 자체만으로는 어떤 문제가 해결되지 않으며, 반드시 다른 부분들과 조합되어 사용되어야 하기 때문입니다. 이런 이유로 대학과 연구소에서도 고가의 DAQ 보드를, (설계하지 않고) 구입해서 사용하는 것입니다. 결론적으로 로거/콘트롤러는 (최종)목적에 도달하기 위한 하나의 필요품일 뿐입니다.</p>
<p>&nbsp;</p>
<p><strong><span style="color: #d72844;font-size: large">제작한 &#8220;원격로거(remote logger) = MY 로거&#8221; 명칭 및 회로도</span></strong></p>
<p>&nbsp;</p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로설명 (circuit description)</strong></span><br />
전 지금까지 제시한 (우리의) 목적과 사양에 맞는 원격로거를 설계/제작/테스트 하였으며, 이름은 “MY 로거”라고 붙였습니다.<br />
<span style="color: #2ebbbb">※ 브레드보드에서 테스트한 “MY 로거”는 1.0 버젼, PCB에 제작하도록 설계한 타입은 2.0 버젼</span><br />
<span style="color: #2ebbbb"> 설계/제작한 “MY 로거”의 사용법, 펌웨어 업그레이드, 통신 프로그램, 실험예 등등을 설명하기에 앞서 필요한 각부의 명칭과 회로도를 먼저 소개합니다.</span></p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로도 (The circuit diagram) “MY 로거”각부의 명칭과 기능</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC003.jpg" rel="lightbox[10544]"><img class="size-large wp-image-10781 aligncenter" alt="05SC003" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC003-502x620.jpg" width="502" height="620" /></a><br />
“MY 로거”는 PC나 노트북 컴퓨터의 COM 포트와 연결되어 사용됩니다 (펌웨어 업그레이드도 동일).<br />
“MY 로거”는 4개의 A/D 채널과 2개의 디지털 입력(DI), 2개의 디지털 출력(DO)을 제공합니다. 그러나 펌웨어를 교체하면 디지털 입/출력 단자의 수를 조정할 수 있어 편리합니다(최대 8 단자).<br />
<span style="color: #2ebbbb">※ 2 단자의 PWM 출력을 제공합니다. (PWM 출력을 RC 필터링하여 간이 D/A로 사용할 수 있습니다. ) 단 “MY 로거” PCB내부에서 (외부로) 선을 연결해야 합니다. (납땜필요)</span></p>
<p>“MY 로거”는 4개의 LED로 동작상태를 쉽게 모니터할 수 있습니다. 또 항상 입력 전압을 감시하도록 설계되어 있으므로, 원격사용에 적합합니다.<br />
“MY 로거”는 견고한 커넥터, 잭, 터미널을 사용하여, 다루기 편리하고 튼튼합니다.<br />
“MY 로거”는 일반부품으로 설계하였으므로 부품조달이 용이하고 제작비가 저렴합니다.<br />
<span style="color: #2ebbbb">※ “5V 출력 핀”에서 제공되는 전류는, 내부의 7805에서 공급되므로 100mA를 넘기지 않도록 주의해야 합니다. (7805 정전압 IC의 최고 정격은 1A 이지만, 방렬판이 없으므로 큰 전류의 공급은 무리)</span></p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로도 (The circuit diagram) : : 원격 로거/콘트롤러 회로도 (Ver 2.0)</strong></span></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC004.jpg" rel="lightbox[10544]"><img class="wp-image-10782 aligncenter" alt="05SC004" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC004.jpg" width="496" height="776" /></a></p>
<p>“MY 로거”회로는 평범한 마이컴회로 범주이므로 일반적인 설명은 생략합니다.<br />
전원잭에서 공급되는 전원의 +/_ 방향에 영향을 받지 않도록, 브릿지 회로(D1~D4)를 이용하였습니다.<br />
마이컴 단자에 직렬 연결된 330Ω 저항은, 실수로 출력단자가 GND에 연결되였을 때 마이컴 파손을 막기 위한 목적입니다.<br />
회로도의 점퍼(Jumper)는 “MY 로거”의 A/D 4단자를 전부 DI 입력로 사용할 때, 마이컴 단자에 100k 풀업저항을 연결하기 위한 용도입니다. 이 때 (삽입되어 있지않은) R16~19, 100K저항도 추가로 연결하여야 합니다. (“MY 로거”를 “콘트롤러” 입력전용으로 사용할 때 변경하면 O.K)<br />
<span style="color: #2ebbbb">※ R16~19 저항은 “MY 로거” 제작시에 조립되지 않으며, 따로 공급됨.</span></p>
<p>“MY 로거”의 외부전원을 전지나 배터리, 태양전지로 연결할 경우를 대비해서 (가급적 소비전력이 적도록) LED 전류제한 저항을 10k로 설계하였습니다. 그 결과 LED 밝기가 희미하나 고장은 아닙니다.</p>
<p>&nbsp;</p>
<p><strong><span style="color: #d72844;font-size: large">&#8220;MY 로거&#8221;의 간단한 사용법</span></strong></p>
<p>&nbsp;</p>
<p><span style="color: #ff9900"><strong><span style="text-decoration: underline">▶ 회로설명 (circuit description)</span></strong></span></p>
<p>이전 시간의 설명들에서 PC에 RS232 (통신)방식으로 연결해서 원격으로 조종할 수 있는, 원격 로거/콘트롤러의 필요과 사양등의 전체 윤곽을 이해하셨을 것입니다.<br />
이번 시간에는 (설명한 개념으로 설계/제작된) “MY 로거”의 사용법을 설명합니다. 옛 속담에 “구슬이 서 말이라도 꿰어야 보배&#8221; 라는 말이 있습니다. 그러므로 만들어진 &#8220;MY 로거”가 진가를 발휘하려면 적절한 성능에 더해서, 쉽게 사용할 수 있으며 깔끔한 동작이 보증되어야 할 것입니다.<br />
(설계/제작한) “MY 로거”는 RS232C 통신을 이용한 원격조정이 목적이므로, 가장 간단하면서도 보편적으로 널리 사용되는 애스키 코드(ASCII code) 형식을 명령과 데이터 전달에 사용합니다.<br />
※ 애스키 코드(ASCII code) : ASCII는 American Standard Code for Information Interchange의 약자로 1963년에 미국에서 제정된 (정보교류용) 표준코드 입니다. 그 목적은 각 시스템간에 정보를 교류한다는 것이었지만, 이것이 자리잡는데에는 무려 15년이라는 시간이 소요 되었습니다. ASCII code는 컴퓨터 코드체계를 선점하여, 가장 큰 영향력을 발휘하였으며 현재까지도 호환성이 좋으며 나중에는 확장판(Latin-1, Extended ASCII)이 발표 되기도 하였습니다.<br />
애스키 코드의 형식은 영문 알파벳을 컴퓨터가 인식하도록 하기 위해, (각 문자마다 정해진) 8비트 이진법 숫자 체계를 약속한 것으로, 현재 영문 텍스트포맷의 표준으로 되어 있습니다.</p>
<p><strong><span style="text-decoration: underline"><span style="color: #ff9900;text-decoration: underline">▶ 회로도 (The circuit diagram) : : “MY 로거”의 초 간단 사용법 (MY Logger Command)</span></span></strong></p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC005.jpg" rel="lightbox[10544]"><img class="wp-image-10783 aligncenter" alt="05SC005" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC005.jpg" width="499" height="649" /></a></p>
<p>“MY 로거”사용법은 간단합니다. 먼저 준비작업으로 PC COM 포트와 “MY 로거”를 (RS232C 통신) 케이블로 연결하고, “MY 로거”에 전원을 연결하면 O.K 입니다(케이블 길이는 10m 까지 허용).</p>
<p>준비가 끝나면 PC에서 정해진 문자열을 (케이블이 연결된) COM 포트로 보내면, &#8220;MY 로거&#8221;가 수신하고 명령을 해독해서 수행하고, 신속하게 결과를 보내 줍니다.<br />
예로 “MY 로거”의 1번 디지털 입력핀의 상태를 알고 싶으면(“MY 로거”로) “i1” 문자열을 보냅니다. 그러면 “MY 로거”는 1번 디지털핀의 전압을 검사해서 High면 T, Low면 F 문자를 보내옵니다. 만일 1번 디지털 출력핀을 High 상태로 셋팅하고 싶으면, “o11” 문자열을 보내면 끝입니다. (간단하지 않나요?) “MY 로거” 명령어는 2개 또는 3개의 문자들로 이루어집니다. 첫 번째는 명령의 종류를, 두 번째는 포트번호를, 세 번째 문자는 데이터를 의미합니다. (그림참조)</p>
<p><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC006.jpg" rel="lightbox[10544]"><img class="wp-image-10784 aligncenter" alt="05SC006" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC006-620x252.jpg" width="496" height="202" /></a></p>
<p><strong></strong><br />
<span style="background-color: #ffffff;color: #28a3a3">※ 주1 : T는 입력단자가 High 상태 (약 5 V), F는 입력단자가 Low 상태 (약 0 V) 임을 의미합니다. </span><br />
<span style="background-color: #ffffff;color: #28a3a3">※ 주2 : “MY 로거”는 0~5V 입력전압을 10 bit A/D로 변환한 후상위, 하위의 두 문자로 나누어 보내줍니다. 측정된 전압값은 (보내진 상위, 하위) 두 문자를 애스키 (10진 값에 해당하는) 숫자로 변환하고 약간의 수정을 거치고, 계산하여 구합니다. (전압값 계산과정은 PC에서 이루어집니다) </span><br />
<span style="background-color: #ffffff;color: #28a3a3">※ 주3 : “a5”명령으로 “MY 로거”의 입력 잭에 공급되는 전압의 1/4 값을 측정합니다. 전압을 다운하여 측정하는 이유는 공급전압이 5V 보다 훨씬 높을 수 있기 때문입니다. </span><br />
<span style="background-color: #ffffff;color: #28a3a3">※ 주4 : 테이터로 0~127 값에 대응하는 ASCII 문자를 (“MY 로거”로) 보냅니다. “MY 로거”에서는 데이터 문자의 애스키 숫자에 비례하는 PWM 듀티비를 계산한 후, 지정된 포트에 펄스열을 출력합니다. 0~5V 범위의 아날로그 전압은 PWM 출력펄스를, 한 번 더 (RC 로우패스)필터를 거쳐 만들어집니다. </span><br />
<span style="background-color: #ffffff;color: #28a3a3">※ 명령은 아니지만 리셋버튼이 눌렸다 떼어지거나 전원이 새로 투입되면, “MY 로거”는 (정해진) &#8220;초기 문자열&#8221;을 보내옵니다. (Ex : Logger! Ver 2.0) </span><br />
<span style="background-color: #ffffff;color: #28a3a3">※ ‘rr’리셋 명령은 잘못된 명령을 보냈거나 또는 (노이즈와 같은) 이유로 “MY 로거”가 응답하지 않을 때 사용합니다. 리셋 명령은 “MY 로거”의 명령 해석루틴을 초기화시켜 새로 시작하도록 합니다. </span><br />
<span style="background-color: #ffffff;color: #28a3a3">※ 명령 문자열은 필요에 의해 추가/삭제될 수 있습니다. (임베디드 프로그램 변경이 필요함)</span><br />
<span style="background-color: #ffffff;color: #28a3a3">※ “MY 로거”RS232 통신사양 : 19200 bps (bit per second), 8 bit data, 1 stop bit, No parity</span></p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로설명 (circuit description)</strong></span><br />
PC와 “MY 로거”의 통신에서 명령어와 데이터에 사용되는 애스키 코드(ASCII code)에 대해 설명하겠습니다.<br />
아래에 위치한 그림의 표를 보면, (128개의) 애스키 코드는 키보드에서 표현여부에 따라 특수문자와 보통문자로 나누어집니다. 그리고 각 문자에는 0에서 127사이의 고유번호가 부여되어 있습니다.<br />
PC나 마이컴은 모두 디지털 로직을 바탕으로 동작하므로, 모든 데이터는 High와 Low의 이진 데이터로 표현됩니다. 그러므로 0~127의 10진 숫자는, 7비트의 2진 숫자로 바뀌어 사용됩니다. (2^7=128)<br />
<span style="color: #28a3a3">※ 마이컴의 자료이동에 사용되는 최소 데이터 단위는 관례적으로 “8 비트”이므로, 부득이 여분의 최상위 비트는 표준 애스키 코드에 사용되지 않습니다.</span></p>
<p>애스키 코드(ASCII code)에 의하면 ‘A’라는 문자는 10진수 65로, ‘A’= 65라는 식이 성립됩니다. 즉 숫자가 문자로 대치되는 것이며, 반대로 문자도 숫자로 표현될 수 있습니다. 명백히 이런 변환이 필요한 이유는 인간(人間)은 문자로 표현해야 이해가 가능하지만, 컴퓨터는 (문자를 다룰 수 없으며) 오직 숫자로만 의사전달과 계산이 가능하기 때문입니다.<br />
그러므로 컴퓨터와 인간, 서로간의 차이를 극복하기 위해서 문자와 숫자 사이의 관계를 약속한 문서가 필요해 집니다. 바로 애스키 코드(ASCII code)입니다.<br />
애스키 코드(ASCII code)에 의해 “문자 = 숫자”가 되므로 혼란스러운 일이 많이 발생합니다. 예를들면 문자끼리 더하기를 할 수 있습니다.<br />
‘A’ + ‘*’= 65 + 42 = 107 = ‘k’ 가 됩니다. 문자 ‘0’은 10진 숫자로 48 입니다. 따라서 ‘0’ + ‘1’ = 48 + 49 = 97 = ‘a’ 가 되고 맙니다. 원래 문자끼리 더할 수는 없는 것이므로, 내용을 모르는 사람에게는 이해할 수 없는 수수께끼로 되는 것입니다. 세상에는 이와 같은 일이 많습니다.<br />
또 하나의 중요한 점은 이제 한 쪽에서 문자를 보내도, 받는 쪽에서 숫자로 사용할 수도 있다는 것입니다. 반대의 경우도 발생합니다. 이제 컴퓨터 (논리) 세계에서, 숫자와 문자는 같은 의미를 같는다는 점을 반드시 마음속에 새겨 두어야 혼란을 피할 수 있습니다.<br />
<span style="color: #28a3a3">※ 키보드로 표현되지 않는 특수문자는, 오로지 숫자로 표현하여야 합니다. “MY 로거”에서는 숫자 데이터를 전송하기 위해 애스키 문자를 이용하므로, 0~127 사이의 모든 문자를 사용하고 있습니다. 따라서 특수문자를 표현에는 (해당하는 애스키) 숫자를 기입합니다.</span></p>
<p>“MY 로거” 사용법을 설명하면서 간단하게 사용한다는 것과, 기술 의미를 설명한다는 것은 다르다는 것을 느꼈습니다. 성능이 약하다고는 하나, 고가의 DAQ 보드를 대체하려는 로거가 간단하기만 하다면, 이 또한 앞 뒤가 맞지 않습니다. 그러나 사용자의 입장에서 보면 (굳이 어려운 내부기술을 모르더라도) 재미있고 유용하게 사용할 수 있으면 충분하다고 생각합니다.<br />
다만 설계자의 입장에서, 자세한 내부 구조를 설명해 두는 것이 여러모로 유용하리라고 믿고 있습니다. 특히 PC측 소프트웨어를 작성하려면 이 정도의 예비 지식은 반드시 필요하리라고 생각하므로, 초보자께서는 이해하여 주시기 부탁 드립니다.</p>
<p><span style="text-decoration: underline;color: #ff9900"><strong>▶ 회로도 (The circuit diagram) :  애스키 코드 (ASCII code)와 RS-232C 통신의 테이터 구</strong></span></p>
<p style="text-align: center"><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC007.jpg" rel="lightbox[10544]"><img class="wp-image-10785 aligncenter" alt="05SC007" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SC007.jpg" width="494" height="1270" /></a></p>
<p style="text-align: right"><span style="color: #808080">다음편에서 계속 됩니다.</span></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/10544/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[5호]위드로봇 무료강좌 기술자료 -1차</title>
		<link>http://www.ntrexgo.com/archives/7658</link>
		<comments>http://www.ntrexgo.com/archives/7658#comments</comments>
		<pubDate>Mon, 17 Jan 2011 05:22:38 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[스페셜 컬럼]]></category>
		<category><![CDATA[5호]]></category>
		<category><![CDATA[mems]]></category>
		<category><![CDATA[강좌]]></category>
		<category><![CDATA[관성]]></category>
		<category><![CDATA[매거진]]></category>
		<category><![CDATA[위드로봇]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=7658</guid>
		<description><![CDATA[디바이스마트 매거진 5호 &#124; MEMS 관성 센서 원리 및 활용법에 대한 주제로 진행된 이번 강좌의 강의 내용을 참석하지 못한 디바이스마트 매거진 구독자들을 위해 간단히 소개하고자 합니다. 2차, 3차, 4차로 진행된 강의 내용들도 순서대로 소개될 예정이니, 기대하셔도 좋을 듯 싶습니다.]]></description>
				<content:encoded><![CDATA[<h3> <a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1013.jpg" rel="lightbox[7658]"><img class="wp-image-7689 alignleft" alt="05SCWITH1013" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1013-620x424.jpg" width="245" height="167" /></a><span style="color: #003300">1차 릴레이 무료강좌 기술자료</span></h3>
<h2><strong><span style="color: #333333">MEMS 관성 </span></strong></h2>
<h2><strong><span style="color: #333333">센서 원리 및 활용법</span></strong></h2>
<p><span style="color: #666699"><strong>부제 | 3축 가속도, 자이로 센서 응용</strong></span></p>
<p style="text-align: left"><span style="color: #333333">글 | 위드로봇(주) 김도윤대표</span></p>
<p style="text-align: left">
<p><span style="font-size: 13px;line-height: 19px">위드로봇 연구실 확장 이전 기념 릴레이 무료 강좌 1차 교육이 2010년 11월 27일 토요일에 성수동 위드로봇 본사에서 진행 되었습니다.  MEMS 관성 센서 원리 및 활용법에 대한 주제로 진행된 이번 강좌의 강의 내용을 참석하지 못한 디바이스마트 매거진 구독자들을 위해 간단히 소개하고자 합니다. 2차, 3차, 4차로 진행된 강의 내용들도 순서대로 소개될 예정이니, 기대하셔도 좋을 듯 싶습니다.</span></p>
<p>디바이스마트 홈페이지에는 여러 종류의 센서들이 판매되고 있는데 가속도, 자이로 센서의 설명을 보면“MEMS 가속도 센서를 이용한 3축 가속도 센서 입니다”“MEMS 자이로 센서를 응용한 제품 입니다”라는 문구를 접할 수 있다.<br />
MEMS 기술이 어떤 것인지, 어떤 장점을 가지고 있으며, 어떤 단점을 가지고 있는지 알고 있다면 이러한 센서를 보다 유의 적절하게 사용할 수 있을 것이다.</p>
<p><span style="color: #ff6600"><strong>MEMS란?</strong></span></p>
<p>MEMS는 Micro Electro Mechanical Systems의 머릿글자를 딴 약어이다. 단어를 그대로 풀어보면 소형 반도체 공법을 이용하여 기계 시스템을 만드는 것을 뜻한다.<br />
전형적인 산업용 공작 기계를 이용하면 아무리 작게 가공하여도 수 mm 이하의 부품을 만들어 내는 것은 힘들다. 하지만 반도체 웨이퍼 상에서 반도체를 제조하는 식각 공정을 이용하면 그 가공법에 한계는 있지만 수 um 수준의 부품을 만들어 낼 수 있다.<br />
이러한 MEMS 공법은 반도체 제조 공정과 동일하기에 한 번에 여러 부품을 만들어 낼 수 있으며, 품질 또한 균일하게 만들며, 크기가 작아지기에 값싸고 여러 분야에 응용할 수 있다는 장점이 있다.</p>
<table style="border-collapse: collapse" width="600" border="1" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1011.jpg" rel="lightbox[7658]"><img class="alignnone size-medium wp-image-7673" alt="05SCWITH1011" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1011-300x119.jpg" width="300" height="119" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1010.jpg" rel="lightbox[7658]"><img class="alignnone size-medium wp-image-7672" alt="05SCWITH1010" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1010-300x166.jpg" width="300" height="166" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림1. 산업용 공작기계 공정과 MEMS 공정 비교</td>
<td style="text-align: center">그림2. MEMS 기술의 시대별 주요 시장</td>
</tr>
</tbody>
</table>
<p>이와 같은 장점에 80년대 후반부터 많은 연구가 진행이 되어 왔고, 90년대에 들어와 차량용 에어백 장착이 의무화되면서 MEMS 가속도 센서 시장의 확대로 1차 중흥기를 맞이한다. 이후 2000년대에 들어와 게임기, 휴대폰에 이러한 가속도 센서가 인터페이스 도구로 활용되기 시작하면서 2차 중흥기 및 본격적인 양산 시대에 돌입한다.<br />
특히 2010년 하반기에 들어서 가속도 센서에 비해 상대적으로 수 배에서 수 십배까지 비쌌던 MEMS 자이로 센서가 iPhone4를 위시하여 WiiMote Plus, 각종 테블릿 PC에 기본 장착되기 시작하며 MEMS 가속도, 자이로 센서는 수$ 대의 저렴한 가격대로 시장에 선보이고 있다. MEMS 시장을 예측하는 사람들은 2010년 이후에는 MEMS 기술이 의료(Lab on a chip), 군사 쪽에 활발히 적용되어 3세대를 열어갈 것이라 예상하고 있다.</p>
<p><span style="color: #ff6600"><strong>DLP 프로젝트</strong></span></p>
<p>MEMS 기술을 손쉽게 만날 수 있는 곳은 프로젝터이다. 90년대만해도 LCD 프로젝터가 주종을 이뤘으나, 2000년대 들어와 TI사에서 DLP(Digital Lighting Processing) 기술을 양산에 성공하면서 저렴한 DLP 프로젝터가 시장의 주종을 이루고 있다. 이 DLP 내부에 DMD(Digital Micro mirror Device) 부분이 바로 MEMS 기술을 이용한 부분이다. 반도체 공법으로 초소형 거울을 만들고 이 거울이 미세하게 움직일 수 있도록 하여 광원에서 나온 빛을 컬러 휠을 통과 시킨 후 거울에 반사시켜 하나의 이미지를 만드는 방식으로 값비싼 LCD를 대치하고 있다.</p>
<table style="border-collapse: collapse" width="600" border="1" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1009.jpg" rel="lightbox[7658]"><img class="wp-image-7671 aligncenter" alt="05SCWITH1009" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1009-620x442.jpg" width="434" height="309" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림3. DLP 내부 구조</td>
</tr>
</tbody>
</table>
<p><span style="color: #ff6600"><strong>가속도 센서</strong></span></p>
<p>MEMS 기술을 소개하는데 가속도 센서를 빼놓을 수 없다. MEMS 기술을 이용한 제품 중에서 MEMS 가속도 센서만큼 성공한 제품이 아직까지 없기 때문이다. MEMS 가속도 센서의 동작 원리는 여러 가지 방법으로 설명할 수 있겠지만 보다 손쉽게 설명하는 방법은 버스 내부에 손잡이와 기둥을 생각하면 손쉽게 이해할 수 있다.<br />
자, 우리가 버스 안에 타고 있다고 생각해 보자. 버스가 정차하고 있는 동안 손잡이는 가운데 늘어져 있을 것이다. 이 때 운전사가 가속 패달을 밟으면 자동차를 속도을 올리기 시작하며 출발할 것이고, 가속되는 순간 손잡이는 뒤쪽으로 밀릴 것이다. 어느 정도 속도를 내어 정속으로 달리기 시작하면 다시 손잡이는 가운데로 돌아올 것이고, 브레이크를 밟아 감속하기 시작하면 손잡이는 앞으로 움직인다.<br />
자, 이 때 버스 안쪽의 기둥의 거동은 어떠한가?<br />
기둥은 버스와 단단히 한 몸체를 이루고 있어 이러한 관성력과 상관없이 단단히 제자리에 서있다.</p>
<table style="border-collapse: collapse" width="600" border="1" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1008.jpg" rel="lightbox[7658]"><img class="alignnone size-large wp-image-7670" alt="05SCWITH1008" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1008-620x237.jpg" width="620" height="237" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림4. 버스 손잡이의 거동이 MEMS 센서 동작 원리와 같다.</td>
</tr>
</tbody>
</table>
<p>MEMS 기술로 만든 가속도 센서 내부도 버스의 기둥과 손잡이의 구조로 구성되어 있다. 아래 그림 5가 MEMS 가속도 센서 내부의 현미경 사진이다. 마치 빗처럼 생긴 부분을 확인할 수 있을 것이다. 이 빗처럼 생긴 부분이 바로, 센서 몸체에 단단히 붙어 있는 버스 기둥에 해당하는 부분과 버스 손잡이처럼 센서가 움직이면 자유롭게 같이 움직이는 추의 역할을 하는 부분이 중복되어 배치되어 있는 것이다. MEMS 센서는 이 양쪽에 전기를 가하여, 기둥과 손잡이의 간격이 줄어들었는지, 늘어났는지를 전기적 신호로 바꿔 외부로 출력하고 있는 것이다. 이 간극의 변화가 센서 움직임의 가속, 감속에 해당하는 것이기에 가속도 센서라 부른다.</p>
<table style="border-collapse: collapse" width="600" border="1" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1007.jpg" rel="lightbox[7658]"><img class="wp-image-7669 aligncenter" alt="05SCWITH1007" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1007-620x465.jpg" width="347" height="261" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림5. MEMS 가속도 센서 내부 구조</td>
</tr>
</tbody>
</table>
<p>그런데 이러한 MEMS 기반의 가속도 센서에는 재미있는 성질을 관측할 수 있다. 위와 같은 구조로 X축, Y축, Z축 3축으로 각각 손잡이와 기둥을 배치했다고 생각해 보자. 센서가 가만히 서 있는 경우 X축과 Y축에는 변화가 없겠지만 Z축 방향으로는 우리는 못 느끼지만 지구상에 있는 모든 물체에게 항상 작용하는 힘, 바로 중력 가속도가 작용하여 손잡이 부분이 축 늘어지게 될 것 이다.<br />
이 이야기는 3축 가속도 센서가 멈춰있을 경우 중력 가속도가 측정이 된다는 뜻이며, 센서를 회전시키면 중력 가속도가 측정되는 축이 변경되기에 센서가 어떤 포즈로 위치하고 있는지를 알 수 있다는 뜻이 된다.</p>
<table style="border-collapse: collapse" border="1" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1006.jpg" rel="lightbox[7658]"><img class="alignnone  wp-image-7668" alt="05SCWITH1006" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1006-620x264.jpg" width="496" height="211" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림6. 가속도 센서 위치에 따른 중력 가속도 측정 축의 변화</td>
</tr>
</tbody>
</table>
<p>이 기능은 MEMS 센서를 이용하는 사용자라면 누구든지 알고 있었으나 가장 멋지게 제품으로 포장해서 내놓은 제품이 바로 iPhone/iPod touch 이다.<br />
장치를 회전하면 자동으로 알아서 화면을 가로 보기에서 세로 보기로 전환하는 기능은“팔리는 제품을 만들기 위해서는 기술을 어떻게 포장해야 하는가?”를 보여주는 단적인 예이기도 하다.</p>
<table style="border-collapse: collapse" width="600" border="1" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1005.jpg" rel="lightbox[7658]"><img class="wp-image-7667 aligncenter" alt="05SCWITH1005" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1005.jpg" width="234" height="201" /></a></td>
</tr>
<tr>
<td>그림7. 가속도 센서를 써본 사람이라면 누구든 알고 있던 기능을 스티븐 잡스는 화려한 인터페이스와 함께 멋지게 녹여냈다.</td>
</tr>
</tbody>
</table>
<p><span style="color: #ff6600"><strong>MEMS 자이로 센서</strong></span></p>
<p>MEMS 가속도 센서와 함께 널리 알려진 센서로는 MEMS 자이로 센서가 있다. 자이로 센서는 회전 각속도를 측정하는 센서로 일반 개발자들에게 많은 오해를 불러 일으키는 센서이기도 하다. 대부분의 개발자들은 회전한 각도를 알고 싶어하는데 이 때 자이로 센서를 사용하면 손쉽게 이 문제를 해결할 수 있을 것으로 생각한다. 하지만 아쉽게도 자이로 센서는 각속도 센서이지, 각도 센서가 아니다.<br />
즉 회전하면 회전하는 속도를 측정하여 알려주는 센서이기에 회전한 각도를 알고 싶으면 자이로 센서의 출력값을 적분해야 한다. 디지털 제어기에서는 적분이 매 샘플링마다 덧셈으로 바뀌기에 이 값을 계속 더해야 하는데, 아쉽게도 센서는 항상 참값(true value)만 내주지는 않는다. 센서 출력값에는 true value와 노이즈(noise)가 섞여있기 마련인데, 이 값을 계속 적분하고 있으면 시간이 흐를수록 노이즈가 누적되는 현상이 나타나며, 이를 센서 드리프트(sensor drift)라고 한다. 이를 보상하는 기법은 매우 다양하게 연구되고 있으며, 결론부터 말하면 아직까지 다른 센서 도움 없이 완벽하게 센서 드리프트를 없애는 방법은 없다. 따라서 자이로 센서만을 이용하여 각도를 측정하려는 경우는 드리프트를 가능한 작게 만드는 알고리즘을 개발하는데 만족해야 하며, 완전히 제거하려면 다른 센서의 도움이 필요하다.</p>
<table style="border-collapse: collapse" width="600" border="1" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1004.jpg" rel="lightbox[7658]"><img class="alignnone size-medium wp-image-7678" alt="05SCWITH1004" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1004-300x246.jpg" width="300" height="246" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1003.jpg" rel="lightbox[7658]"><img class="alignnone size-medium wp-image-7677" alt="05SCWITH1003" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1003-300x247.jpg" width="300" height="247" /></a></td>
</tr>
<tr>
<td style="text-align: center" colspan="2">그림8. 저가형 자이로 센서의 출력(녹색)과 알고리즘은 적용하여 각도를 추출한 경우(파란색)</td>
</tr>
</tbody>
</table>
<p>위드 로봇에서는 위 두 가지 방법을 모두 시도하여 꽤나 의미 있는 결과를 얻어냈다.<br />
우선 단일 자이로 센서의 출력에서부터 각도를 의미 있게 추출하기 위해 폐루프 제어 시스템을 구성한 뒤 강화학습 알고리즘을 적용하여 자이로 센서의 노이즈를 제거하는 방법을 개발하였다(특허 3건, 논문 2편). 실험 결과 저가형 자이로 센서를 이용하여 알고리즘을 적용한 결과 한 시간당 5도 이내의 누적 오차를 보이는 고가형 자이로에서도 얻기 힘든 결과를 획득할 수 있었다. 특히 정지되어 있지 않고 움직일 경우는 더욱 오차가 줄어들기에 활용시에는 더욱 개선된 성능을 느끼게 될 것이다.<br />
위드로봇에서는 2011년 상반기 중으로 이와 같은 알고리즘을 적용한 자이로 센서를 100원짜리 동전보다 작은 형태로 패키징하여 출시할 계획을 가지고 있다.</p>
<p><strong><span style="color: #ff6600">센서 융합</span></strong></p>
<p>자이로 센서는 가속도 센서와 융합할 경우 더욱 큰 효과를 볼 수 있다. 3축 가속도 센서와 2축 자이로 센서를 융합하면 ARS(Attitude Reference System)을 구성할 수 있다. 전형적인 구조는 각 센서의 출력값을 적절한 상태 변수(states)를 가지는 칼만 필터(Kalman filter)를 구성하여 각도를 뽑아내는 것인데, 3축 가속도와 2축 자이로의 조합일 경우는 tilt와 pitch값을 드리프트 없이 찾아낼 수 있다.<br />
위드로봇에서는 2010년 하반기에 이러한 ARS 장치를 초소형으로 제작하는데 착수하여 개발을 완료하였다. 2011년 1월 중으로 디바이스마트를 통해 판매 예정에 있다.</p>
<table style="border-collapse: collapse" width="600" border="1" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1002.jpg" rel="lightbox[7658]"><img class="wp-image-7676 aligncenter" alt="05SCWITH1002" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1002-232x300.jpg" width="186" height="240" /></a></td>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1001.jpg" rel="lightbox[7658]"><img class="wp-image-7675 aligncenter" alt="05SCWITH1001" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1001-274x300.jpg" width="219" height="240" /></a></td>
</tr>
<tr>
<td style="text-align: center" colspan="2">그림9. 개발 완료된 초소형 ARS(모델명 : myARS-USB)</td>
</tr>
</tbody>
</table>
<p>보기에는 작아 보이지만, 내부에 USB, i2c, UART 인터페이스를 가지고 있어 별도의 장치 없이 USB 케이블을 연결하면 바로 PC와 연결이 가능하다. 이 제품의 개발 과정은 위드로봇 개발자 블로그인 withrobot.tistory.com에 자세히 설명되어 있다.</p>
<table style="border-collapse: collapse" width="600" border="1" cellspacing="0" cellpadding="0" align="center">
<tbody>
<tr>
<td><a href="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1012.jpg" rel="lightbox[7658]"><img class="alignnone size-large wp-image-7674" alt="05SCWITH1012" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05SCWITH1012-620x413.jpg" width="620" height="413" /></a></td>
</tr>
<tr>
<td style="text-align: center">그림 10. myARS-USB 테스트 모습</td>
</tr>
</tbody>
</table>
<p>이 외에도 저잡음 MEMS 가속도 센서를 손쉽게 USB, UART로 연결 가능한 제품군과 3축 가속도, 3축 자이로 센서로 구성된 myIMU6-USB, 9축 IMU(3축 가속도, 자이로, 지자기 센서)도 개발 중이거나 개발이 완료되어 2011년 상반기에 출시 일정을 조율하고 있다. 이러한 제품들이 출시되면 디바이스마트 고객들은 보다 손쉽게 MEMS 기반 센서들을 다룰 수 있게 될 것이라 예상하고 있다.</p>
<p><strong><span style="color: #ff6600">같이 생각해 보고 싶은 결론</span></strong></p>
<p><strong></strong>가속도 센서와 자이로 센서의 융합을 통해 각 센서의 단점을 없애고 보다 나은 결과를 도출해 내듯이 엔지니어들도 협동(Co-work)을 통해 시너지를 낼 수 있는 팀 플레이(Team play)에 보다 관심을 쏟을 때라 생각한다.<br />
10년간 꽤 많은 국내외 학회에 참석하거나 연구소를 방문하여 국내, 국외 엔지니어들과 이야기해 보았지만 국내 엔지니어 개개인의 연구자질은 최상급이다. 문제는 이렇게 훌륭한 엔지니어들이 2명, 3명을 모아두면 1+1= 2 또는 3이 되어야 할 텐데 1.5, 1.2가 되거나 심지어는 0.8, 0.7이 된다는 점이 문제이다. 이는‘혼자 일하는 방법’만 배웠고,‘같이 일하는 방법’은 어느 누구도 가르쳐 주지 않았기 때문인 것 같다.<br />
MEMS 센서 활용에서 배울 수 있듯이‘같이 일하는, 같이 행복해지는’방법을 다같이 고민해 봤으면 한다. 위드로봇(WITHROBOT)의 ‘WITH’접두사도 이러한 고민을 담은 사명이기도 하다.</p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p><strong>이미지출처</strong></p>
<p>그림3 : 출처-Texas Instruments 홈페이지<br />
그림5 : 출처-Analog Device 홈페이지<br />
그림7 : 출처-Apple 홈페이지</p>
<p><span style="font-size: 13px;line-height: 19px"></div></span></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/7658/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[5호]Advanced Virtual Risk 정복하기!</title>
		<link>http://www.ntrexgo.com/archives/9817</link>
		<comments>http://www.ntrexgo.com/archives/9817#comments</comments>
		<pubDate>Mon, 17 Jan 2011 01:29:53 +0000</pubDate>
		<dc:creator>디바이스마트 매거진</dc:creator>
				<category><![CDATA[디바이스마트 매거진]]></category>
		<category><![CDATA[특집]]></category>
		<category><![CDATA[5호]]></category>
		<category><![CDATA[AVR]]></category>
		<category><![CDATA[LK임베디드]]></category>
		<category><![CDATA[매거진]]></category>

		<guid isPermaLink="false">http://www.ntrexgo.com/?p=9817</guid>
		<description><![CDATA[디바이스마트 매거진 5호 &#124; 우리는 AVR에서도 가장 규모가 크고 성능이 높은 응용분야에 사용되는 ATmega 패밀리 중에 ATmega 128을 사용하여 개발한 LK EMBEDDED사의 LK ATmega 128 교육용 KIT의 하드웨어를 기반으로 공부하게 될 것이다.]]></description>
				<content:encoded><![CDATA[<p><img class="size-full wp-image-9873 alignnone" alt="05FAVR033" src="http://www.ntrexgo.com/wp-content/uploads/2011/01/05FAVR033.jpg" width="620" height="235" /></p>
<p>&nbsp;</p>
<p><span style="color: #333399;background-color: #ffff00;font-size: medium"><strong>제1부 </strong></span></p>
<p><span style="color: #3366ff"><strong>개요</strong></span></p>
<p>AVR은 Atmel사에서 1997년에 개발한 8비트 제어용 마이크로프로세서로서, 프로그램 메모리와 데이터 메모리를 액세스하기 위한 버스를 독립적으로 사용하는 하버드 아키텍처와 파이프라인 처리 방식을 기반으로 하는 Risk기술을 적용하여 높은 성능을 발휘하는 것만 아니라 플래시 메모리를 생산하던 Atmel사의 장점을 살려 칩내에 플래시 메모리를 내장하고 여기에 사용자가 프로그램을 쉽게 다운로드 할 수 있는 ISP방식을 적용하였다.<br />
우리는 AVR에서도 가장 규모가 크고 성능이 높은 응용분야에 사용되는 ATmega 패밀리 중에 ATmega 128을 사용하여 개발한 LK EMBEDDED사의 LK ATmega 128 교육용 KIT의 하드웨어를 기반으로 공부하게 될 것이다.</p>
<p><strong><span style="color: #3366ff">입출력 포트(I/O PORT)</span></strong></p>
<p>마이크로프로세서(CPU)의 기능 중에서 가장 기본이 되는 기능은 주변장치와 서로 신호를 주고(Output) 받을(Input)수 있는 입출력(I/O)이다. 마이크로프로세서에서 입출력 (I/O)을 제어하기란 매우 쉽다.<br />
먼저 신호를 출력(Output)할 것인지 입력(Input)할 것인지 제어할 신호의 방향부터 결정한 후 방향에 따라 신호를 출력하거나 입력 받으면 된다. 여러분의 이해를 돕기 위해 그림을 이용하여 이해해보자.</p>
<p><img class="alignnone size-large wp-image-9832" alt="05FAVR001" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR001-620x168.jpg" width="620" height="168" /><br />
그림-1에서 빨간색으로 되어 있는 부분을 Tri-State Buffer라고 부른다. 이 버퍼에 보이는 1, 2, 3신호 선들로 구성되어 있고 동작은 버퍼 안에 어떤 신호가 입력되느냐에 따라 달라지게 된다.</p>
<p><img class="alignnone size-large wp-image-9833" alt="05FAVR002" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR002-620x176.jpg" width="620" height="176" /></p>
<p>그림-2을 보면 버퍼의 1 신호 선에 High = 1 이 흐르게 되면 버퍼가 연결되어 2 신호 값이 I/O핀을 통해 외부로 빠져나가게 되며 출력 장치 등을 제어할 수 있게 된다.</p>
<p><img class="alignnone size-large wp-image-9834" alt="05FAVR003" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR003-620x172.jpg" width="620" height="172" /><br />
그림-3을 보면 반대로 3 신호 선에 Low = 0이 흐르게 되었을 경우 버퍼가 닫히게 되어 외부의 입력 장치로부터 신호의 입력을 받을 수 있게 되는 것이다.</p>
<p><img class="alignnone size-large wp-image-9835" alt="05FAVR004" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR004-620x169.jpg" width="620" height="169" /><br />
그림-4의 박스 안에 들어 있는 이름들은 실제로 AVR에서 사용되는 레지스터들의 이름이다. 위의 설명에도 나와 있듯이 DDR 레지스터의 방향에 의해서 출력과 입력이 결정되는 것을 알 수 있었다. 이해를 돕기 위해 DDR 레지스터의 특징과 실제 예를 들어 설명해 보겠다.<br />
<span style="text-decoration: underline">※ 참고사항 ※</span></p>
<p>여기서 주의해야 할점은 Tri State Buffer 신호의 방향성이다. 만약 버퍼의 흐르는 신호에 방향성이 없다면 거꾸로 입출력 핀을 통해 역으로 신호가 들어갈 수도 있기 때문이다. 이를 막기 위해 버퍼에 흐르는 신호는 일정한 방향성이 있다. 쉽게 설명하면 도로에 그어진 일방통행 표시처럼 삼각형 꼭지점 방향으로 한 방향으로 신호가 흐르게 된다.<br />
<span style="color: #3366ff"><strong>DDR 레지스터의 특징</strong></span></p>
<p>1) 데이터의 입, 출력을 결정해주는 레지스터<br />
2) 각 포트의 각각의 비트마다 제어 가능<br />
3) 입력/출력 포트로 설정된 핀은 해당 포트로만 사용될 수 있음<br />
4) 1 : 출력(Output), 0 : 입력(Input)<br />
예) PORTB의 PB7~PB4는 출력으로 PB3~PB0는 입력으로 설정<br />
DDRB=0XF0; // PB7 BIT ~ PB4 BIT (Output) PB3 BIT ~ PB0 BIT (Input)</p>
<p><img class="alignnone size-large wp-image-9836" alt="05FAVR005" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR005-620x116.jpg" width="620" height="116" /><br />
우리는 위와 같이 입력과 출력을 설정 할 수 있는 I/O PORT에 대해 이해 할 수 있었다. 자 그럼 이제 실제 코드에 적용해 보자.<br />
<strong><span style="color: #3366ff">CodeVision AvR C컴파일러</span></strong><br />
<span style="color: #3366ff"><strong>LK ATmega 128 예제소스1 : DDR 레지</strong><strong>스터를 활용한 LED 동작하기</strong></span></p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>//예제 소스 시작<br />
#include &lt;mega128.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;delay.h&gt;<br />
void main(void)<br />
{<br />
DDRE=0XFF; //LED 출력 레지스터 설정<br />
PORTE=0X00; //LED PORT 초기화<br />
DDRG=0XFF; //BUZZER 출력 레지스터 설정<br />
PORTG=0X01; //BUZZER PORT 초기화<br />
while (1)<br />
{<br />
PORTE=0XFF; //LED ON<br />
delay_ms(1000); //딜레이 1초<br />
PORTE=0X00; //LED OFF<br />
delay_ms(1000); //딜레이 1초<br />
PORTG=0X00; //BUZZER ON<br />
delay_ms(1000); //딜레이 1초<br />
PORTG=0X01; //BUZZER OFF<br />
delay_ms(1000); //딜레이 1초<br />
};<br />
}<br />
//예제 소스 끝<br />
</div>
<strong><span style="color: #3366ff">프로그램 소스 해석</span></strong></p>
<p>1) MAIN 함수에서 DDR 레지스터와 PORT의 초기값을 결정해준다.<br />
2) LED 점등<br />
3) 1초 후에 LED 소등<br />
4) 1초 후에 BUZZER 동작<br />
5) 1초 후에 BUZZER 동작중지<br />
6) 2~5번의 동작을 계속 반복한다.</p>
<p><span style="text-decoration: underline"><strong>※ 참고사항 ※</strong></span></p>
<p><img class="alignnone  wp-image-9837" alt="05FAVR006" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR006-620x247.jpg" width="496" height="198" /></p>
<p>위의 그림은 LK ATmega 128 교육용 Kit의 회로도 이다.<br />
LED에는 풀다운 저항이 설계되어 있고 BUZZER에는 반대로 풀업 저항이 설계 되어 있다. 우리 MCU에서 출력을 어떻게 해야 할까?<br />
LED에는 MCU에서 HIGH를 출력으로 내보내야만 전위차에 의해서 LED가 작동되는 것을 알 수 있고 BUZZER에는 MCU에서 LOW를 출력으로 내보내야만 전위차가 발생되어 BUZZER가 동작 될 수 있는 것을 알 수 있다. 위의 소스를 이해하는데 참고하길 바란다.</p>
<p>1) Delay_ms(1000) 이 값의 의미는 ms 단위 시간에 1000이라는 데이터가 대입되는 것이다. 즉 1초라는 말이다. 순차적으로 시간을 제어 할 수 있다는 것은 프로그램 작성 하는데 있어서 없어서는 안될 중요한 요소다. 하지만 delay 함수를 사용할 때 주의할 점은 MCU가 정지되는 것에 있다. 가급적이면 사용하지 않는 것이 올바른 프로그램 작성이라고 할 수 있겠다. 그러면 우린 시간을 제어 할 수 없다는 말인가? 그렇지 않다. ATmega 128에서는 Timer interrupt라는 고성능에 타이머 제어 인터럽트 서비스가 존재 하기 때문이다.<br />
Timer interrupt는 우리가 I/O 제어를 원활하게 하게 되었을 때 학습하게 될 것이다.</p>
<p><strong><span style="color: #3366ff">CodeVision AvR C컴파일러</span></strong><br />
<strong><span style="color: #3366ff"> LK ATmega 128 예제소스2 : BUTTON을 이용한 LED동작하기</span></strong></p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
//예제소스 시작</p>
<p>#include &lt;mega128.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;delay.h&gt;<br />
void main(void)<br />
{<br />
DDRE=0XFF; //LED 출력 레지스터 설정<br />
PORTE=0X00; //LED PORT 초기화<br />
DDRD=0X00; //BUTTON 입력 레지스터 설정<br />
while (1)<br />
{<br />
if(!PIND.3){ //SW1 ON<br />
delay_ms(10);<br />
if(PIND.3)<br />
PORTE=0X0c; //LED 1,2ON<br />
}<br />
if(!PIND.4){ //SW2 ON<br />
delay_ms(10);<br />
if(PIND.4)<br />
PORTE=0X30; //LED 3,4ON<br />
}<br />
if(!PIND.5){ //SW3 ON<br />
delay_ms(10);<br />
if(PIND.5)<br />
PORTE=0Xc0; //LED 5,6ON<br />
}<br />
if(!PIND.6){ //SW4 ON<br />
PORTE=0X00; //LED OFF<br />
}<br />
};<br />
}<br />
//예제소스 끝</p>
</div>
<span style="color: #3366ff"><strong>프로그램 소스 해석</strong></span></p>
<p>1) DDRE을 출력으로 DDRD을 입력으로 레지스터 설정<br />
2) 스위치 1을 눌렀을 경우 LED 1번과 2번이 점등<br />
3) 스위치 2을 눌렀을 경우 LED 3번과 4번이 점등<br />
4) 스위치 3을 눌렀을 경우 LED 5번과 6번이 점등<br />
5) 스위치 4을 눌렀을 경우 LED 소등</p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
※참고사항</p>
<p><img class="alignnone  wp-image-9838" alt="05FAVR007" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR007-620x251.jpg" width="496" height="201" /><br />
위의 그림은 LK ATmega 128 교육용 Kit의 회로도 이다.<br />
스위치 입력의 신호를 확실하게 규명 짓기 위하여 풀업 저항을 이용하여 평소에는 항상 HIGH의 신호를 입력하고 있으며 스위치 동작시에맊LOW의 신호를 입력 받을 수 있게 설계 되어 있다. 여기서 중요한 것은 위의 하드웨어 특성이다. 풀업저항, 풀다운저항을 사용하지 않고 스위치를 MCU에 연결했을 경우를 우리는 플로팅 상태라고 한다. 플로팅 상태란 간단하게 설명하면 MCU 입장에서 1도 아닌 0도 아닌 어중간한 상태를 뜻한다. 즉 스위치를 누르지도 않았는데 동작 할 수도 있다는 이야기이다. 그러므로 항상 플로팅 상태를 피하기 위해서 풀업저항 또는 풀다운저항이 설계되어야 한다.<br />
</div>
<p><span style="background-color: #ffff00;font-size: medium"><strong style="color: #333399">제2부 </strong></span></p>
<p><strong><span style="color: #3366ff"> 개요</span></strong></p>
<p>ATmega 128은 4개의 범용 타이머/카운터가 있다. 종류로는 Timer/Counter0 (8비트), Timer/Counter1(16비트), Timer/Counter2(8비트), Timer/Counter3(16비트)가 있다.<br />
타이머/카운터의 제어에 필요한 레지스터는 타이머/카운터 제어 레지스터(TCCRn), 타이머/카운터 레지스터(TCNTn), 출력 비교 레지스터(OCRn)이 있으며 인터럽트 관련하여 인터럽트 플래그 레지스터(TIFR), 인터럽트 마스크 레지스터(TIMSK)가 있다.<br />
사실 타이머/카운터 레지스터에는 인터럽트 및 PWM 출력 기능을 가지고 있다. 인터럽트는 카운터의 값이 오버플로우 되는 순간에 발생하는 오버플로우 인터럽트, 카운터 값이 출력비교 레지스터의 값과 같게 되는 순간에 발생하는 출력비교 인터럽트, 입력캡쳐 인터럽트등이 있는데 우리는 그 중에 오버플로우 인터럽트를 이용하여 타이머 기능을 구현 할 것이다. 그리고 이 강좌에서는 Timer/Counter0 (8비트)를 사용하여 것이며 CodeVision AvR 컴파일러로 관련 레지스터 설정하는 방법을 통해 강의를 진행할 것이다.<br />
<span style="color: #3366ff"><strong>OVERFLOW INTERRUPT</strong></span></p>
<p>AVR은 두 가지 모드의 타이머/카운터 인터럽트를 지원하는데 출력비교 인터럽트와 오버플로우 인터럽트가 그것이다.<br />
그럼 이 인터럽트가 어떻게 동작되는지 해당 레지스터를 참조해보자.</p>
<p><img class="alignnone  wp-image-9839" alt="05FAVR008" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR008-620x121.jpg" width="496" height="97" /></p>
<p>BIT1의 OCF0는 TNCT와 OCR 레지스터의 값을 비교하여 이것이 같으면 이 비트가 1로 SET 되면서 출력비교 인터럽트가 요청된다.<br />
이 인터럽트는 처리가 시작되면 자동으로 0으로 CLEAR 된다.<br />
BIT0의 TOV0는 오버플로우가 발생되면 BIT1로 SET 되면서 오버플로우 인터럽트가 요청된다. 이 인터럽트도 인터럽트 처리가 시작되면 자동으로 0으로 CLEAR된다.</p>
<p><strong style="color: #3366ff">PRESCALER</strong></p>
<p>프리스케일러란 타이머에 공급되는 입력 클럭의 속도를 제어하는 분주기이다. 분주기는 주기를 나눈다라는 의미가 있습니다.<br />
즉 주기를 나눈다는 말은 클럭의 속도를 느리게 한다는 의미와 같다. 예를 들면 16Mhz를 4분주 한다면 4Mhz가 되는 것이다.</p>
<p><span style="color: #3366ff"><strong>TIMER/COUNTER 설정</strong></span></p>
<p><img class="alignnone  wp-image-9840" alt="05FAVR009" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR009-620x562.jpg" width="496" height="450" /></p>
<p>타이머를 사용하기 위해서는 타이머에서 사용하는 클럭에 대해서 설정을 해야 하는데 이는 프리스케일러(Prescaler) 값으로 조절할 수 있다. 프리스케일러 값은 각 타이머의 컨트롤 레지스터(TCCRn)에서 설정할 수가 있다.<br />
타이머 인터럽트는 각 타이머 관련 컨트롤 레지스터에서 적절한 프리스케일러 값을 설정한 후, 각 타이머 레지스터(TCNTn)에 설정하고 싶은 시간에 대해 인터럽트를 발생시킬 것인지에 대해 관련된 값을 설정해 주면 된다. 그리고 인터럽트를 허용해야 하므로 관련 레지스터인 TIMSK 레지스터를 설정해 주어야 한다.<br />
레지스터를 어떻게 설정해야 원하는 시간을 얻을 수 있을까? 관련 레지스터 설정에 대하여 수식과 왼쪽그림을 통하여 확인해 보자.<br />
[그림-1], [그림-2], [그림-3]을 참조해 보면 CCR0 레지스터의 0~2번 BIT을 사용하여 Prescaler 설정 할 수 있으며 TCNT0 레지스터를 사용하여 시간을 설정할 수 있다. 그리고 TIMSK 레지스터의 TOIE0 BIT을 활성화 해야지만 TIMER0 레지스터의 인터럽트를 허용하겠다는 설정이므로 꼭 기억해야 한다.<br />
위의 레지스터 값을 수식에 대입하여 이해해보자.</p>
<p><img class="alignnone  wp-image-9841" alt="05FAVR010" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR010.jpg" width="263" height="91" /></p>
<p>좀 더 자세히 수식을 표현해 보겠다.</p>
<p><img class="alignnone  wp-image-9842" alt="05FAVR011" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR011-620x59.jpg" width="496" height="47" /><br />
위의 수식을 보면 TIME(원하는 시간)은 XTAL과 Prescaler 그리고 N값을 통해 구해진다. XTAL은 발진 소자의 발진 데이터를 말하며 프리스케일러 데이터는 위에서도 언급했지만 TCCR 레지스터의 의해서 구해진다. 그리고 N은 TNCT 레지스터의 의해서 설정되는 값이다. 이해가 안 되는 분들을 위해서 예를 들어 설명해 보겠다.</p>
<p><img class="alignnone  wp-image-9865" alt="05FAVR032" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR032.jpg" width="276" height="50" /><br />
위의 수식처럼 1ms을 구하기 위하여 XTAL은 16Mhz 발진 소자를 사용하였고 TCCR= 0X04, TCNT=0X06로 레지스터를 설정한 결과이다. 우리는 위와 같이 타이머/카운터 레지스터에 대해 이해 할 수 있었다. 자 그럼 이제 실제 코드에 적용해 보자.</p>
<p><span style="color: #3366ff"><strong>CodeVision AvR C컴파일러 </strong></span><br />
<span style="color: #3366ff"><strong>LK ATmega 128 예제소스3 : TIMER/COUNTER 레지스터를 활용한 LED 동작하기</strong></span></p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>//예제소스 시작</p>
<p>#include &lt;mega128.h&gt;<br />
#include &lt;stdio.h&gt;<br />
int cnt; //카운터 변수 선얶<br />
interrupt [TIM0_OVF] void timer0_ovf_isr(void) //TIMER 0 인터럽트 서비스 루틴<br />
{<br />
TCCR0=0&#215;04;<br />
TCNT0=0&#215;06;<br />
cnt++; //1ms 마다 카운터 변수 증가<br />
if(cnt &gt; 7000){ //7초 후에 LED OFF<br />
PORTE=0X00; //카운터 변수 초기화= 반복 동작<br />
cnt=0;<br />
}<br />
else if(cnt &gt; 6000) //6초 후에 LED6 ON<br />
PORTE=0X80;<br />
else if(cnt &gt; 5000) //5초 후에 LED5 ON<br />
PORTE=0X40;<br />
else if(cnt &gt; 4000) //4초 후에 LED4 ON<br />
PORTE=0X20;<br />
else if(cnt &gt; 3000) //3초 후에 LED3 ON<br />
PORTE=0X10;<br />
else if(cnt &gt; 2000) //2초 후에 LED2 ON<br />
PORTE=0X08;<br />
else if(cnt &gt; 1000) //1초 후에 LED1 ON<br />
PORTE=0X04;<br />
}<br />
void main(void)<br />
{<br />
DDRE=0XFF; //LED 출력 레지스터 설정<br />
PORTE=0X00; //LED PORT 초기화<br />
TCCR0=0&#215;04; //Prescaler 64 설정<br />
TCNT0=0&#215;06; //N값 설정<br />
TIMSK=0&#215;01; //TIMER 0 오버 인터럽트 허용<br />
#asm(&#8220;sei&#8221;)<br />
while (1)<br />
{<br />
};<br />
}</p>
</div>
<p><span style="text-decoration: underline"><strong> ※ 프로그램 해석 <strong>※</strong></strong></span><br />
1) DDRE 레지스터를 이용하여 LED 출력 PORT로 변경<br />
2) TCCR0과 TCNT0을 이용하여 시간을 설정<br />
3) TIMSK 레지스터를 이용하여 타이머 0 오버 인터럽트를 허용<br />
4) 카운터 변수 int cnt를 선언<br />
5) 타이머 서비스루틴은 TCCR0과 TCNT0 값의 의해 1ms로 설정 되어 인터럽트가 발생 될 때 마다 호출된다.<br />
6) cnt(카운터변수)를 증가 처리 했으므로 1ms마다 카운터는 1씩 증가<br />
7) if문 조건에 따라 1초마다 LED가 순차적으로 점등 소등 된다.<br />
8) 7초 후에 마지막 LED가 소등되며 카운터 변수는 리셋된다.<br />
9) 4~8번 순서대로 동작을 반복한다.<br />
<span style="color: #3366ff"><strong>★FLOWCHART</strong></span></p>
<p><img class="alignnone  wp-image-9843" alt="05FAVR012" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR012-579x620.jpg" width="407" height="437" /></p>
<p><span style="text-decoration: underline"><strong>※참고사항 <strong>※</strong></strong></span><br />
<span style="color: #000080">1. 카운터 변수의 자료 형은 int형인데 그 이유는 무엇일까?</span></p>
<p>카운터 변수의 자료 형을 int형을 선택한 이유는 물론 정수형의 숫자를 사용하는 이유도 있지만 char형이라고 정수형의 데이터를 처리 못하는 것은 아니다. 그러나 char형의 크기는 1byte이고 int형은 2byte 이므로 사용할 수 있는 수의 범위가 틀리다.<br />
1byte= 8bit이다. 즉, 10진수로 256의 데이터 수를 갖는다.<br />
그럼 2byte는 16bit 이므로 256 X 256 즉, 65536의 데이터 수를 갖는 것이다.<br />
Cnt 변수의 증가 범위를 보면 0~7000이다. char형을 사용했을 경우 조건이 성립 될 수가 없다.</p>
<p><span style="color: #000080">2. 카운터 변수를 초기화 하지 않을 때 동작은?</span><br />
int형은 최대 65536이란 데이터의 수를 갖고 있다고 말했다.<br />
카운터 변수는 1ms 마다 증가하고 그 값을 초기화 하지 않는다고 가정했을 때 7초까지는 프로그램 작성자가 원하는 대로 동작을 한다. 그러나 그 이후에는 카운터 변수의 데이터는 0~65535까지 증가하고 난 후에야 처음으로 복귀하는 것이다.<br />
항상 변수나 함수를 선택하고 정의하는 부분은 프로그램 작성자가 생각해야 할 부분이므로 의미 있게 체크해두자.</p>
<p>&nbsp;</p>
<p><span style="background-color: #ffff00;font-size: medium"><strong><span style="color: #333399">제3부 </span></strong></span></p>
<p><span style="color: #000080;background-color: #ffff00;font-size: medium"><strong> EXTERNAL INTERRUPT </strong></span></p>
<p><span style="color: #000080;background-color: #ffff00;font-size: medium"><strong>REQUEST(외부 인터럽트)강좌</strong></span><br />
<strong><span style="color: #3366ff">개요</span></strong></p>
<p>인터럽트를 해석하면 “끼어든다”는 의미를 가지고 있다. 프로그램상으로 해석한다면 MCU가 동작을 중지하고 인터럽트를 수행한다고 생각하면 된다.<br />
인터럽트는 크게 내부 인터럽트와 외부 인터럽트로 구분하며 다음과 같은 특징을 가지고 있다.<br />
1) 내부 인터럽트의 예는 전 강의 주제인 타이머 인터럽트가 대표적이다. 전 강의에서 우리는 오버플로우을 이용하여 주기적으로 인터럽트를 발생 시켰고 그로 인해 시간을 제어 할 수 있었다.<br />
2) 외부 인터럽트는 사용자의 의해서 들어오는 신호들을 이용하여 인터럽트를 발생 시키는 방식이다. 예를 들면 외부에서 스위치 및 센서 등을 이용하여 MCU로 신호를 발생 시켰을 때 인터럽트가 걸리는 방식이라고 생각하면 되겠다.<br />
3) ATmega 128은 8개의 외부 핀 INT0~7을 통해 입력되는 신호에 의해서 인터럽트를 발생 시킬 수 있다.<br />
4) 외부 인터럽트는 L의 논리레벨(low level), 하강 에지(falling edge), 상승 에지(rising edge)에 의해 트리거(trigger) 될 수 있는데 이러한 인터럽트 트리거 방법은 외부 인터럽트 제어 레지스터의 설정에 의하여 결정된다.</p>
<p><span style="color: #3366ff"><strong>외부 인터럽트 레지스터 설정</strong></span></p>
<p>외부 인터럽트를 사용하기 위해서는 ECIRA, ECIRB, EIMSK, EIFR 레지스터 설정에 의해서 사용 여부가 결정 된다.<br />
그 내용들을 공부해 보자.</p>
<p><strong>ECIRB, ECIRA 레지스터</strong><br />
ECIR 레지스터는 2개로 구분되는데 EICRA는 INT0~INT3핀을 제어하고 EICRB는 INT4~INT7을 제어한다. 위 2개의 레지스터의 의해서 트리거(trigger)방식을 결정하게 되는데 이해를 돕기 위해 그림을 통하여 학습해보자.</p>
<p><img class="alignnone  wp-image-9844" alt="05FAVR013" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR013-620x599.jpg" width="437" height="421" /><br />
<strong>1) L 논리레벨(low level)트리거 방식 :</strong> 해당 핀의 L상태가 입력되는 동안 인터럽트가 발생되는 방식이다.<br />
<strong>2) 하강 에지(falling edge)트리거 방식 :</strong> 클럭에 관계없이 비동기 적으로 신호가 검출 되며 말 그대로 논리 레벨이 HIGH에서 LOW로 하강하는 순서에 인터럽트가 발생하는 방식이다.<br />
<strong>3) 상승 에지(rising edge)트리거 방식 :</strong> 클럭에 관계없이 비동기 적으로 신호가 검출되며 논리 레벨이 LOW에서 HIGH로 상승하는 순서에 인터럽트가 발생하는 방식이다.<br />
<strong>4) 해당 핀을 설정하는 방법</strong>는 ISCn1, ISCn0 BIT를 [그림-3]의 방식으로 설정하면 되며 여기서 n은 해당 핀의 따라 달라지게 된다.<br />
<strong>EIMSK 레지스터</strong><br />
EIMSK 레지스터는 INT0~7핀의 허용을 결정하는데 사용된다.<br />
설정 방법으로는 해당 BIT를 1로 설정하면 인터럽트 허용, 0으로 설정하면 인터럽트 사용금지가 된다.</p>
<p><img class="alignnone  wp-image-9845" alt="05FAVR014" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR014-620x116.jpg" width="496" height="93" /></p>
<p><strong>EIFR 레지스터</strong><br />
EIFR 레지스터는 INT0~INT7 핀의 입력이 발생되면 해당 인터럽트에 플래그가 발생 되었음을 표시하는데 사용되며 이 비트들은 인터럽트 발생시 1로 SET되고 인터럽트 서비스 루틴으로 진행하게 되면 0로 CLEAR된다.</p>
<p><img class="alignnone  wp-image-9846" alt="05FAVR015" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR015-620x115.jpg" width="496" height="92" /><br />
우리는 위와 같이 외부 인터럽트 레지스터에 대해 이해 할 수 있었다. 자 그럼 이제 실제 코드에 적용해 보자.<br />
<span style="color: #3366ff"><strong>CodeVision AvR C컴파일러</strong></span><br />
<span style="color: #3366ff"><strong> LK ATmega 128 예제소스4 : 외부 인터럽트 레지스터를 활용한 LED 동작하기</strong></span></p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
//예제소스 시작<br />
#include &lt;mega128.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;delay.h&gt;<br />
char cnt; //카운터 변수 선언<br />
interrupt [EXT_INT2] void ext_int2_isr(void) //외부 인터럽트0 서비스 루틴<br />
{<br />
cnt++; //외부 인터럽트 발생시 카운터 증가<br />
}<br />
void main(void)<br />
{<br />
DDRE=0XFF; //LED 포트 출력 레지스터 설정<br />
PORTE=0X00; //LED 초기 OFF<br />
EICRA=0&#215;20; //외부 인터럽트 2 FALLING EDGE 설정<br />
EIMSK=0&#215;04; //외부 인터럽트 2 허용<br />
EIFR=0&#215;04;<br />
#asm(&#8220;sei&#8221;)<br />
while (1)<br />
{<br />
if(cnt==1) //카운터 1일 때 LED1 ON<br />
PORTE=0X04;<br />
else if(cnt==2) //카운터 2일 때 LED2 ON<br />
PORTE=0X08;<br />
else if(cnt==3) //카운터 3일 때 LED3 ON<br />
PORTE=0X10;<br />
else if(cnt==4) //카운터 4일 때 LED4 ON<br />
PORTE=0X20;<br />
else if(cnt==5) //카운터 5일 때 LED5 ON<br />
PORTE=0X40;<br />
else if(cnt==6) //카운터 6일 때 LED6 ON<br />
PORTE=0X80;<br />
else if(cnt==7){ //카운터 7일 때 LED OFF<br />
PORTE=0X00;<br />
cnt=0; //카운터 초기화<br />
}<br />
};<br />
}<br />
//예제소스 끝</p>
</div>
<span style="text-decoration: underline"><strong>※ 프로그램 해석 ※</strong></span><br />
1) 외부 인터럽트 2번 사용설정 및 하강에지 인터럽트 레지스터 설정<br />
2) 외부에서 인터럽트가 발생할 때 카운터는 1씩 증가<br />
3) 카운터가 증가 될 때 마다 LED 순차적으로 점등<br />
4) 카운터 데이터 7이 되면 카운터 변수 RESET 및 LED 소등 된다.<br />
5) 2~4을 반복된다.</p>
<p><span style="color: #3366ff"><strong>★ FLOWCHART</strong></span></p>
<p><img class="alignnone  wp-image-9847" alt="05FAVR016" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR016-552x620.jpg" width="442" height="496" /></p>
<p><strong>※ 참고사항 ※</strong><br />
ATmega 128에서는 RESET을 포함하여 총 35종류의 인터럽트를 가지고 있으며 인터럽트는 MCU의 의지에 따라 순차적으로 제어 되는 것이 아니라 비동기적으로 발생 되는 것이 일반적이므로 우연히 2개 이상의 인터럽트 요청이 중복 되는 경우가 있을 수 있다.<br />
MCU는 인터럽트를 한꺼번에 처리할 수가 없으므로 한번에 1개의 인터럽트를 선택하여 처리하게 되는데 이를 인터럽트 우선 순위 제어라고 한다.<br />
ATmega 128은 인터럽트의 중복을 막기 위하여 인터럽트의 어드레스 번지의 0&#215;0000 ~ 0&#215;0044까지 순차적으로 인터럽트를 처리하게 되어있다. 그리고 35종류의 인터럽트는 각각의 마스크 레지스터를 이용하여 개별적으로 허용여부를 결정할 수 있고 상태 레지스터인 SREG 글로벌 인터럽트를 이용하여 전체적인 허용 여부를 설정할 수 있다.</p>
<p>&nbsp;</p>
<p><strong><span style="color: #333399"><span style="font-size: medium;background-color: #ffff00">제4부 </span></span></strong></p>
<p><span style="color: #000080"><strong><span style="font-size: medium;background-color: #ffff00"> UART(Universal Asynchronous Receiver and Transmitter)강좌</span></strong></span><br />
<span style="color: #3366ff"><strong>개요</strong></span></p>
<p>ATmega 128은 2개의 UART 직렬통신 포트를 가지고 있는데 비 동기 전송 모드에서 전이중 통신이 가능하고 멀티프로세서 통신 모드동작도 가능하다.<br />
UART기능을 사용하기 위해서는 UDRn, UCSRnA, UCSRnB, UCSRnC 레지스터를 이용하여 설정하여야 한다. 하지만 UART 레지스터의 기능들을 초보자가 전부 소화하는 것은 쉽지 않으므로 필요한 부분만을 참조하여 설명하겠다.<br />
1) UART 직렬 통신 포트에서는 송신완료, 송신데이터 준비완료, 수신완료 3가지의 인터럽트를 사용할 수 있으며 내부 구성으로는 클럭 발생부, 송신부, 수신부의 구성으로 나누어 있다.<br />
2) 높은 정밀도의 보레이트 발생기를 내장하고 있다.<br />
3) 비동기식 전송 모드에서는 항상 내부의 클럭에 의하여 보레이트가 결정된다.</p>
<p><strong>※ 참고사항 ※</strong><br />
LK 개발보드에는 CP2012 IC가 내장되어 있어 TTL0레벨의 통신신호를 USB레벨의 통신신호로 변환 해주어 PC와 통신이 가능하게 해주고 있다. 이해를 돕기 위해 회로도를 첨부 하겠다.</p>
<p><span style="color: #3366ff"><strong>★ 회로도</strong></span></p>
<p><span style="color: #3366ff"><strong><img class="alignnone  wp-image-9848" alt="05FAVR017" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR017-620x455.jpg" width="496" height="364" /></strong></span><br />
<span style="color: #3366ff"><strong>UDRn 레지스터</strong></span></p>
<p>UDRn레지스터는 UART 포트의 송, 수신 데이터 버퍼의 기능을 가지고 있다.</p>
<div id="attachment_9849" class="wp-caption alignnone" style="width: 506px"><img class=" wp-image-9849" alt="05FAVR018" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR018-620x156.jpg" width="496" height="125" /><p class="wp-caption-text">그림1</p></div>
[그림-1]을 참조하면 UDRn레지스터는 동일한 메모리 번지에 위치하지만 내부적으로는 서로 다른 레지스터로서, 송신데이터를 UDRn에 라이트하면 이는 송신 데이터 버퍼 TXBn에 저장되고, 수신된 데이터를 UDRn으로 읽으면 수신 데이터 버퍼 RXBn에 수신되어 값을 읽을 수 있게 된다.<br />
그리고 송신 버퍼는 UCSRnA 레지스터의 UDREn 플래그 비트가 1로 설정 되어야만 데이터를 라이트 할 수 있으며 UDREn 플래그 비트가 0으로 되어 있는 경우에는 UDRn에 데이터를 라이트 하더라도 무시 처리가 된다.</p>
<p><span style="color: #3366ff"><strong>UCSRnA 레지스터</strong></span></p>
<p>UCSRnA 레지스터는 UART 포트의 송수신 동작을 제어하거나 송수신 상태를 저장하는 기능을 가지고 있다.<br />
1) RXCn : MCU가 수신 버퍼에 읽혀지지 않은 수신 문자가 들어 있으면 1로 SET되고 MCU가 수신 버퍼의 데이터를 다 읽은 상태이면 0으로 CLEAR되는 플래그 비트<br />
2) TXCn : 송신 시프트 레지스터에 있는 송신 데이터가 모두 송신되고 UDRn의 송신 버퍼에 새로운 데이터가 라이트 되지 않은 상태이면 1로 SET되는 상태 플래그 비트<br />
3) UDREn : UDRn의 송신 버퍼가 비어 있어 새로운 송신 데이터를 받을 준비가 되면 1로 SET되는 상태 플래그 비트</p>
<p><strong style="color: #3366ff">UCSRnB 레지스터</strong></p>
<p>UCSRnB 레지스터는 UART 포트의 송수신 동작을 제어하거나 전송 데이터를 9비트로 설정한 경우에 9번째 비트 데이터를 저장하는 기능을 가지고 있다.</p>
<p><img class="alignnone  wp-image-9851" alt="05FAVR020" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR020-620x117.jpg" width="446" height="85" /><br />
<strong>1) RXCIEn :</strong> 수신완료 인터럽트를 개별적으로 허용하는 비트.<br />
<strong>2) TXCIEn :</strong> 송신완료 인터럽트를 개별적으로 허용하는 비트.<br />
<strong>3) UDRIEn :</strong> 송신 데이터 준비완료 인터럽트를 개별적으로 허용하는 비트.<br />
<strong>4) RXENn :</strong> USART 포트의 수신부가 동작하도록 허용하는 비트<br />
이 비트는 RXDn 핀이 I/O포트가 아니라 직렬 통신 데이터 수신 단자로 동작 하도록 설정하며 에러 플래그 비트의 동작을 유효하게 한다.<br />
<strong>5) TXENn :</strong> UART 포트의 송신부가 동작하도록 허용하는 비트.<br />
<strong>6) UCSZn2 :</strong> 전송 문자의 데이터 비트 수를 설정하는데 사용.<br />
<strong>7) RXB8n :</strong> 전송 문자가 9비트로 설정된 경우에 수신된 문자의 9번째 비트의 데이터를 저장한다.<br />
<strong>8) TXB8n :</strong> 전송 문자가 9비트로 설정된 경우에 송신할 문자의 9번째 비트의 데이터를 저장.</p>
<p><strong style="color: #3366ff">UCSRnC 레지스터</strong></p>
<p>UCSRnC 레지스터는 UART 포트의 송수신 동작을 제어하는 기능을 가지고 있다.</p>
<p><img class="alignnone  wp-image-9852" alt="05FAVR021" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR021-620x294.jpg" width="477" height="227" /><br />
1) USBSn비트를 0으로 설정하면 USART 포트에서 데이터 포맷을 구성하는 스톱 비트를 1개 설정하고 이 비트가 1이면 스톱 비트를 2개를 설정한다.<br />
2) UCSZn0~1비트는 [그림-6]과 같이 UCSRnB 레지스터의 UCSZn2비트와 함께 전송 문자의 데이터 비트 수를 설정하는데 사용된다.</p>
<p><img class="alignnone  wp-image-9853" alt="05FAVR022" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR022-620x226.jpg" width="496" height="181" /><br />
<span style="color: #3366ff"><strong>UBRRnH/L 레지스터</strong></span></p>
<p>UBRRnH/L레지스터는 UART 포트의 송수신 속도를 설정하는 기능을 가지고 있다.</p>
<p><img class="alignnone  wp-image-9854" alt="05FAVR023" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR023-620x227.jpg" width="496" height="182" /><br />
보레이트를 설정하기 위해서는 UBRRnH/L 레지스터를 설정하여야 하는데 계산 수식은 아래와 같다.</p>
<p><img class="alignnone  wp-image-9855" alt="05FAVR024" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR024.jpg" width="257" height="54" /><br />
우리는 위와 같이 UART 레지스터에 대해 이해 할 수 있었다.<br />
자 그럼 이제 실제 코드에 적용해 보자.<br />
<span style="color: #3366ff"><strong>CodeVision AvR C컴파일러</strong></span><br />
<span style="color: #3366ff"><strong> LK ATmega 128 예제소스6: UART레지스터을 이용한 DATA출력하기</strong></span></p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
<p>//예제소스 시작<br />
#include &lt;mega128.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;delay.h&gt;<br />
#define RXB8 1<br />
#define TXB8 0<br />
#define UPE 2<br />
#define OVR 3<br />
#define FE 4<br />
#define UDRE 5<br />
#define RXC 7<br />
#define FRAMING_ERROR (1&lt;&lt;FE)<br />
#define PARITY_ERROR (1&lt;&lt;UPE)<br />
#define DATA_OVERRUN (1&lt;&lt;OVR)<br />
#define DATA_REGISTER_EMPTY (1&lt;&lt;UDRE)<br />
#define RX_COMPLETE (1&lt;&lt;RXC)<br />
#define RX_BUFFER_SIZE0 1 //수 버퍼 사이즈 1로 설정<br />
char rx_buffer0[RX_BUFFER_SIZE0];<br />
#if RX_BUFFER_SIZE0&lt;256<br />
unsigned char rx_wr_index0,rx_rd_index0,rx_counter0;<br />
#else<br />
unsigned int rx_wr_index0,rx_rd_index0,rx_counter0;<br />
#endif<br />
bit rx_flag; //수싞플래그 비트 선언<br />
void tx_out(unsigned char buff) //송싞데이터 출력 함수<br />
{<br />
while ( !( UCSR0A &amp; (1&lt;&lt;UDRE)) ); //폴링 방식으로 송 준비 체크<br />
UDR0 = buff; // 데이터 출력<br />
}<br />
interrupt [USART0_RXC] void usart0_rx_isr(void) //USART0 서비스 루틴<br />
{<br />
char status,data; //변수 선언<br />
status=UCSR0A; //상태 체크 변수<br />
data=UDR0; //데이터 변수<br />
if ((status &amp; (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0) //통싞 에러 및 상태 이상 무<br />
{<br />
rx_buffer0[rx_wr_index0]=data; //수싞 버퍼에 데이터 저장<br />
if (++rx_wr_index0 == RX_BUFFER_SIZE0) {<br />
rx_wr_index0=0; rx_flag=1; //rx_flag 비트 활성화 및 초기화<br />
}<br />
};<br />
}<br />
void main(void)<br />
{<br />
DDRE=0XFF; //LED 출력 레지스터 설정<br />
PORTE=0X00; //LED PORT 초기화<br />
DDRG=0X01; //BUZZER 출력 레지스터 설정<br />
PORTG=0X01; //BUZZER 초기화<br />
UCSR0A=0&#215;00;<br />
UCSR0B=0&#215;98; //송,수 허용<br />
UCSR0C=0&#215;06; //비 동기 통 모드, 데이터 사이즈 8bit<br />
UBRR0H=0&#215;00;<br />
UBRR0L=0&#215;67; //boud rate : 9600 pbs<br />
#asm(&#8220;sei&#8221;)<br />
while (1)<br />
{<br />
If(rx_flag){<br />
rx_flag=0; //수 플래그 비트 초기화<br />
if(rx_buffer0[0]==1){ //수싞버퍼 데이터가 1일 때<br />
PORTE=0XFF; //LED ON<br />
PORTG=0X01; //BUZZER OFF<br />
tx_out(0&#215;01); //송 데이터 0&#215;01<br />
}<br />
else if(rx_buffer0[0]==2){ //수싞 버퍼 데이터가 2일 때<br />
PORTG=0X00; //BUZZER ON<br />
PORTE=0X00; //LED OFF<br />
tx_out(0&#215;02); //송 데이터 0&#215;02<br />
}<br />
else {PORTE=0X00;PORTG=0X01; //수싞 버퍼 데이터 값이 1 또는 2가 아닐 경우<br />
tx_out(0xff) //송싞데이터 0xff<br />
} //LED OFF, BUZZER OFF<br />
}<br />
};<br />
}<br />
//예제소스 끝</p>
</div>
<p><span style="text-decoration: underline"><strong>※ 프로그램 해석 ※</strong></span><br />
1) USART 레지스터 설정<br />
2) 수신 인터럽트 발생시 인터럽트 서비스 루틴 진입<br />
3) 상태 레지스터 및 각종 에러 플래그 비트 체크<br />
4) 수신된 데이터와 설정된 데이터 버퍼수가 같을 때 수신 플래그 비트 활성화<br />
5) 수신 플래그 비트 활성화 시 if문으로 조건 체크<br />
6) If문 조건에 따라서 LED ON 및 BUZZER ON 혹은 LED OFF 및 BUZZER OFF<br />
7) If문 조건에 따라서 송신 데이터 출력<br />
8) 2~7을 반복한다.</p>
<p><span style="color: #3366ff"><strong>★ FLOWCHART</strong></span></p>
<p><img class="alignnone  wp-image-9856" alt="05FAVR025" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR025-490x620.jpg" width="392" height="496" /></p>
<p><span style="text-decoration: underline"><strong>※ 참고사항 ※</strong></span><br />
통신분야에 있어서 통신속도에 관련되는 단위로 흔히 사용되는 것으로 Bps와 Baud가 있다. Bps는 비트 전송 속도를 나타내는 단위이며, 1초간에 전송되는 비트수를 나타낸다.<br />
Baud은 변조 속도를 나타내는 단위이며, 초 단위로 나타낸 최단 변조 주기를 T라고 할 때 Baud=(1/T) [sec]로 정의 된다.</p>
<p>&nbsp;</p>
<p><span style="color: #000080;background-color: #ffff00;font-size: medium"><strong>제5부 </strong></span></p>
<p><span style="color: #000080;background-color: #ffff00;font-size: medium"><strong> ADC CONVERSION (Analog to Digital Converter)강좌</strong></span></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong style="color: #3366ff">개요</strong></p>
<p>ATmega 128은 10비트의 분해능을 가진 8채널 A/D 컨버터를 가지고 있으며 이 8채널의 아날로그 입력 신호는 PORTF와 동일한 핀을 사용하고 있으며 ADMUX 레지스터에 의하여 사용 여부가 결정된다. ATmega 128의 ADC 기능들의 특징은 아래와 같다.</p>
<p>1) A/D컨버터에는 샘플/홀드 회로가 있어서 A/D 변환이 수행되고 있는 동안에는 아날로그 전압이 일정하게 유지되도록 하고 있다.<br />
2) ADMUX레지스터는 8개의 단 극성 입력으로 사용될 수도 있고 1개의 지정된 핀을 기준으로 7개의 차동 입력으로 사용될 수도 있으며 2가지의 차동입력에 대해서는 MCU 내부에서 10배 또는 200배 증폭하여 A/D 변환을 할 수도 있다.<br />
3) A/D변환시간을 사용자가 주파수 50Khz~200Khz까지 시간60~260us 범위에서 설정할 수 있다.<br />
4) A/D는 2가지의 변환모드가 있는데 단일변환모드와 프리런닝모드가 있으며 사용자가 원하는 출력상태를 선택하여 결정하면 된다.<br />
<span style="color: #3366ff"><strong>ADMUX레지스터</strong></span></p>
<p>ADMUX레지스터는 AD컨버터의 기준전압을 선택하거나 변환 결과 레지스터의 데이터 저장형식을 지정하는 기능을 가지고 있으며 아날로그 입력채널을 선택하는 기능을 가지고 있다. 이해를 돕기 위해 아래의 그림을 참조해 설명하겠다.</p>
<p><img class="alignnone size-large wp-image-9857" alt="05FAVR026" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR026-388x620.jpg" width="388" height="620" /></p>
<p><strong>1) REFS1~0 :</strong> 기준 전압을 결정할 때 사용되는 비트로서 외부의 VREF 전압을 사용할 것인지, 외부의 AVCC 전압을 사용할 것인지 내부 기준전압(2.56v)를 사용할 것인지를 결정하는 기능을 수행한다.<br />
<strong>2) ADLAR :</strong> 변환 결과를 저장하는 형식을 결정하며 이 비트를 1로 지정하면 변환 결과가 상위 바이트를 시작으로 저장이 되며 0으로 설정하면 하위 바이트를 시작으로 데이터가 저장된다.<br />
<strong>3) MUX4~0 :</strong> 아날로그 입력 채널을 결정할 때 사용되는데 아날로그 입력은 크게 단 극성 입력과 차동입력으로 나눈다.</p>
<p>단 극성은 8가지의 단 극성 입력을 선택 할 수 있고 차동입력은 단자사이의 차동입력 그리고 이득값을 20 또는 200으로 증폭해서 취득할 수도 있다.<br />
<span style="color: #3366ff"><strong>ADCSRA 레지스터</strong></span></p>
<p>ADCSRA 레지스터는 AD 컨버터의 동작을 설정하거나 동작상태를 표시하는 기능을 수행한다.</p>
<p><img class="alignnone  wp-image-9858" alt="05FAVR027" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR027-620x344.jpg" width="496" height="275" /></p>
<p><strong>1) ADEN :</strong> AD컨버터를 ON 또는 OFF 하는 기능을 수행한다.<br />
<strong>2) ASSC :</strong> 이 비트를 1로 설정하면 AD 컨버터의 변환이 시작되며 프리런닝모드에서는 처음 이후에는 자동으로 변환이 진행된다.<br />
<strong>3) ADFR :</strong> AD 컨버터를 프리런닝 모드로 설정할 때 사용된다.<br />
<strong>4) ADIF :</strong> AD 컨버터의 변환이 완료 되었을 때 1로 SET 되며 인터럽트가 발생하게 된다.<br />
이 인터럽트가 처리되기 시작하면 다시 자동적으로 0으로 CLEAR 된다.<br />
<strong>5) ADIE :</strong> 변환 완료 인터럽트를 개별적으로 허용할 때 사용된다.<br />
<strong>6) ADPS2~0 :</strong> 위와 같이 AD 컨버터에 인가되는 클럭의 분주비를 선택하는 기능을 수행한다.</p>
<p><span style="color: #3366ff"><strong>ADCH, ADCL 레지스터</strong></span></p>
<p>ADCH 및 ADCL 레지스터는 AD 컨버터의 변환 결과를 저장하는 레지스터로서 단 극성 입력을 사용할 경우에는 0~1023의 데이터 범위를 가지지만 차동입력을 사용할 경우에는 -512~+511 의 데이터 범위를 가지게 된다. 그리고 ATmega 128은 10비트의 분해 능을 가지고 있으므로 1 byre로는 처리가 불가능하다.<br />
그래서 ADCH(상위 바이트), ADCL(하위 바이트)로 데이터를 나눠서 저장하게 되며 ADMUX 레지스터의 ADLAR 비트의 설정에 따라 데이터가 우측 또는 좌측으로 정렬되어 저장하게 되는데 그 내용은 아래의 [그림 -6]과 같다.</p>
<p><strong><span style="color: #3366ff">A/D 변환 결과</span></strong></p>
<p><img class="alignnone  wp-image-9859" alt="05FAVR028" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR028-620x512.jpg" width="477" height="394" /></p>
<p>AD 컨버터가 변환을 완료하면 ADCH와 ADCL에 데이터가 저장된다. 그러면 우리는 아날로그 입력이 디지털 값으로 변환이 되었을 때의 데이터를 알아볼 필요가 있다.<br />
42페이지에 [그림-7]과 [그림-8]을 참고하여 계산하여 올바른 데이터 변환이 일어나고 있는지 확인 하면 된다.<br />
<strong>1. 단 극성 입력 채널을 사용</strong></p>
<p><img class="alignnone  wp-image-9860" alt="05FAVR029" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR029-300x95.jpg" width="216" height="68" /><br />
<strong> 2. 차동입력 채널 사용</strong></p>
<p><img class="alignnone  wp-image-9861" alt="05FAVR030" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR030-300x96.jpg" width="192" height="62" /><br />
우리는 위와 같이 ADC 레지스터에 대해 이해 할 수 있었다.<br />
자 그럼 이제 실제 코드에 적용해 보자.<br />
<span style="color: #3366ff"><strong>CodeVision AvR C컴파일러</strong></span><br />
<span style="color: #3366ff"><strong> LK ATmega 128 예제소스6: ADC레지스터와 UART 통신을 이용한 DATA출력하기</strong></span></p>
<div class="symple-box yellow none" style="text-align:left; width:100%;"> 
//예제소스 시작<br />
#include &lt;mega128.h&gt;<br />
#include &lt;stdio.h&gt;<br />
#include &lt;delay.h&gt;<br />
#define ADC_VREF_TYPE 0&#215;40<br />
int data; //AD 컨버팅 데이터 변수<br />
unsigned int read_adc(unsigned char adc_input) //AD 컨버팅 함수<br />
{<br />
ADMUX=adc_input | (ADC_VREF_TYPE &amp; 0xff);<br />
delay_us(10);<br />
ADCSRA|=0&#215;40; //ADC 단일 컨버팅 모드 설정<br />
while ((ADCSRA &amp; 0&#215;10)==0); //ADC 폴링상태로 대기<br />
ADCSRA|=0&#215;10; //인터럽트 발생 플래그 비트 초기화<br />
return ADCW; //ADCL, ADCH 각각 8비트를 합산하여 16비트로 사용<br />
}<br />
void main(void)<br />
{<br />
ADMUX=ADC_VREF_TYPE &amp; 0xff; //ADMUX = 0X40 (define선언 참조), AVCC 핀을 VREF로 설정<br />
ADCSRA=0&#215;84; //AD 컨버팅 허용, 16분주 비 사용<br />
UCSR0A=0&#215;00;<br />
UCSR0B=0&#215;98; //송싞, 수싞 허용<br />
UCSR0C=0&#215;06; //비 동기 통싞 모드, 데이터 사이즈 8bit<br />
UBRR0H=0&#215;00;<br />
UBRR0L=0&#215;67; //boud rate : 9600 BPS<br />
#asm(&#8220;sei&#8221;)<br />
while (1)<br />
{<br />
data=read_adc(0); //데이터 변수에 read_adc(0)채널의 데이터 삽입<br />
printf(&#8220;%d\r\n&#8221;,data); //printf문을 이용하여 데이터 출력<br />
};<br />
}<br />
//예제소스 끝</p>
</div>
<p>&nbsp;</p>
<p><span style="text-decoration: underline"><strong>※ 프로그램 해석 ※</strong></span></p>
<p>1) ADMUX 레지스터 기준전압 설정(데이터 시트 참조) 및 AD컨버팅 허용, 분주 비 설정, ADC 채널 설정<br />
2) 데이터 값을 확인하기 위하여 USART 통신 레지스터 설정<br />
3) read_adc 함수에서 ADC기준 전압을 통하여 ADC0 채널에 디지털 데이터 입력<br />
4) printf 문을 사용하여 ADC0데이터 확인<br />
5) 3~4번 동작을 반복한다.</p>
<p><em id="__mceDel"><br />
</em><span style="color: #3366ff"><strong>FLOWCHART</strong></span></p>
<p><img class="alignnone  wp-image-9862" alt="05FAVR031" src="http://www.ntrexgo.com/wp-content/uploads/2013/04/05FAVR031-498x620.jpg" width="398" height="496" /></p>
<p><span style="text-decoration: underline"><strong>※참고사항※</strong></span><br />
ATmega 128은 프리런닝 모드와 단일 변환 모드를 지원하고 있는데 사용자가 원하는 시점에서 변환을 하려면 단일 변환 모드를 사용해야 한다.<br />
하지만 프로그램의 구성의 따라 이러한 단점을 극복 할 수가 있는데 그 방법으로는 타이머 인터럽트를 이용하여 변환 시간을 사용자가 선택할 수가 있기 때문이다.<br />
예를 들면 타이머 인터럽트를 1ms로 설정하고 read_adc함수를 호출한다면 1ms마다 ADC 데이터를 정의 하게 되기 때문이다.<br />
강의를 통해 얻는 예제 소스를 활용하여 AVR의 기능을 더 극대화 해보길 바란다.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ntrexgo.com/archives/9817/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
