AVRのATmega168を使用し16ビットタイマを使用して正確に1秒毎に点滅するプログラムを作りたいと思っています。ATmega168の周波数は20MHzで環境はWinAVRを使っています。TCNT1やTCCR1Aを使うのだろうというのはわかったんですが、どこにどう組み込めばいいのかがわかりませんのでそこらへんを教えてほしいです。

このQ&Aに関連する最新のQ&A

A 回答 (4件)

>AVRマイコン活用ブックというのを見ているのですけど、うまくいきません。

というかいきなりTCNT1とか TIFRとかTCCR1Aとか出てきて何のことかと思ってしまいます。

説明が悪い本ならほかの本も検討してみるべきでしょう。

>ATmega168の周波数は20MHzで
これは間違いないですか?
外部クロックで20MHz供給される回路が付いているんですね?
「わかるマイコン電子工作AVRマイコン活用ブック」の特製マイコンボード(LED Game for AVR)だと20Mhzでは有りません。マイコンボード名を明かして貰えると問題がないか判断できますが。

>調べてたらTCNT1は16ビットタイマで数え終わるとオーバーフローしてFFFF から0000に戻るということやTCCR1Bはプリスケーラ値を決める。プリスケーラ値は分周で8と64と256と1024の間隔で分周が出来る、 TCCR1B=2なら8ずつ分周するのですかね。0っだたら分周せず、1だったらクロックのまま、3だったら64ずつといった感じですか、というか TCNT1は勝手に数え始めているんですか?

クロックを供給したら(TCCR1B=2)数え始めます。
分周の1/1024とタイマの1/65536で最大クロック8Mhzなら=8000000/1024/65536で最大約8秒まで。クロック20Mhzなら最大約3秒まで数えられますね。
    • good
    • 0
この回答へのお礼

とうとう出来ました。16bitTimerも動かせて、1秒計ることができました。プログラムは
#include <avr/io.h>
#include <stdio.h>
int main(void)
{
TCCR1A = 0;
TCCR1B = 3;
DDRC = 0xff;
DDRB = 0x00;
while(1)
{
while(TCNT1 < 16000);
TCNT1 = 0;
PORTC ^= 0x01;
}
}
です。1秒ごとに点滅するプログラムです。
今回協力いただいて本当にありがとうございました。

お礼日時:2009/05/17 14:19

動きましたか。

良かったですね。
ただ、この方法だと2つ、3つと複数のRCサーボ制御は困難です。
PWMとか割り込みを覚えてくださいね。
    • good
    • 0
この回答へのお礼

とりあえず一個動かすことが目標だったんで今は成功の余韻に浸っております(笑)
また制御が出来ませんという日が来るかもしれませんがそのときはどうかよろしくお願いします。

お礼日時:2009/05/18 01:40

書籍を紹介したはずですが、購入されましたか?


>TCNT1やTCCR1Aを使うのだろうというのはわかったんですが、どこにどう組み込めばいいのかがわかりませんのでそこらへんを教えてほしいです。
例が載っていたはずですが、それを読まれての質問でしょうか?

>16 bit timerで1秒を計る
たぶん直接1秒毎の割り込みは無理だと思います。それ以下のタイミング(たとえば10ms)で割り込みを発生させて1秒分カウントさせるしかないでしょう。

所で、5/12の「スイッチでサーボ制御」#6のソース提示はしてもらえるんでしょうか?
    • good
    • 0
この回答へのお礼

AVRマイコン活用ブックというのを見ているのですけど、うまくいきません。というかいきなりTCNT1とかTIFRとかTCCR1Aとか出てきて何のことかと思ってしまいます。調べてたらTCNT1は16ビットタイマで数え終わるとオーバーフローしてFFFFから0000に戻るということやTCCR1Bはプリスケーラ値を決める。プリスケーラ値は分周で8と64と256と1024の間隔で分周が出来る、TCCR1B=2なら8ずつ分周するのですかね。0っだたら分周せず、1だったらクロックのまま、3だったら64ずつといった感じですか、というかTCNT1は勝手に数え始めているんですか?

お礼日時:2009/05/16 13:41

組み込まれていればタイマーではなくリアルタイムクロック(RTC)を使うのが普通ですが、ATMega168ではRTCはオプションのようなのでそれはさておき。



1秒分のクロックを計測した時点で割り込みが発生するようにして割り込みハンドラで明滅を実施する、というのが基本方針になります。
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);


人気Q&Aランキング

おすすめ情報