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; 

           任意処理  

 }


以上

やましょうでした。






2021年6月8日火曜日

TINY AVR0 シリーズのポートの構成

 こんにちは、

 

やましょうです。

 

 AVR TINY 0 シリーズ(AVR  TINY   202,402,204,404,804,1604,1606,806,406,807,1607)

実際にはATtiny202を使ってみようと思ったのですが、いろいろ検索をしてみたのですが、

何もみつからなったので、記載しておきたいと思います。


1.ポートのレジスタ構成がPICポイ。W

iotn202.hを見てみます。
typedef struct PORT_struct
{
    register8_t DIR;  /* Data Direction */
    register8_t DIRSET;  /* Data Direction Set */
    register8_t DIRCLR;  /* Data Direction Clear */
    register8_t DIRTGL;  /* Data Direction Toggle */
    register8_t OUT;  /* Output Value */
    register8_t OUTSET;  /* Output Value Set */
    register8_t OUTCLR;  /* Output Value Clear */
    register8_t OUTTGL;  /* Output Value Toggle */
    register8_t IN;  /* Input Value */
    register8_t INTFLAGS;  /* Interrupt Flags */
    register8_t reserved_0x0A;
    register8_t reserved_0x0B;
    register8_t reserved_0x0C;
    register8_t reserved_0x0D;
    register8_t reserved_0x0E;
    register8_t reserved_0x0F;
    register8_t PIN0CTRL;  /* Pin 0 Control */
    register8_t PIN1CTRL;  /* Pin 1 Control */
    register8_t PIN2CTRL;  /* Pin 2 Control */
    register8_t PIN3CTRL;  /* Pin 3 Control */
    register8_t PIN4CTRL;  /* Pin 4 Control */
    register8_t PIN5CTRL;  /* Pin 5 Control */
    register8_t PIN6CTRL;  /* Pin 6 Control */
    register8_t PIN7CTRL;  /* Pin 7 Control */
    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;
} PORT_t;

うんーーー最近のpic32に似ています。
まず、dirは入出力設定だと思います。
そのあとSET(bitを立てる用)のレジスタ
そのあとCLR(bitを下げる用)のレジスタ
 そのあとTGL(bitを反転用)のレジスタですね。
その後は、出力ラッチと入力ラッチ 別になっていますね。
あと各PINの機能も1BYTE毎に設定(PINxCTRL)内容としてはPULLUP&反転、割込み設定。
ですね。

次回はタイマを書きたいなぁ。

以上
やましょうでした。