[戻る]
過去ログ [ 0001 ]
過去ログ:     ワード検索: 条件: 表示:

タイトル
記事No
投稿日
投稿者
参照先
dsPIC 33E タイマ割込について
254
: 15/06/12-16:12
kura

はじめまして。
以下の問題が発生しており、皆様のお知恵をお借りしたいです。

概要:
dsPIC 33E 64MC202 を用いて、タイマ2を用いて外部パルスをカウントし、ある回数で、割込みを発生させたい。
外部パルスはPWMにて、自己のPICで発生させている。

問題点:
外部パルスがカウント出来ない。
(割込み関数内で、LATA3出力を反転させているが、出力が
反転しない)

行った調査:
1.割込み関数の書式は正しいか
 はい。
 タイマ2を内部クロック設定で10[ms]の割込みを行うと、正常に割込みがかかる。

2.PWMの要件は満たしているか。
 はい。
 リファレンスマニュアルでのタイマ2の外部パルスカウント仕様(パルスは0.5Tcy以上)は満たしています。
 今回のPWMは1[MHz]です。PICは120[MHz]→Fcy=60[MHz]で動作。
 PWMの信号はオシロで確認済みです。

3.入出力ピンの設定はどうか。
 正しいと判断していますが、問題があるのがここしかないかと思っ ています。
 16Fファミリと設定方法が違い、戸惑いましたが、しっかり確認し たつもりでいます。
 
4.自己で学習したか
 はい。
 後閑様の書籍「dsPIC活用ガイドブック」、リファレンスマニュアル、データシートを見 ています。また16Fファミリの書籍も読んでいます。
 リファレンスマニュアルP11-13の「カウンタモード」のサンプル  コードも参考にしました。

よろしくお願い致します。

/*以下ソース抜粋*/


#define FSOC (119762500ULL)
#define FCY (FSOC/2)
#define PWM_HZ 59
#define P_COUNT 130 // P_COUNT+1 で割込み発生

#include <xc.h>
#include <libpic30.h>

// FICD
#pragma config ICS = PGD3 // ICD Communication Channel Select bits (Communicate on PGEC3 and PGED3)
#pragma config JTAGEN = OFF // JTAG Enable bit (JTAG is disabled)

// FPOR
#pragma config ALTI2C1 = OFF // Alternate I2C1 pins (I2C1 mapped to SDA1/SCL1 pins)
#pragma config ALTI2C2 = OFF // Alternate I2C2 pins (I2C2 mapped to SDA2/SCL2 pins)
#pragma config WDTWIN = WIN25 // Watchdog Window Select bits (WDT Window is 25% of WDT period)

// FWDT
#pragma config WDTPOST = PS32768 // Watchdog Timer Postscaler bits (1:32,768)
#pragma config WDTPRE = PR128 // Watchdog Timer Prescaler bit (1:128)
#pragma config PLLKEN = ON // PLL Lock Enable bit (Clock switch to PLL source will wait until the PLL lock signal is valid.)
#pragma config WINDIS = OFF // Watchdog Timer Window Enable bit (Watchdog Timer in Non-Window mode)
#pragma config FWDTEN = OFF // Watchdog Timer Enable bit (Watchdog timer enabled/disabled by user software)

// FOSC
#pragma config POSCMD = NONE // Primary Oscillator Mode Select bits (Primary Oscillator disabled)
#pragma config OSCIOFNC = ON // OSC2 Pin Function bit (OSC2 is general purpose digital I/O pin)
#pragma config IOL1WAY = OFF // Peripheral pin select configuration (Allow multiple reconfigurations)
#pragma config FCKSM = CSECME // Clock Switching Mode bits (Both Clock switching and Fail-safe Clock Monitor are enabled)

// FOSCSEL
#pragma config FNOSC = FRCPLL // Oscillator Source Selection (Fast RC Oscillator with divide-by-N with PLL module (FRCPLL) )
#pragma config PWMLOCK = OFF // PWM Lock Enable bit (PWM registers may be written without key sequence)
#pragma config IESO = OFF // Two-speed Oscillator Start-up Enable bit (Start up with user-selected oscillator source)

// FGS
#pragma config GWRP = OFF // General Segment Write-Protect bit (General Segment may be written)
#pragma config GCP = OFF

void _ISR _T2Interrupt(void){

IFS0bits.T2IF=0;
LATAbits.LATA3=!LATAbits.LATA3; //反転

}

