なんでも作っちゃう、かも。

Arduino/Make/フィジカルコンピューティング/電子工作あたりで活動しています。スタバの空きカップを使ったスタバカップアンプなど製作。最近はもっぱらArduinoと3Dプリンタの自作に興味があります。

V850付録基板でOgg Vorbisプレイヤー(9)

Posted by arms22 on 2007年06月20日 0  0

TMQ0の一致割り込みでDMA0,1を起動させようと思っていたのだが、1つの割り込み信号で複数のDMAの起動してはいけないという注意書きがあった。
またDMAのリード→ライトには11cycle必要なのでDA0にライトしてからDA1へライトするまでに最大550ns(20MHz動作時)の遅延が発生する(無視しても問題ないかもしれない)。
そこでDAxのリアルタイム出力機能を使ってこの遅延をなくす方法を検討してみる。

リアルタイム出力機能はDA0CSxに書き込んだ値がINTTP2CC0信号(DA0),INTTP3CC0信号(DA1)で出力される。
しかし1命令ずつしか命令を実行できないマイコンでTMP2,TMP3を同時に起動することはできない。
INTTP2CC0信号とINTTP3CC0信号を同時に発生させるには少しプログラムを工夫しないといけない。

TMP2を起動してからTMP3を起動するまでのカウント数をコンペアレジスタから予め引いておけばINTTP2CC0信号とINTTP3CC0信号を同時に発生させることができるかもしれない。

こんな感じでどうだろう、、

static USHORT RealTP3CCR0;

void TMP2AndTMP3SyncedStart(void)
{
    register USHORT tp3ctl0,tp2ctl0;
    RealTP3CCR0 = TP3CCR0;
   /*此処は要検討 カウントクロックをfxxとした場合、
     単純に命令実行クロック分の遅延になる?*/
    TP3CCR0 = RealTP3CCR0 - 1;
    tp3ctl0 = TP3CTL0 | 0x80;
    tp2ctl0 = TP2CTL0 | 0x80;
    ClrIORBit(TP3CCIC0,0x40);
    __DI();
    TP2CTL0 = tp2ctl0;
    TP3CTL0 = tp3ctl0;
    __EI();
}

void MD_INTTP3CC0( void )
{
    /* 1回目の割り込みで本当のTP3CCR0レジスタの値を設定する */
    TP3CCR0 = RealTP3CCR0;
    /* Mask interrupt */
    SetIORBit(TP3CCIC0,0x40);
    /* Clear interrupt request flag */
    ClrIORBit(TP3CCIC0,0x80);
}
とここまで書いて、本当にそんなことする必要があるのだろうかと思えてきた。。DMAの起動はINTTQ0CC0とINTTQ0CC1で良いんじゃないかと。

Ads by Google

Leave a reply






管理者にだけ表示を許可する

該当の記事は見つかりませんでした。