Code Examples Forum Discussions
Hello
I would like to ask if anyone had the opportunity to work with the Turbidity Sensor, since I do not find much reference on this device to program it and use it in a psoc5.
If there is a tutorial to start and start programming it.
I attach an image of the sensor
Show LessHi,
I recently started working on a project for which I would need to implement two time-interleaved IDAC-s (each IDAC changes its state on every other sample and increases or decreases its current depending on the wanted output state) for generating a higher-frequency sine wave.
DACs are connected to the DAC bus and their ipolarity and strobe inputs should be controlled by hardware (logic).
Implemented logic should calculate the difference between two input samples (current and previous sample) and, depending on the value and sign of that difference, change state of one of the DACs so that the output matches the current sample. On the next sample it will again calculate the difference, but this time it changes the state of the other DAC. Logic should also need to trigger DAC conversion (strobe signal) and control the polarity of the DACs (current source or sink) via their ipolarity input.
I'm having problems with implementing this logic in CY8CKIT-059 PSoC 5LP.
I made 2 separate projects in which I tried to implement all of the needed logic in Verilog, but build fails on Digital Placement with errors:
Unable to pack the design into 24 udbs in Project "interleaving_2level"
Resource limit: Maximum number of PLDs exceeded (max=48, needed=53) in Project "2_subtractors_crossed"
I am not very experienced with Verilog or any other HDL, so I read some documents and reference guides for PSoCs regarding the use of Verilog in building new components, but I can't find a way to shrink and optimize the design so that it could cram into the PSoC.
The projects I attached are not finished. I connected a simple counter so that I could build the project without unconnected net errors. If I manage to get the design to fit, I would need to generate sine wave samples, so probably even more resources would be used.
I attached the minimal bundles of these projects.
Any help would be appreciated.
Show LessHi,
I am looking to use the UART of the PSoC 6. I can use it normally but for my application I need to invert the output Tx.
I tried to do it with a simple inverter but it doesn't work. However when I use the UART without the inverter it works perfectly.
Here is the schematic I tried:
And here are the errors I get when I try to generate the appplication:
Does anyone have any idea why this is wrong and how I could fix my problem ?
Best regards
Alex
Show Lessそろそろ TSoC 基板にもセンサーらしいセンサーを付けて動かしてみたいなと考えて
引出しの中にあった秋月で買ってきた BME280 モジュールを I2C で繋いでみました。
BME280使用 温湿度・気圧センサモジュールキット: センサ一般 秋月電子通商-電子部品・ネット通販
I2C だから SDA と SCL に外付けのプルアップがいるよね~と
ブレッドボードを用意して、抵抗を挿している時に、
ふと、
“そういえば BME280 って 3.3V だったような・・・”
と虫の知らせが・・・
はい、現在 VDD 5V で動いている私の TSoC 基板に直結したら壊れますよね恐らく。
ということで BME への VDD は 3.3V のレギュレータを使用して TSoC の 5V を 3.3V にして使用しました。
ジャンパ、ブレッドボード以外に外付けに 3.3V のレギュレータ、4.7KΩの抵抗 x2 が必要でした。
実行結果
とりあえず、TSoC でも普通に I2C センサが使えました。
moto
Show Less温度・湿度センサは多数ありますが、今回トライした IDT の HS3001 モジュールは
SDAH01 というセンサ評価キットに含まれているモジュールで、
私がこれまで試したモジュールの中では断トツに小さいものでした。
※センサ自体ではもっと小さなものもありそうですが。
今回の開発で、“ハマった”のは、Measurement_Request を発行してから
実際のデータを取りに行くまでに、少しディレイを挿入してやらないと
温度 125℃、湿度 100% という、住みにくそうな数字が返って来たことでした。
ハーフピッチのピンは通常のジャンパ線すら接続不能なので、
知人で変換基板を作ってもらい TSoC 基板に接続できるようにしました。
2.2KΩのプルアップ抵抗も変換基板に実装してもらったので
TSoC に直結できる形になりました。
回路図
Tera Term log
Serial Plot
main.c
======================
#include "project.h"
#include "stdio.h"
#include "i2c_utils.h"
#include "hs3001.h"
char str[128] ; /* print buffer */
void print(char *str)
{
UART_UartPutString(str) ;
}
void splash(void)
{
sprintf(str, "TSoC HS3001(I2C) Test (%s %s)\n", __DATE__, __TIME__) ;
print(str) ;
}
void init_hardware(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
UART_Start() ;
I2C_Start() ;
}
int main(void)
{
float humidity ;
float temperature ;
int status ;
uint8_t data[4] ;
init_hardware() ;
splash() ;
print("Temp(C), Humidity(%)\n") ;
for(;;)
{
HS3001_Measurement_Request() ;
CyDelay(500) ;
HS3001_Data_Fetch(data) ;
status = (data[0] >> 6) & 0x03 ;
if (status == 0) { /* valid data */
humidity = 100.0 * (float)(((data[0] & 0x3F) << 😎 | data[1])/16383.0 ;
temperature = 165.0 * (float)((data[2] << 6) | (data[3] >> 2)) / 16383.0 - 40.0 ;
sprintf(str, " %3d.%02d, %3d.%02d\n",
(int)(temperature + 0.005), (int)(100 * temperature + 0.5) % 100,
(int)(humidity + 0.005), (int)(100 * humidity + 0.5) % 100) ;
print(str) ;
}
CyDelay(1000) ;
}
}
======================
hs3001.c
======================
#include "project.h"
#include "i2c_utils.h"
#include "hs3001.h"
#define HS3001_I2C_ADDRESS 0x44
uint8_t HS3001_i2c_address = HS3001_I2C_ADDRESS ;
int HS3001_Measurement_Request(void)
{
int result = 0 ;
i2c_set_slave_address(HS3001_i2c_address) ;
i2c_SendStart(0) ; /* 0 for write */
i2c_SendStop() ;
return( result ) ;
}
int HS3001_Data_Fetch(uint8_t data[])
{
int result = 0 ;
i2c_set_slave_address(HS3001_i2c_address) ;
i2c_SendStart(1) ; /* 1 for read */
data[0] = i2c_readByte(I2C_I2C_ACK_DATA) ;
data[1] = i2c_readByte(I2C_I2C_ACK_DATA) ;
data[2] = i2c_readByte(I2C_I2C_ACK_DATA) ;
data[3] = i2c_readByte(I2C_I2C_NAK_DATA) ;
i2c_SendStop() ;
return( result ) ;
}
int HS3001_Hume_Fetch(float *hume)
{
int result = 0 ;
uint8_t data[2] ;
i2c_set_slave_address(HS3001_i2c_address) ;
i2c_SendStart(1) ; /* 1 for read */
data[0] = i2c_readByte(I2C_I2C_ACK_DATA) ;
data[1] = i2c_readByte(I2C_I2C_NAK_DATA) ;
i2c_SendStop() ;
*hume = 100.0 * (((data[0] & 0x3F) << 😎 | data[1]) / 16383.0 ;
return( result ) ;
}
======================
moto
Show Less平成最後のゴールデンウィークということで、
いつものようにチマチマとプログラムを書いていたら
別のスレでサーボの動かし方について質問をいただきました。
良い機会と TSoC で秋月で買った SG-90 を動かしてみました。
猫・右向き (compare = 500)
猫・正面 (compare = 1500)
猫・左向き (compare = 2400)
サーボのページ
マイクロサーボ9g SG−90: パーツ一般 秋月電子通商-電子部品・ネット通販
猫は秋月から秋葉原駅に移動する途中にあったガチャポンでゲットしましたが、
季節物なので、その時に入手できるものを使用してください。
使用では 20ms 周期の PWM で、デューティーが 0.5ms から 2.4ms ということですので、
1MHz のクロックで動かす PWM で、period を 20000 (19999) とすると
compare が 500 ~ 2400 で良さそうとして、だいたい 1500 位で真ん中なので
初期値は 1500 にしておきました。
回路図
TeraTerm のログ
main.c
===========================
#include "project.h"
#include "stdio.h"
#include "string.h"
#define STR_LEN 32
#define RX_BUF_LEN 128
#define COMPARE_MAX 2400
#define COMPARE_MIN 500
#define SPACE ' '
#define TAB '\t'
#define CR '\r'
#define LF '\n'
inline int is_delimiter(uint8_t c)
{
int result = 0 ;
switch(c) {
case CR:
case LF:
case TAB:
case SPACE:
result = c ;
break ;
}
return( result ) ;
}
volatile char rx_buf[RX_BUF_LEN] ;
volatile int rx_read_index = 0 ;
volatile int rx_write_index = 0 ;
char str[STR_LEN+1] ; /* print buffer */
int str_index = 0 ;
CY_ISR(usr_isr)
{
uint8_t int_flag ;
UART_ClearRxInterruptSource(UART_INTR_RX_NOT_EMPTY) ;
if (UART_SpiUartGetRxBufferSize()) {
int_flag = CyEnterCriticalSection() ;
rx_buf[rx_write_index] = UART_UartGetByte() ;
rx_write_index = (rx_write_index + 1) % RX_BUF_LEN ;
CyExitCriticalSection(int_flag) ;
}
}
void print(char *str)
{
UART_UartPutString(str) ;
}
void help(void)
{
print("============== usage ===============\n") ;
print("led {on | off} : turn LED on or off\n") ;
sprintf(str, "servo [ numbers ] : set servo pulse in us (%d~%d)\n",
COMPARE_MIN, COMPARE_MAX) ;
print(str) ;
print("flip : flip the servo\n") ;
print("status : show current status\n") ;
print("help : print this\n") ;
print("=====================================\n") ;
}
void init_hardware(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
UART_SpiUartClearRxBuffer() ;
UART_SetCustomInterruptHandler(usr_isr) ;
UART_Start() ;
PWM_Start() ;
}
void splash(void)
{
char str[64] ;
sprintf(str, "TSoC Board UART Command Test (%s %s)\n", __DATE__, __TIME__) ;
print(str) ;
}
void prompt(void)
{
print("> ") ;
}
int get_str(void)
{
int result = 0 ;
if (rx_read_index != rx_write_index) {
result = is_delimiter(rx_buf[rx_read_index]) ;
if (result) { /* a string delimter was detected */
str[str_index] = 0 ;
str_index = 0 ;
} else { /* still in the middle of a string */
str[str_index++] = rx_buf[rx_read_index] ;
if (str_index >= STR_LEN) { /* string is too long */
str[STR_LEN] = 0 ;
str_index = 0 ;
result = -1 ;
}
}
rx_read_index = (rx_read_index + 1) % RX_BUF_LEN ;
}
return( result ) ;
}
void str2upper(char *str)
{
while(str && *str) {
if (('a' <= *str) && (*str <= 'z')) {
*str -= ('a' - 'A') ;
}
str++ ;
}
}
void do_led(void)
{
while(get_str() == 0) ;
str2upper(str) ;
if (strcmp(str, "ON") == 0) {
LED_Write(1) ;
print("LED is ON\n") ;
} else {
LED_Write(0) ;
print("LED is OFF\n") ;
}
}
void do_servo(void)
{
uint16_t compare = 0 ;
while(get_str() == 0) ;
str2upper(str) ;
sscanf(str, "%hd", &compare) ;
if ((COMPARE_MIN <= compare) && (compare <= COMPARE_MAX)) {
PWM_WriteCompare(compare) ;
} else {
sprintf(str, "Compare value %hd is out of range, ignored\n", compare) ;
print(str) ;
sprintf(str, "Acceptable range is %d ~ %d\n", COMPARE_MIN, COMPARE_MAX) ;
print(str) ;
}
}
void do_flip(void)
{
uint16_t compare = 0 ;
int i ;
compare = PWM_ReadCompare() ;
for (i = (compare - 500) / 10; i > 0 ; i--) {
compare = 500 + i * 10 ;
PWM_WriteCompare(compare) ;
LED_Write(1) ;
CyDelay(10) ;
}
for (i = 0 ; i < 180 ; i++ ) {
compare = 500 + i * 10 ;
PWM_WriteCompare(compare) ;
LED_Write(0) ;
CyDelay(10) ;
}
for (i = 180 ; i >= 0 ; i-- ) {
compare = 500 + i * 10 ;
PWM_WriteCompare(compare) ;
LED_Write(1) ;
CyDelay(10) ;
}
for (i = 0 ; i < 90 ; i++ ) {
compare = 500 + i * 10 ;
PWM_WriteCompare(compare) ;
LED_Write(0) ;
CyDelay(10) ;
}
LED_Write(0) ;
}
void do_status(void)
{
uint16_t period, compare ;
int led_value ;
period = PWM_ReadPeriod() ;
compare = PWM_ReadCompare() ;
led_value = LED_Read() ;
print("=== Status ===\n") ;
sprintf(str, "LED = %d\n", led_value) ;
print(str) ;
sprintf(str, "SERVO : %hd / %hd\n", compare, period) ;
print(str) ;
print("==============\n") ;
}
void do_command(char *str)
{
str2upper(str) ;
if (strcmp(str, "LED") == 0) {
do_led() ;
} else if (strcmp(str, "SERVO") == 0) {
do_servo() ;
} else if (strcmp(str, "FLIP") == 0) {
do_flip() ;
} else if (strcmp(str, "STATUS") == 0) {
do_status() ;
} else {
help() ;
}
}
int main(void)
{
init_hardware() ;
splash() ;
prompt() ;
for(;;)
{
if (get_str()) { /* a string was recived in str[] */
do_command(str) ;
prompt() ;
}
}
}
===========================
moto
それは昨日のこと、連休明け初の週末で呆けていると、
どこぞの学生さんと思われる方からのご質問で
It was the first weekend after the Golden Week, when I was busy dorking off,
I found a question from (probably) a student of somewhere,
「ADCでPoteniometerの値を読込んでLEDで表示する方法を教えておくれ」
"Someone can help with this program about the potentiometer and ADC?"
https://community.cypress.com/thread/46011
という訳で、このくらいなら例によって ADC で読んで
PWMのデューティー(compare)を変えてやって LED に出したら終わりじゃね?
と、軽い気持ちで TSoC でプロジェクトを作って書き始めたところ、
なんと TSoC の LED は PWM に繋がってない!という驚愕の事実に遭遇しました。
Well, I thought, "it will be done just feeding an ADC value to a PWM which drives an output LED! A piece of cake!".
And I started creating a project, but I was brown away when I noticed that the LED on TSoC can not be connected to a PWM!
そこで「外付けでLEDを足してやったら何とかなるでしょ」と
散歩がてら秋葉原で出かけて、買ってきました LED (^_^)V
Then, "Well, I'll get a LED and connect it to a PWM pin of the board!",
I made a round trip to Akihabara and got the LED (^_^)V (20 yen = 20 cents?)
http://akizukidenshi.com/catalog/g/gI-11985/
それで作ったのが(私視点でオーソドックスな)下記のプロジェクト (adc_test_190511)
adc_test_190511 is the project I created in my orthodox approach.
schematic
main.c
=======================
#include "project.h"
#include "stdio.h"
char str[128] ; /* print buffer */
void print(char *str)
{
UART_UartPutString(str) ;
}
void init_hardware(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
UART_Start() ;
PWM_Start() ;
ADC_Start() ;
}
void splash(void)
{
sprintf(str, "ADC -> PWM test (%s %s)\n", __DATE__, __TIME__) ;
print(str) ;
}
float measure(void)
{
int16_t adc_count ;
int16_t mV ;
int ch = 0 ;
ADC_StartConvert() ;
ADC_IsEndConversion(ADC_WAIT_FOR_RESULT) ;
adc_count = ADC_GetResult16(ch) ;
mV = ADC_CountsTo_mVolts(ch, adc_count) ;
if (mV < 0) {
mV = 0 ;
}
return( mV ) ;
}
int main(void)
{
uint16_t adc_ref_val = 3300 ;
uint16_t mV = 0 ;
uint16_t period = 10000 ;
uint16_t compare = 0 ; /* pwm duty is compare / period */
init_hardware() ;
splash() ;
PWM_WritePeriod(period) ;
for(;;)
{
mV = measure() ;
compare = (int)(period * mV / adc_ref_val) ; ;
PWM_WriteCompare( compare ) ;
sprintf(str, "POT = %d.%02d V\n", mV/1000, mV%1000) ;
print(str) ;
CyDelay(100) ;
}
}
=======================
TeraTerm-log
で、これでどうよ?と回答したら、
「UARTまだ習ってないし、私の簡単な方法で実現してくれない?」
とハードルが上がったんだか、下がったんだか・・・
so, I replied the thread with this project, "how about this?" then the response was
"Ahh... I'm not learn about the UART yet, so... Can you help me with the simple way?"
... well, is he making the story easier or harder?
彼のアプローチはループ毎にLEDを反転(点灯⇔消灯)させて、
ADC の読取り値によってループの遅延時間を変えるというものでした。
His approach was changing the delay in each loop according to the ADC value.
私視点では「プログラム動作の安定性?なにそれおいしいの?」といったアプローチに感じたのですが、
確かに、この方法であれば TSoC の LED でもADC の読取り値の変化を目視できると気付き、
自分の頭の固さを反省しつつ下記のプロジェクトを作ってみました。(adc_test_190512)
From my view point, "Changing the time of main loop each time? Sounds like a kludge!".
But when I re-think about this, I noticed that actually with this approach, even with the TSoC LED we can view the changing of ADC value!
So I regretted my hardheaded thought, I made a project (adc_test_190512)
schamtic
main.c
================
#include "project.h"
int main(void)
{
int16_t adc_count ;
int16_t mV = 0 ;
int16_t ch = 0 ;
CyGlobalIntEnable; /* Enable global interrupts. */
ADC_Start() ;
for(;;)
{
LED_Write(!LED_Read());
ADC_StartConvert();
ADC_IsEndConversion(ADC_WAIT_FOR_RESULT);
adc_count = ADC_GetResult16(ch);
mV = ADC_CountsTo_mVolts(ch, adc_count);
CyDelay(mV/30);
}
}
================
ADC の値によって LED の明るさが変わるのではなくて、点滅のスピードが
まるでウル○ラマンのカ○ータイマーの様に変化する様を見ることができました。
Now depending on the value of ADC, LED does not change the brightness, but the speed of blinking changes,
just like the Color Timer of the Ult*aman.
ところで、当初の課題には、
「ADCのチャンネルを8bit, 100Hz サンプリングで攪乱して」
という泣かせるセリフが書かれていました。
(Confuse は Config の誤記なのでしょうが、ツボだったので残しておきます。)
BTW, in the first question, there was an impressive sentence
"Confuse an ADC of a channel, eight BITS, and 100 Hz sampling."
(Confuse must be a typo of Config, but as I liked it, I quote 😉
後で考えてみると、課題の100Hzでサンプリングという話はどこかへ吹っ飛んでいってしまっていますので、
この方法は課題の回答としては好ましくないのですね。
ちなみに私の例も10Hzでサンプリングしていることになるので CyDelay(100) を CyDelay(10) にするか、
他に Timer を設けて100Hz周期の処理にしてあげる必要がありました。
Again, I noticed that I misplaced "100Hz sampling" during my trip to Akihabara.
So the second project won't be a good answer for the exercise.
Mine is also not good, as I inserted CyDelay(100) which makes the loop about 10Hz.
という訳で、最初の回路図に Timer を増やして、100kHz のクロックを1000 回周期で回してあげれば 100Hz のサンプリングの ADC -> PWM 変換に
なるよねといって作ったのが下記。(adc_test_190512B)
(これは最初のものと同様に外付けのLEDが必要です。)
流石に100Hz でプリント文を実行したら、いろいろとまずそうなので今回はUARTにはお引き取り願いました。
So I made another project (adc_test_190512B) which utilizes a Counter driven by a 100kHz clock and set period to 1000.
(This also requires an external LED, so my trip was not in vain 😉
Since printing ADC values 100 times per second does not sound cool, I asked the UART to leave.
schematic
main.c
=================
#include "project.h"
#include "stdio.h"
volatile int pit_flag = 0 ;
CY_ISR(pit_isr)
{
Timer_ClearInterrupt(Timer_INTR_MASK_TC) ;
pit_flag = 1 ;
}
void init_hardware(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
PWM_Start() ;
ADC_Start() ;
Timer_ClearInterrupt(Timer_INTR_MASK_TC) ;
PIT_INT_ClearPending() ;
PIT_INT_StartEx(pit_isr) ;
Timer_Start() ;
}
float measure(void)
{
int16_t adc_count ;
int16_t mV ;
int ch = 0 ;
ADC_StartConvert() ;
ADC_IsEndConversion(ADC_WAIT_FOR_RESULT) ;
adc_count = ADC_GetResult16(ch) ;
mV = ADC_CountsTo_mVolts(ch, adc_count) ;
if (mV < 0) {
mV = 0 ;
}
return( mV ) ;
}
int main(void)
{
uint16_t adc_ref_val = 3300 ;
uint16_t mV = 0 ;
uint16_t period = 1000 ;
uint16_t compare = 0 ; /* pwm duty is compare / period */
init_hardware() ;
PWM_WritePeriod(period) ;
for(;;)
{
if (pit_flag) {
pit_flag = 0 ;
mV = measure() ;
compare = (int)(period * mV / adc_ref_val) ; ;
PWM_WriteCompare( compare ) ;
}
}
}
=================
このトピックを書いていたら、週末もすでに日曜日の午後になってしまいました。
今日は「母の日」らしいので、何かお菓子でも買いに行かなくては予後が悪そうです。
という訳で、今日はこの辺で (^_^)
Writing this, it's already in the afternoon of Sunday.
And since it's a mother's day in Japan, I need to go out and get some sweets for her.
So let me call it a week 😉
moto
Show Less近年まれにみる大型ゴールデンウィークも今日で終わりということで、
明日からの社会復帰にそなえたリハビリも兼ねて秋月で買ってきたアナログ出力の加速度センサをTSoCで動かしてみました。
センサ (KXSC7-2050 モジュール)
http://akizukidenshi.com/catalog/g/gK-07243/
写真ではジャンパ線が飛び回っていますが、3端子レギュレータで KitProg からの 5V を 3.3V に落とす以外では、
センサのモード設定用が殆どでした。
Schematic
取り合えず出力を TeraTerm で見てみると
こんな感じで、ちょっと面白くありません。
そこでシリアルプロットというソフトにつないで表示させてみると
シリアルプロット
https://hackaday.io/project/5334-serialplot-realtime-plotting-software
x, y, z それぞれ頂点と底辺に来るように基板を動かしてみたところ、
だいたい、1g で 900 くらい、-1g で 400 くらいの数字に読めているようでした。
センサの出力がアナログなので、ADCで受けてやると下記の様に50行程度で書けてしまうというプログラムの書きやすいセンサでした。
※これでリハビリになったのかは、疑問ですが・・・
main.c
===================
#include "project.h"
#include "stdio.h"
char str[128] ; /* print buffer */
void print(char *str)
{
UART_UartPutString(str) ;
}
void init_hardware(void)
{
CyGlobalIntEnable; /* Enable global interrupts. */
UART_Start() ;
ADC_Start() ;
}
void splash(void)
{
sprintf(str, "KXSC7 Test Program (%s %s)\n", __DATE__, __TIME__) ;
print(str) ;
}
void measure(int16_t *x, int16_t *y, int16_t *z)
{
ADC_StartConvert() ;
ADC_IsEndConversion(ADC_WAIT_FOR_RESULT) ;
*x = ADC_GetResult16(0) ;
*y = ADC_GetResult16(1) ;
*z = ADC_GetResult16(2) ;
}
int main(void)
{
int16_t x, y, z ;
init_hardware() ;
splash() ;
print(" X, Y, Z\n") ;
for(;;)
{
measure(&x, &y, &z) ;
sprintf(str, "%5d, %5d, %5d\n", x, y, z) ;
print(str) ;
CyDelay(100) ;
}
}
===================
moto
Show LessHello Everyone,
I am new to the PSoC World. I am trying to make HW connections between digital input and output pins on PSoC 4100S Plus Prototype kit.
Which mean i am trying to connect User Switch ( SW1 )in Resistive Pull Up Mode with (HW connection) enabled to User (LED1) with (HW connection) enabled.
As soon as i enable the drive mode as Resistive Pull up for the switch i get and error. Can anybody tell me what is the problem ?
Basically i am trying to see the HW connection works by any means. So, thought this might be the simple way to do.
I will wait for the experts answer.
Thanks
Show Less
Hi,
Here I am uploading a custom component to read temperatures from Maxim DS18B20 digital temperature sensors. It implements 1-Wire communication to read sensor temperature at 12bit resolution , simultaneously samples data from up to 8 sensors, returns temperature in float, integer and string formats.
Attached archive contains component library, component datasheet, two demo projects and screenshots. Tested on PSoC4200 (PioneerBoard) and PSoC5LP (FreeSoC) under Creator 3.1 SP1
regards,
odissey1