void main(void){

// PLLに関連する設定 ------------------------------------------
PLLFBD = 63; // M = 65 7.37MHz x65/2/2
CLKDIVbits.PLLPOST=0; // N2 = 2 = 119.7625MHz
CLKDIVbits.PLLPRE=0; // N1 = 2 // Fcy = Fosc /2 = 59.88125 MHz
while (OSCCONbits.LOCK!=1); // PLLの安定(LOCK)を待つ
// --------------------------------------------------------------


TRISA=0x0000;
TRISB=0x0040;

// ペリフェラルピン設定 (PPS)
// 入力
RPINR3bits.T2CKR=0b0100010; // RPI34(6ピン)をタイマ2外部クロック源

// 出力
RPOR0=0x0010; // RP20(12ピン)をOC1に設定

// 割込み設定
SRbits.IPL=2; // CPU割込みレベル
INTCON1=0x8000; // 多重割込み禁止
INTCON2=0x8000; // GIE =1; 立上りエッジで割込み. IVT使用


// タイマ設定

// タイマ2設定(CLKカウント用)

//T2CON=0x0002; // 16bit,プリスケーラ1/1,外部クロックでUP
T2CONbits.TON=0;
T2CONbits.TCS=1;
T2CONbits.TCKPS=0b00;

TMR2=0;
PR2=999;//P_COUNT; // カウント数

// タイマ2割込み設定
IPC1bits.T2IP=5;
IFS0bits.T2IF=0;
IEC0bits.T2IE=1;

T2CONbits.TON=1; // タイマ2 ON


// OC用タイマ設定
// タイマ4設定
PR4=PWM_HZ; // PWM周期の設定
T4CON=0x0000; // 16bitモード、内部クロック使用、プリスケーラ1/1
TMR4=0; // タイマ4カウンタレジスタクリア
T4CONbits.TON=1; // タイマ4 ON

// OC1 設定
OC1CON1=0x0006; // エッジアラインPWMモード
OC1CON1bits.OCTSEL=0b010; // クロック源はタイマ4
OC1CON2bits.SYNCSEL=0x0E; // 同期(周期)はタイマ4
OC1R=(PWM_HZ+1)/2; // デューティ比 50%

while(1){

} // end of main loop

}


 
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
解決しましたか?
256
: 15/06/15-00:27
RETFIE

知恵袋にもマルチポストされていましたのでリンクを張っておきます。
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q12146628852



