アーカイブ
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。



■今回の動作
スイッチを押すとLEDが付き、離すと消える。これはGPIOの両エッジ割り込みでやってる。
さらに、UARTでパソコン側から送られた文字はそのまま送り返す(エコーする)
送られてきた文字の中にUがあればLEDを点灯させ、 !Up!を送り返す。Dがあれば消灯して!Down!を送り返す。
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のバッファが残っているかどうかを確かめる方法がわからない。
PSoC – CY8C29466でUART送信
CY8C29466のADCINC12
PSoCの12ビットAD変換器を使う。
関連、PGAについても:s.h.log: PSoC Designer – CY8C29466の6bit ADコンバータ
PSoC Designer – CY8C29466の16bit Timer
CY3210-MiniEval基盤にCY8C29466マイコンを置いて、16ビットタイマーを4つ置いて動かした。
1秒毎?ぐらいで動かしてみたが、動いたは動いたけどまだ正確な仕組みがわからない。特にクロックの分周まわり。
ちなみに16bitタイマーはデジタルブロックを2つ消費するので、29466では同時に8個まで使える。
今回はPSoC CPU 基板 (ストロベリーリナックス社) – 趣味の電子工作研究工房 – 楽天ブログ(Blog)がとても参考になった。
■今回のコード
Source Code (PSoC Designer4.3 + C Compiler)
■タイマーの配置とクロック設定
Device EditorのUser Module Selection Viewから選択してくる。

PSoC Designer – CY8C29466で外部入力割り込み(C言語で)
前の記事s.h.log: PSoC Designer – CY8C29466でスイッチ入力と同じ動作を、割り込みでやってみた。
基盤も同じくCY3210-MiniEvalを使った。
動き方もまったく同じのを作っちゃったのでビデオは省略。ただスイッチの扱い方が違うだけ。
SourceCode (PSoC Designer 4.3 + C Compiler)
■動作設定
Device EditorのInterconnect Viewで

基本的にs.h.log: PSoC Designer – CY8C29466でスイッチ入力と同じだが、
タクトスイッチの接続されているPORT2-4のInterruptをFailingEdgeにする。
割り込みの仕方は3種類あり、
・FailingEdge → 立下り割り込み
・RisingEdge → 立ち上がり割り込み
・ChangeFromRead → 両エッジ変化割り込み
から選ぶ。
AVRのSIG_INTERRUPT0、SIG_INTERRUPT1はそれぞれINT0, INT1ピンの状態が変化を監視する外部入力割り込みだが、
PSoCの外部入力割込みはAVRのSIG_PIN_CHANGEの方と同じく、どのピンに変化があっても割り込みが発生してしまう。
だから、複数のピンの割り込みを有効にする場合は実際にどのピンの変化が割り込みを発生させたのか?をいちいち確認しなければならない。今回はマスクレジスタで1つのピン(PORT2-4)だけをenableにしているので必要ないけど。
軽くまとめると、PSoCの割り込みの設定は
・マスクレジスタで「どのピンの変化を監視するか」を指定
・ピン毎に「立ち上がり/下がり/両方の、どの条件で割り込むか」を指定
できる。でもこれはPSoC Designerが自動生成してくれるので下手に触る必要は無い。
マスクで複数enableに指定した場合は、実際にどのピンが反応したか?はプログラミングでなんとかする。(1回前のPRTnDRの状態をglobal変数に保存しておいて比較するとか)
この辺ははじめてのPSoCマイコンの「入出力&割り込みのしくみとスイッチ&LEDを使った実験」p.67に詳しく書かれている。








最近のコメント