ターミナルブロック
秋月のこれとか -> con-phoenix-508.lbr MKDSN1,5/2-5.08
抵抗
普通のカーボン抵抗とか -> resistor.lbr R-US_0207/7
コンデンサ
パスコンとかによく使う0.1uFのやつとか -> resistor.lbr C-EU050-025X075
電解コンデンサ(ルビコンの4.7uFとか) -> resistor.lbr CPOL-EUE2-5
(後ろの数字は、穴ピッチ、ケース径。2-5は、穴ピッチ2mm、ケース径5mm)
//CPUのクロック周波数
#define F_CPU 16000000
int32_t msec;//ミリ秒で保存します。
ISR(TIMER1_OVF_vect) //タイマ1割り込みの定義
{
msec += (65536L * 1024L * 1000L) / F_CPU ;
}
これは、ミリ秒にするために1000を掛けていますが、これでは大きくなりすぎて、32ビット数値を桁あふれしてしまいます。
そこで、予めCPU周波数を1000で割った数字を用意し、これで割りましょう。
//CPUのクロック周波数を1000で割ったもの
#define F_CPU_DIV1000 16000
int32_t msec;//ミリ秒で保存します。
ISR(TIMER1_OVF_vect) //タイマ1割り込みの定義
{
msec += (65536L * 1024L) / F_CPU_DIV1000 ;
}
そして、あとはタイマ関係のレジスタに設定してやれば、その通り動きます。
#include <stdint.h>
class Timer {
public:
//タイマを設定し、起動する。
void StartTimer();
//タイマを起動してからの経過時間をミリ秒で返す。
int32_t GetTime();
//タイマを終了する。
void EndTimer();
//時間を0にリセットする。
void ResetTime();
};
Timer.cpp
#include "Timer.h"
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/common.h>
#define F_CPU 16000000L
#define F_CPU_DIV1000 16000L
volatile int32_t current_msec;
void Timer::StartTimer()
{
current_msec = 0;
//割り込み禁止
cli();
//タイマ/カウンタ1制御レジスタAの設定
//(タイマ用ピンとして使わない)
TCCR1A = 0x00; //タイマ関係のピンは標準ポート動作とする
//タイマ/カウンタ1制御レジスタBの設定
TCCR1B = (1<<CS12)|(1<<CS10);//1024分周でタイマON
//タイマ/カウンタ1割り込みマスク レジスタ設定
TIMSK1 = (1<<TOIE1);//タイマ1オーバーフロー割り込み許可
//割り込み許可
sei();
}
int32_t Timer::GetTime()
{
//16ビットレジスタの読み書きの際には、テンポラリレジスタを使用する。
//このため、割り込み禁止操作が必要。
//ステータスレジスタを一時保存する変数
uint8_t sreg;
//ステータスレジスタを保存
sreg = SREG;
//割り込み禁止
cli();
//現在のタイマ値を取得
uint16_t t = TCNT1;
//SREGを戻す。これによって割り込み禁止状態が戻る。(SREGのIビットを戻すから)
SREG = sreg;
int32_t tw = (int32_t)t;
return current_msec + (tw * 1024) / F_CPU_DIV1000;
}
void Timer::ResetTime()
{
uint8_t sreg;
sreg = SREG;
cli();
//タイマを0にする
TCNT1 = 0;
SREG = sreg;
//経過時間も0にする
current_msec = 0;
}
void Timer::EndTimer()
{
TCCR1B = 0;//タイマoff
}
ISR(TIMER1_OVF_vect) //タイマ割り込み
{
current_msec += (65536L * 1024L)/ F_CPU_DIV1000;
}
使い方は、どこかにTimerの実体を定義しておいて、
#include "Timer.h" Timer timer; //タイマ起動時に一回だけ実行 timer.StartTimer(); ... ... //時刻を知りたいとき int32_t time_elapsed = timer.GetTime(); ... ... //時間をリセットしたいとき timer.ResetTime(); ... ... //タイマーが不要になったとき timer.EndTimer();こんな感じですかね