PIC18F2550・タイマ1が8bitでリセットしてしまう

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
アニー

PIC18F2550・タイマ1が8bitでリセットしてしまう

#1

投稿記事 by アニー » 15年前

大変恐縮ですが、下記項目につき原因についてアドバイス頂けますと幸いです。
作成環境はMPLAB V8.36、MPLAB C18コンパイラV3.33 です。
<質問内容>
◎タイマ1がうまく動作しない。
やりたい事は、
 (1)タイマ0(8bit)を使い割り込みを発生させ、ポートから信号ON/OFF(PWM信号を出したい)。
 (2)タイマ1(16bit)を使いCCP1/2のコンペアマッチ割り込みを行ない、CCP1ポートからPWM信号ON/OFF(サーボモータの動作用PWM信号を出したい)。
(1),(2)を同時進行で動作させたい、というものです。
シミュレーションで確認したところ、タイマ0/1のカウントアップ動作自体は確認できているのですが、タイマ1が8bitのところでオーバーフロー?して、タイマ0と同時に0にリセットされてしまいます。
以下に作成コードを掲載します。
--【以下、コード抜粋】--
//===《初期設定》===
//---<ヘッダーファイル>---
#include<p18f2550.h>
//---<コンフィグレーション>---
//---<関数宣言>---
//---<割り込みの定義関連>---
//===《動作プログラム》===
//---<メイン関数>---
void main()
{
ioport_settei(); //サブルーチン「ioport_settei」実行(入出力ポート初期設定)
interrupt_settei(); //サブルーチン「interrupt_settei」実行(割り込み初期設定)
tmr_ccp_settei(); //サブルーチン「tmr_ccp_settei」実行(タイマ&CCPモード初期設定)
while(1) //繰り返し(ずっと繰り返す)
{
}
}
//---<サブルーチン>---
void ioport_settei(void) //[入出力ポート初期設定]
{省略}
void interrupt_settei(void) //[割り込み初期設定]
{
INTCONbits.GIE = 1; //グローバル割り込み設定:許可
INTCONbits.PEIE = 1; //周辺割り込み設定:許可
INTCONbits.TMR0IE = 1; //タイマ0割り込み設定:許可
PIE1bits.TMR1IE = 1; //タイマ1割り込み設定:許可
PIE1bits.CCP1IE = 1; //CCP1割り込み設定:許可
PIE2bits.CCP2IE = 1; //CCP2割り込み設定:許可
}
void tmr_ccp_settei(void) //[タイマ&CCPモード初期設定]
{
TMR0H = 0;
TMR0L = 0;
TMR1H = 0;
TMR1L = 0;
T0CON = 0b11001000; //タイマ0設定(有効,8bit,内部クロック,プリ1倍)
T1CON = 0b10000001; //タイマ1設定(有効,16bit,内部クロック,プリ1倍)
CCP1CON = 0b00001001; //CCP1設定(Compare mode,RC2=0,割り込み発生)
CCP2CON = 0b00001011; //CCP2設定(Compare mode,スペシャルイベントトリガ,割り込み発生)
CCPR1 = 3750; //CCP1 Duty値初期設定(PWM(ON時間)=1.5ms…ニュートラル位置)
CCPR2 = 50000; //CCP2 Duty値初期設定(PWM(周期)=20ms)
}
//---<割り込み処理関数>---
#pragma code
void isr(void)
{
if(INTCONbits.TMR0IF == 1)
{
INTCONbits.TMR0IF = 0;
}
}
となります。
大変恐縮ですが、原因が判る方がいらっしゃいましたら、ご教示のほどよろしくお願い致します。

softya

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#2

投稿記事 by softya » 15年前

ここはマルチポストが基本禁止ですので、まず他のサイトのを閉じてもらえますか。
http://oshiete1.goo.ne.jp/qa5678699.html
詳しくはこの掲示板の使い方をご覧ください→ http://dixq.net/board/board.html

