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

タイトル
記事No
投稿日
投稿者
参照先
タイマ割り込み周期
444
: 16/01/21-10:00
PIC始めました

PIC18F2620 + C18環境です。

タイマ割り込みの周期設定が思うようにいきません。

[config設定]
#pragma config OSC = INTIO67,MCLRE = OFF
#pragma config BOREN = OFF,WDT = OFF,LVP = OFF

[clock設定]
OSCCON=0b01110000; //8MHz設定

[割り込み設定]
//0.1msec割り込みタイマ設定
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_256);
WriteTimer0(65136);


[動作確認方法]
上の内容で設定し、あるポートから割り込み周期のタイミングでHi/Lo信号を出力させています。


#pragma interrupt pwm //pwm割り込みの宣言
#pragma code isr_vector = 0x08 //割込みベクタにジャンプ命令をセット
void goto_isr(void)
{
_asm
Goto pwm
_endasm
}

#pragma code
void pwm(void) //割込み処理関数
{
LATAbits.LATA6 = ~LATAbits.LATA6;
INTCONbits.TMR0IF = 0; ///タイマ0割り込みフラグのクリア
WriteTimer0(65136);

[動作確認結果]
100msec周期の割り込みになってしまいます。
(0.1msec周期の割り込みとなるように、計算してプログラムしているつもりなのですが…)

なにか、勘違いをしているのでしょうか?
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re: タイマ割り込み周期
447
: 16/01/21-17:25
Goakn

この設定だと
 0.5usec×256×400 = 51msec 周期の割り込みになりますね。


> PIC18F2620 + C18環境です。
>
> タイマ割り込みの周期設定が思うようにいきません。
>
> [config設定]
> #pragma config OSC = INTIO67,MCLRE = OFF
> #pragma config BOREN = OFF,WDT = OFF,LVP = OFF
>
> [clock設定]
> OSCCON=0b01110000; //8MHz設定
>
> [割り込み設定]
> //0.1msec割り込みタイマ設定
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_256);
> WriteTimer0(65136);
>
>
> [動作確認方法]
> 上の内容で設定し、あるポートから割り込み周期のタイミングでHi/Lo信号を出力させています。
>
>
> #pragma interrupt pwm //pwm割り込みの宣言
> #pragma code isr_vector = 0x08 //割込みベクタにジャンプ命令をセット
> void goto_isr(void)
> {
> _asm
> Goto pwm
> _endasm
> }
>
> #pragma code
> void pwm(void) //割込み処理関数
> {
> LATAbits.LATA6 = ~LATAbits.LATA6;
> INTCONbits.TMR0IF = 0; ///タイマ0割り込みフラグのクリア
> WriteTimer0(65136);
>
> [動作確認結果]
> 100msec周期の割り込みになってしまいます。
> (0.1msec周期の割り込みとなるように、計算してプログラムしているつもりなのですが…)
>
> なにか、勘違いをしているのでしょうか?
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^2: タイマ割り込み周期
448
: 16/01/21-17:44
PIC始めました

config, clockの設定はそのままで、

次のコードに書き換えました。
0.5usec x 2 x 100 = 100usec
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
WriteTimer0(65436);

しかし、結果は約400usec(380usec)です。
何か根本的に誤解しているのでしょうか。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^3: タイマ割り込み周期
450
: 16/01/24-11:16
Gokan <gokan@picfun.com>

割り込み処理関数の方も
WriteTimer(65436);に書き換えましたか??


> config, clockの設定はそのままで、
>
> 次のコードに書き換えました。
> 0.5usec x 2 x 100 = 100usec
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
> WriteTimer0(65436);
>
> しかし、結果は約400usec(380usec)です。
> 何か根本的に誤解しているのでしょうか。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^4: タイマ割り込み周期
451
: 16/01/25-08:18
PIC始めました

割り込み処理関数の方も書き換えてあります。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^5: タイマ割り込み周期
452
: 16/01/25-09:40
Goakn

main関数内で割り込み禁止時間があったりしませんか?
他の割り込みを使っていませんか?
8MHzで100usec周期の処理はかなり厳しいですね。


> 割り込み処理関数の方も書き換えてあります。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^6: タイマ割り込み周期
453
: 16/01/25-10:46
PIC始めました

回答ありがとうございます。
コードを添付させていただきます。

8MHzで100usec周期の処理はかなり厳しいとのことですが、
8MHzだと、どのくらいの割り込み周期まで可能でしょうか?

100usec周期の割り込みを発生させたい場合、クロック周波数を変更するしか方法はありませんか?


void main()
{
//Clock周波数設定
OSCCON=0b01110000; //8MHz設定
//OSCCON=0b01100000; //4MHz設定

//各ポート入出力モード設定
TRISA = 0b00001111; // RA7-0 (1:input/0:output)
TRISB = 0b00000010; // RB7-0 (1:input/0:output)
TRISC = 0b10001000; // RC7-0 (1:input/0:output)
ADCON1 = 0x0C; // RA2-0 Analog input

//各ポート出力初期設定
LATA=0xFF; //ポートAの出力ラッチAにFFを出力
LATB=0x00; //ポートBの出力ラッチBに0を出力
LATC=0xFF; //ポートCの出力ラッチCにFFを出力


//0.1msec割り込みタイマ設定
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
WriteTimer0(65436);


//Interrupt Setting(割り込み設定)
INTCONbits.TMR0IE = 1; //タイマ0割り込み許可
INTCONbits.GIE = 1; //割り込み許可


while(1){

}
}


/************************************************************
* TMR0割り込み処理
ソフトウェアPWM *
************************************************************/
#pragma interrupt pwm //pwm割り込みの宣言
#pragma code isr_vector = 0x08 //割込みベクタにジャンプ命令をセット
void goto_isr(void)
{
_asm
Goto pwm
_endasm
}

#pragma code
void pwm(void) //割込み処理関数
{
LATAbits.LATA6 = ~LATAbits.LATA6;
INTCONbits.TMR0IF = 0; ///タイマ0割り込みフラグのクリア
WriteTimer0(65436);
}
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^7: タイマ割り込み周期
454
: 16/01/25-12:56
Goakn

厳しいというのは何らかの処理をする時間が少ないという意味です。
実際に実行する内容が簡単で処理時間が短ければ問題ありません。
今回の問題で、次のようにするとどうなりますか?
・クロック周波数を変更してみる
・プリスケーラ値を変更してみる
・タイマの下駄の値を変えてみる



> 回答ありがとうございます。
> コードを添付させていただきます。
>
> 8MHzで100usec周期の処理はかなり厳しいとのことですが、
> 8MHzだと、どのくらいの割り込み周期まで可能でしょうか?
>
> 100usec周期の割り込みを発生させたい場合、クロック周波数を変更するしか方法はありませんか?
>
>
> void main()
> {
> //Clock周波数設定
> OSCCON=0b01110000; //8MHz設定
> //OSCCON=0b01100000; //4MHz設定
>
> //各ポート入出力モード設定
> TRISA = 0b00001111; // RA7-0 (1:input/0:output)
> TRISB = 0b00000010; // RB7-0 (1:input/0:output)
> TRISC = 0b10001000; // RC7-0 (1:input/0:output)
> ADCON1 = 0x0C; // RA2-0 Analog input
>
> //各ポート出力初期設定
> LATA=0xFF; //ポートAの出力ラッチAにFFを出力
> LATB=0x00; //ポートBの出力ラッチBに0を出力
> LATC=0xFF; //ポートCの出力ラッチCにFFを出力
>
>
> //0.1msec割り込みタイマ設定
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
> WriteTimer0(65436);
>
>
> //Interrupt Setting(割り込み設定)
> INTCONbits.TMR0IE = 1; //タイマ0割り込み許可
> INTCONbits.GIE = 1; //割り込み許可
>
>
> while(1){
>
> }
> }
>
>
> /************************************************************
> * TMR0割り込み処理
> ソフトウェアPWM *
> ************************************************************/
> #pragma interrupt pwm //pwm割り込みの宣言
> #pragma code isr_vector = 0x08 //割込みベクタにジャンプ命令をセット
> void goto_isr(void)
> {
> _asm
> Goto pwm
> _endasm
> }
>
> #pragma code
> void pwm(void) //割込み処理関数
> {
> LATAbits.LATA6 = ~LATAbits.LATA6;
> INTCONbits.TMR0IF = 0; ///タイマ0割り込みフラグのクリア
> WriteTimer0(65436);
> }
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^8: タイマ割り込み周期
455
: 16/01/25-13:35
PIC始めました

色々変えて試してみました。
結果を↓に載せさせていただきました。

8MHzのときは、C(330usec)が上限
4MHzのときは、G(670usec)が上限  ということでしょうか?

この結果からすると、約30MHz以上のクロックをPICマイコンに供給してあげないと、100usec周期の割り込みは発生させられない。。。
ということでしょうか。。。

@Clock 8MHz
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
WriteTimer0(65436);

380usec周期


AClock 8MHz
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_8);
WriteTimer0(65436);

