やっぱり最初はこれよね。
LEDをPD0〜PD7に接続。
以下、ソースコード。
#include <avr/io.h> #include <util/delay.h> void delay_ms( int t ) { while( t-- ){ _delay_ms( 1 ); } } int main( void ) { DDRD = 0b11111111; PORTD = 0b00000000; char count = 0; char binc = 0; while( 1 ){ PORTD = ( 1 << count ); if( 0 == binc ){ count++; if( 7 <= count ){ binc = 1; } } else { count--; if( 0 >= count ){ binc = 0; } } delay_ms( 100 ); } return 0; }
ATmega168Pは、内蔵RC発信器が8MHzとなっていたので、普通にCPUのFrequencyも8MHzだろうと思いこむ。
AVRStudioのProjectOptionで、Frequencyを8000000Hzに設定して、F_CPUのdefineを設定したんだけど、実際やってみると、delay_msの待ちが余りに遅い。
具体的に言うと、8倍くらい。
データシートを読み返してみると、ヒューズビットにCKDIV8とかいうのがあって、こいつが0だと、実際には8で割った数がシステムクロックとなるらしい。
(システムクロック前置分周器:目的としては、消費電力節約用?)
ってんで、Frequencyを1000000Hzに設定しなおして、事なきを得る。
というわけで、ヒューズビットのCKDIV8を立てて、Frequencyを8000000Hzにしてもちゃんと動きました。
この辺は、電源とかの兼ね合いで変えるべきかね。