解決したら、その後で。

アニー

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#3

投稿記事 by アニー » 15年前

ルールをよく存じておらずすみません。
「マルチポスト」という言葉を初めて知りました。
元の投稿(OK Wave)に対してなかなか回答がもらえないため、焦ってこちらにも投稿した次第です。
元の投稿が削除できないようですので、こちらを削除としたいと思います。
ご迷惑をお掛けし、大変申し訳ありませんでした。
もしお時間があるようでしたら、元の投稿に回答頂けますと幸いです。
以上、よろしくお願い致します。

softya

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#4

投稿記事 by softya » 15年前

okwave系は、返答が無い状態なら取り消し可能だと思います。お試し下さい。
あと、社員研修であれば研修の指導者に聞くのが本筋だと思うのですが、聞けない理由でもあるんでしょうか?
私が研修の指導者なら、聞いてこない新人は逆に不安になりますけど。

たかぎ

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#5

投稿記事 by たかぎ » 15年前

> こちらを削除としたいと思います。

自分の勝手な都合で記事を削除することは禁止されています。
いずれにせよ、利用規約を熟読することをお勧めします。

アニー

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#6

投稿記事 by アニー » 15年前

親切なご指導、ありがとうございます。
OK Waveの方を削除できました。こちらで回答頂けますと幸いです。
また、「研修の指導者に聞くのが本筋」という件については、まさにその通り
なのですが、現在行っている研修は、自分達でテーマ(と使用機材等)を決めて
行なうもので、PICマイコンに関しては精通している者が社内に居ないため質問
ができず、そのためここのような専門知識を持った方に質問をさせて頂いた次第
です。
何卒ご理解のほどよろしくお願い致します。

softya

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#7

投稿記事 by softya » 15年前

それでは、picfun(電子工作の実験室)と言うサイトはご存知でしょうか?
PIC関係の著作物で有名な後閑哲也氏のサイトで、
http://www.picfun.com/
その中にあるC18による内蔵モジュールの使い方。
http://www.picfun.com/mod18frame.html
まず、これを読んでください。

あと、下記の本のいずれかがあった方が今後のためだと思いますが。
http://www.picfun.com/picbook8.html
http://www.picfun.com/picbookI.html

ソースコードについては、インデントし直して投稿いただけると助かります。
※ このサイトではちゃんとインデントされますので。

アニー

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#8

投稿記事 by アニー » 15年前

ありがとうございます。
ご紹介頂いたサイトは、先日net検索でたまたま辿り着き、内容を読ませて頂きました。
…ただ、解説内容が下名には難解すぎて、どうしても具体的な内部ロジック(どこの設定が間違って
いるのか)が理解できませんでした。

ソースコードを貼り付け直しました。
条件は、オシレータは10MHzのセラロックで優先割り込み無しとして書いて(書いたつもり)あります。
その他ご不明な点がありましたら指示下さい。

大変申し訳ありませんが、ご教授のほどよろしくお願い致します。

--以下、プログラムコード--

//【タイマ割り込み&コンペアマッチ割り込み動作テストプログラム】
//---------------------------------------------------------------------------------------------
//●使用マイコン:PIC18F2550
//===《初期設定》===
//---<ヘッダーファイル>---
#include<p18f2550.h>
//#include<delays.h>
//---<コンフィグレーション>---
#pragma config FOSC = HS, PLLDIV = 1
#pragma config FCMEN = OFF, IESO = OFF, PWRT = ON
#pragma config BOR = OFF, BORV = 3, WDT = OFF, WDTPS = 1
#pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF, CCP2MX = OFF
#pragma config STVREN = OFF, LVP = OFF, XINST = OFF, DEBUG = OFF
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF
#pragma config CPB = OFF, CPD = OFF
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF
#pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF
#pragma config EBTRB = OFF
//---<関数宣言>---
void ioport_settei(void); //サブルーチン「ioport_settei」を宣言
void interrupt_settei(void); //サブルーチン「interrupt_settei」を宣言
void tmr_ccp_settei(void); //サブルーチン「tmr_ccp_settei」を宣言
void isr(void);

