#freeze 閲覧総計:&counter(); (本日:&counter(today); 昨日:&counter(yesterday);)~ ~ *インターバルタイマ(TMR0割込み利用) [#fcc8bd9b] タイマー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回| 0x80|0b10000000| | 4回| 0x81|0b10000001| | 8回| 0x82|0b10000010| | 16回| 0x83|0b10000011| | 32回| 0x84|0b10000100| | 64回| 0x85|0b10000101| | 128回| 0x86|0b10000110| | 256回| 0x87|0b10000111| | 1回| 0x88|0b10001000| 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_REG|OPTION REGister| |INTCON|INTerruption CONfigration| |TMR0|TiMeR0| |T0IF|Timer0 Interruption Flag| |T0IE|Timer0 Interruption Enable| |GIE|General Interruption Enable| 07/12/16追記 &attachref(P1010193.JPG,zoom,150x150,button){新しい写真添付}; /** * インターバルタイマ(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の間を繰り返す } ★この情報は役に立ちましたか? #vote(はい[56],普通[7],いいえ[32]) - mikroC(ver8)のsimulatorでは割り込みのトラップ出来ないのでしょうか? -- [[のりすけ]] &new{2008-02-25 (月) 20:35:14}; - 申し訳ございません。私はこのご質問にお答えする知識を持ち合わせておりません。お分かりになる方、回答の程よろしくお願いします。 -- [[PICとMikroC]] &new{2008-02-25 (月) 22:17:37}; - いつも拝見しています。上記のプログラムを書いてコンパイルし、デバックをしてみたところTMR0の値が変化しません。変化しない理由に心当たりがありましたら、教えてください。 MikroC(ver8)使用 -- [[ビックバン]] &new{2008-03-26 (水) 19:57:06}; - 追加ですみません。TMR0の初期値「96」にはなります。ここからの変化が見られません。よろしくお願いします。 -- [[ビックバン]] &new{2008-03-26 (水) 19:59:59}; - 原因はいろいろ考えられます。ここのコメント欄を使用しての問題解決のやり取りには限界があります~ ので、後関さんの質問掲示板を利用し、問題解決して行きたいです。お手数ですが後関さんの掲示板~ http://www.picfun.com/freecgi/TreeBBS/index.cgi?bid=3~ に再質問願います。~ その際、使用されているPIC情報とDevice Flagsの設定内容も提示願います。 -- [[PICとMikroC]] &new{2008-03-26 (水) 21:28:55}; - わかりました。ありがとうございます。 -- [[ビックバン]] &new{2008-03-26 (水) 22:22:18};