PSoC UARTメモ

by K.I
2007/12/06

Index


概要


[top]

いろいろやってみる

受信割込み

割込みハンドラが実行されない?

で割込み許可されてるはずなのに、割込みハンドラに飛んでこない。 まるで割込み許可されていないような感じだ。 試しに直接割込みフラグをEnableにしてみたが、ダメ。
        INT_MSK1 |= INT_MSK1_DCB03;                             //RX Interrupt enable

波形を確認してみる

考えを整理してみる

GPIO割込みなら

やっぱりRX割込みが変

 * NULL,CR,LFを繰返している→つまりNULLコードを受信している?

いろいろ悩む

もう一度整理してみよう。

邪魔をしていたのは

それならばとgpio割込みで、RXが0、或はタクトスイッチが変化しなければ何もしない、としてみた。

標準のルーチンを使おう

CRコードが2回必要?

送信完了までSLEEPしないように

COMPLETEはクリアされる

SLEEP前の処理

まとめ

最終的なプログラム

#pragma interrupt_handler gpio_handler
void gpio_handler()
{
        if (~PRT1DR&0x40 || !(~PRT1DR&0x03F)) return;   // RX変化なら何もしない
        :                                              // bit6=RX,bit0〜5=タクトスイッチ
        タクトスイッチ処理、モード変更や設定等
        :
}

void main()
{
        //Initialize
        LCD_1_Start();
        UART_1_CmdReset();
        UART_1_EnableInt();
        UART_1_Start(UART_1_PARITY_NONE);
        
        LED_1_Start();
        INT_MSK0 |= INT_MSK0_GPIO;
        M8C_EnableGInt; 

        while(1) {

                :
                // 設定モード、キー入力等のローカル処理
                :

                // 以下、UARTによるPCリモート処理
                if (UART_1_bCmdCheck()) {                       // Wait for command
                        if (cmd = UART_1_szGetParam()) {        // get command
                                switch (*cmd) {
                                case 'R':                                       // Read
                                        UART_1_CPutString(">Read \r\n");
                                        UART_1_PutCRLF();
                                        break;
                                case 'W':                                       // Write
                                        UART_1_CPutString(">Write \r\n");
                                        UART_1_PutCRLF();
                                        break;
                                }
                        }
                        UART_1_CmdReset();                      // Reset command buffer
                }
                while (~UART_1_bReadTxStatus()&UART_1_TX_BUFFER_EMPTY);
                wait_ms(1);                             // about 1ms delay
                CPU_SCR0 |= CPU_SCR0_SLEEP_MASK;        // sleep
        }

1後から考えると変なんだけど、この時は分かってなかったので。
2しかし、DigiView4のアプリは使い辛い。イライラするので3に戻した。
3これ、callで呼んで自分でretiを入れる仕様の方が自由度あるんじゃないのかなぁ。余計なお世話のような気がするけど。。

[top]

参考


[top] [電子工作関連に戻る]

comments powered by Disqus