//---<割り込みの定義関連>---
//****** 割込みの定義(優先レベルなし)
#pragma interrupt isr save = PROD
//***** 割込みベクタへジャンプ命令セット
#pragma code isrcode = 0x8
void isr_direct(void) // 割り込みベクタから割り込み関数へ跳ぶための関数
{
_asm
goto isr
_endasm
}
//----------------------------

//---<変数宣言>---
/*
char = 0; //変数「c_flg」を宣言(直角コーナー通過処理用)
int = 0; //変数「s_value」を宣言(ニュートラル:100,右折:~200,左折:0~)
*/
//---------------------------------------------------------------------------------------------
//===《動作プログラム》===
//---<メイン関数>---
void main()
{
ioport_settei(); //サブルーチン「ioport_settei」実行(入出力ポート初期設定)
interrupt_settei(); //サブルーチン「interrupt_settei」実行(割り込み初期設定)
tmr_ccp_settei(); //サブルーチン「tmr_ccp_settei」実行(タイマ&CCPモード初期設定)
while(1) //繰り返し(ずっと繰り返す)
{
}
}
//---<サブルーチン>---
void ioport_settei(void) //[入出力ポート初期設定]
{
ADCON1 = 0b00001111; //A/D設定:全ポートデジタル
TRISA = 0b00111111; //ポートA・I/O設定:RA0~RA5入力,RA6(OSC2)
TRISB = 0b00011111; //ポートB・I/O設定:RB0~4入力,RB5,6出力,RB7未使用
TRISC = 0b00110000; //ポートC・I/O設定:RC0,1,3未使用,RC2(CCP),RC4,5入力,RC6,7出力
LATA = 0; //ポートAクリア
LATB = 0; //ポートBクリア
LATC = 0; //ポートCクリア
}
void interrupt_settei(void) //[割り込み初期設定]
{
INTCONbits.GIE = 1; //グローバル割り込み設定:許可
INTCONbits.PEIE = 1; //周辺割り込み設定:許可
INTCONbits.TMR0IE = 1; //タイマ0割り込み設定:許可
PIE1bits.TMR1IE = 0; //タイマ1割り込み設定:許可しない
PIE1bits.CCP1IE = 1; //CCP1割り込み設定:許可
PIE2bits.CCP2IE = 1; //CCP2割り込み設定:許可
}
void tmr_ccp_settei(void) //[タイマ&CCPモード初期設定]
{
TMR0H = 0; //タイマ0クリア
TMR0L = 0; //タイマ0クリア
TMR1H = 0; //タイマ1クリア
TMR1L = 0; //タイマ1クリア
T0CON = 0b11001000; //タイマ0設定(有効,8bit,内部クロック,プリ1倍)
T1CON = 0b10000001; //タイマ1設定(有効,16bit,内部クロック,プリ1倍)
CCP1CON = 0b00001001; //CCP1設定(Compare mode,RC2=0,割り込み発生)
CCP2CON = 0b00001011; //CCP2設定(Compare mode,スペシャルイベントトリガ,割り込み発生)
CCPR1 = 3750; //CCP1 Duty値初期設定(PWM(ON時間)=1.5ms…ニュートラル位置)
CCPR2 = 50000; //CCP2 Duty値初期設定(PWM(周期)=20ms)
}
//---<割り込み処理関数>---
#pragma code
void isr(void)
{
if(INTCONbits.TMR0IF == 1)
{
INTCONbits.TMR0IF = 0;
}
/*
if(PIR1bits.TMR1IF == 1)
{
PIR1bits.TMR1IF = 0;
}
*/
if(PIR1bits.CCP1IF == 1)
{
PIR1bits.CCP1IF = 0;
}
if(PIR2bits.CCP2IF == 1)
{
PIR2bits.CCP2IF = 0;
LATCbits.LATC2 = 1;
}
}
以上

