私がよく使っているAVRマイコンのATmega88には、タイマーが3つあります。
タイマー0と2が8ビットタイマーで、タイマー1が16ビットタイマーです。
基本的には、同じように使えるハズなのですが・・・
これまで、単純に時間待ちタイマーとして使用する場合には、タイマー0を使って10msを計測していました。
しかし、次項のPWMを実験するにあたり、PWM用にタイマー0を使用する関係上、時間待ちをタイマー0以外で実現する必要があります。
#include <avr/io.h>
#define LED_SET DDRD |= 0b01000000
#define LED_ON PORTD |= 0b01000000
#define LED_OFF PORTD &= ~0b01000000
void wait( long t ) // 10ms単位での時間待ち
{
TCNT0 = 0;
while( t-- > 0 )
{
while( TCNT0 < 78 );
TCNT0 = 0;
}
}
int main( void )
{
LED_SET;
TCCR0B = 0x05; // プリスケーラ1024分周
LED_ON;
wait( 100 );
LED_OFF;
}
このプログラムでPD6ポートに接続したLEDを1秒間だけ光らせるのですが・・・
このプログラムの TCNT0とTCCR0Bをそれぞれ、TCNT1とTCCR1Bに変更すると、それでも1秒間LEDが光ります。
しかし、TCNT2とTCCR2Bに変更すると、LEDが一瞬だけ光って終わってしまいます。 待ち時間を多くしてみると、タイマー0や1に比べて7倍くらいの速さ(短さ)になってしまっているようです。
私の何がいけないの?
タイマー2をタイマー0と同じように使用する方法を誰か教えてください。
>待ち時間を多くしてみると、タイマー0や1に比べて7倍くらいの速さ(短さ)になってしまっているようです。
タイマ0,1とタイマ2では分周器に設定する値が変わります。
タイマ0,1で1024分周にするには0x05ですが
タイマ2では0x07になります。
(0x05だと、128分周ですので、ちょうど1/8位ですね)
確かに、データシートを見ると、0x05だと128分周ですね。
単に私自身の確認不足でした。
ご教授ありがとうございました。