---
---
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を反転
}
}