softya

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#9

投稿記事 by softya » 15年前

PIC18Fシリーズは使ったことが無い&PICは久しぶりなので見当違いかも知れませんが、CCP1IFとCCP2IFが有効になっていない気がするのですが?。あっ勘違いですね。失礼しました。
とりあえず問題を明確にするため、CCP1だけで動くかまず確認することと、念のためタイマー3のCCP使用を無効に設定してみて下さい。CCP2に関しては一旦コメントアウトを。
もう一つ気になるのは、タイマー1の16bit設定なんですが必要なんでしょうか?
T1CON = 0b10000001; //タイマ1設定(有効,16bit,内部クロック,プリ1倍)
これってレジスタへの格納の仕方であって、16ビット連動ON/OFFじゃないですよね。

参考↓アセンブラですが。
http://homepage1.nifty.com/rikiya/softw ... MER1_1.htmt=

アニー

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#10

投稿記事 by アニー » 15年前

ありがとうございます。
とりあえず、やってみます。
確認結果はまた報告します。

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

アニー

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#11

投稿記事 by アニー » 15年前

報告が遅れ申し訳ありません。
昨日急な出張が入り、確認する時間が取れませんでした。
先ほど動作確認を行いましたので、報告します。


> とりあえず問題を明確にするため、CCP1だけで動くかまず確認することと、念のためタイマー3のCCP使用を無効に設定してみて下さい。CCP2に関しては一旦コメントアウトを。

→タイマ3を無効に設定し、CCP2の部分をコメントアウトして動作させてみました。
 結果としては、変化無し(8bitまでカウントアップしたところで0にリセットされる)でした。


> もう一つ気になるのは、タイマー1の16bit設定なんですが必要なんでしょうか?
> T1CON = 0b10000001; //タイマ1設定(有効,16bit,内部クロック,プリ1倍)
> これってレジスタへの格納の仕方であって、16ビット連動ON/OFFじゃないですよね。

→すみません、「レジスタへの格納の仕方」「16ビット連動ON/OFF」の意味がわかりませんでした。
 T1CONの設定をどのように変更すればよいでしょうか?

大変申し訳ありませんが、アドバイスのほどよろしくお願い致します。

アニー

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#12

投稿記事 by アニー » 15年前

追加の確認結果を報告します。

T1CONのbit6(T1RUN)が、ソースコード上でON(1)に書き換えても、シミュレータ上では
書き換わってくれませんでした(bit6は0のままになってしまう)。
その他のbitはちゃんと変更を反映してくれます。
他のレジスタ設定との関連なのでしょうか?

また、コンフィグレーションの設定で関連ありそうな所はありますでしょうか?
同僚の電気屋からはそのような意見がありました(ただ、その人物も下名と同等の
PIC知識レベルですが…)。

些細な情報でも構いませんので、関連がありそうな項目がありましたら情報提供のほど、
何卒よろしくお願い致します。

softya

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#13

投稿記事 by softya » 15年前

PICは本業じゃないので、あんまり頼られてもちゃんと出来る自信は無いですが(汗)
出来る限りはやってみます。

>結果としては、変化無し(8bitまでカウントアップしたところで0にリセットされる)でした。
聞きたいこと。
・CCP1の割り込みは発生しませんか?
CCP1CON = 0b00001001; だと割り込みが発生しないはずです。CCP1CON = 0b00001010; で試してみてください。
・TMR1Lが0の時に、TMR1Hも0のままでしょうか?

>すみません、「レジスタへの格納の仕方」「16ビット連動ON/OFF」の意味がわかりませんでした。
 T1CONの設定をどのように変更すればよいでしょうか?
RD16の事です。読み出しだけの問題なのでONにしておけば良いみたいですね。
関係なさそうです。すいません。
TMR1は何もしなくても16bitのカウンタとして動作するはずです。

