シリアル受信割り込み†UARTでPCなどからシリアルデータを大量に受信したいとき、 シリアル受信割り込み†ユーザモジュールRX8を使う場合の例を示します。 メイン関数†#define RX_BUFFER_SIZE 256 BYTE rx_buf[RX_BUFFER_SIZE]; BYTE pReceive = 0, pRead = 0; #pragma interrupt_handler RX8_ISR_C void RX8_ISR_C(){ rx_buf[pReceive++] = RX8_cGetChar(); if (pReceive == RX_BUFFER_SIZE) pReceive = 0; } ... main(){ ... RX8_EnableInt(); // enable RX8 interrupt M8C_EnableGInt; // enable global interrupt これは、RX8で1バイトのデータ受信が起こったときに呼ばれる関数「RX8_ISR_C()」を定義しています。その中身は、受信したデータをrx_buffer[]に入れていくわけですが、その位置をpReceiveという変数で指定しています。1バイト受信するごとにpReceiveは1増え、RX_BUFFER_SIZE(=256)になったら0に戻りますので、この256バイトのrx_buffer[]に、先頭→末尾→先頭に戻る、という順序で、いわゆるラウンドロビン式に受信データがたまっていきます。 なおmain()内では、この2つの関数でシリアル受信割り込みが起こるように設定しておきます。 受信したデータを読み出す関数†int RX8_Receive(){ BYTE d: if (pReceive == pRead) return(-1); // no received data else{ d = rx_buffer[pRead++]; if (pRead == RX_BUFFER_SIZE) pRead = 0; return((int)d); } } これは、受信したデータを読み出したいときに使う関数です。 RX8INT.asm†_RX8_3_ISR: ;@PSoC_UserCode_BODY@ (Do not change this line.) ;--------------------------------------------------- ; Insert your custom assembly code below this banner ;--------------------------------------------------- ; NOTE: interrupt service routines must preserve ; the values of the A and X CPU registers. ;--------------------------------------------------- ; Insert your custom assembly code above this banner ;--------------------------------------------------- ljmp _RX8_ISR_C ; add this line ;--------------------------------------------------- ; Insert a lcall to a C function below this banner ; and un-comment the lines between these banners ;--------------------------------------------------- さてRX8でシリアルデータが受信されたときに、上で定義したRX8_ISR_C()が呼び出される必要があるわけですが、これは、ちょっと読みにくいですがRX8INT.asm(ファイル名はモジュール名RX8に"INT.asm"をつけたもの)に、上記の"add this line"の行を追加する必要があります。 以上で、
|