---
---
dsPICの内部Timer1を操作させるプログラムを示します。なおクロックを80MHzに設定したときのTimer1の設定値とカウントアップ時間の関係を下表にまとめました。
時間 | Input Clock Prescale | 時間 | Input Clock Prescale | |||||
---|---|---|---|---|---|---|---|---|
1:256 | 1:64 | 1:8 | 1:64 | 1:8 | 1:1 | |||
200mS | 31249 | 500uS | 2499 | 19999 | ||||
100mS | 15624 | 62499 | 100uS | 499 | 3999 | |||
50mS | 31249 | 50uS | 249 | 1999 | ||||
10mS | 6249 | 49999 | 10uS | 49 | 399 | |||
5mS | 3124 | 24999 | 5uS | 24 | 199 | |||
1mS | 624 | 4999 | 1uS | 4 | 39 |
Timer1のプリスケラを1/256にしPR1に31,249をセットすることで、LEDを5Hz(200mS)毎に点滅させる。
/* *************************************************** * LED をTimer1を使用して点滅させる * *************************************************** * クロックは4MHzXtalをPLLで20倍にし、80MHz(40MIPS) * Target PIC dsPic33FJ128GP802 * MPLAB X , Microchip XC16 * Created on 2014/03/09, 17:45 * ******************************************************/ #include <xc.h> // #include <libpic30.h> // 遅延ライブラリ // LEDの定義 ---------------------------------------------- #define intl_LEDs() TRISB&=0xC3FF #define LEDs_ON() LATB|=0x3C00 #define LEDs_OFF() LATB&=0xC3FF #define LEDs_INV() LATB^=0x3C00 #define LED1 _LATB10 #define LED2 _LATB11 #define LED3 _LATB12 #define LED4 _LATB13 // コンフィギュレーション ----- XT(3-10MHz)発振 + PLL ----- _FGS(GWRP_OFF & GCP_OFF); _FOSCSEL(FNOSC_PRIPLL); _FOSC(FCKSM_CSECMD & OSCIOFNC_OFF & POSCMD_XT); _FWDT(FWDTEN_OFF); int main (void){ // PLLに関連する設定 ------------------------------------------ PLLFBD = 78; // M = 80 4MHz x80/2/2 CLKDIVbits.PLLPOST=0; // N2 = 2 = 80MHz CLKDIVbits.PLLPRE=0; // N1 = 2 while (OSCCONbits.LOCK!=1); // PLLの安定(LOCK)を待つ // -------------------------------------------------------------- /* *********************************************** * Timer1の設定 * Fcyをプリスケラで1/256にし、PR1に31,249を * セットし、合わせて、5Hz(200mS)毎に * Timerがリセットし、T1IFがセットされる。 * 40MHz / 256 / (31,249 + 1) = 5Hz(200mS) * *********************************************** T1CONbits.TON = 1; // Timer1有効 T1CONbits.TSIDL = 0; // アイドル時も稼働 T1CONbits.TGATE = 0; // Fcyをゲートしない T1CONbits.TCKPS = 3; // 1/256 T1CONbits.TCS = 0; // 内部クロックをカウント * ***********************************************/ PR1 = 31249; // プリセット値 200mS T1CON = 0x8030; // PS 1/256 intl_LEDs(); // LED Portを出力設定 LED1 = 1; // LED1を点灯 LED2 = 1; // LED2を点灯 while(1){ while(!_T1IF); // 200mS遅延 _T1IF = 0; LEDs_INV(); // すべてのLEDを反転 } }