>T1CONのbit6(T1RUN)が、ソースコード上でON(1)に書き換えても、シミュレータ上では
PIC16Fに無かったビットなので詳しくないですがデータシートも見る限りREADONLYのビットの様です。
データシートまたは、PIC18Fの本を確認して下さい。

>また、コンフィグレーションの設定で関連ありそうな所はありますでしょうか?
無さそうですよ。
http://www.picfun.com/pic18/pic18xx12.html

アニー

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#14

投稿記事 by アニー » 15年前

> PICは本業じゃないので、あんまり頼られてもちゃんと出来る自信は無いですが(汗)
> 出来る限りはやってみます。

 親身なアドバイス、本当に感謝です。
 ありがとうございます。


> >結果としては、変化無し(8bitまでカウントアップしたところで0にリセットされる)でした。
> 聞きたいこと。
> ・CCP1の割り込みは発生しませんか?
> CCP1CON = 0b00001001; だと割り込みが発生しないはずです。CCP1CON = 0b00001010; で試してみてください。
> ・TMR1Lが0の時に、TMR1Hも0のままでしょうか?

→TMR1が8bit(256)のところでリセットされてしまうので、CCPR1を150とし、「CCP1CON = 0b00001001;」
 と「CCP1CON = 0b00001010;」の両方で確認してみましたが、両方とも
  1周目  :タイマ1が150になったところでPIR1bits.CCP1IFが1に変化し(割り込み発生している)、
       タイマ0が256で再び割り込み発生(タイマ0割り込み)
  2周目以降:タイマ1が150になっても割り込み発生しない(PIR1bits.CCP1IFはちゃんと0に戻っている)
       タイマ0の割り込みはちゃんと発生
 という動きになりました。

 また、TMR1Hの値は、常に0のままです。(1度も変化しません)


> >T1CONのbit6(T1RUN)が、ソースコード上でON(1)に書き換えても、シミュレータ上では
> PIC16Fに無かったビットなので詳しくないですがデータシートも見る限りREADONLYのビットの様です。
> データシートまたは、PIC18Fの本を確認して下さい。

 データシートのR-0というのがその事ですね。見方を初めて知りました。
 ありがとうございます。

 
以上、よろしくお願い致します。

softya

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#15

投稿記事 by softya » 15年前

そうか!基本的すぎて忘れてました。
INTCONbits.GIE = 1; //グローバル割り込み設定:許可
INTCONbits.PEIE = 1; //周辺割り込み設定:許可

T1CONbits.TMR1ON = 1;
は初期化が終わるまで設定してはいけません。
ioport_settei(); //サブルーチン「ioport_settei」実行(入出力ポート初期設定)
interrupt_settei(); //サブルーチン「interrupt_settei」実行(割り込み初期設定)
tmr_ccp_settei(); //サブルーチン「tmr_ccp_settei」実行(タイマ&CCPモード初期設定)
後に
INTCONbits.GIE = 1; //グローバル割り込み設定:許可
INTCONbits.PEIE = 1; //周辺割り込み設定:許可
T1CONbits.TMR1ON = 1; //タイマ1スタート
としてください。
なので、T1CONの初期化は
T1CON = 0b10000000; //タイマ1設定(有効,16bit,内部クロック,プリ1倍)
となります。

それと割り込み時には
PIE1bits.CCP1IE = 1; //CCP1割り込み設定:許可
で割り込みをアセンブラなら再設定する必要があります。
たぶんCでも必要じゃないかなと思います。

アニー

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#16

投稿記事 by アニー » 15年前

> そうか!基本的すぎて忘れてました。
> INTCONbits.GIE = 1; //グローバル割り込み設定:許可
> INTCONbits.PEIE = 1; //周辺割り込み設定:許可
> や
> T1CONbits.TMR1ON = 1;
> は初期化が終わるまで設定してはいけません。

 コードを書き直し動かしてみましたが、症状は変わりませんでした。
 ちょっと長くなってしまいますが、変更したコードを貼り付けますので、
 確認頂けますでしょうか?
 申し訳ありませんが、よろしくお願い致します。

