· 

ATtiny861VのTimer1

ATtiny861をATTinyCoreでArduino風に使おうと思う。で、ブレッドボードで構成するのってまぁまぁ作業場所をとってじゃまなので、ボードをこさえてみた(ICSPのピン位置に穴が開いてなかったのでとりあえずぶっ飛んだところに設置)。

上から見るととてもすっきり。でも裏側は、、、いつも通りのスパゲティ。ちなみに、セラミックレゾネータは載せているけどいったん内蔵OSCで進める。

で、ATtiny861VのTimer1が思う通り動かないので、その記録。単に知識とスキルがないだけなんだと思うけど、、、

でデータシートによると、標準動作でOCR1CをTOP値とした任意のタイミングで割り込みが起こせるらしい。なのでだいぶ簡単なはず、、、

#define PIN_T1OVF_OUT (0x20)
volatile uint8_t stat;
ISR(TIMER1_OVF_vect){
    if((stat++)&0x01){
        PORTA|=PIN_T1OVF_OUT;
    }else{
        PORTA&=~PIN_T1OVF_OUT;
    }
}
 
void setup(void){
    stat=0;
    DDRA|=(PIN_T1OVF_OUT);
 
    OCR1C=0x08;
    TCCR1B=0x05;/*タイマースタート*/
    TIMSK|=0x04;
}
void loop(void){
}

これでclkIO/16の8カウントで割り込みが来るはず。

1/(8000000/16)*8=16us

が、実際には32usで割り込みが来る、、、なんでや?

 

ATtiny861VはTimer1にPLLが使えるらしいのでこちらでも試してみる。

#define PIN_T1OVF_OUT (0x20)
volatile uint8_t stat;
ISR(TIMER1_OVF_vect){
    if((stat++)&0x01){
        PORTA|=PIN_T1OVF_OUT;
    }else{
        PORTA&=~PIN_T1OVF_OUT;
    }
}
 
void setup(void){
    PLLCSR|=0x02;
    while((PLLCSR&0x01)==0x00){
        //
    }
    PLLCSR|=0x84;
    stat=0;
    DDRA|=(PIN_T1OVF_OUT);
 
    OCR1C=0x08;
    TCCR1B=0x05;/*タイマースタート*/
    TIMSK|=0x04;
}
void loop(void){
}

これでclkPCK/16の8カウントで割り込みが来るはず。PLLが生成するクロックは64MHzだけど低速動作で設定しているので32MHzで動いているはず。なので、

1/(32000000/16)*8=4us

となるが、実際には8usで割り込みが来る、、、なんでや?