avr atTINY13a 3:自作


[実験中]

 2013年夏も真ん中で「少し変わった使い方」と思い、128KHzの発振部分を使って見ることにしました。この発振はWDT(ウオッチ・ドッグ・タイマー)との共用で、とにかく周波数が低いので省エネ動作が期待出来ます。
 atTiny13aは9.8/4.8MHzの他にこの発振を指定出来ます。
 今回の動作は[Tiny13a 1.9V 0.1mA/128KHz sound only]と、かなりエネルギーは少ない状態だった。0.1mA以下の電流はテスターが不正確!

 以前、AT90S2313でLEDを点灯させていた(mcu_76.htm)、今考えてもこれって新鮮さを感じる。
 2.2Vで3.5mAと結構動いている。LEDなので時間表示が薄いのですが見えるのは魅力。当時(10年前か!)「LEDが電池2本で動く」なんて発想は全然無かった、本などにもこのアイディアは見たことが無い!
 夜中の点灯なんてLCDには出来ないし… その内、何かを作りたい!

[ 時計などのTimerに最適! ]

 周波数が低いので時計などTimer動作が適当の様です、そういえば家では「パソコンの経過時間警報」が以前から使って便利しています(3V動作)。
 時間表示はピンが少ないので出ませんが、音出しだけならこのままで行けそうです。時間も精度は適当で良いし、ある程度オーバー時間の警告が出れば十分ですから、まあ使えるでしょう…。

 以前作った物はLEDを表示に使って、経過時間が見える物ですが今回LEDが付きません。これがどれだけ実用性があるのか、気になる所です。

[ 書き込み器は! ]

 一般的な説明の前に、今回驚いたことがあってそれを初めにお知らせします。
 というのも、いつもの1MHzの発振での書き込みを使っていましたが今回これとは異なる128KHzです。これって書き込み器が対応してないとだめ!です。

 初めこれは全く気が付きませんでした。試しプログラムを動かすべく「128KHz」に設定した時の事です、ベリファイでエラーになったのです。
 当初何処でエラーになるのか分かりません、変わっている所は128KHzしかないのだ!「あ・もしかして!」と思ったのですが、戻せません。
 更に動かすべくトライするのですが、書き込み器が「デバイスが反応しません」と受け付けないのです。ICが悪いのか別のICを入れて書き直しても同じです。ここで初めて「128KHz動作になってしまったのだ」と気が付きました。

 書き込み器のSOFTを調べて見ると、書き込み対応周波数「1MHz」を下げることが出来るのが分かり、そこの設定を100KHzにしてみると読み出せることが分かりました。128KHzで動いているので近い125KHzに設定しました。

 という事で128KHzの読み書きが出来ないライターではだめ!、最悪ICが使えなくなってしまいます(読み出しエラーになるが、書き込みだけは出来る)。


 私の書き込み器は@で紹介した「デジットのAVRWRT」です!これって対応していて良かったです。ただ1MHzと比べると読み書きに時間が掛かります、ある意味仕方がないのですが!

 まあ動かせるようになったのでホットしています。

[ 動作は簡単! ]

 時間はTimer0を使って0.5秒を作り、割り込みを使って1分・1時間(これは未使用)を作っている。
 メインプログラムでは分を読み出し、0分又は30分の時に2秒間だけ耳で聞こえる「ピピ」と音出しをしている(処理時間を吟味してないので5回しか音は出ない)。

 問題はICによって少し発振周波数がずれることです(バラツキがある)。
 売り物ではないので「動作を調べて、タイマー部分を調整しよう」という物にしました。

 0.5秒*120で分を作る所がありますが、ここの0.5秒をいじって時間調整をしています。具体的には[Tuning_Time = 40]を変更します。約1が0.24秒なので、1分間の誤差を調べ(LEDを点滅させて数える)ここを変更して合わせ込みます(少し面倒なのは仕方がない)。
 変更してからコンパイルします。この合わせ方で理論的に1/60以下に合わせられることになります(120の所をいじっても同じ様な物ですが…:この場合0.5秒間隔となる)。

 周波数の変動は電圧や温度が知られているので、最低限電圧だけはレギュレーターなどを使って押さえておきたい。又は電池を使っている場合は電圧チエックを時折するなどの工夫が必要かも。

[回路図]
[ プログラム ]

 回路図にはLEDが付いていますが、使いません。1秒点滅をさせなければ(LEDを外す)節電になるし全体として簡単になります。(もう一度書き出してみると!)

タイマー動作と音出しの組み合わせ!
A. Timer/C0を使って0.5秒を作る。
B. 0分又は30分で、最初の2秒間だけ音をだす。
C. 音出しは「60mSecの音出しサブルーチン」を使って約2KHzの音を圧電素子から出す。240mSec休んで、2秒で5回程音(チッチッチッチッチッ)を出して知らせる。
 後は30分ごとに音をだして知らせる。

