<?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>花夢電科雑多猫</title>
	<atom:link href="http://hp.hana-neko.com/feed" rel="self" type="application/rss+xml" />
	<link>http://hp.hana-neko.com</link>
	<description>技術を間違った情熱に使いがちな人のページ</description>
	<lastBuildDate>Fri, 13 Jan 2012 02:49:04 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>折り紙で楊枝入れ</title>
		<link>http://hp.hana-neko.com/archives/615</link>
		<comments>http://hp.hana-neko.com/archives/615#comments</comments>
		<pubDate>Fri, 13 Jan 2012 02:46:13 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[折紙]]></category>
		<category><![CDATA[美術]]></category>

		<guid isPermaLink="false">http://hp.hana-neko.com/?p=615</guid>
		<description><![CDATA[折り紙で楊枝入れ作る方法。 黒文字楊枝使ってるけど他のモノにも応用できそう。 リード抵抗とかも！ 折って中心を出す。 片方だけ中心に折り込む さらにもう一巻き折る。 この時の寸法がポイント。 ズレるとバランスが崩れて少し不格好になる。 たいした問題ではない。 包み込み開始 裏返してさらに折る 底を作る こんなふうに折り込む できあがり！ 折り紙・箸袋2 ここのを元に、綺麗できるように少しやり方改造した。 使用した折り紙は100円ショップの安い千代紙セット。 寸法は 74*74mm 大きい折り紙使えば箸袋になる。 折り紙ってゴミ箱に使ったりすると便利！ &#160; &#160; &#160; &#160; .]]></description>
			<content:encoded><![CDATA[<p><a title="IMG_0732 by suga_lego, on Flickr" href="http://www.flickr.com/photos/suganlego/6687583183/"><img src="http://farm8.staticflickr.com/7008/6687583183_b645e3ee0d.jpg" alt="IMG_0732" width="500" height="375" /></a><br />
折り紙で楊枝入れ作る方法。<br />
黒文字楊枝使ってるけど他のモノにも応用できそう。<br />
リード抵抗とかも！</p>
<p><a title="IMG_0721 by suga_lego, on Flickr" href="http://www.flickr.com/photos/suganlego/6687582109/"><img src="http://farm8.staticflickr.com/7022/6687582109_86126cd9c4_m.jpg" alt="IMG_0721" width="240" height="180" /></a><br />
折って中心を出す。</p>
<p><a title="IMG_0722 by suga_lego, on Flickr" href="http://www.flickr.com/photos/suganlego/6687581401/"><img src="http://farm8.staticflickr.com/7008/6687581401_0f49a6af03_m.jpg" alt="IMG_0722" width="240" height="180" /></a><br />
片方だけ中心に折り込む</p>
<p><a title="IMG_0724 by suga_lego, on Flickr" href="http://www.flickr.com/photos/suganlego/6687584029/"><img src="http://farm8.staticflickr.com/7147/6687584029_7fe2a7b59c_m.jpg" alt="IMG_0724" width="240" height="180" /></a><br />
さらにもう一巻き折る。<br />
この時の寸法がポイント。<br />
ズレるとバランスが崩れて少し不格好になる。<br />
たいした問題ではない。</p>
<p><a title="IMG_0725 by suga_lego, on Flickr" href="http://www.flickr.com/photos/suganlego/6687583617/"><img src="http://farm8.staticflickr.com/7034/6687583617_b0f1e38059_m.jpg" alt="IMG_0725" width="240" height="180" /></a><br />
包み込み開始</p>
<p><a title="IMG_0727 by suga_lego, on Flickr" href="http://www.flickr.com/photos/suganlego/6687579693/"><img src="http://farm8.staticflickr.com/7145/6687579693_299f378b79_m.jpg" alt="IMG_0727" width="240" height="180" /></a><br />
裏返してさらに折る</p>
<p><a title="IMG_0728 by suga_lego, on Flickr" href="http://www.flickr.com/photos/suganlego/6687580307/"><img src="http://farm8.staticflickr.com/7001/6687580307_233dd508c7_m.jpg" alt="IMG_0728" width="240" height="180" /></a><br />
底を作る</p>
<p><a title="IMG_0729 by suga_lego, on Flickr" href="http://www.flickr.com/photos/suganlego/6687580769/"><img src="http://farm8.staticflickr.com/7170/6687580769_a95a8fc129_m.jpg" alt="IMG_0729" width="240" height="180" /></a><br />
こんなふうに折り込む</p>
<p><a title="IMG_0731 by suga_lego, on Flickr" href="http://www.flickr.com/photos/suganlego/6687582575/"><img src="http://farm8.staticflickr.com/7030/6687582575_f79815bb1a_m.jpg" alt="IMG_0731" width="240" height="180" /></a><br />
できあがり！</p>
<p><a href="http://www.origami-club.com/use/stick%20case2/index.html">折り紙・箸袋2</a><br />
ここのを元に、綺麗できるように少しやり方改造した。<br />
使用した折り紙は100円ショップの安い千代紙セット。<br />
寸法は 74*74mm<br />
大きい折り紙使えば箸袋になる。</p>
<p>折り紙ってゴミ箱に使ったりすると便利！</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hp.hana-neko.com/archives/615/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AVRexample] UART</title>
		<link>http://hp.hana-neko.com/archives/607</link>
		<comments>http://hp.hana-neko.com/archives/607#comments</comments>
		<pubDate>Tue, 10 Jan 2012 13:22:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AVR]]></category>
		<category><![CDATA[電子]]></category>

		<guid isPermaLink="false">http://hp.hana-neko.com/?p=607</guid>
		<description><![CDATA[平たく言うとCOMポート使った通信の事。 RS232Cとか呼ばれる。 ●簡単な送信（定数文字列） Flashメモリ上に置かれた文字列定数データを送信。 AVRWiki「簡単な送信プログラム」のほぼそのまんまコピーです。 wiki執筆の方に大感謝です！ #include &#60;avr/io.h&#62; #include &#60;avr/pgmspace.h&#62; #include &#60;util/delay.h&#62; // cbi()    addrのbit番目をLowに // sbi()    addrのbit番目をHighに #define cbi(addr,bit)     addr &#38;= ~(1&#60;&#60;bit) #define sbi(addr,bit)     addr &#124;=  (1&#60;&#60;bit) #define    UART_RX    0        //ATtiny2313 では PD0:RxD PD1:TxD #define    UART_TX    1 const prog_char a[]  = "This is a test message";        //送信したい文字列 void uart_putchar(char c) {     loop_until_bit_is_set(UCSRA, UDRE); [...]]]></description>
			<content:encoded><![CDATA[<p>平たく言うとCOMポート使った通信の事。<br />
RS232Cとか呼ばれる。</p>
<p><a href="http://hp.hana-neko.com/wp-content/uploads/uart.png"><img class="alignnone size-medium wp-image-611" title="uart" src="http://hp.hana-neko.com/wp-content/uploads/uart-300x163.png" alt="" width="300" height="163" /></a></p>
<h2>●簡単な送信（定数文字列）</h2>
<p>Flashメモリ上に置かれた文字列定数データを送信。<br />
<a href="http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Started+Notes+%2D+UART#p10" rel="nofollow">AVRWiki「簡単な送信プログラム」</a>のほぼそのまんまコピーです。<br />
wiki執筆の方に大感謝です！</p>
<pre><span style="color: #008000;">#include &lt;avr/io.h&gt;</span>
<span style="color: #008000;">#include &lt;avr/pgmspace.h&gt;</span>
<span style="color: #008000;">#include &lt;util/delay.h&gt;</span>

<span style="color: #008000;">// cbi()    addrのbit番目をLowに</span>
<span style="color: #008000;">// sbi()    addrのbit番目をHighに</span>
<span style="color: #008000;">#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)</span>
<span style="color: #008000;">#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)</span>

<span style="color: #008000;">#define    UART_RX    0        //ATtiny2313 では PD0:RxD PD1:TxD</span>
<span style="color: #008000;">#define    UART_TX    1</span>

<span style="color: #008000;">const prog_char a[]  = "This is a test message";        //送信したい文字列</span>

<span style="color: #008000;">void uart_putchar(char c)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    loop_until_bit_is_set(UCSRA, UDRE); //UDREビットが1になるまで待つ</span>
<span style="color: #008000;">    UDR = c;</span>
<span style="color: #008000;">}</span>
<span style="color: #008000;">void uart_putstr_pgm(char *s)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    char c;</span>
<span style="color: #008000;">    while(1)</span>
<span style="color: #008000;">    {</span>
<span style="color: #008000;">        c = pgm_read_byte(s++);</span>
<span style="color: #008000;">        if (c==0) break;</span>
<span style="color: #008000;">        uart_putchar(c);</span>
<span style="color: #008000;">    }</span>
<span style="color: #008000;">    uart_putchar(10);        // 改行(LF)</span>
<span style="color: #008000;">}</span>

<span style="color: #008000;">int main(void)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    DDRA = ~0b11111111;        //portA all input    面倒なので一度全部適切な処理行う</span>
<span style="color: #008000;">    PORTA = 0b11111111;        //portA all pullup</span>
<span style="color: #008000;">    DDRB = ~0b11111111;        //portB all input</span>
<span style="color: #008000;">    PORTB = 0b11111111;        //portB all pullup</span>
<span style="color: #008000;">    DDRD = ~0b11111111;        //portD all input</span>
<span style="color: #008000;">    PORTD = 0b11111111;        //portD all pullup</span>

<span style="color: #008000;">    sbi(DDRD,UART_TX);        //UART関連だけのI/O方向処理</span>
<span style="color: #008000;">    cbi(DDRD,UART_RX);</span>

<span style="color: #008000;">    UCSRB = _BV(TXEN); //送信許可</span>
<span style="color: #008000;">    UBRRH = 0;</span>
<span style="color: #008000;">    UBRRL = 51;        // 8MHzで9600bps</span>
<span style="color: #008000;">    for(;;)</span>
<span style="color: #008000;">    {</span>
<span style="color: #008000;">        uart_putstr_pgm(a);</span>
<span style="color: #008000;">        _delay_ms(1000);        // 1秒待つ</span>
<span style="color: #008000;">    }</span>
<span style="color: #008000;">}</span></pre>
<h2>●簡単な送信（変数文字列）</h2>
<p>定数文字列版のちょっと改造。<br />
文字列変数をそのまま送信できる。</p>
<pre><span style="color: #008000;">#include &lt;avr/io.h&gt;</span>
<span style="color: #008000;">#include &lt;util/delay.h&gt;</span>

<span style="color: #008000;">// cbi()    addrのbit番目をLowに</span>
<span style="color: #008000;">// sbi()    addrのbit番目をHighに</span>
<span style="color: #008000;">#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)</span>
<span style="color: #008000;">#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)</span>

<span style="color: #008000;">#define    UART_RX    0        //ATtiny2313 では PD0:RxD PD1:TxD</span>
<span style="color: #008000;">#define    UART_TX    1</span>

<span style="color: #008000;">void uart_putchar(char c)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    loop_until_bit_is_set(UCSRA, UDRE); //UDREビットが1になるまで待つ</span>
<span style="color: #008000;">    UDR = c;</span>
<span style="color: #008000;">}</span>
<span style="color: #008000;">void uart_putstr(char *s)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    char c;</span>
<span style="color: #008000;">    while(1)</span>
<span style="color: #008000;">    {</span>
<span style="color: #008000;">        c = *s++;                // ポインタ s の指し示すアドレスの "データを" 読み出す</span>
<span style="color: #008000;">        if (c==0) break;</span>
<span style="color: #008000;">        uart_putchar(c);</span>
<span style="color: #008000;">    }</span>
<span style="color: #008000;">    uart_putchar(10);        // 改行(LF)</span>
<span style="color: #008000;">}</span>

