工作工房

工作工房

2006年12月08日
XML
カテゴリ: カテゴリ未分類

PSoCのUARTは受信割り込みの許可 UART_1_IntCntl(UART_1X_INT); //Enable RX interrupts を行うとバイナリーの受信割り込みができないんです。

UART_1_bCmdLength() で受信数を得て UART_1_szGetParam()で受信数分データを得ることができます。そして UART_1_CmdReset()で初期の状態にし再度この方法で繰り返すと受信内容のデータが間違っています。だからバイナリーの受信は割り込み許可で割り込みの受信ができないんです。なんとか良い方法はないかと思い受信割り込みをC言語だけで処理することにしました。

#include <m8c.h>        //part specific constants and macros
#include "PSoCAPI.h"    //PSoC API definitions for all User Modules#include <string.h>
#include <stdlib.h>

//ここを付け加えます。(受信割り込みをC言語で行う)

#pragma interrupt_handler int_uart1_rx //UART_1_RX Interrupt

unsigned int uart1_rxint_count; //UART_1_RX interrupt counter

unsigned char recv_data[50]; //recv data

unsigned char sumcrc_data[2]; //SUM CRC DATA

main

{

    UART_1_CmdReset();                    //Initialize receiver/cmd buf.
    UART_1_IntCntl(UART_1_ENABLE_RX_INT);  //Enable RX interrupts
    UART_1_Start(UART_1_PARITY_NONE);       //Enable UART

    int_recv_test(); //UART 1 RX Interrupt test }

//-----------------------------------------------------------
void int_recv_test(void) //UART 1 RX Interrupt test
{
 unsigned int c;
 unsigned char *send_buf;

Loop1: 
 if(uart1_rxint_count == 10){  //UART_1_RX interrupt counter
  uart1_rxint_count = 0;   //UART_1_RX interrupt counter
  send_buf = &recv_data[0];
  for(c=0; c<10; c++){
   UART_1_SendData( *(send_buf + c) );
   while( !( UART_1_bReadTxStatus() & UART_1_TX_BUFFER_EMPTY ) ); //send end loop
  }
  UART_1_PutCRLF();
 }
 else{
  goto Loop1;
 }
}

//-------------------------------------------------------

boot.asm の受信割り込みの内容を書き換える

    org   2Ch                      ;PSoC Block DCB03 Interrupt Vector
    ljmp _int_uart1_rx     ;UART_1_RX Interrupt    //ljmp _UART_1_RX_ISR
    reti

初期時のエラー解決を完了すれば割り込みのバイナリー受信は解決できます。もしエラーが起こってもSUM チェックやCRCチェックで受信ミスがわかりますので問題ないとおもいます。私はSUMチェックを使用しています。

//-----------------------------------------------------------------------
void sum_check(int kazu,unsigned char *adress) //SUM CHECK
{
unsigned int c;
unsigned int i;
unsigned int va;
unsigned int vz;

 va = 0;
 for(c = 0; c < kazu; c++){
  va = va + *(adress + (c)); //
 }
 vz = va & 0xFF00;
 vz = vz >> 8;
 sumcrc_data[0] = vz;   //MSB
 sumcrc_data[1] = va & 0x00FF; //LSB
}

//----------------------------------------------------------------------
void crc_check(int kazu,unsigned char *adress) //CRC CHECK
{
unsigned int c;
unsigned int i;
unsigned int ia;
unsigned int va;
unsigned int vd;
unsigned int vc;
unsigned int vz;

 vd = 0xFFFF;
 for(c = 0; c < kazu; c++){
  vc = *(adress + (c));  //
  vd = vd ^ vc;    //
  for(ia=0; ia < 8; ia++){
   vz = vd & 0x0001;  //0 Bit
   if(vz == 1){
    vd = vd >> 1;
    vd = vd ^ 0xA001; //EXOR
   }
   else{
    vd = vd >> 1;
   }
  }
 }
 sumcrc_data[0] = (vd/256);  //MSB
 sumcrc_data[1] = vd & 0x00FF; //LSB
}






お気に入りの記事を「いいね!」で応援しよう

最終更新日  2006年12月08日 22時36分40秒
コメント(7) | コメントを書く


■コメント

お名前
タイトル
メッセージ
画像認証
上の画像で表示されている数字を入力して下さい。


利用規約 に同意してコメントを
※コメントに関するよくある質問は、 こちら をご確認ください。


バイナリ受信割込み  
K.I さん
バイナリっていうのは、デリミタやターミネータに設定したデータを含むものってことですね。
ちょっと分からなかったのですが、これは元々の割込みハンドラの代わりにint_uart1_rxを呼び出すってことですか?(これは省略されてるんですよね?)
シリアル通信でバイナリ通信はやっぱり必要になることもありそうなので興味あります。 (2006年12月10日 23時19分27秒)

詳しく知りたい^^;  
PIC9801  さん
私もこれからPSoCを活用したいと考えています。
割り込みで
UART_1_bCmdLength() =受信数
UART_1_szGetParam() =受信数分のデータ取得
ということですが、この機能は非常に有用ですね^^
UART_1_CmdReset()で初期の状態に戻すとき、データが化けるのであれば、UART_1_CmdReset()を使わなければ問題はないのでしょうか?

その場合、受信数はどんどん増えるので、受信数を自分が作成するプログラムで管理すれば大丈夫なのでしょうか?

できれば、UART_1_szGetParam()でデータ取得したときに、自動的にUART_1_bCmdLength()の値を減らし(数合わせ)をしてくれるとありがたいですね^^

この質問、的外れかもしれませんが、その場合はお許しください。^^ (2006年12月17日 21時02分24秒)

Re:バイナリ受信割込み(12/08)  
e-device  さん
K.Iさん
バイナリで通信する時はデミリッタ(CR=0Dh LF=0Ah)を含みます。00h-FFhの全てを使用しますのでデホルトの_UART_1_RX_ISRの割り込みを使用したプログラムは使用できません。_UART_1_RX_ISRはテキスト割り込みのみで考えてあるようです。UART_1のUser Modeule Parameter のCommand Teminator を13にすればUART_1_bCmdCheck()で13(CR)を受信した確認ができます。10に設定すればLFの確認ができると思います(確認はしていません)

>バイナリっていうのは、デリミタやターミネータに設定したデータを含むものってことですね。
>ちょっと分からなかったのですが、これは元々の割込みハンドラの代わりにint_uart1_rxを呼び出すってことですか?(これは省略されてるんですよね?)
>シリアル通信でバイナリ通信はやっぱり必要になることもありそうなので興味あります。
-----
(2006年12月18日 00時12分25秒)

Re:詳しく知りたい^^;(12/08)  
e-device  さん
PIC9801さん
UART_1_szGetParam()でデータ取得したときに、自動的にUART_1_bCmdLength()の値を減らし(数合わせ)をしてくれると問題解決できます。 UART_1_CmdReset()を使用しないと受信カウンターがどんどん増え受信バッファーがオーバーフローとなります。


>私もこれからPSoCを活用したいと考えています。
>割り込みで
>UART_1_bCmdLength() =受信数
>UART_1_szGetParam() =受信数分のデータ取得
>ということですが、この機能は非常に有用ですね^^
>UART_1_CmdReset()で初期の状態に戻すとき、データが化けるのであれば、UART_1_CmdReset()を使わなければ問題はないのでしょうか?

>その場合、受信数はどんどん増えるので、受信数を自分が作成するプログラムで管理すれば大丈夫なのでしょうか?

>できれば、UART_1_szGetParam()でデータ取得したときに、自動的にUART_1_bCmdLength()の値を減らし(数合わせ)をしてくれるとありがたいですね^^

>この質問、的外れかもしれませんが、その場合はお許しください。^^
-----
(2006年12月18日 00時39分02秒)

Re[1]:バイナリ受信割込み(12/08)  
K.I さん
ということは、バイナリに対応させたint_uart1_rxというのをe-deviceさんが作られたんですね。
出来合いのAPIだけで出来れば楽だと思ったんですけど、まぁ、そのうち自分も考えてみます。 (2006年12月19日 01時22分58秒)

Re[2]:バイナリ受信割込み(12/08)  
e-device  さん
K.Iさん
今日は、APIを使って試行錯誤、しっく八苦して挑戦しました。UART_1_bCmdLength()で5入力を3回確認後UART_1_CmdReset()を行いUART_1_bCmdLength()で読み取った時までは正常です。その後UART_1_bCmdLength()でその内容を読み取ると送信した内容と比較すると違っています。
バイナリーデータ、テキストデータに関わらずUART_1_bCmdLength()の内容で読み取りその後UART_1_CmdReset()を行う事の繰り返しであれば問題ありません。
上記の問題で長いバイナリーデータをAPIで受信処理事ができないのでint_uart1_rxを作成しました。簡単に説明しますと、受信割り込みで読み取りカウンターをインクルメントするだけです。

void int_uart1_rx(void) //UART_1_RX_ISR
{
recv_data[uart1_rxint_count]=UART_1_RX_BUFFER_REG; //recv data
uart1_rxint_count++;
}


>ということは、バイナリに対応させたint_uart1_rxというのをe-deviceさんが作られたんですね。
>出来合いのAPIだけで出来れば楽だと思ったんですけど、まぁ、そのうち自分も考えてみます。
-----
(2006年12月20日 00時42分53秒)

Re[3]:バイナリ受信割込み(12/08)  
K.I さん
e-deviceさん
もしかすると、APIにはちょっとバグがあるのかもしれませんね。
シリアル通信の実例って、意外と少ないのでありがたいです。
プログラムありがとうございます!
結構シンプルになりましたね。でも、こうなるまでに苦労されたと推察します。
今度、シリアル通信が必要な時に試させて頂こうと思います。

(2006年12月21日 01時48分00秒)

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

© Rakuten Group, Inc.
Design a Mobile Website
スマートフォン版を閲覧 | PC版を閲覧
Share by: