616082 ランダム
 ホーム | 日記 | プロフィール 【フォローする】 【ログイン】

工作工房

工作工房

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



© Rakuten Group, Inc.