★割り込みキー入力で
 [void TC0_Interrupt() iv IVT_ADDR_TIM0_OVF ]を入力する時、…iv まで入力して[CTRL+Space]でアシストを呼び出して[IVT]とキーを押せば文字が出るので…TIM0_OVFを選べば、入力ミスを防げる。(最も!下の欄をコピーすればそれで良いのだが…)
★当初、SWを付けタイミングを合わせようしたがプログラムをいじる方式に変更した。[Tuning_Time = 32]がそれだ!
★PB3とPB4のピン位置を勘違いしないように!下からPB4.3.5と並んでいる。

[ 使 う ]

 スイッチONで直ぐ「チッチッ」と音がして、作動開始を知らせる。
 LEDは節電の為使わない。後は約30分毎に、音が知らせる。当然精度はICによるが、単なる警告だけなので1-2分ずれても大したことはない。「音が出たらそろそろやめようか」とか「もう少し…」なんて自分をコントロールする道具として使う。
 家では何処かへ出掛ける時、後30分などの時に使え、結構便利です。


[Timing]

 周波数は写真の様に[1.004Hz]とだいたいあっている。1/100ぐらい合えば十分です。デュウテイ比も0.504と半分になっている。実用的には30分で誤差1分でも十分である。

------------------------------------------------------
/*       ATTiny13a      128KHz(7.8uS) Timer     BY M.K 2013/7/28
         Config         L= 0x7B       H= 0xFD
         0 & 30mintes on Buzzer
         Last 8/3      276 Bytes         mikroC PRO v.5.0
         PORTB3_bit=LED  4=Sound
*/

char Temp,hsec,minut,hour;

#define Tuning_Time 32       // ORG=40   set=** [1=0.24 Sec]
                             // 1minutes = 60 - 61 (1秒多い時は"4"減らす)

void TC0_Interrupt() iv IVT_ADDR_TIM0_OVF
{
     TCNT0=Tuning_Time;           //Again
     PORTB3_bit=~(PORTB3_bit);    // sec for LED ON-OFF
     hsec++;                 // sec counter
     if (hsec==120){
         hsec=0;
         minut++;            // minuts
         if (minut==60){
             minut=0;
             hour++;         // hours
             if (hour==12)
                 hour=0;
         }
     }
}

void T60ms_sound()          // 実測   100mSec =183
{
         for (temp=0;temp < 110;temp++){ //
             PORTB4_bit=1;   //Sound ON     2KHz
             Delay_us(227);
             PORTB4_bit=0;
             Delay_us(187);
         }
}

void main()
 {
     DDRB = ~0b00100111;
     PORTB=  0b00100111;     // Pull up
     //
     Delay_ms(1);            // Wait
     TCNT0=Tuning_Time;      //
     TOIE0_bit=1;
     TCCR0B=4;               // 256:7.8125*256*250=0.5S 
     SREG_I_bit=1;           // interrupt Enable
     hsec=0;
     minut=0;
     //
     while (1){
        if ((minut==0)||(minut==30)){  // 0 or 30 minutes
            if (hsec < 3) {           // 2Sec
                T60ms_sound();
                Delay_ms(240);
             }
         }
     }
}
------------------------------------------------------
:1000000056C0FECFFDCF22C0FBCFFACFF9CFF8CF3D
:04001000F7CFF6CF61
:1000AE00BFE9BDBFB0E0BEBFB8EDB7BBB7E2B8BBEE
:1000BE000AE20A95F1F700000000B0E2B2BFB9B74C
:1000CE00B260B9BFB4E0B3BFBFB7B068BFBFB0E0F6
:1000DE00B0936100B0E0B09360000091600000301A
:1000EE0029F0009160000E3109F00BC00091610003
:1000FE00033038F488DF18E205EE0A95F1F71A9509
:06010E00E1F7EBCFFFCF8B
:10001400B0E0B0936200009162000E36A0F4B8B371
:10002400B061B8BB09E00A95F1F700000000B8B36D
:10003400BF7EB8BB08E00A95F1F7009162000F5F3C
:0800440000936200E8CF08956B
:10004C000F93EF93FF93BF93BFB7BF93B0E2B2BFD1
:10005C0008B2B8E00B2608BA009161000F5F00935C
:10006C0061000837B9F4B0E0B09361000091600012
:10007C000F5F009360000C3369F4B0E0B093600044
:10008C00009163000F5F009363000C3019F4B0E033
:10009C00B0936300BF91BFBFBF91FF91EF910F91E0
:0200AC001895A5
:00000001FF

製作 2013/8/15 


 [MAIN MENU へ戻る]

inserted by FC2 system