Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lock attach
Attachments are accessible only for community members.
MotooTanaka
Level 9
Level 9
Distributor - Marubun (Japan)
First comment on blog Beta tester First comment on KBA

So in a couple of days, there will be an event named "Infineon MCU Partner & Solution Day 2023" in Japan.

"Infineon MCU Partner & Solution Day 2023" が明後日と迫って来ました。

https://www.infineon.com/cms/jp/product/promopages/event/infineon-mcu-partner-solution-day-2023/

IMG_5551.JPG

This time, I tried to create a demo using a TSoC board (CY8C4146LQI-S433) and the Elephantec's new demo board which mounts a sensor and a companion resistor on their P-Flex.

今回は先にも紹介させていただいた
「PSoC基板で始める回路図プログラミング」に付属のTSoC (CY8C4146LQI-S433) 基板と、https://interface.cqpub.co.jp/psocbook/

P-Flex 基板上に直接センサと抵抗を搭載した
エレファンテック社のデモボードを使用したデモを作ってみました。
https://info.elephantech.co.jp/p-flex

シンボル印刷部図.JPG

Since the demo will be put on our booth, it should work without a PC (and its operator)
I reused my previous sample of driving a cheap OLED display, which I purchased 3 of them from Amazon 😉

ブースの置いたデモに常に PC (とその操作員) を置いておかなくても良いように
以前作成した I2C 接続の OLED ディスプレイを再度使用しました。(アマゾンで3個セット買っちゃてたし)

So the schematics are
ということで、回路図は

(1) TSoC, KitProg, and OLED

回路図_1C.JPG

(2) ADC, Thermistor and ELD demo board
Note: This might be the first time I used "Differential" input ADC...
The "Thermistor" component is nice!

※ ADC で差動入力を使ったのはこれが初めてかも知れません。
「Thermistor」コンポーネント、便利だ!

回路図_1A.JPG

BTW, at the beginning, I forgot to connect V_H to VDD and V_L to GND,
and the temperature was about -154 C deg, a little too cold even in the summer. (lol)

ところで、当初 V_H と VDD, V_L と GND を接続するのを忘れていたところ
気温が -154℃と、真夏でも涼しすぎるだろうという値になっていて悩みました。w

(3) Connection instruction (in case the demo will be accidentally disassembled)
何かの拍子にデモがバラバラになってしまった時用の接続図

接続図.JPG

Pins

Pins.JPG

main.c

 

 

 

#include "project.h"
#include "stdio.h"
#include "i2c_utils.h"
#include "tty_utils.h"
#include "ssd1306.h"
#include "ssd1306_utils.h"
#include "func_list.h"

#define SENSOR_INTERVAL 3000
#define MODE_IDLE 0
#define MODE_RUN  1
volatile int  sensor_flag = 0 ;
int mode = MODE_RUN; // MODE_IDLE ;
char *sensor_type = "P-Flex 3u SENSOR" ; // Ref Resistor = 220Kohm

void do_help(void) ;
void do_read_status(void) ;
void do_com_pin(void) ;
void do_com_direction(void) ;
void do_segment_remap(void) ;
void do_set_contrast(void) ;
void do_set_page(void) ;
void do_set_column(void) ;
void do_text_locate(void) ;
void do_entire_display_on(void) ;
void do_inverse_display(void) ;
void do_set_display_on(void) ;
void do_test_pattern(void) ;
void do_draw_str(void) ;
void do_clear_display(void) ;
void do_run(void) ;
void do_stop(void) ;
void display_init_oled(void) ;

#if 0
f_list_type main_func_list[] = {
    { "help",            do_help,              "show help message" },
    { "com",             do_com_pin,           "Set COM Pins Hardware Configuration (0-3)"},
    { "direction",       do_com_direction,     "Set COM output Scan direction, (0-1)"},
    { "remap",           do_segment_remap,     "Set Segment Re-map"},
    { "contrast",        do_set_contrast,      "Set Contrast Control {0 - 255}"},
    { "status",          do_read_status,       "read status register" },
    { "EntireDisplayOn", do_entire_display_on, "Entire Dsiplay ON { 0 | 1 }"},
    { "inverse",         do_inverse_display,   "Set Normal/Inverse Display { 0 | 1 }"},
    { "display",         do_set_display_on,    "Set Display ON { 0 | 1 }"},
    { "clear",           do_clear_display,     "Clear Display"},
    { "TestPattern",     do_test_pattern,      "Display Test Pattern"},
    { "locate",          do_text_locate,       "Specify text location x, y"},
    { "page",            do_set_page,          "Set Page"},
    { "col",             do_set_column,        "Set Column"},
    { "print",           do_draw_str,          "Draw a string"},
    { "run",             do_run,               "Start measurement"},
    { "stop",            do_stop,              "Stop measurement"},
    { 0,                 0,                    0}
} ;
#endif
f_list_type main_func_list[] = {
    { "run",             do_run,               "Start measurement"},
    { "stop",            do_stop,              "Stop measurement"},
    { "help",            do_help,              "show help message" },
    { "contrast",        do_set_contrast,      "Set Contrast Control {0 - 255}"},
    { "status",          do_read_status,       "read status register" },
    { "EntireDisplayOn", do_entire_display_on, "Entire Dsiplay ON { 0 | 1 }"},
    { "inverse",         do_inverse_display,   "Set Normal/Inverse Display { 0 | 1 }"},
    { "display",         do_set_display_on,    "Set Display ON { 0 | 1 }"},
    { "clear",           do_clear_display,     "Clear Display"},
    { "TestPattern",     do_test_pattern,      "Display Test Pattern"},
    { "locate",          do_text_locate,       "Specify text location x, y"},
    { "page",            do_set_page,          "Set Page"},
    { "col",             do_set_column,        "Set Column"},
    { "print",           do_draw_str,          "Draw a string"},

    { 0,                 0,                    0}
} ;