<span style="color: #008000;">int main(void)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    DDRA = ~0b11111111;        //portA all input    面倒なので一度全部適切な処理行う</span>
<span style="color: #008000;">    PORTA = 0b11111111;        //portA all pullup</span>
<span style="color: #008000;">    DDRB = ~0b11111111;        //portB all input</span>
<span style="color: #008000;">    PORTB = 0b11111111;        //portB all pullup</span>
<span style="color: #008000;">    DDRD = ~0b11111111;        //portD all input</span>
<span style="color: #008000;">    PORTD = 0b11111111;        //portD all pullup</span>

<span style="color: #008000;">    sbi(DDRD,UART_TX);        //UART関連だけのI/O方向処理</span>
<span style="color: #008000;">    cbi(DDRD,UART_RX);</span>

<span style="color: #008000;">    UCSRB = _BV(TXEN); //送信許可</span>
<span style="color: #008000;">    UBRRH = 0;</span>
<span style="color: #008000;">    UBRRL = 51;        // 8MHzで9600bps</span>
<span style="color: #008000;">    for(;;)</span>
<span style="color: #008000;">    {</span>
<span style="color: #008000;">        uart_putstr("test mess");</span>
<span style="color: #008000;">        _delay_ms(1000);        // 1秒待つ</span>
<span style="color: #008000;">    }</span>
<span style="color: #008000;">}</span>
</pre>
<h2>●簡単な送信（数値=&gt;文字列変換）</h2>
<p>変数 num の値を送信。<br />
ループ毎に num++ されるので。<br />
123<br />
124<br />
125<br />
:<br />
とPCで受信できる。<br />
Arduino では数値データの送信は文字列として行われる。<br />
同じような感覚で行うためモノ。<br />
上記「簡単な送信（変数文字列）」に<span style="background-color: #ff99cc;">赤</span>の部分をいじっただけ<br />
<a href="https://sites.google.com/site/hananekosugan/sanpuru-kodo/avr-basic-usage-sample-code/str_val">数値&lt;=&gt;文字列 相互変換について。</a></p>
<pre><span style="color: #008000;">#include &lt;avr/io.h&gt;</span>
<span style="color: #008000;">#include &lt;util/delay.h&gt;</span>
<span style="color: #008000; background-color: #ff99cc;">#include &lt;stdlib.h&gt;</span>

<span style="color: #008000;">// cbi()    addrのbit番目をLowに</span>
<span style="color: #008000;">// sbi()    addrのbit番目をHighに</span>
<span style="color: #008000;">#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)</span>
<span style="color: #008000;">#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)</span>

<span style="color: #008000;">#define    UART_RX    0        //ATtiny2313 では PD0:RxD PD1:TxD</span>
<span style="color: #008000;">#define    UART_TX    1</span>

<span style="color: #008000;">void uart_putchar(char c)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    loop_until_bit_is_set(UCSRA, UDRE); //UDREビットが1になるまで待つ</span>
<span style="color: #008000;">    UDR = c;</span>
<span style="color: #008000;">}</span>
<span style="color: #008000;">void uart_putstr(char *s)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    char c;</span>
<span style="color: #008000;">    while(1)</span>
<span style="color: #008000;">    {</span>
<span style="color: #008000;">        c = *s++;                // ポインタ s の指し示すアドレスの "データを" 読み出す</span>
<span style="color: #008000;">        if (c==0) break;</span>
<span style="color: #008000;">        uart_putchar(c);</span>
<span style="color: #008000;">    }</span>
<span style="color: #008000;">    uart_putchar(10);        // 改行(LF)</span>
<span style="color: #008000;">}</span>

<span style="color: #008000;">int main(void)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000; background-color: #ff99cc;">    int num;</span>
<span style="color: #008000; background-color: #ff99cc;">    char strg[7];</span>

<span style="color: #008000;">    DDRA = ~0b11111111;        //portA all input    面倒なので一度全部適切な処理行う</span>
<span style="color: #008000;">    PORTA = 0b11111111;        //portA all pullup</span>
<span style="color: #008000;">    DDRB = ~0b11111111;        //portB all input</span>
<span style="color: #008000;">    PORTB = 0b11111111;        //portB all pullup</span>
<span style="color: #008000;">    DDRD = ~0b11111111;        //portD all input</span>
<span style="color: #008000;">    PORTD = 0b11111111;        //portD all pullup</span>

<span style="color: #008000;">    sbi(DDRD,UART_TX);        //UART関連だけのI/O方向処理</span>
<span style="color: #008000;">    cbi(DDRD,UART_RX);</span>

<span style="color: #008000;">    UCSRB = _BV(TXEN); //送信許可</span>
<span style="color: #008000;">    UBRRH = 0;</span>
<span style="color: #008000;">    UBRRL = 51;        // 8MHzで9600bps</span>
<span style="color: #008000; background-color: #ff99cc;">    num=123;</span>
<span style="color: #008000;">    for(;;)</span>
<span style="color: #008000;">    {</span>
<span style="color: #008000;"><span style="background-color: #ff99cc;">        utoa(num,strg,10);</span>            //符号無し int を10進数文字列に変換</span>
<span style="color: #008000;">        uart_putstr(<span style="background-color: #ff99cc;">strg</span>);</span>
<span style="color: #008000;">        _delay_ms(1000);        // 1秒待つ</span>
<span style="color: #008000; background-color: #ff99cc;">        num++;</span>
<span style="color: #008000;">    }</span>
<span style="color: #008000;">}</span></pre>
<p>&nbsp;</p>
<h2>●簡単な受信</h2>
<p>ポーリング（待ち処理）にて受信。<br />
受信した文字が1byteごとにPORTBに表示される。<br />
<a href="http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Started+Notes+-+UART#p15" rel="nofollow" target="_blank">AVRWiki </a>のほぼそのまんまコピーです。<br />
wiki執筆の方に大感謝です！</p>
<pre><span style="color: #008000;">#include &lt;avr/io.h&gt;</span>

<span style="color: #008000;">#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)</span>
<span style="color: #008000;">#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)</span>
<span style="color: #008000;">#define    UART_RX    0        //ATtiny2313 では PD0:RxD PD1:TxD</span>
<span style="color: #008000;">#define    UART_TX    1</span>

<span style="color: #008000;">int main(void)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    DDRA = ~0b11111111;        //portA all input    面倒なので一度全部適切な処理行う</span>
<span style="color: #008000;">    PORTA = 0b11111111;        //portA all pullup</span>
<span style="color: #008000;">    DDRB = ~0b11111111;        //portB all input</span>
<span style="color: #008000;">    PORTB = 0b11111111;        //portB all pullup</span>
<span style="color: #008000;">    DDRD = ~0b11111111;        //portD all input</span>
<span style="color: #008000;">    PORTD = 0b11111111;        //portD all pullup</span>
<span style="color: #008000;">    sbi(DDRD,UART_TX);        //UART関連だけのI/O方向処理</span>
<span style="color: #008000;">    cbi(DDRD,UART_RX);</span>

<span style="color: #008000;">    DDRB = ~0b00000000;        //portB all output</span>
<span style="color: #008000;">    PORTB = 0x00;</span>

<span style="color: #008000;">    UCSRB = _BV(RXEN);    // 受信有効</span>
<span style="color: #008000;">    UBRRH = 0;</span>
<span style="color: #008000;">    UBRRL = 51;        //9600bps in MCU clock 8MHz</span>
<span style="color: #008000;">    for(;;)</span>
<span style="color: #008000;">    {</span>
<span style="color: #008000;">        if (bit_is_set(UCSRA,RXC))</span>
<span style="color: #008000;">        {</span>
<span style="color: #008000;">            PORTB = UDR;</span>
<span style="color: #008000;">        }</span>
<span style="color: #008000;">         // 他の処理</span>
<span style="color: #008000;">    }</span>
<span style="color: #008000;">}</span></pre>
<h2>●割り込みで受信</h2>
<p>受信した文字が1byteごとにPORTBに表示される。<br />
<a href="http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Started+Notes+-+UART#p15" rel="nofollow" target="_blank">AVRWiki </a>のほぼそのまんまコピーです。<br />
wiki執筆の方に大感謝です！</p>
<pre><span style="color: #008000;">#include &lt;avr/io.h&gt;</span>
<span style="color: #008000;">#include &lt;avr/interrupt.h&gt;</span>

<span style="color: #008000;">#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)</span>
<span style="color: #008000;">#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)</span>
<span style="color: #008000;">#define    UART_RX    0        //ATtiny2313 では PD0:RxD PD1:TxD</span>
<span style="color: #008000;">#define    UART_TX    1</span>