980usec周期


BClock 8MHz
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_16);
WriteTimer0(65436);

1.78msec周期

CClock 8MHz
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
WriteTimer0(65535);

330usec周期


DClock 4MHz
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
WriteTimer0(65436);

760usec周期


EClock 4MHz
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_8);
WriteTimer0(65436);

1.96msec周期


FClock 4MHz
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_16);
WriteTimer0(65436);

3.56msec周期


GClock 4MHz
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
WriteTimer0(65486);

670usec周期


GClock 4MHz
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
WriteTimer0(65535);

670usec周期
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^9: タイマ割り込み周期
456
: 16/01/25-16:11
Goakn

割り込み処理の中でWriteTimer0を実行するまでに
すでに割り込みの受付までの時間といくつかの命令を実行して
しまっていますからその分だけ時間がのびることになります。
したがってその分だけWriteTimer0ではかせる下駄を大きくして
時間を短くする必要があります。
(2)番目の8MHzでプリスケーラで1/8の時の値はほぼ計算通り
に近い値となっていますね。
ここで周期といっているのがLEDの点滅周期だとすると実際の
割り込みの周期は半分ですよね。
当方で(1)の場合をMPLAB XのシミュレータのStopwatchで計測
すると141usec となりました。
つまり80個近い命令がWriteTimer0までに実行されていることに
なりますね。



> 色々変えて試してみました。
> 結果を↓に載せさせていただきました。
>
> 8MHzのときは、C(330usec)が上限
> 4MHzのときは、G(670usec)が上限  ということでしょうか?
>
> この結果からすると、約30MHz以上のクロックをPICマイコンに供給してあげないと、100usec周期の割り込みは発生させられない。。。
> ということでしょうか。。。
>
> @Clock 8MHz
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
> WriteTimer0(65436);
>
> 380usec周期
>
>
> AClock 8MHz
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_8);
> WriteTimer0(65436);
>
> 980usec周期
>
>
> BClock 8MHz
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_16);
> WriteTimer0(65436);
>
> 1.78msec周期
>
> CClock 8MHz
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
> WriteTimer0(65535);
>
> 330usec周期
>
>
> DClock 4MHz
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
> WriteTimer0(65436);
>
> 760usec周期
>
>
> EClock 4MHz
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_8);
> WriteTimer0(65436);
>
> 1.96msec周期
>
>
> FClock 4MHz
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_16);
> WriteTimer0(65436);
>
> 3.56msec周期
>
>
> GClock 4MHz
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
> WriteTimer0(65486);
>
> 670usec周期
>
>
> GClock 4MHz
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
> WriteTimer0(65535);
>
> 670usec周期
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^10: タイマ割り込み周期
457
: 16/01/25-17:10
PIC始めました

度々すみません。
何点か教えてください。

@割り込み処理の中でWriteTimer0を実行するまでに
すでに割り込みの受付までの時間といくつかの命令を実行して
しまっていますからその分だけ時間がのびることになります。

これについては、割り込み処理内には次の3行しか記述していないのですが、これでも時間がのびてしまうのでしょうか?
LATAbits.LATA6 = ~LATAbits.LATA6;
INTCONbits.TMR0IF = 0; ///タイマ0割り込みフラグのクリア
WriteTimer0(65535);


Aしたがってその分だけWriteTimer0ではかせる下駄を大きくして
時間を短くする必要があります。

『下駄を大きくして時間を短く』というのが理解できておりません。
具体的にどのようにすればよいのでしょうか? (理解力が低くてすみません。)


B(2)番目の8MHzでプリスケーラで1/8の時の値はほぼ計算通り
に近い値となっていますね。

私の計算では、(2)番目は、0.5usec × 8 × 100 = 400usecで、実測値と異なります。
私の計算が間違えているのでしょうか。


Cここで周期といっているのがLEDの点滅周期だとすると実際の
割り込みの周期は半分ですよね。

私が測定している周期は、RA6の信号をオシロで測定しています。
LATAbits.LATA6 = ~LATAbits.LATA6;


D当方で(1)の場合をMPLAB XのシミュレータのStopwatchで計測
すると141usec となりました。
つまり80個近い命令がWriteTimer0までに実行されていることに
なりますね。

どのような計算で80個という値が出てくるのでしょうか?

141usec ÷ 0.5usec = 282個かなと思っていますが、間違いでしょうか。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^11: タイマ割り込み周期
458
: 16/01/25-17:21
Goakn

まず最初にオシロで観測している周期はHighまたはLowの幅ですか?
それともHigh+Lowの幅ですか?

次にWriteTimer0(65436);の命令の65436が下駄の値です。
つまりタイマ0のカウントが65436から始まることになります。

タイマ0は0xFFFFから0x0000にロールオーバーするときに割り込み
を発生します。しかし、割り込みが受け付けられるまでに数サイクル
がかかり、さらにこのWriteTimer0の文を実行するまでには、
LATAとINTCONの命令がありますよね。これらをアセンブラ命令で
実行するとかなりの命令数になります。
したがってWriteTimer0を実行するまでにこの命令ステップだけの
時間がすでに経っていることになり、この時点からWriteTimer0で
100usecをカウントすることになります。
141usecから100usecを引いた41usecがこの余分な時間になります。
したがってサイクルが0.5usecですから82サイクルとなります。








> 度々すみません。
> 何点か教えてください。
>
> @割り込み処理の中でWriteTimer0を実行するまでに
> すでに割り込みの受付までの時間といくつかの命令を実行して
> しまっていますからその分だけ時間がのびることになります。
>
> これについては、割り込み処理内には次の3行しか記述していないのですが、これでも時間がのびてしまうのでしょうか?
> LATAbits.LATA6 = ~LATAbits.LATA6;
> INTCONbits.TMR0IF = 0; ///タイマ0割り込みフラグのクリア
> WriteTimer0(65535);
>
>
> Aしたがってその分だけWriteTimer0ではかせる下駄を大きくして
> 時間を短くする必要があります。
>
> 『下駄を大きくして時間を短く』というのが理解できておりません。
> 具体的にどのようにすればよいのでしょうか? (理解力が低くてすみません。)
>
>
> B(2)番目の8MHzでプリスケーラで1/8の時の値はほぼ計算通り
> に近い値となっていますね。
>
> 私の計算では、(2)番目は、0.5usec × 8 × 100 = 400usecで、実測値と異なります。
> 私の計算が間違えているのでしょうか。
>
>
> Cここで周期といっているのがLEDの点滅周期だとすると実際の
> 割り込みの周期は半分ですよね。
>
> 私が測定している周期は、RA6の信号をオシロで測定しています。
> LATAbits.LATA6 = ~LATAbits.LATA6;
>
>
> D当方で(1)の場合をMPLAB XのシミュレータのStopwatchで計測
> すると141usec となりました。
> つまり80個近い命令がWriteTimer0までに実行されていることに
> なりますね。
>
> どのような計算で80個という値が出てくるのでしょうか?
>
> 141usec ÷ 0.5usec = 282個かなと思っていますが、間違いでしょうか。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^12: タイマ割り込み周期
459
: 16/01/25-17:48
PIC始めました

分かりやすい説明ありがとうございます。

@オシロで観測している周期は、High+Lowの幅です。
A82サイクルの説明も理解できました。ありがとうございます。

実測値(オシロ測定値) - 割り込み周期計算値 / 0.5usec がWriteTimer0までに実行されているのですね。

これで『下駄を大きくして、時間を短く』の理解ができました。
前々回の内容と重複しますが、下駄の値を65535に設定した結果が次の結果となっています。

つまり、これが限界ということでしょうか?
他に方法はありますか?

CClock 8MHz
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
WriteTimer0(65535);

330usec周期

GClock 4MHz
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
WriteTimer0(65535);

670usec周期
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^13: タイマ割り込み周期
460
: 16/01/25-22:09
Gokan <gokan@picfun.com>

High+Lowということは割り込み周期の2倍ということです。

330usecということは割り込み周期が165usecで、タイマの
設定周期が1usecですから、ほぼ164usecが割り込み処理で
かかっている時間のすべてということになります。
ちょっと時間がかかり過ぎている感じはしますが。

したがってこれ以上短い周期にするにはクロック周波数を
上げるしかないですね。

PLLを有効にすれば4倍の32MHzにできますからこれが一番
簡単な解決方法ですね。



> 分かりやすい説明ありがとうございます。
>
> @オシロで観測している周期は、High+Lowの幅です。
> A82サイクルの説明も理解できました。ありがとうございます。
>
> 実測値(オシロ測定値) - 割り込み周期計算値 / 0.5usec がWriteTimer0までに実行されているのですね。
>
> これで『下駄を大きくして、時間を短く』の理解ができました。
> 前々回の内容と重複しますが、下駄の値を65535に設定した結果が次の結果となっています。
>
> つまり、これが限界ということでしょうか?
> 他に方法はありますか?
>
> CClock 8MHz
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
> WriteTimer0(65535);
>
> 330usec周期
>
> GClock 4MHz
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
> WriteTimer0(65535);
>
> 670usec周期
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^14: タイマ割り込み周期
461
: 16/01/26-13:59
PIC始めました

32MHzに変更 (OSC=HSPLL)して、試してみました。
ところが、RA6の端子からは中間電位(2.5V)が出力したまま、変化しません。

何か大きなミスをしてしまっているのでしょうか。
↓のコードで試しました。


#include <p18f2620.h>

#pragma config OSC = HSPLL,MCLRE = OFF
#pragma config BOREN = OFF,WDT = OFF,LVP = OFF

//////////////////////////*メイン関数*//////////////////////////
void main()
{
//Clock周波数設定
OSCCON=0b01110000; //8MHz設定
//OSCCON=0b01100000; //4MHz設定

//各ポート入出力モード設定
TRISA = 0b00001111; // RA7-0 (1:input/0:output)
TRISB = 0b00000010; // RB7-0 (1:input/0:output)
TRISC = 0b10001000; // RC7-0 (1:input/0:output)
ADCON1 = 0x0C; // RA2-0 Analog input

//各ポート出力初期設定
LATA=0xFF; //ポートAの出力ラッチAにFFを出力
LATB=0x00; //ポートBの出力ラッチBに0を出力
LATC=0xFF; //ポートCの出力ラッチCにFFを出力



//0.1msec割り込みタイマ設定
OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
WriteTimer0(65136);


//Interrupt Setting(割り込み設定)
INTCONbits.TMR0IE = 1; //タイマ0割り込み許可
INTCONbits.GIE = 1; //割り込み許可


while(1){

}
}


/************************************************************
* TMR0割り込み処理
*
************************************************************/
#pragma interrupt pwm //pwm割り込みの宣言
#pragma code isr_vector = 0x08 //割込みベクタにジャンプ命令をセット
void goto_isr(void)
{
_asm
Goto pwm
_endasm
}

#pragma code
void pwm(void) //割込み処理関数
{
LATAbits.LATA6 = ~LATAbits.LATA6;
INTCONbits.TMR0IF = 0; ///タイマ0割り込みフラグのクリア
WriteTimer0(65136);
}
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^15: タイマ割り込み周期
462
: 16/01/26-14:27
PIC始めました

もしかして、内部クロックを4倍にはできないのでしょうか?

OSC = HSPLLと設定しても、外部からクロックを入力していないので、PICマイコンが動いていない状態に陥っているのでしょうか。

現在、PICマイコンのClock端子には何も接続しておりません。

この理解が正しいとすると、100usecの割り込みを発生させる方法は、
8MHzの発振子をPICマイコンにつける以外方法はないのでしょうか。
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
Re^15: タイマ割り込み周期
463
: 16/01/26-14:29
Goakn

なぜINTOSCからHSPLLに変えたのですか?

HSPLLの場合にはRA6とRA7にクリスタルかセラミック発振子を
接続して発振させる必要があります。クロック発振回路
が有効になったためRA6ピンの役割が変わっています。

INTOSCのままOSCTUNEレジスタでPLLENだけセットすれば32MHz
になります。



> 32MHzに変更 (OSC=HSPLL)して、試してみました。
> ところが、RA6の端子からは中間電位(2.5V)が出力したまま、変化しません。
>
> 何か大きなミスをしてしまっているのでしょうか。
> ↓のコードで試しました。
>
>
> #include <p18f2620.h>
>
> #pragma config OSC = HSPLL,MCLRE = OFF
> #pragma config BOREN = OFF,WDT = OFF,LVP = OFF
>
> //////////////////////////*メイン関数*//////////////////////////
> void main()
> {
> //Clock周波数設定
> OSCCON=0b01110000; //8MHz設定
> //OSCCON=0b01100000; //4MHz設定
>
> //各ポート入出力モード設定
> TRISA = 0b00001111; // RA7-0 (1:input/0:output)
> TRISB = 0b00000010; // RB7-0 (1:input/0:output)
> TRISC = 0b10001000; // RC7-0 (1:input/0:output)
> ADCON1 = 0x0C; // RA2-0 Analog input
>
> //各ポート出力初期設定
> LATA=0xFF; //ポートAの出力ラッチAにFFを出力
> LATB=0x00; //ポートBの出力ラッチBに0を出力
> LATC=0xFF; //ポートCの出力ラッチCにFFを出力
>
>
>
> //0.1msec割り込みタイマ設定
> OpenTimer0(TIMER_INT_ON & T0_16BIT & T0_SOURCE_INT & T0_PS_1_2);
> WriteTimer0(65136);
>
>
> //Interrupt Setting(割り込み設定)
> INTCONbits.TMR0IE = 1; //タイマ0割り込み許可
> INTCONbits.GIE = 1; //割り込み許可
>
>
> while(1){
>
> }
> }
>
>
> /************************************************************
> * TMR0割り込み処理
> *
> ************************************************************/
> #pragma interrupt pwm //pwm割り込みの宣言
> #pragma code isr_vector = 0x08 //割込みベクタにジャンプ命令をセット
> void goto_isr(void)
> {
> _asm
> Goto pwm
> _endasm
> }
>
> #pragma code
> void pwm(void) //割込み処理関数
> {
> LATAbits.LATA6 = ~LATAbits.LATA6;
> INTCONbits.TMR0IF = 0; ///タイマ0割り込みフラグのクリア
> WriteTimer0(65136);
> }
▲pagetop
タイトル
記事No
投稿日
投稿者
参照先
[解決] タイマ割り込み周期
464
: 16/01/26-16:13
PIC始めました

OSCTUNEの存在を知りませんでした。
勉強になります。

次の通り設定することで、ほぼ目論み通りのタイマ割り込周期を発生させることができました。
ありがとうございました。
OSCTUNE=0b01100000; //PLL Enable
▲pagetop

- WebForum -