dsPIC33Fの基本動作から応用プログラムまでを学びます。

ホーム
16F18313
16F18325
16F18346
16F1619
Curiosity
---
---
    
12F1822
16F1455
16F1459
18F14K50
18F26J50
dsPIC
その他
dsPIC33FのTimer1

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