PSoC関連

サイプレスセミコンダクター社の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]してみてください。

[TOP]

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]してみてください。

[TOP]

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]してみてください。

[TOP]