こんにちは やましょうです。
AVR0 シリーズ本日はタイマです。
なんか昔のAVRと違う。。ということでタイマのsampleです。
TCAの構成はこんな感じですね。
typedef struct TCA_SINGLE_struct
{
register8_t CTRLA; /* Control A */
register8_t CTRLB; /* Control B */
register8_t CTRLC; /* Control C */
register8_t CTRLD; /* Control D */
register8_t CTRLECLR; /* Control E Clear */
register8_t CTRLESET; /* Control E Set */
register8_t CTRLFCLR; /* Control F Clear */
register8_t CTRLFSET; /* Control F Set */
register8_t reserved_0x08;
register8_t EVCTRL; /* Event Control */
register8_t INTCTRL; /* Interrupt Control */
register8_t INTFLAGS; /* Interrupt Flags */
register8_t reserved_0x0C;
register8_t reserved_0x0D;
register8_t DBGCTRL; /* Degbug Control */
register8_t TEMP; /* Temporary data for 16-bit Access */
register8_t reserved_0x10;
register8_t reserved_0x11;
register8_t reserved_0x12;
register8_t reserved_0x13;
register8_t reserved_0x14;
register8_t reserved_0x15;
register8_t reserved_0x16;
register8_t reserved_0x17;
register8_t reserved_0x18;
register8_t reserved_0x19;
register8_t reserved_0x1A;
register8_t reserved_0x1B;
register8_t reserved_0x1C;
register8_t reserved_0x1D;
register8_t reserved_0x1E;
register8_t reserved_0x1F;
_WORDREGISTER(CNT); /* Count */
register8_t reserved_0x22;
register8_t reserved_0x23;
register8_t reserved_0x24;
register8_t reserved_0x25;
_WORDREGISTER(PER); /* Period */
_WORDREGISTER(CMP0); /* Compare 0 */
_WORDREGISTER(CMP1); /* Compare 1 */
_WORDREGISTER(CMP2); /* Compare 2 */
register8_t reserved_0x2E;
register8_t reserved_0x2F;
register8_t reserved_0x30;
register8_t reserved_0x31;
register8_t reserved_0x32;
register8_t reserved_0x33;
register8_t reserved_0x34;
register8_t reserved_0x35;
_WORDREGISTER(PERBUF); /* Period Buffer */
_WORDREGISTER(CMP0BUF); /* Compare 0 Buffer */
_WORDREGISTER(CMP1BUF); /* Compare 1 Buffer */
_WORDREGISTER(CMP2BUF); /* Compare 2 Buffer */
register8_t reserved_0x3E;
register8_t reserved_0x3F;
} TCA_SINGLE_t;
①CTRLBのWGMODE2~01に01(FRQ)を設定
#define TCA_SINGLE_OVF_bm 0x01 /* Overflow Interrupt bit mask. */
となっているのでこれを設定
②PERにタイマ値設定
カウント数(設定値+1) = 欲しい規定時間 * 3.3Mhz(20Mhz発振時 1/6分周後)となるので。
1[mS]が欲しい規定時間の場合 3000となります。
TCBですと1/2の分周器が入るので設定値は半分の
1500になると思います。
実際タイマの回路はアンダーフローで割込みに入るでしょうから
カウント数-1を設定するべきかと思います。
③CTRLAに分周数設定し開始
TCA0.SINGLE.CTRLB = TCA_SINGLE_WGMODE_NORMAL_gc;
TCA0.SINGLE.PER = 3000;
TCA0.SINGLE.CTRLA = TCA_SINGLE_CLKSEL_DIV1_gc; /* 1/1分周 */ TCA0.SINGLE.CTRLA |= TCA_SINGLE_ENABLE_bm; /* タイマ計測開始 */
また割込みを使用する場合は、
④INTCTRLのOVFを設定して、タイマのOVERフロー割込みを許可にしておきます。
(その後MASTER割込みも許可してくださいね)
⑤割込み処理の記述、もしくはメインでOVFのチェックをします。
5-1.割込み時
タイマ割込み設定にして、
TCA0.SINGLE.INTCTRL = TCA_SINGLE_OVF_bm;を設定部に追加し
ISR(TCA0_OVF_vect)
{
任意処理
TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm;
}
5-2.メインでタイマチェック
if(TCA0.SINGLE.INTFLAGS & TCA_SINGLE_OVF_bm)
{ /*1MS単位 */
TCA0.SINGLE.INTFLAGS = TCA_SINGLE_OVF_bm;
任意処理
}
以上
やましょうでした。