
サイプレスセミコンダクター社のPSoC関連のTipsA
| I/Oポート割り込みについて |
|---|
| PSOCはすべてのI-Oポートを割り込みピンとして利用できるようだ。 サンプル例は「CY3210-MiniEval1+CY8C27443-24PXI」のボタンを押すごとにLEDの表示位置が変化するのを割り込みで実現する。 準備@-I/Oポートの割り込みピンに設定する。 ![]() スイッチS1はPort_1_4に接続されており、ボタンを押すことによりL->Hに変化するので、 DriveをPull Down、InterruptをRisingEdgeに設定する。 参考までに、割り込み条件(Interrupt)は下記のように4種類に設定できる。 DisableInt: 割り込みをしない。 RisingEdge: 信号が立ち上がったときに割り込みがかかる。 FallingEdge: 信号が立ち下がったときに割り込みがかかる。 ChangeFromRead: ポート読み込みの際に前回と違っていた場合に割り込みがかかる。 このように設定し、GenerateAppricationすると、自動的に(PSoCGPIOINT.asm)が生成されるので、 ;-----------------------------------------------------------------------------
; FUNCTION NAME: PSoC_GPIO_ISR
;
; DESCRIPTION: Unless modified, this implements only a null handler stub.
;
;-----------------------------------------------------------------------------
;
PSoC_GPIO_ISR:
;@PSoC_UserCode_BODY@ (Do not change this line.)
;---------------------------------------------------
; Insert your custom code below this banner
;---------------------------------------------------
ljmp _GPIO_INT
;---------------------------------------------------
; Insert your custom code above this banner
;---------------------------------------------------
;@PSoC_UserCode_END@ (Do not change this line.)
reti
割り込み時にmain.cのGPIO_INT()関数にジャンプするためにljmp _GPIO_INT を追加する。 手順A--main.cの追加 main()関数内で、下記の2行を追加する。 M8C_EnableGInt; //M8C全体の割り込み許可 M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO); //GPIOの割り込み許可 割り込み関数を作成 #pragma interrupt_handler GPIO_INT void GPIO_INT(void){ //ISR for GPIO ............. } サンプルソース(PSoC Designer4.2 SP2) test4.zip ダウンロード後、PSoC Designerで開いて[Rebuild All]してみてください。 |
| ADコンバータ(SAR6)の使用例 |
|---|
| PSOCユーザーモジュールで用意されているADCで一番簡単な6ビットADCであるSAR6を使ってみる。 サンプル例は「CY3210-MiniEval1+CY8C27443-24PXI」のボリュームを変化すると変化量に応じて、LEDバーが変化するプログラムです。 準備@ グローバルリソースを以下のように設定する。 ![]() VC1を16にする理由は、SAR_6の供給クロックを3MHz/16=185.7kHzとするため。(Maxは333kHz) RefMuxはPort_0_1の入力レンジがVss-Vddなので、(Vdd/2)+/-(Vdd/2)に設定する。 準備A ボリューム(Port_0_1)の電圧を取り込むためにPGA_1とSAR_1を配置し、アナログマルチプレクサ0をPort_0_1に設定する。 ![]() (PGA_1の設定)---Port_0_1の電圧をゲイン1倍でSAR_1に出力する。 ![]() (SAR_1の設定) ![]() 手順B--main.cの追加 PGA_1_Start(3); //PGA_1をハイパワーで使用する。 SAR6_1_Start(3); //PGA_1をハイパワーで使用する。 cData = SAR6_1_cGetSample() + 32; //SAR6_1_cGetSample()は-32から+31の値が返ってくるるので・・・ サンプルソース(PSoC Designer4.2 SP2) test5.zip ダウンロード後、PSoC Designerで開いて[Rebuild All]してみてください。 |
| RS-232Cシリアル通信の一例 |
|---|
| PSOCユーザーモジュールで用意されているTX8とRX8を使ってみる。(当然UARTでもOK) サンプル例は「CY3210-MiniEval1+CY8C27443-24PXI」に232cケーブルを接続し、PCのハイパーターミナル上でエンターキーを押すと、Port_0_1の電圧を0-63で返答する。 ![]() 準備@ 232Cケーブルを作成 とりあえず動けばいいので、MAX232CなどのドライバICを使用せず、下記のケーブルを作成した。 (PO5)----(100kオーム抵抗)----(D-SUB9pinメスBTxD) (PO3)----(300オーム抵抗)----(D-SUB9pinメスARxD) (GND)-----------------------(D-SUB9pinメスDGND) 規格外の使用方法なので環境によっては動かないかもしれない。 また、環境によってはD-SUB9pinのC-E,F-Gをショートする必要があるかも? 写真のようなケーブルを一本作っておくとPSoCの簡易デバックに重宝します。 準備A グローバルリソースを以下のように設定する。 ![]() 準備B ユーザーモジュールを配置する。 ![]() たくさん変更しているので、サンプルプログラムをみてじっくり研究してね。 ポイントは38400bps通信するためにPWM8でクロック作成していることと、RS-232Cドライバを使用していないので、入出力共にインバートしています。 手順B--main.cの追加 送受信関数の作成 /* Global bRxData - saves code - ptrs are expensive */
BYTE bRxData;
BOOL fWaitToReceiveByte(void)
{
BYTE bRxStatus ;
/* Wait to receive full byte*/
while ( !( bRxStatus=RX8_bReadRxStatus() & RX8_RX_COMPLETE ) )
{
/* might want to sleep or keep track of time */
}
/* data received, now check for errors */
if (( bRxStatus & RX8_RX_NO_ERROR ) == 0 )
{
/* no error detected */
bRxData = RX8_bReadRxData();
return( TRUE );
}
else
{
/* error detected */
bRxData = bRxStatus;
return( FALSE );
}
}
void TxZeroTerminatedRamString( BYTE * pbStrPtr )
{
/* check for the end condition, before sending the next byte */
while( *pbStrPtr != 0 )
{
/* send the next byte */
TX8_SendData( *pbStrPtr );
/* Wait for the data to start transmitting */
while( !( TX8_bReadTxStatus() & TX8_TX_BUFFER_EMPTY ) );
pbStrPtr++;
}
}
送受信準備 PWM8_Start();
TX8_Start(TX8_PARITY_NONE);
RX8_Start(RX8_PARITY_NONE);
送受信方法 while(bRxData != '\r'){
if(fWaitToReceiveByte()){
TX8_SendData( bRxData );
while( !( TX8_bReadTxStatus() & TX8_TX_BUFFER_EMPTY ) );
}
}
fWaitToReceiveByte()がTRUEを返したときは、何か受信している。TX8_SendData( bRxData );でデータを送信する。 次の動作に行く前に、場合によっては、 while( !( TX8_bReadTxStatus() & TX8_TX_BUFFER_EMPTY ) ); により、送信完了までWAITする。 手順C ハイパーターミナルの設定 ![]() 上記のようにハイパーターミナルを設定すると。 ![]() 無事、送受信が成功しました。 サンプルソース(PSoC Designer4.2 SP2) test6.zip ダウンロード後、PSoC Designerで開いて[Rebuild All]してみてください。 |