<span style="color: #008000;">ISR(USART_RX_vect)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    PORTB = UDR;</span>
<span style="color: #008000;">}</span>
<span style="color: #008000;">int main(void)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    DDRA = ~0b11111111;        //portA all input    面倒なので一度全部適切な処理行う</span>
<span style="color: #008000;">    PORTA = 0b11111111;        //portA all pullup</span>
<span style="color: #008000;">    DDRB = ~0b11111111;        //portB all input</span>
<span style="color: #008000;">    PORTB = 0b11111111;        //portB all pullup</span>
<span style="color: #008000;">    DDRD = ~0b11111111;        //portD all input</span>
<span style="color: #008000;">    PORTD = 0b11111111;        //portD all pullup</span>
<span style="color: #008000;">    sbi(DDRD,UART_TX);        //UART関連だけのI/O方向処理</span>
<span style="color: #008000;">    cbi(DDRD,UART_RX);</span>

<span style="color: #008000;">    DDRB = ~0b00000000;        //portB all output</span>
<span style="color: #008000;">    PORTB = 0x00;</span>

<span style="color: #008000;">    UCSRB = _BV(RXCIE)|_BV(RXEN);    // 受信・受信割り込み有効</span>
<span style="color: #008000;">    UBRRH = 0;</span>
<span style="color: #008000;">    UBRRL = 51;    //8MHz で9600bps</span>
<span style="color: #008000;">    sei();        //全割り込み許可</span>
<span style="color: #008000;">for(;;){}</span>
<span style="color: #008000;">}</span></pre>
<p>&nbsp;</p>
<h2>●ArduinoIDEのシリアルモニタを活用</h2>
<p>送受信のテストはArduinoIDEのシリアルモニタを使うのがお手軽。<br />
フリーソフトもいっぱいあるけどね。</p>
<h2>●注意</h2>
<h3><a name="TOC-I-O-"></a>●I/O方向設定はした方が良い</h3>
<p>ネットや書籍の例文を見るとDDRBなどのI/O方向設定を指定していない。<br />
実際指定してなくても動いてしまう。<br />
だが、他ピンのLow/Highの影響を受けて変動してしまう事があり誤動作する。<br />
（特に、受け側が高インピーダンスの場合。）<br />
よって下記のように適切な定義はした方が良い。</p>
<pre><span style="color: #008000;">    DDRA = ~0b11111111;        //portA all input    面倒なので一度全部適切な処理行う</span>
<span style="color: #008000;">    PORTA = 0b11111111;        //portA all pullup</span>
<span style="color: #008000;">    DDRB = ~0b11111111;        //portB all input</span>
<span style="color: #008000;">    PORTB = 0b11111111;        //portB all pullup</span>
<span style="color: #008000;">    DDRD = ~0b11111111;        //portD all input</span>
<span style="color: #008000;">    PORTD = 0b11111111;        //portD all pullup</span>
<span style="color: #008000;">    sbi(DDRD,UART_TX);        //UART関連だけのI/O方向処理</span>
<span style="color: #008000;">    cbi(DDRD,UART_RX);</span></pre>
<h2>●参考リンク</h2>
<h3><a name="TOC-Getting-Started-Notes---UART---AVRW"></a><a href="http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Started+Notes+%2D+UART" rel="nofollow">Getting Started Notes &#8211; UART &#8211; AVRWiki</a></h3>
<p>非常に有用な資料です！<br />
割り込み方式がちょっと古いけどね。</p>
<h3><a name="TOC-ASCII-"></a><a href="http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html" rel="nofollow">ASCIIコード表</a></h3>
<p>改行コードの確認に。<br />
LF : 10 (10進)<br />
CR :13 (10進)</p>
]]></content:encoded>
			<wfw:commentRss>http://hp.hana-neko.com/archives/607/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AVRexample] Timer1 オーバーフロー</title>
		<link>http://hp.hana-neko.com/archives/596</link>
		<comments>http://hp.hana-neko.com/archives/596#comments</comments>
		<pubDate>Wed, 04 Jan 2012 03:49:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AVR]]></category>
		<category><![CDATA[電子]]></category>

		<guid isPermaLink="false">http://hp.hana-neko.com/?p=596</guid>
		<description><![CDATA[＜＜目次へ戻る 8bit の Timer0 に比べてずっと長い時間が扱える。 また、カウンタ値が大きく1/256 1/64 などの短いプリスケーラでもイケるので 生成できる周波数が多彩。 今の所 5Hz (100ms割り込み) 50Hz(10ms割り込み） を確認（測定器が無いので実際正確な値が出てるか？はわからん） ●多分正確？100ms毎の割り込み CPUは内蔵発振 8MHz 8bit版 Timer0 と違う場所は赤で示す #include &#60;avr/io.h&#62; #include &#60;avr/interrupt.h&#62; /*     AVRwiki より拝借マクロ     cbi()    addrのbit番目をLowに     sbi()    addrのbit番目をHighに    */ #define cbi(addr,bit)     addr &#38;= ~(1&#60;&#60;bit) #define sbi(addr,bit)     addr &#124;=  (1&#60;&#60;bit) volatile int led; ISR (TIMER1_OVF_vect) {     TCNT1 = 62411;     [...]]]></description>
			<content:encoded><![CDATA[<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
<p>8bit の Timer0 に比べてずっと長い時間が扱える。</p>
<div><a href="http://hp.hana-neko.com/wp-content/uploads/timer0_0-1.png"><img class="alignnone size-medium wp-image-597" title="timer0_0-1" src="http://hp.hana-neko.com/wp-content/uploads/timer0_0-1-300x143.png" alt="" width="300" height="143" /></a></div>
<p><iframe src="http://www.youtube.com/embed/D6McAAoQvMM" frameborder="0" width="420" height="315"></iframe></p>
<p>また、カウンタ値が大きく1/256 1/64 などの短いプリスケーラでもイケるので<br />
生成できる周波数が多彩。<br />
今の所</p>
<ul>
<li>5Hz (100ms割り込み)</li>
<li>50Hz(10ms割り込み）</li>
</ul>
<p>を確認（測定器が無いので実際正確な値が出てるか？はわからん）</p>
<h2><a name="TOC-100ms-"></a>●多分正確？100ms毎の割り込み</h2>
<p>CPUは内蔵発振 8MHz<br />
8bit版 Timer0 と違う場所は<span style="background-color: #ff0000;">赤</span>で示す</p>
<pre><span style="color: #008000;">#include &lt;avr/io.h&gt;</span>
<span style="color: #008000;">#include &lt;avr/interrupt.h&gt;</span>

<span style="color: #008000;">/*     AVRwiki より拝借マクロ</span>
<span style="color: #008000;">    cbi()    addrのbit番目をLowに</span>
<span style="color: #008000;">    sbi()    addrのbit番目をHighに    */</span>
<span style="color: #008000;">#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)</span>
<span style="color: #008000;">#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)</span>

<span style="color: #008000;">volatile int led;</span>

<span style="color: #008000;">ISR (TIMER<span style="background-color: #ff0000;">1</span>_OVF_vect)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    TCNT<span style="background-color: #ff0000;">1</span> = 62411;</span>
<span style="color: #008000;">    led++;</span>
<span style="color: #008000;">    PORTB = led;</span>
<span style="color: #008000;">}</span>

<span style="color: #008000;">int main( void )</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    DDRB  = 0xFF;        // PORTBの全ピンを出力に</span>
<span style="color: #008000;">    led = 0;</span>

<span style="color: #008000;">    TCCR<span style="background-color: #ff0000;">1</span>B = 0;            // タイマ停止</span>
<span style="color: #008000;">    TCNT<span style="background-color: #ff0000;">1</span> = 62411;            // カウンタは0からスタート</span>
<span style="color: #008000;">    TCCR<span style="background-color: #ff0000;">1</span>B = 4;            // タイマ開始。プリスケールは ck/256</span>
<span style="color: #008000;">    sbi(TIMSK,TOIE<span style="background-color: #ff0000;">1</span>);    // タイマ1オーバーフロー割り込みの許可</span>
<span style="color: #008000;">    sei();                // 割り込みの許可</span>
<span style="color: #008000;">    for (;;);</span>
<span style="color: #008000;">}</span></pre>
<p>&nbsp;</p>
<h3>注意</h3>
<p>ATtiny2313の場合 TIMSK はTimer0と共用。Megaの場合は別になる事がある</p>
<h2><a name="TOC-2"></a>●計算方法</h2>
<p>算数苦手なので自信無いです。<br />
考え方は 8bit版の Timer0 と同じ。<br />
100ms 10ms などの10で割り切れる波長を作るのを前提にしてる。</p>
<h3><a name="TOC-5Hz-100ms-"></a>5Hz(100ms)を作る</h3>
<ul>
<li>内蔵発振8MHzを256分周する = 31,250 Hz<br />
Timer0 では1024分周使ってた。<br />
Timer1のこの説明では10で割り切ってビッタリの精度出したいので分周後の周波数下桁が 0 になるようにプリスケーラ値を下げてる。</li>
<li>欲 しい周波数というのは振幅の Low / High 両方合わせたもの。<br />
しかしタイマーで設定できるのは片方だけの長さなので<br />
欲しい周波 数を2倍して計算式に入れる。<br />
5Hzが欲しいなら 100 を入れる。</li>
<li>16bit タイマは 0xFFFF の65536段分周器なので &#8221; / 65536 &#8221; の作用があると考える。<br />
つまり、求める物は”何段分周するか？”である</li>
<li>分周した い段数が決まったら 65536段 &#8211; (分周したい段)  ← これを TCNT1 に入れる</li>
</ul>
<h3><a name="TOC-5Hz-100ms-1"></a>5Hz(100ms)計算例</h3>
<p>100Hz が欲しい。</p>
<p>「8MHz256分周後の周波数をさらに x 段分周すると、求めたい周波数 5Hz がでる。」<br />
これの x について解く。<br />
出た x を65536(段)から引く。<br />
出た数値を TCNT1 に書き込む。</p>
<p>(8,000,000 / 256) / x = 2 * 5<br />
x = 39.0625&#8230;..<br />
65536 &#8211; 3125 = <span style="text-decoration: underline;">62411</span></p>
<h3><a name="TOC-3"></a>実測値</h3>
<p>5Hz : 5.04〜5.07 Hz<br />
50Hz :<br />
秋月テスター使用</p>
<h2><a name="TOC-4"></a>●注意</h2>
<p>volatile int led; の volatile は割り込みルーチン内で変数使う場合に必要。</p>
<div><a>avr-libc: Frequently Asked Questions</a><br />
割り込みルーチン内で書き換えたはずの変数が更新されません</div>
<p>を 参考の事。</p>
<p>ISP端子付けてるとPortB上位3bitが光るときリセットかかるっぽい。<br />
回路図のようにISP端子外す 事。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
]]></content:encoded>
			<wfw:commentRss>http://hp.hana-neko.com/archives/596/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AVRexample] Timer0 オーバーフロー</title>
		<link>http://hp.hana-neko.com/archives/587</link>
		<comments>http://hp.hana-neko.com/archives/587#comments</comments>
		<pubDate>Tue, 27 Dec 2011 03:13:50 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AVR]]></category>
		<category><![CDATA[電子]]></category>

		<guid isPermaLink="false">http://hp.hana-neko.com/?p=587</guid>
		<description><![CDATA[＜＜目次へ戻る 8bitタイマー 0 の件です。 タイマーは割り込みで使う場面がほとんどなので割り込み使用のサンプルのみ。 周波数は内蔵発振 8MHz。 オーバーフロータイマを使うより、CTCを使った方がずっと楽。 ●単純なオーバーフロー割り込み カウンタ0からスタートして 255 を超えたらオーバーフロー割り込みが発生する。 超えたら0に戻って勝手に再スタート。 #include &#60;avr/io.h&#62; #include &#60;avr/interrupt.h&#62; /*     AVRwiki より拝借マクロ     cbi()    addrのbit番目をLowに     sbi()    addrのbit番目をHighに    */ #define cbi(addr,bit)     addr &#38;= ~(1&#60;&#60;bit) #define sbi(addr,bit)     addr &#124;=  (1&#60;&#60;bit) volatile int led; ISR (TIMER0_OVF_vect)        //オーバーフローするとここに飛んで来る {     led++;     PORTB = led;             //変数 led の内容をPORTBに表示 } int [...]]]></description>
			<content:encoded><![CDATA[<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
<p>8bitタイマー 0 の件です。<br />
タイマーは割り込みで使う場面がほとんどなので割り込み使用のサンプルのみ。<br />
周波数は内蔵発振 8MHz。</p>
<p><a href="http://hp.hana-neko.com/wp-content/uploads/timer0_0.png"><img class="alignnone size-medium wp-image-589" title="timer0_0" src="http://hp.hana-neko.com/wp-content/uploads/timer0_0-300x143.png" alt="" width="300" height="143" /></a></p>
<p>オーバーフロータイマを使うより、CTCを使った方がずっと楽。<span id="more-587"></span></p>
<h2><a name="TOC-1"></a>●単純なオーバーフロー割り込み</h2>
<p>カウンタ0からスタートして 255 を超えたらオーバーフロー割り込みが発生する。<br />
超えたら0に戻って勝手に再スタート。</p>
<pre><span style="color: #008000;">#include &lt;avr/io.h&gt;</span>
<span style="color: #008000;">#include &lt;avr/interrupt.h&gt;</span>

<span style="color: #008000;">/*     AVRwiki より拝借マクロ</span>
<span style="color: #008000;">    cbi()    addrのbit番目をLowに</span>
<span style="color: #008000;">    sbi()    addrのbit番目をHighに    */</span>
<span style="color: #008000;">#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)</span>
<span style="color: #008000;">#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)</span>

<span style="color: #008000;">volatile int led;</span>

<span style="color: #008000;">ISR (TIMER0_OVF_vect)        //オーバーフローするとここに飛んで来る</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    led++;</span>
<span style="color: #008000;">    PORTB = led;             //変数 led の内容をPORTBに表示</span>
<span style="color: #008000;">}</span>

<span style="color: #008000;">int main( void )</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    DDRB  = 0xFF;        // PORTBの全ピンを出力に</span>
<span style="color: #008000;">    led = 0;</span>

<span style="color: #008000;">    TCCR0B = 0;            // タイマ停止</span>
<span style="color: #008000;">    TCNT0 = 0;            // カウンタは0からスタート</span>
<span style="color: #008000;">    TCCR0B = 5;            // タイマ開始。プリスケールは ck/1024</span>
<span style="color: #008000;">    sbi(TIMSK,TOIE0);    // タイマ0オーバーフロー割り込みの許可</span>
<span style="color: #008000;">    sei();                // 割り込みの許可</span>
<span style="color: #008000;">    for (;;);</span>
<span style="color: #008000;">}</span></pre>
<p>&nbsp;</p>
<h2>●ほぼ100Hzを創り出すオーバーフロー割り込み</h2>
<pre><span style="color: #008000;"> #include &lt;avr/io.h&gt;</span>
<span style="color: #008000;">#include &lt;avr/interrupt.h&gt;</span>

<span style="color: #008000;">/*     AVRwiki より拝借マクロ</span>
<span style="color: #008000;">    cbi()    addrのbit番目をLowに</span>
<span style="color: #008000;">    sbi()    addrのbit番目をHighに    */</span>
<span style="color: #008000;">#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)</span>
<span style="color: #008000;">#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)</span>

<span style="color: #008000;">volatile int led;</span>

<span style="color: #008000;">ISR (TIMER0_OVF_vect)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;"><span style="color: #ff0000;">    TCNT0 = 217;</span>                // 単純オーバーフローにこれを追加しただけ</span>
<span style="color: #008000;">    led++;</span>
<span style="color: #008000;">    PORTB = led;</span>
<span style="color: #008000;">}</span>

<span style="color: #008000;">int main( void )</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    DDRB  = 0xFF;        // PORTBの全ピンを出力に</span>
<span style="color: #008000;">    led = 0;</span>

<span style="color: #008000;">    TCCR0B = 0;            // タイマ停止</span>
<span style="color: #ff0000;">    TCNT0 = 217;            // 217からスタート</span>
<span style="color: #008000;">    TCCR0B = 5;            // タイマ開始。プリスケールは ck/1024</span>
<span style="color: #008000;">    sbi(TIMSK,TOIE0);    // タイマ0オーバーフロー割り込みの許可</span>
<span style="color: #008000;">    sei();                // 割り込みの許可</span>
<span style="color: #008000;">    for (;;);</span>
<span style="color: #008000;">}</span>
</pre>
<p>&nbsp;</p>
<h3>計算式</h3>
<p>算数苦手なので自信無いです。</p>
<ul>
<li>内蔵発振8MHzを1024分周する = 7,812.5 Hz</li>
<li>欲しい周波数というのは振幅の Low / High 両方合わせたもの。<br />
しかしタイマーで設定できるのは片方だけの長さなので<br />
欲しい周波数を2倍して計算式に入れる。<br />
100Hzが欲しいなら 200 を入れる。</li>
<li>8bit タイマは 0xFF の256段分周器なので &#8221; / 256 &#8221; の作用があると考える。<br />
つまり、求める物は”何段分周するか？”である</li>
<li>分周したい段数が決まったら 256段 &#8211; (分周したい段)  ← これを TCNT0 に入れる</li>
</ul>
<h3><a name="TOC-3"></a>計算例</h3>
<p>100Hzが欲しい。</p>
<p>「8MHz1024分周後の周波数をさらに x 段分周すると、求めたい周波数 100Hz がでる。」<br />
これの x について解く。<br />
出た x を256(段)から引く。<br />
出た数値を TCNT0 に書き込む。</p>
<p>(8,000,000 / 1024) / x = 2 * 100<br />
x = 39.0625&#8230;..<br />
256 &#8211; 39.0625 = 216.7&#8230; 約 <span style="text-decoration: underline;">217</span></p>
<h3><a name="TOC-4"></a>実測値</h3>
<p>100.3〜100.7 Hz<br />
秋月テスター使用</p>
<h2>●注意</h2>
<p>ATtiny2313の TCCR0B レジスタは<br />
ATmega では TCCR0 という名前になってる事多い。</p>
<p>volatile int led; の volatile は割り込みルーチン内で変数使う場合に必要。</p>
<p style="padding-left: 30px;"><a>avr-libc: Frequently Asked Questions</a><br />
割り込みルーチン内で書き換えたはずの変数が更新されません</p>
<p>を参考の事。</p>
<p>ISP端子付けてるとPortB上位3bitが光るときリセットかかるっぽい。<br />
回路図のようにISP端子外す事。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
<p>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hp.hana-neko.com/archives/587/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AVRexample] Timer0 CTC</title>
		<link>http://hp.hana-neko.com/archives/567</link>
		<comments>http://hp.hana-neko.com/archives/567#comments</comments>
		<pubDate>Mon, 26 Dec 2011 13:42:47 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AVR]]></category>
		<category><![CDATA[電子]]></category>

		<guid isPermaLink="false">http://hp.hana-neko.com/?p=567</guid>
		<description><![CDATA[＜＜目次へ戻る CTCは結局の所 自由な矩形周波数生成 オーバーフロータイマーを便利にしたもの 割り込みルーチン内でフロー再定義の必要が無い と言える。 ●自由な周波数の生成 OC0A(PB2)に周波数が出力される。 OCR0A レジスタの数値を増やす事で周波数を低くできる。 0-255まで。255は、CPU8MHzの時約65Hzの周波数になる。 ●サンプルコード #include &#60;avr/io.h&#62; int main(void) {     DDRB &#124;= _BV(PB2);     OCR0A  = 255;     TCCR0A = 2;            //Mode2     TCCR0A &#124;= _BV(COM0A0);     /* OSC8MHzの時片パルス幅30.5Hz この設定値はPWMを参照 */     TCCR0B &#124;= _BV(CS02) &#124; _BV(CS00);     for(;;); } &#160; &#160; ●自由な周波数の生成 割り込み有り版 上記に割り込みをつけただけ。 OC0A(PB2)に周波数が出力される。 OCR0A [...]]]></description>
			<content:encoded><![CDATA[<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
<p>CTCは結局の所</p>
<ul>
<li>自由な矩形周波数生成</li>
<li>オーバーフロータイマーを便利にしたもの<br />
割り込みルーチン内でフロー再定義の必要が無い</li>
</ul>
<p>と言える。<span id="more-567"></span></p>
<h2><a name="TOC-1"></a>●自由な周波数の生成</h2>
<p><a href="http://hp.hana-neko.com/wp-content/uploads/t0ctc1.png"><img class="alignnone size-medium wp-image-575" title="t0ctc1" src="http://hp.hana-neko.com/wp-content/uploads/t0ctc1-300x181.png" alt="" width="300" height="181" /></a></p>
<p>OC0A(PB2)に周波数が出力される。<br />
OCR0A レジスタの数値を増やす事で周波数を低くできる。<br />
0-255まで。255は、CPU8MHzの時約65Hzの周波数になる。</p>
<h3><a name="TOC-2"></a>●サンプルコード</h3>
<pre><span style="color: #008000;">#include &lt;avr/io.h&gt;</span>

<span style="color: #008000;">int main(void)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    DDRB |= _BV(PB2);</span>

<span style="color: #008000;">    OCR0A  = 255;</span>

<span style="color: #008000;">    TCCR0A = 2;            //Mode2</span>

<span style="color: #008000;">    TCCR0A |= _BV(COM0A0);</span>

<span style="color: #008000;">    /* OSC8MHzの時片パルス幅30.5Hz この設定値はPWMを参照 */</span>
<span style="color: #008000;">    TCCR0B |= _BV(CS02) | _BV(CS00);</span>

<span style="color: #008000;">    for(;;);</span>
<span style="color: #008000;">}</span></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2>●自由な周波数の生成 割り込み有り版</h2>
<p>上記に割り込みをつけただけ。</p>
<p><a href="http://hp.hana-neko.com/wp-content/uploads/t0ctc2.png"><img class="alignnone size-medium wp-image-576" title="t0ctc2" src="http://hp.hana-neko.com/wp-content/uploads/t0ctc2-300x202.png" alt="" width="300" height="202" /></a></p>
<p>OC0A(PB2)に周波数が出力される。<br />
OCR0A レジスタの数値を増やす事で周波数を低くできる。</p>
<p><a href="http://hp.hana-neko.com/wp-content/uploads/DSCN3798.jpg"><img class="alignnone size-medium wp-image-573" title="DSCN3798" src="http://hp.hana-neko.com/wp-content/uploads/DSCN3798-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>確認のため割り込み内でPD5に 5ms のパルスを出している。（波形<span style="background-color: #ffff00;">黄色</span>線）<br />
<span style="background-color: #ff99cc;">赤線</span>はOC0A(PB2)に出力されてる波形。<br />
割り込み内で処理がもたついても割り込み周期変わらないのがCTCの魅力</p>
<h3><a name="TOC-4"></a>●サンプルコード</h3>
<pre><span style="color: #008000;">#include &lt;avr/io.h&gt;</span>
<span style="color: #008000;">#include &lt;avr/interrupt.h&gt;</span>
<span style="color: #008000;">#include &lt;util/delay.h&gt;</span>

<span style="color: #008000;">#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)</span>
<span style="color: #008000;">#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)</span>

<span style="color: #008000;">ISR (TIMER0_COMPA_vect)        //オーバーフローするとここに飛んで来る</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    sbi(PORTD,PD5);</span>
<span style="color: #008000;">    _delay_ms(5);</span>
<span style="color: #008000;">    cbi(PORTD,PD5);</span>
<span style="color: #008000;">}</span>

<span style="color: #008000;">int main(void)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    DDRB |= _BV(PB2);</span>
<span style="color: #008000;">    DDRD |=_BV(PD5);</span>

<span style="color: #008000;">    OCR0A  = 255;</span>

<span style="color: #008000;">    TCCR0A = 2;            //Mode2 CTCモード</span>
<span style="color: #008000;">    TIMSK |= _BV(OCIE0A);    //キャプチャA 割り込みを設定</span>

<span style="color: #008000;">    TCCR0A |= _BV(COM0A0);</span>
<span style="color: #008000;">    TCCR0B |= _BV(CS02) | _BV(CS00);    //OSC8MHzの時30.5Hz</span>

<span style="color: #008000;">    sei();    //全体割り込み許可</span>
<span style="color: #008000;">    for(;;);</span>
<span style="color: #008000;">}</span></pre>
<p>&nbsp;</p>
<h2>●タイマ的な使い方</h2>
<p>波形出力をしないってこと。<br />
上記コードから</p>
<div>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">TCCR0A |= _BV(COM0A0);</div></div>
</div>
<p>を削れば波形出力だけしなくなる。<br />
オーバーフロータイマと違って割り込みルーチン内でフロー値再定義の必要が無い。<br />
フリーランでイケるタイマとして使うことができる。</p>
<p>できる事は一緒。<br />
つまり、オーバーフロータイマよりCTC使った方が楽。</p>
<p><a href="http://hp.hana-neko.com/wp-content/uploads/t0ctc3.png"><img class="alignnone size-medium wp-image-577" title="t0ctc3" src="http://hp.hana-neko.com/wp-content/uploads/t0ctc3-300x202.png" alt="" width="300" height="202" /></a></p>
<p>OCR0A レジスタの数値を増やす事で周波数を低くできる。</p>
<p><a href="http://hp.hana-neko.com/wp-content/uploads/DSCN3802.jpg"><img class="alignnone size-medium wp-image-574" title="DSCN3802" src="http://hp.hana-neko.com/wp-content/uploads/DSCN3802-300x225.jpg" alt="" width="300" height="225" /></a></p>
<p>確認のため割り込み内でPD5に 5ms のパルスを出している。（波形<span style="background-color: #ffff00;">黄色</span>線）<br />
上記のPB2(<span style="background-color: #ff0000;">赤線</span>)出力を無くしただけ</p>
<p>●サンプルコード</p>
<pre><span style="color: #008000;">#include &lt;avr/io.h&gt;</span>
<span style="color: #008000;">#include &lt;avr/interrupt.h&gt;</span>
<span style="color: #008000;">#include &lt;util/delay.h&gt;</span>

<span style="color: #008000;">#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)</span>
<span style="color: #008000;">#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)</span>

<span style="color: #008000;">ISR (TIMER0_COMPA_vect)        //マッチするとここに飛んで来る</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    sbi(PORTD,PD5);</span>
<span style="color: #008000;">    _delay_ms(5);</span>
<span style="color: #008000;">    cbi(PORTD,PD5);</span>
<span style="color: #008000;">}</span>

