_delay_msを使っていたら,なんか意図したように時間が取れない。
delay.hとdelay_basic.hを見ると,_delay_ms()は_delay_loop_2()をつかっている。_delay_loop_2()は,16bit数を-1ループになってるんで4クロック*65536=262.144ms(CPUが1MHzの時)までのdelayになる。8MHzだと32.768msまでしか正常にウエイト出来ない。
_delay_us()も同様に,_delay_loop1()を使って,3クロック*256=768us(CPUが1MHzの時)までのdelayになる。8MHzだと96usまでしか正常にウエイト出来ない。
使うときは,
void __delay_ms(time) { while (time--) _delay_ms(1); }
ってすれば大丈夫。
どうも最適化オプションは,-O1以上にしないとおかしくなるようだ。
新しくコメントをつける