> はじめまして。
> 以下の問題が発生しており、皆様のお知恵をお借りしたいです。
>
> 概要:
> dsPIC 33E 64MC202 を用いて、タイマ2を用いて外部パルスをカウントし、ある回数で、割込みを発生させたい。
> 外部パルスはPWMにて、自己のPICで発生させている。
>
> 問題点:
> 外部パルスがカウント出来ない。
> (割込み関数内で、LATA3出力を反転させているが、出力が
> 反転しない)
>
> 行った調査:
> 1.割込み関数の書式は正しいか
>  はい。
>  タイマ2を内部クロック設定で10[ms]の割込みを行うと、正常に割込みがかかる。
>
> 2.PWMの要件は満たしているか。
>  はい。
>  リファレンスマニュアルでのタイマ2の外部パルスカウント仕様(パルスは0.5Tcy以上)は満たしています。
>  今回のPWMは1[MHz]です。PICは120[MHz]→Fcy=60[MHz]で動作。
>  PWMの信号はオシロで確認済みです。
>
> 3.入出力ピンの設定はどうか。
>  正しいと判断していますが、問題があるのがここしかないかと思っ ています。
>  16Fファミリと設定方法が違い、戸惑いましたが、しっかり確認し たつもりでいます。
>  
> 4.自己で学習したか
>  はい。
>  後閑様の書籍「dsPIC活用ガイドブック」、リファレンスマニュアル、データシートを見 ています。また16Fファミリの書籍も読んでいます。
>  リファレンスマニュアルP11-13の「カウンタモード」のサンプル  コードも参考にしました。
>
> よろしくお願い致します。
>
> /*以下ソース抜粋*/
>
>
> #define FSOC (119762500ULL)
> #define FCY (FSOC/2)
> #define PWM_HZ 59
> #define P_COUNT 130 // P_COUNT+1 で割込み発生
>
> #include <xc.h>
> #include <libpic30.h>
>
> // FICD
> #pragma config ICS = PGD3 // ICD Communication Channel Select bits (Communicate on PGEC3 and PGED3)
> #pragma config JTAGEN = OFF // JTAG Enable bit (JTAG is disabled)
>
> // FPOR
> #pragma config ALTI2C1 = OFF // Alternate I2C1 pins (I2C1 mapped to SDA1/SCL1 pins)
> #pragma config ALTI2C2 = OFF // Alternate I2C2 pins (I2C2 mapped to SDA2/SCL2 pins)
> #pragma config WDTWIN = WIN25 // Watchdog Window Select bits (WDT Window is 25% of WDT period)
>
> // FWDT
> #pragma config WDTPOST = PS32768 // Watchdog Timer Postscaler bits (1:32,768)
> #pragma config WDTPRE = PR128 // Watchdog Timer Prescaler bit (1:128)
> #pragma config PLLKEN = ON // PLL Lock Enable bit (Clock switch to PLL source will wait until the PLL lock signal is valid.)
> #pragma config WINDIS = OFF // Watchdog Timer Window Enable bit (Watchdog Timer in Non-Window mode)
> #pragma config FWDTEN = OFF // Watchdog Timer Enable bit (Watchdog timer enabled/disabled by user software)
>
> // FOSC
> #pragma config POSCMD = NONE // Primary Oscillator Mode Select bits (Primary Oscillator disabled)
> #pragma config OSCIOFNC = ON // OSC2 Pin Function bit (OSC2 is general purpose digital I/O pin)
> #pragma config IOL1WAY = OFF // Peripheral pin select configuration (Allow multiple reconfigurations)
> #pragma config FCKSM = CSECME // Clock Switching Mode bits (Both Clock switching and Fail-safe Clock Monitor are enabled)
>
> // FOSCSEL
> #pragma config FNOSC = FRCPLL // Oscillator Source Selection (Fast RC Oscillator with divide-by-N with PLL module (FRCPLL) )
> #pragma config PWMLOCK = OFF // PWM Lock Enable bit (PWM registers may be written without key sequence)
> #pragma config IESO = OFF // Two-speed Oscillator Start-up Enable bit (Start up with user-selected oscillator source)
>
> // FGS
> #pragma config GWRP = OFF // General Segment Write-Protect bit (General Segment may be written)
> #pragma config GCP = OFF
>
> void _ISR _T2Interrupt(void){
>
> IFS0bits.T2IF=0;
> LATAbits.LATA3=!LATAbits.LATA3; //反転
>
> }
>
> void main(void){
>
> // PLLに関連する設定 ------------------------------------------
> PLLFBD = 63; // M = 65 7.37MHz x65/2/2
> CLKDIVbits.PLLPOST=0; // N2 = 2 = 119.7625MHz
> CLKDIVbits.PLLPRE=0; // N1 = 2 // Fcy = Fosc /2 = 59.88125 MHz
> while (OSCCONbits.LOCK!=1); // PLLの安定(LOCK)を待つ
> // --------------------------------------------------------------
>
>
> TRISA=0x0000;
> TRISB=0x0040;
>
> // ペリフェラルピン設定 (PPS)
> // 入力
> RPINR3bits.T2CKR=0b0100010; // RPI34(6ピン)をタイマ2外部クロック源
>
> // 出力
> RPOR0=0x0010; // RP20(12ピン)をOC1に設定
>
> // 割込み設定
> SRbits.IPL=2; // CPU割込みレベル
> INTCON1=0x8000; // 多重割込み禁止
> INTCON2=0x8000; // GIE =1; 立上りエッジで割込み. IVT使用
>
>
> // タイマ設定
>
> // タイマ2設定(CLKカウント用)
>
> //T2CON=0x0002; // 16bit,プリスケーラ1/1,外部クロックでUP
> T2CONbits.TON=0;
> T2CONbits.TCS=1;
> T2CONbits.TCKPS=0b00;
>
> TMR2=0;
> PR2=999;//P_COUNT; // カウント数
>
> // タイマ2割込み設定
> IPC1bits.T2IP=5;
> IFS0bits.T2IF=0;
> IEC0bits.T2IE=1;
>
> T2CONbits.TON=1; // タイマ2 ON
>
>
> // OC用タイマ設定
> // タイマ4設定
> PR4=PWM_HZ; // PWM周期の設定
> T4CON=0x0000; // 16bitモード、内部クロック使用、プリスケーラ1/1
> TMR4=0; // タイマ4カウンタレジスタクリア
> T4CONbits.TON=1; // タイマ4 ON
>
> // OC1 設定
> OC1CON1=0x0006; // エッジアラインPWMモード
> OC1CON1bits.OCTSEL=0b010; // クロック源はタイマ4
> OC1CON2bits.SYNCSEL=0x0E; // 同期(周期)はタイマ4
> OC1R=(PWM_HZ+1)/2; // デューティ比 50%
>
> while(1){
>
> } // end of main loop
>
> }
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
解決いたしました。
257
: 15/06/15-09:12
kura

返信ありがとうございます。

解決いたしました。

頂きましたアドバイスの
ANSELレジスタ
ODCレジスタ
の設定を記述したら割込みがかかりました。

ありがとうございまず。

また、マナーに関するご指摘もありがとうございます。

私の拙い経験で申し訳ないですが、頂きましたアドバイスをまとめると

ANSELx
ODCx
などは、デフォルトで「0」と思わずに、しっかりと記述しなければ
ならないということです。

ありがとうございました。
▲pagetop

- WebForum -