<span style="color: #008000;">int main(void)</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    DDRD |=_BV(PD5);</span>

<span style="color: #008000;">    OCR0A  = 255;</span>

<span style="color: #008000;">    TCCR0A = 2;            //Mode2 CTCモード</span>
<span style="color: #008000;">    TIMSK |= _BV(OCIE0A);    // キャプチャA 割り込みを設定</span>
        
<span style="color: #008000;">    TCCR0B |= _BV(CS02) | _BV(CS00);    //OSC8MHzの時30.5Hz</span>

<span style="color: #008000;">    sei();    //全体割り込み許可</span>
<span style="color: #008000;">    for(;;);</span>
<span style="color: #008000;">} </span></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
]]></content:encoded>
			<wfw:commentRss>http://hp.hana-neko.com/archives/567/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AVRexample] sleep</title>
		<link>http://hp.hana-neko.com/archives/549</link>
		<comments>http://hp.hana-neko.com/archives/549#comments</comments>
		<pubDate>Fri, 23 Dec 2011 08:03:59 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AVR]]></category>
		<category><![CDATA[電子]]></category>

		<guid isPermaLink="false">http://hp.hana-neko.com/?p=549</guid>
		<description><![CDATA[＜＜目次へ戻る ●概要 割り込みを使って目覚めるので、割り込み処理必要。 sleep自体は set_sleep_mode( mode ) でスリープモードを指定 sleep_mode()で眠りにつく 割り込みで目覚めて割り込みベクタへ飛ぶ プログラム中でまた sleep_mode() を呼び出して眠らせる と、これだけ。とてもシンプル。 スリープイネーブル(SE)ビットの立て下げ処理はsleep_mode()の中でやってくれる。 実用的なスリープモードは アイドル　SLEEP_MODE_IDLE パワーダウン　 SLEEP_MODE_PWR_DOWN の2パターンなので、2パターンだけ例を示しておく。 ●パワーダウンモードの例 【動作】 INT0外部割り込みスイッチ入力があると目覚める。 起動 ↓ PB1のLEDが一回光ってすぐ眠る。目覚めるまで何もしない ↓ ★割り込有り！★ ↓ 最初に割り込み処理内でPB0のLEDを光らせる。 ↓ main()にもどりPB1のLEDが一回光る。 ↓ また眠る パワーダウンモードではINT0割り込みで目覚める場合、Lレベル割り込みしか使えない。 #include &#60;avr/io.h&#62; #include &#60;util/delay.h&#62; #include &#60;avr/interrupt.h&#62; #include &#60;avr/sleep.h&#62; /*     AVRwiki より拝借マクロ     cbi()    addrのbit番目をLowに     sbi()    addrのbit番目をHighに    */ #define cbi(addr,bit)     [...]]]></description>
			<content:encoded><![CDATA[<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
<h2>●概要</h2>
<p>割り込みを使って目覚めるので、割り込み処理必要。<br />
sleep自体は</p>
<ol>
<li>set_sleep_mode( mode ) でスリープモードを指定</li>
<li>sleep_mode()で眠りにつく</li>
<li>割り込みで目覚めて割り込みベクタへ飛ぶ</li>
<li>プログラム中でまた sleep_mode() を呼び出して眠らせる</li>
</ol>
<p>と、これだけ。とてもシンプル。<br />
スリープイネーブル(SE)ビットの立て下げ処理はsleep_mode()の中でやってくれる。</p>
<p>実用的なスリープモードは</p>
<ul>
<li>アイドル　SLEEP_MODE_IDLE</li>
<li>パワーダウン　 SLEEP_MODE_PWR_DOWN</li>
</ul>
<p>の2パターンなので、2パターンだけ例を示しておく。<span id="more-549"></span></p>
<p><a href="http://hp.hana-neko.com/wp-content/uploads/avr_sleep_juyvjbk.png"><img class="alignnone size-medium wp-image-550" title="avr_sleep_juyvjbk" src="http://hp.hana-neko.com/wp-content/uploads/avr_sleep_juyvjbk-300x177.png" alt="" width="300" height="177" /></a></p>
<h2><a name="TOC-2"></a>●パワーダウンモードの例</h2>
<h3><a name="TOC-3"></a>【動作】</h3>
<p>INT0外部割り込みスイッチ入力があると目覚める。</p>
<pre style="padding-left: 30px;">起動
↓
PB1のLEDが一回光ってすぐ眠る。目覚めるまで何もしない
↓
★割り込有り！★
↓
最初に割り込み処理内でPB0のLEDを光らせる。
↓
main()にもどりPB1のLEDが一回光る。
↓
また眠る</pre>
<p>パワーダウンモードではINT0割り込みで目覚める場合、Lレベル割り込みしか使えない。</p>
<pre><span style="color: #008000;">#include &lt;avr/io.h&gt;</span>
<span style="color: #008000;">#include &lt;util/delay.h&gt;</span>
<span style="color: #008000;">#include &lt;avr/interrupt.h&gt;</span>
<span style="color: #008000;">#include &lt;avr/sleep.h&gt;</span>

<span style="color: #008000;">/*     AVRwiki より拝借マクロ</span>
<span style="color: #008000;">    cbi()    addrのbit番目をLowに</span>
<span style="color: #008000;">    sbi()    addrのbit番目をHighに    */</span>
<span style="color: #008000;">#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)</span>
<span style="color: #008000;">#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)</span>

<span style="color: #008000;">ISR (INT0_vect,ISR_BLOCK) // PD2 がLOWになった時は光る</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    sbi(PORTB,0);        //LED on</span>
<span style="color: #008000;">    _delay_ms(100);        //0.1sec 点灯させる</span>
<span style="color: #008000;">    cbi(PORTB,0);        //LED off</span>
<span style="color: #008000;">}</span>

<span style="color: #008000;">int main( void )</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    DDRB = 0xFF;    //　PortBをLED点灯のためOutputに</span>
<span style="color: #008000;">    DDRD = 0x00;    //    PortDをSW入力のためすべてInputに</span>
<span style="color: #008000;">    PORTD= 0xFF;    //    PortD全てプルアップ。</span>
<span style="color: #008000;">    /* INT0を許可する */</span>
<span style="color: #008000;">    sbi(GIMSK,INT0);</span>
<span style="color: #008000;">    // INT0 はLowになれば割り込み発生するよう設定</span>
<span style="color: #008000;">    // つまりパワーダウンモードに対応</span>
<span style="color: #008000;">    cbi(MCUCR,ISC01);</span>
<span style="color: #008000;">    cbi(MCUCR,ISC00);</span>
<span style="color: #008000;">    set_sleep_mode(SLEEP_MODE_PWR_DOWN);// パワーダウンモードを設定</span>

<span style="color: #008000;">    sei();        //全体割り込み許可</span>
<span style="color: #008000;">    for (;;)</span>
<span style="color: #008000;">    {</span>
<span style="color: #008000;">        sbi(PORTB,1);        //LED on</span>
<span style="color: #008000;">        _delay_ms(100);        //0.1sec 点灯させる</span>
<span style="color: #008000;">        cbi(PORTB,1);        //LED off       </span>
<span style="color: #008000;">        _delay_ms(100);        //0.1sec 消灯させる</span>
<span style="color: #008000;">        sleep_mode();                //スリープ開始。</span>
<span style="color: #008000;">    }</span>
<span style="color: #008000;">}</span>

<a name="TOC-4"></a></pre>
<h2>●アイドルモードの例</h2>
<h3><a name="TOC-5"></a>【動作】</h3>
<p>INT0外部割り込みスイッチ入力があると目覚める。</p>
<pre style="padding-left: 30px;">起動
↓
PB1のLEDが一回光ってすぐ眠る。目覚めるまで何もしない
↓
★割り込有り！★
↓
最初に割り込み処理内でPB0のLEDを光らせる。
↓
main()にもどりPB1のLEDが一回光る。
↓
また眠る</pre>
<p>動作自体はパワーダウンモードと全く同じ。<br />
アイドルモードではピン入力部分は動いているので立ち上がり立ち下がりを検出できる。</p>
<pre><span style="color: #008000;"> #include &lt;avr/io.h&gt;</span>
<span style="color: #008000;">#include &lt;util/delay.h&gt;</span>
<span style="color: #008000;">#include &lt;avr/interrupt.h&gt;</span>
<span style="color: #008000;">#include &lt;avr/sleep.h&gt;/*     AVRwiki より拝借マクロ</span>
<span style="color: #008000;">    cbi()    addrのbit番目をLowに</span>
<span style="color: #008000;">    sbi()    addrのbit番目をHighに    */</span>
<span style="color: #008000;">#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)</span>
<span style="color: #008000;">#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)</span>

<span style="color: #008000;">ISR (INT0_vect,ISR_BLOCK) // PD2 がLOWになった時光る</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    sbi(PORTB,0);        //LED on</span>
<span style="color: #008000;">    _delay_ms(100);        //0.1sec 点灯させる</span>
<span style="color: #008000;">    cbi(PORTB,0);        //LED off</span>
<span style="color: #008000;">}</span>

<span style="color: #800000;">//パワーダウンモードと違う所は赤文字部分のみ</span>
<span style="color: #008000;">int main( void )</span>
<span style="color: #008000;">{</span>
<span style="color: #008000;">    DDRB = 0xFF;    //　PortBをLED点灯のためOutputに</span>
<span style="color: #008000;">    DDRD = 0x00;    //    PortDをSW入力のためすべてInputに</span>
<span style="color: #008000;">    PORTD= 0xFF;    //    PortD全てプルアップ。</span>
<span style="color: #008000;">    /* INT0を許可する */</span>
<span style="color: #008000;">    sbi(GIMSK,INT0);</span>
<span style="color: #008000;">    // INT0 は立下り割り込み発生するよう設定</span>
<span style="color: #800000;">    sbi(MCUCR,ISC01);</span>

<span style="color: #008000;">    set_sleep_mode(<span style="color: #800000;">SLEEP_MODE_IDLE</span>);    //アイドルモードに設定</span>

<span style="color: #008000;">    sei();        //全体割り込み許可</span>
<span style="color: #008000;">    for (;;)</span>
<span style="color: #008000;">    {</span>
<span style="color: #008000;">        sbi(PORTB,1);        //LED on</span>
<span style="color: #008000;">        _delay_ms(100);        //0.1sec 点灯させる</span>
<span style="color: #008000;">        cbi(PORTB,1);        //LED off       </span>
<span style="color: #008000;">        _delay_ms(100);        //0.1sec 消灯させる</span>
<span style="color: #008000;">        sleep_mode();</span>
<span style="color: #008000;">    }</span>
<span style="color: #008000;">}</span></pre>
<div>
<h2><a name="TOC-6"></a>●消費電流</h2>
<p>スリープ中の消費電流。<br />
いずれも実測。<br />
なんちゃってテスタなので精密ではない。</p>
<p style="padding-left: 30px;"> <strong>モード:消費電流</strong><br />
パワーダウンモー:0.02mA<br />
アイドルモード:2.30mA<br />
sleep無し永久ループ:5.04mA</p>
<p>これはもう、断然パワーダウンモード便利だね！<br />
パワーダウンは目覚めるまでにリセットタイムアウト時間分かかる。<br />
リセットタイムアウトは動作周波数決めるヒューズビットで設定。<br />
例えば<br />
Int RC 8MHz StartUptime <span style="color: #800000;">14CK + 65ms</span><br />
など。<br />
アイドルモードの目覚めるまでにかかる時間は不明。数クロックだとおもうけど。</p>
<h2><a name="TOC-AVR-Sleep-"></a>●AVRのSleepからの復帰条件</h2>
<p>基本は割り込みのみ。</p>
<ul>
<li>TWIのアドレスマッチ</li>
<li>ウォッチドッグ</li>
</ul>
<p>などの非同期モジュールからも目覚めることができる</p>
<h2><a name="TOC-7"></a>●使えるスリープモード</h2>
<p>ATtiny2313では</p>
<ul>
<li>アイドル　SLEEP_MODE_IDLE</li>
<li>パワーダウン　SLEEP_MODE_PWR_DOWN</li>
<li>スタンバイ　SLEEP_MODE_STANDBY</li>
</ul>
<p>以外使えない。というか定義されてない。他のモードは自分で設定する事。<br />
普通の製作では実質アイドルとスタンバイしか使わないと思うので問題無さそう。</p>
<p>以下、ヘッダファイルの中のコード</p>
<pre><span style="color: #008000;">#elif defined(__AVR_ATtiny2313__) \</span>
<span style="color: #008000;">|| defined(__AVR_ATtiny2313A__) \</span>
<span style="color: #008000;">|| defined(__AVR_ATtiny4313__)    #define SLEEP_MODE_IDLE         0</span>
<span style="color: #008000;">    #define SLEEP_MODE_PWR_DOWN     (_BV(SM0) | _BV(SM1))</span>
<span style="color: #008000;">    #define SLEEP_MODE_STANDBY      _BV(SM1)    #define set_sleep_mode(mode) \</span>
<span style="color: #008000;">    do { \</span>
<span style="color: #008000;">        _SLEEP_CONTROL_REG = ((_SLEEP_CONTROL_REG &amp; ~(_BV(SM0) | _BV(SM1))) | (mode)); \</span>
<span style="color: #008000;">    } while(0)</span></pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
</div>
]]></content:encoded>
			<wfw:commentRss>http://hp.hana-neko.com/archives/549/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AVRexample] serial 7seg 4桁LED</title>
		<link>http://hp.hana-neko.com/archives/539</link>
		<comments>http://hp.hana-neko.com/archives/539#comments</comments>
		<pubDate>Thu, 22 Dec 2011 00:05:43 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AVR]]></category>
		<category><![CDATA[電子]]></category>

		<guid isPermaLink="false">http://hp.hana-neko.com/?p=539</guid>
		<description><![CDATA[＜＜目次へ戻る スイッチサイエンス社で販売してる シリアル接続7セグメント4桁LED の動作方法。 SparkFunで売っている物と同様。 コツというか注意がたくさんある。 SparkFunのページにマニュアル有り。サンプルコードはごちゃごちゃしてて解読しづらい。 ●UARTによる接続。動作と回路図 ●UARTによる接続。サンプルコード #include &#60;avr/io.h&#62; #include &#60;util/delay.h&#62; void uart_putchar(char c) {     //UDREビットが1になるまで待つ     loop_until_bit_is_set(UCSRA, UDRE);     UDR = c; } int main(void) {     //TXDのみ出力     DDRD = ~0b11111101;     //無用なポートはプルアップ     PORTD = 0b11111101;     UCSRB = _BV(TXEN); //送信許可     UBRRH = 0;     UBRRL = 51;        [...]]]></description>
			<content:encoded><![CDATA[<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
<p><a href="http://www.switch-science.com/products/detail.php?product_id=182" rel="nofollow">スイッチサイエンス社で販売してる シリアル接続7セグメント4桁LED</a><br />
の動作方法。<br />
<a href="http://www.sparkfun.com/commerce/product_info.php?products_id=9230" rel="nofollow">SparkFun</a>で売っている物と同様。<br />
コツというか注意がたくさんある。<br />
<a href="http://www.sparkfun.com/commerce/product_info.php?products_id=9230" rel="nofollow">SparkFun</a>のページにマニュアル有り。サンプルコードはごちゃごちゃしてて解読しづらい。<span id="more-539"></span></p>
<h2><a name="TOC-UART-"></a>●UARTによる接続。動作と回路図</h2>
<p><a href="http://hp.hana-neko.com/wp-content/uploads/7seg_seri_uart.png"><img class="alignnone size-medium wp-image-544" title="7seg_seri_uart" src="http://hp.hana-neko.com/wp-content/uploads/7seg_seri_uart-300x156.png" alt="" width="300" height="156" /></a><a name="TOC-1"></a><br />
<iframe src="http://www.youtube.com/embed/2F17RZ43hFI" frameborder="0" width="420" height="315"></iframe></p>
<h2><a name="TOC-UART-1"></a>●UARTによる接続。サンプルコード</h2>
<pre>#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;

void uart_putchar(char c)
{
    //UDREビットが1になるまで待つ
    loop_until_bit_is_set(UCSRA, UDRE);
    UDR = c;
}

int main(void)
{
    //TXDのみ出力
    DDRD = ~0b11111101;
    //無用なポートはプルアップ
    PORTD = 0b11111101;

    UCSRB = _BV(TXEN); //送信許可
    UBRRH = 0;
    UBRRL = 51;        // 8MHzで9600bps
    _delay_ms(200);
    uart_putchar(0x77);        // [ : ] を消す制御コマンド。カーソル位置をリセットする目的。
    uart_putchar(0x00);
    _delay_ms(200);
    for(;;)
    {
        uart_putchar(0x77);     // [ : ] を消す制御コマンド。こまめにカーソル位置をリセットする目的。
        uart_putchar(0x00);
        _delay_ms(200);
        uart_putchar(0x01);    // [1234]と表示
        uart_putchar(0x02);
        uart_putchar(0x03);
        uart_putchar(0x04);
        _delay_ms(1000);
        uart_putchar(0x78);    // ブランクを4つ送信。表示を消してる
        uart_putchar(0x78);
        uart_putchar(0x78);
        uart_putchar(0x78);
        _delay_ms(1000);
    }
}</pre>
<p>&nbsp;</p>
<hr size="2" width="100%" />
<p>&nbsp;</p>
<h2><a name="TOC-3"></a>●コツ</h2>
<h3><a name="TOC-00:00-"></a>● 00<strong>:</strong>00 の真ん中のダブルコロンを点灯させる</h3>
<pre>        uart_putchar(0x77);
        uart_putchar(0x30);
        _delay_ms(1000);</pre>
<h2><a name="TOC-4"></a>●注意</h2>
<h3><a name="TOC-9600bps"></a>●通信速度は9600bps</h3>
<h3><a name="TOC-5"></a>●リセットに該当するコマンドが無い</h3>
<p>そのため制御コマンドで何も表示しない物で代用する<br />
↓参照</p>
<h3><a name="TOC-6"></a>●最初に制御コマンドを書く</h3>
<p>制御コマンド無しの場合、俗に言う「カーソル位置」からの描画となる。<br />
[1234]と表示したいのに[3412]になることがとても多かった。<br />
最初に制御コマンドを入れておくと、カーソル位置がリセットされるっぽい。</p>
<pre>    uart_putchar(0x77);
    uart_putchar(0x00);　　これは 00:00 の真ん中のダブルコロンを消灯させるコマンド。表示に影響が出にくいので便利</pre>
<h3><a name="TOC-7"></a>●どっちにしろ桁ズレする</h3>
<p>入れた所で上手く行かない事もある。<br />
もしかしたら、信号線も電源ラインもノイズに弱いのかも。</p>
<h3><a name="TOC-200ms-"></a>●電源入れたら200msほど待つ</h3>
<pre>
<div class="codecolorer-container text default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">_delay_ms(200);</div></div>
</pre>
<p>のようにね。</p>
<h3><a name="TOC-8"></a>●制御コマンドのあとはウエイトを入れる</h3>
<p>200msecくらいかな？<br />
<a href="http://www.switch-science.com/products/detail.php?product_id=182" rel="nofollow">シリアル接続7セグメント4桁LED商品ページ</a>のコメント欄参照</p>
<h3><a name="TOC-AVR-"></a>●AVRのポートはしっかりプルアップしておく事</h3>
<p>他ポートが浮いているだけでノイズが流入して誤動作するっぽい。<br />
また、7segモジュールのRXにつなぐTXDピンはちゃんと出力モードにしておく事。</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
]]></content:encoded>
			<wfw:commentRss>http://hp.hana-neko.com/archives/539/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AVRexample] LEDフラッシャー</title>
		<link>http://hp.hana-neko.com/archives/526</link>
		<comments>http://hp.hana-neko.com/archives/526#comments</comments>
		<pubDate>Wed, 21 Dec 2011 02:14:36 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AVR]]></category>
		<category><![CDATA[電子]]></category>

		<guid isPermaLink="false">http://hp.hana-neko.com/?p=526</guid>
		<description><![CDATA[＜＜目次へ戻る ●目的 RAMメモリの節約手法の例文。 LEDフラッシャーを作る事を通して、 RAMではなくFlashROMに定数データを記述する方法を習得。 フォントの導入やグラフィックLCDへ画像を表示したい場合などの応用が考えられる。 ●構文 LEDフラッシャーテスト 記述 const char leddata[] PROGMEM = {     data,data,data, .... };    ←最後の ; がポイント 読み込み         for (s=0;s&#60;= データの数 ;s++)         {             PORTB = pgm_read_byte_near(leddata + s);             _delay_ms(20);         } ●サンプルコード #include &#60;avr/io.h&#62; #include &#60;util/delay.h&#62; #include &#60;avr/pgmspace.h&#62;    //←これをincludeするのがポイント [...]]]></description>
			<content:encoded><![CDATA[<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
<h2>●目的</h2>
<p>RAMメモリの節約手法の例文。<br />
LEDフラッシャーを作る事を通して、<br />
RAMではなくFlashROMに定数データを記述する方法を習得。<br />
フォントの導入やグラフィックLCDへ画像を表示したい場合などの応用が考えられる。</p>
<p><a href="http://hp.hana-neko.com/wp-content/uploads/flash.png"><img class="alignnone size-medium wp-image-533" title="flash" src="http://hp.hana-neko.com/wp-content/uploads/flash-300x140.png" alt="" width="300" height="140" /></a><span id="more-526"></span><br />
<iframe src="http://www.youtube.com/embed/xlAmUmKorAA" frameborder="0" width="420" height="315"></iframe></p>
<h2><a name="TOC-2"></a>●構文</h2>
<div>
<div>
<h4>LEDフラッシャーテスト</h4>
</div>
</div>
<h3><a name="TOC-3"></a>記述</h3>
<pre style="padding-left: 60px;">const char leddata[] PROGMEM = {
    data,data,data, ....
};    ←最後の ; がポイント</pre>
<h3><a name="TOC-4"></a>読み込み</h3>
<pre>        for (s=0;s&lt;= <em>データの数</em> ;s++)
        {
            PORTB = pgm_read_byte_near(leddata + s);
            _delay_ms(20);
        }</pre>
<h2><a name="TOC-5"></a>●サンプルコード</h2>
<pre>#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;
#include &lt;avr/pgmspace.h&gt;    //←これをincludeするのがポイント

const char leddata[] PROGMEM = {    // データ数186個
0b00000001,        //scroll
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000001,        //scroll
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000001,        //scroll
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000001,        //scroll
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000001,        //scroll
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000001,        //scroll
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000001,        //scroll
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000001,        //scroll
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000001,        //scroll
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000001,        //scroll
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000001,        //scroll
0b00000010,
0b00000100,
0b00001000,
0b00010000,
0b00100000,
0b01000000,
0b10000000,
0b01000000,
0b00100000,
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000000,        //flash
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b11111111,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000
};        //const 宣言のときは最後に ; をつける

int main( void )
{
    uint8_t    s;        // カウンタ変数

    DDRB = 0xFF;    //　PortBをLED点灯のためOutputに
    DDRD = 0x00;    //    PortDをSW入力のためすべてInputに
    PORTD= 0xFF;    //    PortD全てプルアップ。

    for(;;)                //永久ループ
    {
        for (s=0;s&lt;=185;s++)
        {
            PORTB = pgm_read_byte_near(leddata + s);    //ここでデータ取り出す
            _delay_ms(20);
        }
    }
}</pre>
<h2><a name="TOC-6"></a>●注意というか謎</h2>
<p>pgm_read_byte_near(leddata[s]);<br />
では取り出せなかった。<br />
ポインタしか記述できないのかな。</p>
<h2><a name="TOC-7"></a>●参考資料</h2>
<p><a href="http://www.musashinodenpa.com/arduino/ref/index.php?f=0&amp;pos=1613" rel="nofollow">Arduino 日本語リファレンス</a><br />
PROGMEM の項目。シンプルで一番役に立つ。</p>
<p><a href="http://brown.ap.teacup.com/nekosan0/700.html" rel="nofollow">続、続、avr-gccの制約 | ＰＩＣ　ＡＶＲ　工作室　ブログ</a><br />
大量に記述する例。<br />
32kbyteの制限が有るらしい。</p>
<p><a href="http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Started+Notes+%2D+Program+Memory" rel="nofollow">Getting Started Notes &#8211; Program Memory &#8211; AVRWiki</a><br />
大御所AVRwiki<br />
良い説明が有るが動かなかった。内容が古いので注意。</p>
<h3>有用そうな資料引用</h3>
<pre>プログラムメモリの中に配列を作る
const prog_char *TEN = {0,1,2,3,4,5,6,7,8,9};

配列の要素を読む
char res = pgm_read_byte(&amp;TEN[5]); /* TEN[X]の読み出し*/
char res = pgm_read_byte(TEN+X); /* TENからXバイト目の読み出し */</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
<p>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hp.hana-neko.com/archives/526/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AVRexample] LEDの点滅</title>
		<link>http://hp.hana-neko.com/archives/515</link>
		<comments>http://hp.hana-neko.com/archives/515#comments</comments>
		<pubDate>Tue, 20 Dec 2011 12:59:15 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AVR]]></category>
		<category><![CDATA[電子]]></category>

		<guid isPermaLink="false">http://hp.hana-neko.com/?p=515</guid>
		<description><![CDATA[＜＜目次へ戻る 一番基本になる物です。 LEDの点滅・ピカピカ・blink ブレッドボードに構築すると良いかと。 内蔵発振8MHz 周波数は他の物にしてもOKそうです。 点滅速度が変わるだけ。 C で示すパスコンは無くても動いた。 ●超基礎 LEDがチカチカチカ・・・と点滅します #include &#60;avr/io.h&#62; int main(void) {     long i;     DDRB = 1;     // portB の1pinを出力に。00000001を書き込んでいる     while(1)     {         for (i=0;i&#60;10000;i++)         { }         PORTB ^=1;        // XOR演算で 1pin のみ反転させてる     } } 引用：AVRマイコン活用ブック すこし修正してます &#160; &#160; ●実用型 これも点滅。 // ATmega168 &#38; [...]]]></description>
			<content:encoded><![CDATA[<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
<p>一番基本になる物です。<br />
LEDの点滅・ピカピカ・blink</p>
<p><a href="../wp-content/uploads/avr_blink_cir1.jpg"><img class="alignnone size-medium wp-image-516" title="avr_blink_cir" src="../wp-content/uploads/avr_blink_cir1-300x170.jpg" alt="" width="300" height="170" /></a></p>
<p>ブレッドボードに構築すると良いかと。<br />
内蔵発振8MHz<br />
周波数は他の物にしてもOKそうです。<br />
点滅速度が変わるだけ。<br />
C で示すパスコンは無くても動いた。<span id="more-515"></span></p>
<h2><a name="TOC-1"></a>●超基礎</h2>
<p>LEDがチカチカチカ・・・と点滅します</p>
<pre>#include &lt;avr/io.h&gt;
int main(void)
{
    long i;
    DDRB = 1;     // portB の1pinを出力に。00000001を書き込んでいる
    while(1)
    {
        for (i=0;i&lt;10000;i++)
        { }
        PORTB ^=1;        // XOR演算で 1pin のみ反転させてる
    }
}</pre>
<p>引用：<a href="http://www.nicotak.com/avr/" rel="nofollow" target="_blank">AVRマイコン活用ブック<br />
</a>すこし修正してます</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h2><a name="TOC-2"></a>●実用型</h2>
<p>これも点滅。</p>
<pre><span style="color: #339966;">// ATmega168 &amp; ATtiny13A用 ATtiny2313 でも動くはず</span>

#include &lt;avr/io.h&gt;
#include &lt;util/delay.h&gt;
// AVRwiki より拝借マクロ
// cbi()    addrのbit番目をLowに
// sbi()    addrのbit番目をHighに
#define cbi(addr,bit)     addr &amp;= ~(1&lt;&lt;bit)
#define sbi(addr,bit)     addr |=  (1&lt;&lt;bit)

int main(void)
{
    DDRB = ~0b00111000;
    PORTB = 0b00000000;
    while(1)
    {
        if(bit_is_set(PORTB,0)==0)
        {
            sbi(PORTB,0);        //もしPB0がLowなら点灯させる
        }else
        {
            cbi(PORTB,0);
        }
        _delay_ms(500);
    }
}</pre>
<p>&nbsp;</p>
<h2>注意点</h2>
<h3><a name="TOC-4"></a>入出力方向の決定</h3>
<p>PICと大きく違うのは、0でinput / 1 でoutput であるという事。<br />
ちょうど解釈が反転してる。<br />
PICの方が覚えやすいねー</p>
<p>DDRB = 0b00000001;    //これでportBのPB0が出力<br />
DDRB = <span style="background-color: #ffff00;">~</span>0b11111110;    //これでもportBのPB0が出力<br />
~ はNOTの意味。</p>
<h3><a name="TOC-5"></a>出力レジスタと入力検知レジスタが違う</h3>
<p>PICは一緒でごちゃごちゃにして使う。<br />
AVRは分離。分離の方が業界主流。</p>
<ul>
<li>ポートB方向指定レジスタ DDRB　　(ポートAならDDRA)</li>
<li>ポートB出力セットレジスタ PORTB　(ポートAならPORTA)</li>
<li>ポートB入力検知レジスタ PINB　　(ポートAならPINA)</li>
</ul>
<p>引用修正元：<a href="http://avrwiki.jpn.ph/wiki.cgi?page=Getting+Started+Notes+%2D+Ports#p11" rel="nofollow">Getting Started Notes &#8211; Ports &#8211; AVRWiki</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hp.hana-neko.com/archives/515/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[AVRexample] delay関数の使用</title>
		<link>http://hp.hana-neko.com/archives/506</link>
		<comments>http://hp.hana-neko.com/archives/506#comments</comments>
		<pubDate>Tue, 20 Dec 2011 01:18:07 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[AVR]]></category>
		<category><![CDATA[電子]]></category>

		<guid isPermaLink="false">http://hp.hana-neko.com/?p=506</guid>
		<description><![CDATA[＜＜目次へ戻る delay関数を使ってみます ●動作 1秒毎にLEDの点滅 ●ソース #include &#60;avr/io.h&#62; //マイコンの周波数を定義。delay.h を include する前に書く //ここで実際の動作クロックを決められるわけではない。あくまで内部計算用 //AVR StudioのProject→Configuration Optionsのfrequencyに入力してやることで指定することもできる #define    F_CPU    8000000UL #include &#60;util/delay.h&#62; int main(void) {     long i;         DDRB = 1;         while(1)         {             _delay_ms(1000);             PORTB ^=1;         }         return 0;  } ●注意 _delay_ms(); には定数しか書けない。変数はダメ。 【OK例】         while(1)         {             _delay_ms(1000); [...]]]></description>
			<content:encoded><![CDATA[<p>＜＜<a href="http://hp.hana-neko.com/ele_basic/avrsample">目次</a>へ戻る</p>
<p>delay関数を使ってみます</p>
<h2><a name="TOC-1"></a>●動作</h2>
<div><a href="http://hp.hana-neko.com/wp-content/uploads/avr_blink_cir.jpg"><img class="alignnone size-medium wp-image-509" title="avr_blink_cir" src="http://hp.hana-neko.com/wp-content/uploads/avr_blink_cir-300x170.jpg" alt="" width="300" height="170" /></a></div>
<p>1秒毎にLEDの点滅</p>
<h2><a name="TOC-2"></a>●ソース</h2>
<pre>#include &lt;avr/io.h&gt;
<span style="color: #339966;">//マイコンの周波数を定義。delay.h を include する前に書く</span>
<span style="color: #339966;">//ここで実際の動作クロックを決められるわけではない。あくまで内部計算用</span>
<span style="color: #339966;">//AVR StudioのProject→Configuration Optionsのfrequencyに入力してやることで指定することもできる</span>
#define    F_CPU    8000000UL
#include &lt;util/delay.h&gt;

int main(void)
{
    long i;
        DDRB = 1;
        while(1)
        {
            _delay_ms(1000);
            PORTB ^=1;
        }
        return 0;
 }</pre>
<h2><a name="TOC-3"></a>●注意</h2>
<pre>_delay_ms(); には定数しか書けない。変数はダメ。
【OK例】
        while(1)
        {
            _delay_ms(1000);
            PORTB ^=1;
        }
【NG例】
        int s;
        s = 1000;
        while(1)
        {
            _delay_ms(s);
            PORTB ^=1;
        }</pre>
<h2><a name="TOC-4"></a>●参考サイト</h2>
<p>&nbsp;</p>
<h4><a name="TOC-LED---AVR-"></a><a href="http://www.botebote.com/pwiki/index.php?LED%A5%B5%A5%F3%A5%D7%A5%EB" rel="nofollow">LEDサンプル &#8211; AVR 覚え書き</a></h4>
<ul>
<li>ヒューズビット CKDIV8 の罠について<br />
引用：<span style="font-size: xx-small;"><em>こいつが0だと、実際には8で割った数がシステムクロックとなるらしい。</em></span></li>
<li>定数決めうちが良い<br />
引用：<span style="font-size: xx-small;"><em>変数を渡すようなコードを書くと、doubleに変換した引数とF_CPUの計算ルーチンが入るため、コードが膨らむ。</em></span></li>
</ul>
<h4><a name="TOC-AVR-LED---Sim-s-blog"></a><a href="http://blog.goo.ne.jp/sim00/e/0bc6364fd15050bff9a0af7486e72977" rel="nofollow">AVRでLEDホタル &#8211; Sim&#8217;s blog</a></h4>
<ul>
<li>どこに周波数定義を書けるか？が書いてある<br />
僕はコードに明示するのが好きなので F_CPU を使用<br />
引用：<br />
<span style="font-size: xx-small;"><em>動作クロックはF_CPUをマクロ定義します。自分で#defineすることもできますが、AVR StudioだとProject→Configuration Optionsのfrequencyに入力してやることで指定することもできます。</em></span></li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>.</p>
]]></content:encoded>
			<wfw:commentRss>http://hp.hana-neko.com/archives/506/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