--以下、プログラムコード--

//-----------------------------------------------------------------------------------------
//●使用マイコン:PIC18F2550
//===《初期設定》===
//---<ヘッダーファイル>---
#include<p18f2550.h>
//#include<delays.h>
//---<コンフィグレーション>---
#pragma config FOSC = HS, PLLDIV = 1
#pragma config FCMEN = OFF, IESO = OFF, PWRT = ON
#pragma config BOR = OFF, BORV = 3, WDT = OFF, WDTPS = 1
#pragma config MCLRE = ON, LPT1OSC = OFF, PBADEN = OFF, CCP2MX = OFF
#pragma config STVREN = OFF, LVP = OFF, XINST = OFF, DEBUG = OFF
#pragma config CP0 = OFF, CP1 = OFF, CP2 = OFF, CP3 = OFF
#pragma config CPB = OFF, CPD = OFF
#pragma config WRT0 = OFF, WRT1 = OFF, WRT2 = OFF, WRT3 = OFF
#pragma config WRTB = OFF, WRTC = OFF, WRTD = OFF
#pragma config EBTR0 = OFF, EBTR1 = OFF, EBTR2 = OFF, EBTR3 = OFF
#pragma config EBTRB = OFF
//---<関数宣言>---
void ioport_settei(void); //サブルーチン「ioport_settei」を宣言
void interrupt_settei(void); //サブルーチン「interrupt_settei」を宣言
void tmr_ccp_settei(void); //サブルーチン「tmr_ccp_settei」を宣言
void isr(void);

//---<割り込みの定義関連>---
//****** 割込みの定義(優先レベルなし)
#pragma interrupt isr save = PROD
//***** 割込みベクタへジャンプ命令セット
#pragma code isrcode = 0x8
void isr_direct(void) // 割り込みベクタから割り込み関数へ跳ぶための関数
{
_asm
goto isr
_endasm
}
//------------------------
//---<変数宣言>---
/*
char = 0; //変数「c_flg」を宣言(直角コーナー通過処理用)
int = 0; //変数「s_value」を宣言(ニュートラル:100,右折:~200,左折:0~)
*/
//----------------------------------------------------------------------------------------
//===《動作プログラム》===
//---<メイン関数>---
void main()
{
ioport_settei(); //サブルーチン「ioport_settei」実行(入出力ポート初期設定)
interrupt_settei(); //サブルーチン「interrupt_settei」実行(割り込み初期設定)
tmr_ccp_settei(); //サブルーチン「tmr_ccp_settei」実行(タイマ&CCPモード初期設定)
INTCONbits.GIE = 1; //グローバル割り込み設定:許可
INTCONbits.PEIE = 1; //周辺割り込み設定:許可
T1CONbits.TMR1ON = 1; //タイマ1スタート
while(1) //繰り返し(ずっと繰り返す)
{
}
}
//---<サブルーチン>---
void ioport_settei(void) //[入出力ポート初期設定]
{
ADCON1 = 0b00001111; //A/D設定:全ポートデジタル
TRISA = 0b00111111; //ポートA・I/O設定:RA0~RA5入力,RA6(OSC2)
TRISB = 0b00011111; //ポートB・I/O設定:RB0~4入力,RB5,6出力,RB7未使用
TRISC = 0b00110000; //ポートC・I/O設定:RC0,1,3未使用,RC2(CCP),RC4,5入力,RC6,7出力
LATA = 0; //ポートAクリア
LATB = 0; //ポートBクリア
LATC = 0; //ポートCクリア
}
void interrupt_settei(void) //[割り込み初期設定]
{
INTCONbits.TMR0IE = 1; //タイマ0割り込み設定:許可
PIE1bits.TMR1IE = 0; //タイマ1割り込み設定:許可しない
PIE1bits.CCP1IE = 1; //CCP1割り込み設定:許可
// PIE2bits.CCP2IE = 1; //CCP2割り込み設定:許可
}
void tmr_ccp_settei(void) //[タイマ&CCPモード初期設定]
{
TMR0H = 0; //タイマ0クリア
TMR0L = 0; //タイマ0クリア
TMR1H = 0; //タイマ1クリア
TMR1L = 0; //タイマ1クリア
T0CON = 0b11001000; //タイマ0設定(有効,8bit,内部クロック,プリ1倍)
T1CON = 0b10000000; //タイマ1設定(無効,16bit,内部クロック,プリ1倍)
T3CON = 0b00000000; //タイマ3設定(無効)
CCP1CON = 0b00001010; //CCP1設定(Compare mode,RC2=0,割り込み発生)
// CCP2CON = 0b00001011; //CCP2設定(Compare mode,スペシャルイベントトリガ,割り込み発生)
CCPR1 = 150; //CCP1 Duty値初期設定(PWM(ON時間)=1.5ms…ニュートラル位置)
// CCPR2 = 50000; //CCP2 Duty値初期設定(PWM(周期)=20ms)
}
//---<割り込み処理関数>---
#pragma code
void isr(void)
{
if(INTCONbits.TMR0IF == 1)
{
INTCONbits.TMR0IF = 0;
}
/*
if(PIR1bits.TMR1IF == 1)
{
PIR1bits.TMR1IF = 0;
}
*/
if(PIR1bits.CCP1IF == 1)
{
PIR1bits.CCP1IF = 0;
PIE1bits.CCP1IE = 1; //CCP1割り込み設定:許可(再設定)
}
if(PIR2bits.CCP2IF == 1)
{
PIR2bits.CCP2IF = 0;
PIE2bits.CCP2IE = 1; //CCP2割り込み設定:許可(再設定)
LATCbits.LATC2 = 1;
}
}

