LEDサンプル
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
#analog
#norelated
#contents
* LEDサンプル [#d2eb2c43]
** 回路図 [#u7272bd2]
やっぱり最初はこれよね。~
LEDをPD0〜PD7に接続。~
#ref(LEDTest.png,left,nowrap,LEDサンプル)
本当は抵抗が必要なはずだが、まぁいい。~
とりあえずは光ればいい。~
#u2b(fc-vW6RD1Co,w=480,h=385)
** ソースコード [#ie5d30a4]
以下、ソースコード。~
#include <avr/io.h>
#include <util/delay.h>
void delay_ms( int time )
{
// 指定ms分ループ
while( time-- ){
_delay_ms( 1 );
}
}
int main( void )
{
DDRD = 0b11111111; // ポートDの方向レジスタを、全て出力に
PORTD = 0b00000000; // ポートDの出力レジスタを、全てLowに
char count = 0; // 0〜7まで
char binc = 1; // インクリメントモードかデクリメントモ...
while( 1 ){
PORTD = ( 1 << count ); // ポートDのカウント数位置の出...
if( binc ){ // インクリメントモード
count++;
if( 7 <= count ){ // 端までいったのでデクリメントモー...
binc = 0;
}
} else { // デクリメントモード
count--;
if( 0 >= count ){ // 最初まで戻ったのでインクリメント...
binc = 1;
}
}
delay_ms( 50 ); // 50ms待ち
}
return 0;
}
** _delay_ms [#zc5a7ac7]
ATmega168Pは、内蔵RC発信器が8MHzとなっていたので、普通にC...
AVRStudioのProject Optionで、Frequencyを8000000Hzに設定し...
具体的に言うと、8倍くらい。~
データシートを読み返してみると、ヒューズビットにCKDIV8と...
(システムクロック前置分周器:目的としては、消費電力節約用...
ってんで、Frequencyを1000000Hzに設定しなおして、事なきを...
デバイスの最高周波数より高い周波数のクロックを入力する場...
というわけで、ヒューズビットのCKDIV8を立てて、Frequencyを...
この辺は、電源とかの兼ね合いで変えるべきかね。~
[[AVRWikiにあるように、:http://avrwiki.jpn.ph/wiki.cgi?pa...
なので、1ms指定で指定ms分ループをしている。~
本当は、1ms指定じゃなくもっと大きい数で少ない回数回す方が...
そのシステムクロックで回せる最大数以上だったら最大数、未...
しかし、未満で変数を渡す場合は、以下の問題がある。~
_delay_ms関数は結局、周波数の定数F_CPUを参照して、それを...
このため、定数を_delay_msに渡す場合は、コンパイラが最適化...
けど、変数を渡すようなコードを書くと、doubleに変換した引...
手軽に使えるけど、色々考えなければいけないようだ。~
あと、ふと思ったけど、これって決め打ちでループ回してるだ...
びみょい。~
タイマを使ってみようかとも思ったけど、分周比との兼ね合い...
結局、今のやり方が、とりあえずは一番お手頃な感じ。~
----
** タイマ [#a796668b]
とかいいつつ、前置分周なしの8bitタイマ0使用のバージョンを...
以下、ソースコード。~
main関数は変わってない。~
~#include <util/delay.h>はいらなくなるので削除。~
void delay_ms( int32_t time )
{
int32_t waithz = ( F_CPU / 1000 ) * time; // 指定ms数で...
if( 0 >= time ) return;
TCCR0A = 0; // タイマ/カウンタ0制御レジスタAを標準動作...
while( 0 < waithz ){
if( 256 < waithz ){
TCNT0 = 0; // 待ちクロックが256よりも大きければ、...
} else {
TCNT0 = 256 - waithz; // 256以内なら、カウンタを256-...
}
waithz -= 256;
// 一周して0xFF→0になる瞬間に捕まえる
TCCR0B = 1; // タイマ/カウンタ0制御レジスタBを前置分周...
while( 1 ){
if( bit_is_set( TIFR0, TOV0 )){
TCCR0B = 0; // タイマ/カウンタ0制御レジスタBを動作...
TIFR0 = _BV( TOV0 ); // オーバーフローフラグを落とす...
break;
}
}
}
}
すっかり頭から抜け落ちてたというか、普段32bitプログラムに...
最初組んだら、waithzがオーバーフローしてて0以上だったらの...
しばらく悩んでもーた。~
実際はやっぱり誤差があるはず。~
ループごとにタイマ停止するから、次のタイマ開始までの処理...
後は、電力の節約とかを考えると、入力の時間によって、前置...
しかし、タイマ化するだけで結構プログラムサイズは増えるの...
(書き込みサイズが、変更前233bytes、変更後353bytes)~
こんな使い方だったら、やっぱり_delay_msで充分なのかも。~
とりあえず、タイマの勉強にはなったけど、やっぱりタイマは...
終了行:
#analog
#norelated
#contents
* LEDサンプル [#d2eb2c43]
** 回路図 [#u7272bd2]
やっぱり最初はこれよね。~
LEDをPD0〜PD7に接続。~
#ref(LEDTest.png,left,nowrap,LEDサンプル)
本当は抵抗が必要なはずだが、まぁいい。~
とりあえずは光ればいい。~
#u2b(fc-vW6RD1Co,w=480,h=385)
** ソースコード [#ie5d30a4]
以下、ソースコード。~
#include <avr/io.h>
#include <util/delay.h>
void delay_ms( int time )
{
// 指定ms分ループ
while( time-- ){
_delay_ms( 1 );
}
}
int main( void )
{
DDRD = 0b11111111; // ポートDの方向レジスタを、全て出力に
PORTD = 0b00000000; // ポートDの出力レジスタを、全てLowに
char count = 0; // 0〜7まで
char binc = 1; // インクリメントモードかデクリメントモ...
while( 1 ){
PORTD = ( 1 << count ); // ポートDのカウント数位置の出...
if( binc ){ // インクリメントモード
count++;
if( 7 <= count ){ // 端までいったのでデクリメントモー...
binc = 0;
}
} else { // デクリメントモード
count--;
if( 0 >= count ){ // 最初まで戻ったのでインクリメント...
binc = 1;
}
}
delay_ms( 50 ); // 50ms待ち
}
return 0;
}
** _delay_ms [#zc5a7ac7]
ATmega168Pは、内蔵RC発信器が8MHzとなっていたので、普通にC...
AVRStudioのProject Optionで、Frequencyを8000000Hzに設定し...
具体的に言うと、8倍くらい。~
データシートを読み返してみると、ヒューズビットにCKDIV8と...
(システムクロック前置分周器:目的としては、消費電力節約用...
ってんで、Frequencyを1000000Hzに設定しなおして、事なきを...
デバイスの最高周波数より高い周波数のクロックを入力する場...
というわけで、ヒューズビットのCKDIV8を立てて、Frequencyを...
この辺は、電源とかの兼ね合いで変えるべきかね。~
[[AVRWikiにあるように、:http://avrwiki.jpn.ph/wiki.cgi?pa...
なので、1ms指定で指定ms分ループをしている。~
本当は、1ms指定じゃなくもっと大きい数で少ない回数回す方が...
そのシステムクロックで回せる最大数以上だったら最大数、未...
しかし、未満で変数を渡す場合は、以下の問題がある。~
_delay_ms関数は結局、周波数の定数F_CPUを参照して、それを...
このため、定数を_delay_msに渡す場合は、コンパイラが最適化...
けど、変数を渡すようなコードを書くと、doubleに変換した引...
手軽に使えるけど、色々考えなければいけないようだ。~
あと、ふと思ったけど、これって決め打ちでループ回してるだ...
びみょい。~
タイマを使ってみようかとも思ったけど、分周比との兼ね合い...
結局、今のやり方が、とりあえずは一番お手頃な感じ。~
----
** タイマ [#a796668b]
とかいいつつ、前置分周なしの8bitタイマ0使用のバージョンを...
以下、ソースコード。~
main関数は変わってない。~
~#include <util/delay.h>はいらなくなるので削除。~
void delay_ms( int32_t time )
{
int32_t waithz = ( F_CPU / 1000 ) * time; // 指定ms数で...
if( 0 >= time ) return;
TCCR0A = 0; // タイマ/カウンタ0制御レジスタAを標準動作...
while( 0 < waithz ){
if( 256 < waithz ){
TCNT0 = 0; // 待ちクロックが256よりも大きければ、...
} else {
TCNT0 = 256 - waithz; // 256以内なら、カウンタを256-...
}
waithz -= 256;
// 一周して0xFF→0になる瞬間に捕まえる
TCCR0B = 1; // タイマ/カウンタ0制御レジスタBを前置分周...
while( 1 ){
if( bit_is_set( TIFR0, TOV0 )){
TCCR0B = 0; // タイマ/カウンタ0制御レジスタBを動作...
TIFR0 = _BV( TOV0 ); // オーバーフローフラグを落とす...
break;
}
}
}
}
すっかり頭から抜け落ちてたというか、普段32bitプログラムに...
最初組んだら、waithzがオーバーフローしてて0以上だったらの...
しばらく悩んでもーた。~
実際はやっぱり誤差があるはず。~
ループごとにタイマ停止するから、次のタイマ開始までの処理...
後は、電力の節約とかを考えると、入力の時間によって、前置...
しかし、タイマ化するだけで結構プログラムサイズは増えるの...
(書き込みサイズが、変更前233bytes、変更後353bytes)~
こんな使い方だったら、やっぱり_delay_msで充分なのかも。~
とりあえず、タイマの勉強にはなったけど、やっぱりタイマは...
ページ名: