(toppers-users 3494) Re: TOPEERS JSP Ver1.4.3でのタイマー追加について

今井和彦 imai-ka648 @ pref.miyagi.jp
2011年 6月 28日 (火) 09:00:43 JST


長嶋さん

宮城県産業技術総合センターの今井です。

今さんからも同じ旨のコメントが出ていますが、

> IER、IFR、TSRはタイマ間共通のレジスタになってます。
> おそらくシステムタイマの設定が先に行われていると思うので、
> これらレジスタにsil_wrb_mem()はちょっと危険を感じます。

>  4-1. 初期化
> void   itu1_init( void )
> {

中略

>    //  GRAコンペアマッチによる割込み要求を許可
>    sil_wrb_mem( (VP)ITU1_TIMER_IER, ITU1_TIMER_IE ) ; ←ここ


先日、公開されたjsp-1.4.4では、hw_timer_initializeの該当
箇所が修正されておりますので、JSPカーネルも更新して下さい。
(その他の細かな修正もされています。)
追加されたitu1_initもこれを参考に、修正してみて下さい。

また、高橋さんが(toppers-users 3493)で指摘された事項も
ご確認下さい。


------------------------
宮城県産業技術総合センター
今井和彦
E-mail: imai-ka648 @ pref.miyagi.jp
TEL 022-377-8700
FAX 022-377-8712

(2011/06/27 17:39), Nozomu Kon wrote:
> 今@ベクトルです。
> 
> 割込みの発生状況(割込みフラグレジスタ)も変わりありませんか?
> ちなみにMCUはH8/3069ですよね?
> 
> 今回の現象とは直接関係しませんが、長嶋さんのdefineの通り
> IER、IFR、TSRはタイマ間共通のレジスタになってます。
> おそらくシステムタイマの設定が先に行われていると思うので、
> これらレジスタにsil_wrb_mem()はちょっと危険を感じます。
> 
> 割込みが発生、未発生については少々乱暴ですが(スタック破壊覚悟で)
> ベクタテーブルにトラップ関数を登録してしまうのも手です。
> void trap(void)
> {
> for(;;){
> sil_wrb_mem( H8PADR, 0xFF ) ;
> sil_wrb_mem( H8PADR, 0x00 ) ;
> }
> }
> 
> 
> コンペアマッチは0x9c4(2500)ですよね。
> 20MHzのφ/8だとして…1msタイマですか。
> 極端に大きな値でもないし、割込みが発生しないなら、
> どこかでレジスタの内容を変えているような気がします。
> 
> 念の為、オシロであてているピン番号もご確認ください。
> 自分も見てる所が違った…(汗)という経験があるので。
> 
> あと、お手数ですが、動作確認状況があるとコメントがしやすいです。
> (システムタイマは動作している など)
> 
> 以上、よろしくお願いします。
> 
> (2011/06/27 16:26), 長嶋 美子男 wrote:
>> Nozomu Kon さん有り難う御座いました。
>> 早々に、ご指摘あったプライオリティ処理を以下の様にして行いましたが
>> 事態は変わりませんでした。
>>
>> /*  割込み要求のレベル設定  */
>> #define    ITU1_TIMER_IPR      H8IPRA
>> #define    ITU1_TIMER_IP_BIT   H8IPR_ITU1_BIT
>> #define    ITU1_TIMER_IPM      IPM_LEVEL1
>>
>> const IRC TIMER1_IRC = { (UB*)ITU1_TIMER_IPR,
>>                           ITU1_TIMER_IP_BIT,
>>                           ITU1_TIMER_IPM
>>                         } ;
>>
>> #define    IRQ_IMIA1	               28
>> #define    INHNO_TIMER1                IRQ_IMIA1
>> #define    itu1_int_handler_intmask   IPM_LEVEL1
>>
>> void   itu1_init( void )
>> {
>>     sil_wrb_mem( PADDR, 0xFF ) ;
>>     sil_wrb_mem( PADR, 0x00 ) ;
>>
>>     // タイマ停止
>>     bitclr( (UB *)ITU1_TIMER_TSTR, ITU1_TIMER_STR_BIT ) ;
>>     //  GRAコンペアマッチでカウンタをクリア、分周比設定
>>     sil_wrb_mem( (VP)ITU1_TIMER_TCR, ITU1_TIMER_TCR_BIT ) ;
>>     //  GRAコンペアマッチによる割込み要求を許可
>>     sil_wrb_mem( (VP)ITU1_TIMER_IER, ITU1_TIMER_IE ) ;
>>     //  GRAコンペアマッチによる端子出力禁止
>>     sil_wrb_mem( (VP)ITU1_TIMER_TIOR, ITU1_TIMER_TIOR_BIT ) ;
>>     //  GRAレジスタ設定(カウンタ目標値)
>>     sil_wrh_mem( (VP)ITU1_TIMER_GRH, 0x09 ) ;
>>     sil_wrh_mem( (VP)ITU1_TIMER_GRL, 0xC4 ) ;
>>     sil_wrh_mem( (VP)ITU1_TIMER_CNT, 0 ) ;	       // カウンタをクリア
>>     /* GRAコンペアマッチの割り込み要求フラグをクリア */
>>     bitclr( (UB *)ITU1_TIMER_IFR, ITU1_TIMER_IF_BIT ) ;
>>     // プライオリティ・レベルの設定
>>     define_int_plevel(&TIMER1_IRC ) ;			// ご指摘がありましたので追加
>>     // タイマスタート
>>     bitset( (UB *)ITU1_TIMER_TSTR, ITU1_TIMER_STR_BIT ) ;
>> }
>>
>> Nozomu Kon さんは書きました:
>>> 今@ベクトルと申します。
>>>
>>> JSPの処理については識者の方々にお任せするとして...
>>>
>>> 制御の流れを見た感じですと割込みプライオリティの処理が見受けられません。
>>> プライオリティ処理はシステムタイマの処理を参考にされると良いかもしれません。
>>> ->  hw_timere.h内のhw_timer_initialize()、Line141〜辺りです。
>>>
>>> 実際SYSCRとCCRの組み合わせで、割込み処理は決まると思いますが、
>>> システムタイマはプライオリティをSETしているので、ひょっとしたらプライオリティを
>>> SETしないと割込み要求が発生しないのかもしれません。
>>>
>>> また、割込みそのものが生起しているかの確認は、
>>> デバッガがあれば、
>>>  ソフトを任意のタイミングで止めて割込みフラグを確認する、
>>> デバッガがなければ
>>>  通常ルーチンで割込みフラグを監視し「PAポートのON/OFF〜」
>>> を実行してみてください。
>>>
>>> 割込みフラグはITUの割込みステータスレジスタ内にあると思います。
>>>
>>>
>>> (2011/06/27 13:34), Mineo Nagashima wrote:
>>>> 関係者の皆様へ
>>>> 現在、TOPPERS JSP Ver1.4.3を使用させて頂き、モーター制御に取り組んでいまして
>>>> ITU1のタイマー割り込みを使いたいと考えていますが、以下の方法をとりましたが
>>>> うまくいきません。
>>>>
>>>> 現象:ITU1のタイマー割り込み自体がどうもかかっていない。(?)
>>>>    AポートをON/OFFするかオシロスコープで確認していますが、ON/OFFしていない
>>>>
>>>> 恐れ入りますが、教えて下さい。
>>>>
>>>> 1.カールネルへの割り込みハンドラの登録
>>>>   ./main/main.cfg内に
>>>> 	DEF_INH(INHNO_TIMER1, { TA_HLNG, itu1_int_handler });
>>>>     を記述。
>>>>   INHNO_TIMER1=0x28として定義
>>>>
>>>> 2../main/main.h内に
>>>>
>>>>     Extern extern void    itu1_int_handler( void ) ;を追記
>>>>
>>>> 3.ベクタテーブルの登録は、Vrector.sには自動的に記述されているので
>>>>   なにもしない。
>>>>
>>>> 4.初期化と実行
>>>>  定義
>>>>
>>>> #define ITU1_TIMER		   H816TU1
>>>>
>>>> #define ITU1_TIMER_CNT	       (ITU1_TIMER + H8TCNT)
>>>> #define ITU1_TIMER_TCR	       (ITU1_TIMER + H8TCR)
>>>> #define ITU1_TIMER_TIOR	       (ITU1_TIMER + H8TIOR)
>>>> #define ITU1_TIMER_IER	       H816TU_TISRA
>>>> #define ITU1_TIMER_IFR	       H816TU_TISRA
>>>> #define ITU1_TIMER_TSTR	       H816TU_TSTR
>>>> #define ITU1_TIMER_GRH	       (ITU1_TIMER + H8GRAH)
>>>> #define ITU1_TIMER_GRL	       (ITU1_TIMER + H8GRAL)
>>>>
>>>> #define ITU1_TIMER_STR	       H8TSTR_STR1
>>>> #define ITU1_TIMER_STR_BIT     H8TSTR_STR1_BIT
>>>> #define ITU1_TIMER_IE	       H8TISRA_IMIEA1		   // interrupt mask
>>>> #define ITU1_TIMER_IE_BIT      H8TISRA_IMIEA1_BIT
>>>> #define ITU1_TIMER_IF	       H8TISRA_IMFA1		   // match flag
>>>> #define ITU1_TIMER_IF_BIT      H8TISRA_IMFA1_BIT
>>>>
>>>> #define INHNO_TIMER1		   IRQ_IMIA1
>>>>
>>>> #define ITU1_TIMER_TCR_BIT     ( H8TCR_CCLR0 | H8TCR_TPSC1 | H8TCR_TPSC0 )
>>>> // 0x23
>>>> #define ITU1_TIMER_TIOR_BIT    ( 0 )
>>>>
>>>> #define H8PADDR			0xfee009
>>>> #define H8PADR			0xffffd9
>>>>
>>>>
>>>>  4-1. 初期化
>>>> void   itu1_init( void )
>>>> {
>>>>     sil_wrb_mem( H8PADDR, 0xFF ) ;
>>>>     sil_wrb_mem( H8PADR, 0x00 ) ;
>>>>
>>>>     // タイマ停止
>>>>     bitclr( (UB *)ITU1_TIMER_TSTR, ITU1_TIMER_STR_BIT ) ;
>>>>     //  GRAコンペアマッチでカウンタをクリア、分周比設定
>>>>     sil_wrb_mem( (VP)ITU1_TIMER_TCR, ITU1_TIMER_TCR_BIT ) ;
>>>>     //  GRAコンペアマッチによる割込み要求を許可
>>>>     sil_wrb_mem( (VP)ITU1_TIMER_IER, ITU1_TIMER_IE ) ;
>>>>     //  GRAコンペアマッチによる端子出力禁止
>>>>     sil_wrb_mem( (VP)ITU1_TIMER_TIOR, ITU1_TIMER_TIOR_BIT ) ;
>>>>     //  GRAレジスタ設定(カウンタ目標値)
>>>>     sil_wrh_mem( (VP)ITU1_TIMER_GRH, 0x09 ) ;
>>>>     sil_wrh_mem( (VP)ITU1_TIMER_GRL, 0xC4 ) ;
>>>>     sil_wrh_mem( (VP)ITU1_TIMER_CNT, 0 ) ;	       // カウンタをクリア
>>>>     /* GRAコンペアマッチの割り込み要求フラグをクリア */
>>>>     bitclr( (UB *)ITU1_TIMER_IFR, ITU1_TIMER_IF_BIT ) ;
>>>>     // タイマスタート
>>>>     bitset( (UB *)ITU1_TIMER_TSTR, ITU1_TIMER_STR_BIT ) ;
>>>> }
>>>>
>>>>   4-2.実行処理
>>>> void   itu1_int_handler( void )
>>>> {
>>>>
>>>>     /* GRAコンペアマッチの割り込み要求フラグをクリア */
>>>>     bitclr( (UB *)ITU1_TIMER_IFR, ITU1_TIMER_IF_BIT ) ;
>>>>
>>>> //PADR = 0xFF ;	// DEBUG
>>>>     sil_wrb_mem( H8PADR, 0xFF ) ;
>>>>
>>>>     if ( TIME_DAT != 0 )    --TIME_DAT ;
>>>>
>>>> PADR = 0x00 ;   // DEBUG
>>>>     sil_wrb_mem( H8PADR, 0x00 ) ;
>>>>
>>>> }
>>>>
>>>>   4-3.メインタスクでの処理
>>>>   メインでは、TIME_DATが0になるのを確認して、新たなカウント数を入れる
>>>>
>>>> ここで、割り込み処理において、PAポートのON/OFFをオシロスコープで確認している
>>>> のですが
>>>> ON/OFFしません。
>>>>
>>>> 以上、宜しくお願い致します。