2019年6月14日金曜日

トラ技PSoc基板をためしました。

トランジスタ技術5月号付録のPSoc基板を入手、この2か月あれやこれやといじっています。今回74HC595によるシリアル/パラレル変換をテストしました。

1.LCDディスプレイ表示
キャラクタLCDディスプレイ(SC1602)表示

キャラクタLCDディスプレイの表示にはPSoc Creatorで提供されるサンプルコードを利用します。










サンプルコード選択

〇プロジェクト新規作成
・プロジェクトテンプレート選択で「Code example」を選択。

・サンプルコード(code example)選択で「Char_LCD_Horizontal_Bar_Graph」を選択。


Bootladableコンポーネント追加

・Bootladableコンポーネントを追加(トラ技 Lチカプロジェクト(LEDBLINK) 参考)





〇このサンプルプロジェクトをビルド後PSoc基板に書き込む。
       ※書き込み後 サンプルプログラムが動き出す。
〇このプロジェクトのデモ表示部を削除して、LDC表示のみを残しベースプロジェクトとします。

2.GPIO割り込みの実装
操作SW用 Digital Input Pin コンポーネント追加
テスト基板の3つの操作スイッチの割り込みを実装します。
〇Digital Input Pinコンポーネントの追加
・Number Of Pinsを3に
・Interruptの設定



〇main.cの編集
・CY_ISR_PROTOマクロを使用してGPIO割り込み関数を宣言
  CY_ISR_PROTO(GPIO_ISR);
・CY_ISRマクロを使用してGPIO割り込み関数を定義
  CY_ISR(GPIO_ISR)
   {
       uint8 InterruptState = SW_ClearInterrupt();
      ・・・・・・・・
             ※InterruptStateにPinのIDが格納
・main()に初期処理を追加
     isr_1_StartEx(GPIO_ISR);  ・・・・GPIO割り込み関数を登録
     CyGlobalIntEnable;     ・・・・・割り込みを許可

3.74HC595のテスト
今回は、74HC595(シリアル/パラレル変換)のテストを行った。
74HC595テスト構成


・操作スイッチSW1~3でLEDの点灯パターンを切り替え。
・PSoc4100S ==> 74HC595 はシリアル。
・74HC126は今回のテストでは不要
(ほぼ無意味)
・PSoc4100S<==>LCDキャラクタLCDディスプレイの接続はP0をP2に変更
   






74HC595テスト




















※※※※※main.c※※※※※※

#include
#include

/* The LCD format in characters */
#define LCD_ROWS                (2u)
#define LCD_COLUMNS             (16u)

/* The delay between displaying bar graphs */
#define BARGRAPH_DELAY_MS       (15u)

CY_ISR_PROTO(GPIO_ISR);

int iPtn = 0;

void fnc_595(int ic){
    int i;
    int j;
    int k;
    k = 128;
    j = ic;
    RCK_Write(0);
    for(i=0;i<8 i="" p="">        if( k & j){
            SI_Write(1);
        } else {
            SI_Write(0);
        }
        SCK_Write(1);   
        CyDelay(10u);
        SCK_Write(0);
        k = k >> 1;
    }
    RCK_Write(1);
return;
}

int main()
{
    int idat = 1;
   
    /* Start the LCD */
    LCD_Start();

    /* Show the demo start message */
    LCD_Position(0u, 0u);
    LCD_PrintString("Test 74HC595");
    LCD_Position(1u, 0u);
    LCD_PrintString("#####05######");
    SI_Write(0);
    RCK_Write(0);
    SCK_Write(0);
    CyDelay(1000u);

    isr_1_StartEx(GPIO_ISR);
    CyGlobalIntEnable;
   
    for(;;)
    {
        if(iPtn == 0){
            idat++;
        }else if(iPtn ==1){
            if(idat == 0) idat = 1;
            else idat = idat << 1;
        }else if(iPtn ==2){
            if(idat == 0) idat = 128;
            else idat = idat >> 1;
            }
        idat = idat & 0xFF;
        fnc_595(idat);
        CyDelay(100u);
    }
}

CY_ISR(GPIO_ISR)
{
    uint8 InterruptState = SW_ClearInterrupt();
    char cbuff[8];
   
    itoa(InterruptState,cbuff,10);
   
    LCD_Position(1u, 0u);
   
    if (InterruptState == 1){
      LCD_PrintString("##Key1##");
       iPtn =0;

    }else if (InterruptState == 2){
     LCD_PrintString("##Key2##");
       iPtn =1;
 
    }else if (InterruptState == 4){
      LCD_PrintString("##Key3##"); 
       iPtn =2;
 
    }else {
      LCD_PrintString("##KeyX##");
   }
     LCD_Position(1u, 9u);
     LCD_PrintString(cbuff);
}
※※※※※※※※※※※※※※※※※※

GPIO割り込み時の押されたスイッチの識別は
 uint8 InterruptState = SW_ClearInterrupt();
の InterruptState  に格納される値で行いました。
Digital Input PinコンポーネントのSWのピンIDで
SW[0]の場合 1
SW[1]の場合 2
SW[2]の場合 4  となるようです。