softya

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#17

投稿記事 by softya » 15年前

>PIE1bits.CCP1IE = 1; //CCP1割り込み設定:許可(再設定)
は不要だったみたいですごめんなさい。

こうなるとソースコードだけ見てる身としては、訳がわかんないですね。
こんな場合に私ならどうするかと言うと、

(1)サンプルコードを動かしてみて動作するか確認して、動いたら違いを探す。
piffunより↓
http://www.picfun.com/pic18/18ctest9.c
アセンブラのやつ↓
http://homepage1.nifty.com/rikiya/softw ... MER1_1.htm

(2)割り込みも何も無しでTMR1が0xff以上になるのかとか、TMR1の動作を簡単なところから始めて複雑にしていく。出来るだけシンプルなコードから始める。

(3)Cソースからアセンブラコードを出して、ちゃんと処理しているか確認する。

(4)ステップトレースして、他のフラグ類の変化を調べる。
初回のCCP1割り込みが発生したときと、2回目の発生しなくなった時で違いは無いでしょうか?

こんな感じでしょうか。

アニー

Re:PIC18F2550・タイマ1が8bitでリセットしてしまう

#18

投稿記事 by アニー » 15年前

ありがとうございます。

実際の動きを一つづつ地道に確認していくしか方法は無いようですね。
(1)から順番に確かめてみたいと思います。

自分はメカ屋で普段制御ソフトに触れる機会は皆無なのですが、今回自分で
プログラム作成をやってみて、改めてソフト屋さんの大変さを実感しました。
(コーディングそのものよりも、マイコンの初期設定項目の確認・決定が大変
ですね。(同じPICマイコンでも機種毎に同じ項目で設定レジスタが違っていた
り、データシートも英語だし…))

また判った事があったら、報告させて頂きます。

以上、よろしくお願い致します。

閉鎖

“C言語何でも質問掲示板” へ戻る