void do_help(void)
{
    show_help(main_func_list) ;
}

void do_run(void)
{
    display_init_oled() ;
    mode = MODE_RUN ;
}

void do_stop(void)
{
    mode = MODE_IDLE ;
}

// SysTick Related functions

volatile uint32_t tick_count = 0 ;

CY_ISR(tick_callback)
{
    tick_count++ ;
    if (tick_count >= SENSOR_INTERVAL) {
        tick_count = 0 ;
        sensor_flag = 1 ;
    }
}

int find_empty_slot(void)
{
    int result = -1 ;
    uint32_t i ;
    for (i = 0 ; i < CY_SYS_SYST_NUM_OF_CALLBACKS ; i++ ) {
        if (CySysTickGetCallback(i) == NULL) {
            result = i ;
            break ;
        }
    }
    return(result) ;
}

void init_systick(void)
{
    int sys_tick_slot ;
    
    sys_tick_slot = find_empty_slot() ;
    if (sys_tick_slot < 0) {
        print("Sorry No empty SysTick Slot available\n\r") ;
        while(1) { } /* halting here */
    } else {
        CySysTickStart() ;
        CySysTickSetCallback(sys_tick_slot, tick_callback) ;
    }    
}

// Thermo Sensor related

int16_t get_temp(void)
{
    int16_t cReference, cThermistor ;
    int16_t vReference, vThermistor ;
    uint32_t resultT ;
    int16_t temp ;
    
    ADC_StartConvert() ;
    ADC_IsEndConversion(ADC_WAIT_FOR_RESULT) ;
    cReference = ADC_GetResult16(0) ;
    cThermistor = ADC_GetResult16(1) ;
    vReference = ADC_CountsTo_mVolts(0, cReference) ;
    vThermistor = ADC_CountsTo_mVolts(1, cThermistor) ;
    resultT = Thermistor_GetResistance(vReference, vThermistor) ;
    temp = Thermistor_GetTemperature(resultT) ;
    return( temp ) ;
}

void init_hardware(void) 
{
    CyGlobalIntEnable; /* Enable global interrupts. */

    init_systick() ;
    
    tty_init() ;
    I2C_Start() ;
    
    ADC_Start() ;
}

void display_init_oled(void)
{
    clear_display() ;
    text_locate(35, 1) ;
    draw_str("Elephantech") ;
    text_locate(25, 3) ;
    draw_str(sensor_type) ;    
}

int main(void)
{       
    func_ptr func ;
    int16_t temp ;
    int prev_mode = MODE_IDLE ;
    
    init_hardware() ;
    
    splash(sensor_type) ;
 
    ssd1306_init() ;
    do_help() ;
    
    prompt("> ") ;
    
    display_init_oled() ;
    
    for(;;)
    {
        if (get_line()) {
            func = get_func(main_func_list, str) ;
            if (func) {
                func() ;
            } else {
                print("Unknown Command: ") ;
                println(str) ;
                do_help() ;
            }
            prompt("> ") ;
        }
        if (sensor_flag) {
            sensor_flag = 0 ;
            if (mode == MODE_RUN) {
                if (mode != prev_mode) {
                    prev_mode = mode ;
                    display_init_oled() ;
                }
                temp = get_temp() ;
                if (temp >= 0) {
                    snprintf(str, 32, " %3d.%02d  ", temp/100, temp%100) ;
                } else {
                    snprintf(str, 32, "-%3d.%02d  ", -(temp/100), -(temp%100)) ;
                }
                print(str) ;
                print("\r\n") ;
//                text_locate(40, 6) ;
//                draw_str("         ") ;
                text_locate(40, 6)  ;
                draw_str(str) ;
            }
        }
    }
}

 

 

 

 

Attached are project for the three different type baords

また、3種類用意されたセンサ基板用に3つのプロジェクトも添付しておきます。

TSoC_P_Flex.JPG

3um board: elt_oled_test_230623A
12um board: elt_oled_test_230623B
FR4 borad: elt_oled_test_230623C

moto


P.S. I'm looking forward to seeing you at the event 😉


追伸:それでは会場でお会いできることを楽しみにしております。m(_ _)m

1 Reply
MotooTanaka
Level 9
Level 9
Distributor - Marubun (Japan)
First comment on blog Beta tester First comment on KBA

So the event went very successfully.
Thank you all  😉

おかげさまで、イベントは大変盛況のうちに終了しました。
ご来場いただいた皆様、ありがとうございました 😀

In our booth, we exhibited
(1) Above demo of ELT P-Flex and TSoC
(2) The 5th Generation CapSense demo using PSoC 4100S MAX and the Tuner
(3)  CQ Pub's Books and Magazines with PSoC theme

丸文のブースでは、
(1) エレファンテック社の温度センサーを実装したP-Flex 基板と TSoC デモ 
(2) PSoC 4100S MAX の第五世代 CapSense と CapSense Tuner
(3) CQ出版社の PSoC 関連書籍、雑誌
を展示させていただきました。

IMG_5555.JPG

CQ Pub also had their booth and showing interesting samples
introduced in the "PSoC Book"
Note: The sign on the right reads "Do free book browsing here" 😊

また、CQ出版も 「PSoC基板で始める 回路図プログラミング」で
紹介されている錚々たるサンプルの実機を展示されていました。
※右側のサインは「立ち読み禁止」ではなく、「立ち読み推奨」でした 😊

IMG_5552.JPG

moto