2021年6月9日水曜日

Tiny Avr 0 シリーズタイマの例

 こんにちは   やましょうです。

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; 

           任意処理  

 }


以上

やましょうでした。






0 件のコメント:

コメントを投稿