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

長嶋 美子男 wbs03263 @ mail.wbs.ne.jp
2011年 6月 28日 (火) 09:17:33 JST


長嶋です。
大学のゼミの関係で時間をとられました、申し訳御座いません。
アライブビジョンソフトウエアの高橋さんからのご指摘のATT_INIの記載がない
との件ですが、コンフィグレーションファイルの追記してありました。(未報告で申し訳御座いません)
MCUは秋月通商のH8/3069FLANボード(20MHz)と拡張ボードを使用しております。
又、ご指摘のIER,IFR,TSRは確かに共通のレジスタですのでそのままsil_wrb_mem()を使うのは危険ですので
最初に各レジスタのデータを読み出し、その後で、ORをとり書き込むものとしました。

例:unsigned int sts ;
   sts = sil_reb_mem( (VP)ITU1_TIMER_IER ) ;
   sts |= ITU1_TIMER_IE ;
   sil_wrb_mem( (VP)ITU1_TIMER_IER, sts ) ;

次に、割り込み処理部分に
bitclr( (UB *)ITU1_TIMER_IFR, ITU1_TIMER_IF_BIT ) ;
sil_wrb_mem( H8PADR, 0xFF ) ;
sil_wrb_mem( H8PADR, 0x00 ) ;
のみを書き込み、メイン処理では
while ( 1 ) {
  slp_tsk() ;
 }
のみとして、システムタイマーは周期ハンドラ(1秒間隔に設定)を使用して
拡張ボードのLEDを点滅する様にしてテストした結果
周期ハンドラを利用したLEDは見事に1秒間隔で点滅しますが
相変わらず、PAポート側はON/OFFしません(オシロスコープで確認しています)
初期化でPAポートを0x00にしていますので、そのまま0レベルです。
割込みの発生状況(割込みフラグレジスタ)は変化しません

以上、報告します。

Nozomu Kon さんは書きました:
>今@ベクトルです。
>
>割込みの発生状況(割込みフラグレジスタ)も変わりありませんか?
>ちなみに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しません。
>>>>
>>>> 以上、宜しくお願い致します。
>>>>
>>>>
>>>>
>>>>
>>>>
>>>
>>>
>>>
>>