閲覧総計:51817  (本日:4  昨日:8)


インターバルタイマ(TMR0割込み利用)

タイマー0割込みを利用して「インターバルタイマ」を作ります。06/11/03

↓タイマー0割込みの使い方説明ページ
http://picfun.com/pic09.html

例題:発光ダイオード(LED)を1秒点灯、1秒消灯

【備忘メモ1】TMT0にカウントさせたい回数の設定法(0回〜256回)
例:160回カウントしたい場合は TMR0 = -160;(マイナスを付ける)
理由:TMR0は「アップカウンタ」の為、160回カウントさせたい為には
256(FF)-160=96で、TMR0 = 96;と設定する。
しかしTMR0 = -160;と設定しても同意である為、視覚性の見地から
TMR0 = -160;と書く事とする。

【備忘メモ2】TMR0のプリスケーラ繰返し回数とOPTION_REG設定値の対照表を示しておきます。

プリスケーラ値OPTION_REG設定値
    2回  0x800b10000000
    4回  0x810b10000001
    8回  0x820b10000010
   16回  0x830b10000011
   32回  0x840b10000100
   64回  0x850b10000101
  128回  0x860b10000110
  256回  0x870b10000111
    1回  0x880b10001000

06/11/03

【備忘メモ3】
久世氏のページにMikroC 割込み関数の特徴(短所?)がCCS-Cの割込み関数の機能と比較
して説明されている。
http://www.kuze.jp/p-comp/pic/page08.html
(ポイント) CCS-Cの割込み関数は、割込みフラグ解除や他の割り込みの一時停止や
再開を、自動的にやってくれる。しかし、MikroCでは、それはやってくれない為、
これらひとつひとつの命令を自分で書いて行う事になる。 06/12/02追記

【備忘メモ4】TMR0関連予約後のフルスペル一覧

予約語フルスペル
OPTION_REGOPTION REGister
INTCONINTerruption CONfigration
TMR0TiMeR0
T0IFTimer0 Interruption Flag
T0IETimer0 Interruption Enable
GIEGeneral Interruption Enable

07/12/16追記

P1010193.JPG

/**
* インターバルタイマ(TMR0割込み利用)
* 発光ダイオード(LED)を1秒点灯、1秒消灯
*
* PIC 16F628A
* 発信器:内臓4MHz
* 電源:乾電池3本 (4.5V)
* RB1: LED
* 
* Device Flags: _BODEN_OFF _BOREN_OFF _CP_OFF _PWRTE_ON _WDT_OFF
*        _LVP_OFF _MCLRE_OFF _INTRC_OSC_NOCLKOUT
*
* 言語 MikroC v6.2
*
*【1秒インターバルの作り方】
* TMR0割込みで5.12msec、それを200回繰返し1秒にする
* 4MHz=0.25usec
* 5.12msec (=0.25usec * 4 * 32回 * 160回)
* 約1秒 =1024msec (=5.12msec * 200回)
*/
unsigned int cnt; //変数定義:200回カウンタ

void interrupt() { //割込み関数
    //5msecインターバルタイマ
    if (INTCON.T0IF) { //割込み種がTimer0割込みの場合
        INTCON.T0IF = 0; //割込みフラグクリア
        TMR0 = -160; //TMR0カウント値再設定 160回(アップカウンタ)

        cnt++; //200回カウンタ カウントアップ
    }
}

void main() {
    PORTB = 0b00000000; //PORTBの中身をきれいにする
    TRISB = 0b00000000; //PORTB 8個全て0:出力に設定

    OPTION_REG = 0x84; //プリスケーラ値設定0x84(=32回)
    TMR0 = -160; //TMR0カウント値設定 160回(アップカウンタ)
    
    INTCON.T0IE = 1; //タイマ割込み許可
    INTCON.GIE = 1; //全体割込み許可
    
    cnt = 0; //200回カウンタ値クリア
    
    do { //doとwhileの間を繰り返す
        //点滅間隔1秒(=5msec * 200回)
        if (cnt == 200) {
            PORTB.F1 = ~PORTB.F1; //LED点灯⇔消灯反転
            cnt = 0; //200回カウンタ値クリア
        }
    } while(1); //doとwhileの間を繰り返す
}

★この情報は役に立ちましたか?

選択肢 投票
はい 69  
普通 11  
いいえ 53  

添付ファイル: fileP1010193.JPG 2276件 [詳細]