3

PSoC – CY8C29466でUART受信割り込み

ひさしぶりにPSoC Designer4.4をいじって、UARTの受信割り込みを覚えたのでメモ。

1年ぐらい前にUART送信と、受信バッファに溜まったデータの読み込み方はやったんだけど

s.h.log: PSoC – CY8C29466でUART送信

受信した瞬間にイベントを発生させて、あらかじめ登録しておいた関数にジャンプさせる「受信割り込み」の方法がわからなかった。

んで最近植木さんが「uart_1int.asmの_UART_1_RX_ISR:からljmp」と言っていたので、その通りやったらできた。

■回路

ADM3202のRXとTXに、PSoCのPort2_4とPort2_5を突っ込む。

Port_2_2にタクトスイッチ、Port_2_0にLED。

PSoC UARTPSoC UART

PSoC UART Receive Int

■今回の動作

スイッチを押すとLEDが付き、離すと消える。これはGPIOの両エッジ割り込みでやってる。

さらに、UARTでパソコン側から送られた文字はそのまま送り返す(エコーする)

送られてきた文字の中にUがあればLEDを点灯させ、 !Up!を送り返す。Dがあれば消灯して!Down!を送り返す。

Acknowrichでシリアル通信をやりとりしているところ

PSoC UART Receive Int



Source Code (PSoC Designer 4.4 + C Compiler)

/***
  Port2_2のスイッチでLEDをON/OFFする
  UARTを受信してそのままエコー。DでLEDをOFF、UでLEDをONする
  
  CPU: CY8C29466 24MHz(Internal)
  Board: Bread-board
  Compiler: PSoC Designer4.4 + C Compiler
  Date: 2008/3/14
  Author: Sho Hashimoto
  WebSite: http://shokai.org
  ***/
#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#define _BV(BIT) (1<<BIT)
#define sbi(BYTE,BIT) (BYTE |= _BV(BIT))
#define cbi(BYTE,BIT) (BYTE &= ~_BV(BIT))
#define LED_ON() sbi(PRT2DR, 0);
#define LED_OFF() cbi(PRT2DR, 0);
void main(){
  M8C_EnableGInt; // enable global interrupt
  M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
  UART_1_CmdReset(); // uart init
  UART_1_IntCntl(UART_1_ENABLE_RX_INT); // enable receive interrupt
  UART_1_Start(UART_1_PARITY_NONE);
  LED_ON();
}
#pragma interrupt_handler INT_GPIO
void INT_GPIO(void){
  if(PRT2DR & _BV(2)){
    LED_ON();
    UART_1_CPutString("ON¥r¥n");
  }
  else{
    LED_OFF();
    UART_1_CPutString("OFF¥r¥n");
  }
}
#pragma interrupt_handler INT_UART_RX
void INT_UART_RX(void){
  char recv_data;
  recv_data = UART_1_cGetChar(); // read UART
  UART_1_PutChar(recv_data); // echo
  switch(recv_data){
  case 'U':
    LED_ON();
    UART_1_CPutString("!Up!");
    break;
  case 'D':
    LED_OFF();
    UART_1_CPutString("!Down!");
    break;
  }
}


uart_1int.asmに受信割り込みをljmpで書いておく
_UART_1_RX_ISR:
   ;@PSoC_UserCode_BODY_2@ (Do not change this line.)
   ;---------------------------------------------------
   ; Insert your custom code below this banner
   ;---------------------------------------------------
   ;   NOTE: interrupt service routines must preserve
   ;   the values of the A and X CPU registers.
   
   ljmp _INT_UART_RX
   ;---------------------------------------------------
   ; Insert your custom code above this banner
   ;---------------------------------------------------
   ;@PSoC_UserCode_END@ (Do not change this line.)


psocgpioint.asmにも、GPIOの割り込みをljmpで書いておく
PSoC_GPIO_ISR:
   ;@PSoC_UserCode_BODY@ (Do not change this line.)
   ;---------------------------------------------------
   ; Insert your custom code below this banner
   ;---------------------------------------------------
   
    ljmp _INT_GPIO
   ;---------------------------------------------------
   ; Insert your custom code above this banner
   ;---------------------------------------------------
   ;@PSoC_UserCode_END@ (Do not change this line.)
   reti

UARTまわりの関数はuart_1.asmとuart_1.hに自動生成されてる。

cGetChar()とiGetChar()があるが、cGetChar()の方だとchar型として読み出せた。iGetCharの方はおそらく数値としてかな?

RXのバッファが残っているかどうかを確かめる方法がわからない。

Read more

0

PSoC CY8C29466 + Digital Compass

前はArduinoでやったけど

s.h.log: Arduinoで方位センサ RDCM-802 を試す

今日はRDCM-802というデジタルコンパス(方位センサー)をPileusに取り付けた。

これ

方位センサー

でもはんだづける場所が無かったので

Digital Compass on PileusDigital Compass on Pileus

こうやって

Read more

0

PSoC – CY8C29466でUART送信

9600bpsがやっと出せたのでメモ。あとで受信割り込みもやらなきゃ。

今回使うのはこのUARTモジュール。TXだけとかRXだけのモジュールもあるけど。

UART of PSoC CY8C29466

Device Editor上でPlaceして、Port_2_4とPort_2_5に接続します。これがブレッドボードみたいで楽しい。

UART of PSoC CY8C29466

Read more

0

CY8C29466のADCINC12

PSoCの12ビットAD変換器を使う。

関連、PGAについても:s.h.log: PSoC Designer – CY8C29466の6bit ADコンバータ

■Device Editor

ADCINC12とPGA(Programmable AMP)の設定

CY8C29466 ADCINC12CY8C29466 ADCINC12

ADCINC12をPGAを通してPort_0_7に結線する

CY8C29466 ADCINC12

Read more

0

トランジスタでUARTを分岐させる

普段使う20ピンや28ピンのAVRには、UARTピンが1組しかない。64ピンとかになれば2組とか付いているけど。

んで昨日からDontronicsのUARTかUSBで制御できる小型LCDをいじっているんだけど、いつもシリアル通信でデバッグしているのに、UARTがLCDに占有されているせいでデバッグができない。

仕方ないので、信号用のトランジスタ2SC1815と10kΩの抵抗を使って、UARTセレクタ(分岐させる回路)を作った。

usart selectorusart selector

Read more