Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

割り込みを使用して、LEDをさまざまな色でさまざまな速度で点滅させようとしています。 目標とする低速周波数は3Hz、高速周波数は15Hzです。 SWとタイマー割り込みの両方をクリアしているので、何が問題なのかわかりません。
*何らかの理由でファイルを添付させてくれません*

#include "project.h" (project.h) を
volatile int SW_flag;

int型メイン(void)
{
CyGlobalIntEnableです。/* グローバル割り込みを有効にする。 */
LED_Timer_Start();タイマー開始
TIMER_ISR_Start();タイマ割り込み開始
SW_ISR_Start();スイッチ割り込みを開始します

SW_flag = 0;フラグを 0 に設定し、スライド スイッチを使用するまで割り込みになりません。
R_LED_Write(1);LEDのデフォルトはオフ
G_LED_Write(1);
B_LED_Write(1);

for(;;)
    {

     }
} // ファイルの終わり

CY_ISR(SW_ISR_Interrupt)
{
##ifdef SW_ISR_INTERRUPT_INTERRUPT_CALLBACK
SW_ISR_Interrupt_InterruptCallback();
#endif /* SW_ISR_INTERRUPT_INTERRUPT_CALLBACK */

/* ここに割り込みコードを配置します。 */
/* '#START SW_ISR_Interrupt' */
extern volatile int SW_flag;

SW_flag = 1;スイッチ使用時、フラグ = 0

SW_ClearInterrupt();割り込みをクリアして無限にしない
/* '#END' */
}

CY_ISR(TIMER_ISR_Interrupt)
{
#ifdef TIMER_ISR_INTERRUPT_INTERRUPT_CALLBACK
TIMER_ISR_Interrupt_InterruptCallback();
#endif /* TIMER_ISR_INTERRUPT_INTERRUPT_CALLBACK */

/* ここに割り込みコードを配置します。 */
/* '#START TIMER_ISR_Interrupt' */
extern volatile int SW_flag;
if (SW_flag != 0) {
SW_flag = 0;
if (SW_Read() == 0) { //000 //off slow
        LED_Timer_WritePeriod(333); //slow blink
        LED_Timer_WriteCounter(0); //reset counter
        R_LED_Write(1);
        G_LED_Write(1);
        B_LED_Write(1);
    }
if (SW_Read() == 1) { //0b001 //red slow
        LED_Timer_WritePeriod(333);
        LED_Timer_WriteCounter(0);
        R_LED_Write(0);
        G_LED_Write(1);
        B_LED_Write(1);
    }
if(SW_Read() == 2) {//0b010 //green slow
        LED_Timer_WritePeriod(333);
        LED_Timer_WriteCounter(0);
        R_LED_Write(1);
        G_LED_Write(0);
        B_LED_Write(1);
    }
if(SW_Read() == 3) { //0b11 //blue slow
       LED_Timer_WritePeriod(333);
       LED_Timer_WriteCounter(0);
       R_LED_Write(1);
       G_LED_Write(1);
       B_LED_Write(0);
    }

if (SW_Read() == 5) { //0b101 //red fast
        LED_Timer_WritePeriod(66);
        LED_Timer_WriteCounter(0);
        R_LED_Write(0);
        G_LED_Write(1);
        B_LED_Write(1);
    }
if(SW_Read() == 6) {//0b110 //グリーンファスト

LED_Timer_WritePeriod(66);
LED_Timer_WriteCounter(0);
R_LED_Write(1);
G_LED_Write(0);
B_LED_Write(1);
}
if(SW_Read() == 7) { //0b111 //blue fast
        LED_Timer_WritePeriod(66);
        LED_Timer_WriteCounter(0);
        R_LED_Write(1);
        G_LED_Write(1);
        B_LED_Write(0);
    }
}

LED_Timer_ClearInterrupt(LED_Timer_INTR_MASK_TC);割り込みをクリアして無限にしない
/* '#END' */
}

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/LED-Not-Blinking/td-p/687285

0 件の賞賛
9 返答(返信)
Translation_Bot
Community Manager
Community Manager
Community Manager

 こんにちは

 

ISR_Start()ではなくISR_StartEx()APIを使っていますが、まずは以下の2点について教えてください。

 

- 割り込み優先度

GPIO(SW)の割り込みはTIMERの割り込みよりも優先度が高いですか?

 

- GPIO(SW)割り込みの設定

GPIO割り込みは両エッジに設定されていますか?

 

また、main関数で割り込みイネーブルのタイミングを以下のように変更した方が良いと思います。

 

CyGlobalIntEnableです。/* グローバル割り込みを有効にする。 */

LED_Timer_Start();タイマー開始

TIMER_ISR_Start();タイマ割り込み開始

SW_ISR_Start();スイッチ割り込みを開始します

SW_flag = 0;フラグを 0 に設定し、スライド スイッチを使用するまで割り込みになりません。

R_LED_Write(1);LEDのデフォルトはオフ

G_LED_Write(1);

B_LED_Write(1);

CyGlobalIntEnableです。/* グローバル割り込みを有効にする。 */

 

LEDが点滅しないとのことですが、どのような状態になるのでしょうか。

 

よろしく

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/LED-Not-Blinking/m-p/691350

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは

私の意見では、3Hz、15Hz などの遅い間隔の場合は、 Cortex® -m に無料で付属している「SysTick」タイマーを使用することを好みます。

そこで、これを CY8CKIT-044 で試してみました。他のPSoC™ 4 デバイスに移植するのが難しくないことを願っています (苦労しました)。

スケマティック

001-schematic.JPG

ピン

002-pins.JPG

メイン

#include "project.h"

#define LED_ON 0u
#define LED_OFF 1u

#define INTERVAL_3HZ  167 // (1000 / 3) / 2
#define INTERVAL_15HZ  33  // (1000 / 15) / 2

uint32_t     interval   = INTERVAL_3HZ ;
volatile int blink_flag = 0 ;

// SysTick related functions
volatile uint32_t tick_count = 0 ;

CY_ISR(tick_callback)
{
    tick_count++ ;
    if (tick_count > interval) {
        tick_count = 0 ;
        blink_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_sys_tick(void)
{
    int sys_tick_slot = 0 ;

    sys_tick_slot = find_empty_slot() ;
    if (sys_tick_slot < 0) {
        R_LED_Write(LED_ON) ;
        while(1) { } /* halting here */
    } else {
        CySysTickStart() ;
        CySysTickSetCallback(sys_tick_slot, tick_callback) ;
    }
    
}
// SW interrupt related functions
volatile int sw_flag = 0 ;

CY_ISR(sw_isr)
{
    SW_ClearInterrupt() ;
    isr_1_ClearPending() ; // may be not necessary
    sw_flag = 1 ;
}

void blink_led(void)
{
 //   R_LED_Write(!R_LED_Read()) ;
    G_LED_Write(!G_LED_Read()) ;
//    B_LED_Write(!B_LED_Read()) ;
}

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

    isr_1_ClearPending() ;
    isr_1_StartEx(sw_isr) ;
    
    init_sys_tick() ;

    for(;;) {
        if (sw_flag) { 
            sw_flag = 0 ;
            if (interval == INTERVAL_3HZ) {
                interval = INTERVAL_15HZ ;
            } else {
                interval = INTERVAL_3HZ ;
            }
        }
        if (blink_flag) {
            blink_flag = 0 ;
            blink_led() ;
        }
    }
}

 

モト

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/LED-Not-Blinking/m-p/691445

0 件の賞賛
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは

相変わらず慌てふためき、色の変化を忘れていました。

これは、色が変化するバージョンで、最初は緑色の点滅(3Hz)、swは青色の点滅(15Hz)をその逆に押し出します。

回路図とピンは前の投稿と同じです。

メイン

 

#include "project.h"

#define LED_ON 0u
#define LED_OFF 1u

#define INTERVAL_3HZ  167 // (1000 / 3) / 2
#define INTERVAL_15HZ  33  // (1000 / 15) / 2

#define COLOR_RED   0x01
#define COLOR_GREEN 0x02
#define COLOR_BLUE  0x04

uint8_t      led_color  = COLOR_GREEN ;
uint32_t     interval   = INTERVAL_3HZ ;
volatile int blink_flag = 0 ;

// SysTick related functions
volatile uint32_t tick_count = 0 ;

CY_ISR(tick_callback)
{
    tick_count++ ;
    if (tick_count > interval) {
        tick_count = 0 ;
        blink_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_sys_tick(void)
{
    int sys_tick_slot = 0 ;

    sys_tick_slot = find_empty_slot() ;
    if (sys_tick_slot < 0) {
        R_LED_Write(LED_ON) ;
        while(1) { } /* halting here */
    } else {
        CySysTickStart() ;
        CySysTickSetCallback(sys_tick_slot, tick_callback) ;
    }
    
}
// SW interrupt related functions
volatile int sw_flag = 0 ;

CY_ISR(sw_isr)
{
    SW_ClearInterrupt() ;
    isr_1_ClearPending() ; // may be not necessary
    sw_flag = 1 ;
}

// LED control functions

void set_color(uint8_t color)
{
    R_LED_Write(LED_OFF) ;
    G_LED_Write(LED_OFF) ;
    B_LED_Write(LED_OFF) ;
    
    led_color = color ;
}

void blink_led(void)
{
    if (led_color & COLOR_RED) {
        R_LED_Write(!R_LED_Read()) ;
    }
    if (led_color & COLOR_GREEN) {
        G_LED_Write(!G_LED_Read()) ;
    }
    if (led_color & COLOR_BLUE) {
        B_LED_Write(!B_LED_Read()) ;
    }
}

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

    isr_1_ClearPending() ;
    isr_1_StartEx(sw_isr) ;
    
    init_sys_tick() ;

    for(;;) {
        if (sw_flag) { 
            sw_flag = 0 ;
            if (interval == INTERVAL_3HZ) {
                interval = INTERVAL_15HZ ;
                set_color( COLOR_BLUE ) ;
            } else {
                interval = INTERVAL_3HZ ;
                set_color( COLOR_GREEN) ;
            }
        }
        if (blink_flag) {
            blink_flag = 0 ;
            blink_led() ;
        }
    }
}

 

注:「set_color()」呼び出しで色を変更できます。
「set_color(COLOR_GREEN |COLOR_RED)」も。

モト

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/LED-Not-Blinking/m-p/691490

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

CY8CKIT-042を使って試してみました。

ISR_Start APIではなくISR_StartEx APIを使用して動作することが確認できました。

それ以外は、ほとんどの場合、ソースコードを使用しています。

 

添付ファイルについては、以下の点にご注意ください。

1. GPIOポートは、便宜上プルダウンするように設定されています。

2. DVKのLEDが「L」で点灯

3. LEDの点滅構成が0x04欠落していますが、デバッグ目的で0x00から0x07に試しています。

 

よろしく

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/LED-Not-Blinking/m-p/691542

0 件の賞賛
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

CY8CKIT-042を使用して動作を確認しました。

ソースコードは、ほとんどあなたのものです。

 

田中さんの言う通りだと思います。

 

プロジェクトでは、次の操作を行います。

GPIOの変更、SW割り込みフラグの設定。

タイマによって割り込みが発生し、

・SW割り込みフラグクリア

・タイマーの周期変更

・指定のGPIOに合わせてLEDを点灯させる

次のタイマ割り込みも発生しますが、

・GPIOを変更せずに同色のLEDを点灯

 

LEDを点灯するように設定していますが、消灯する条件はありません。

タイマ割り込みでLEDの状態を読み取り、反転させる必要があると思います。

 

Archive01は点滅せず、Archive02は点滅するだけに条件を変更しました。

この構成では、タイマー割り込みのみでGPIOの状態を読み込めるので、GPIO割り込みは不要だと感じました。

 

よろしく

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/LED-Not-Blinking/m-p/691557

0 件の賞賛
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは

Switchもタイマーもisrはあっけた方がいい気がするけど、

タイマーISRのポーリングスイッチにより、応答が遅くなる場合があります。

そこで、CY8CKIT-042で次のことを試しました

スケマティック

010-schematic_042.JPG

ピン

011-pins.JPG

メイン

#include "project.h"

#define COLOR_RED   0x04
#define COLOR_GREEN 0x02
#define COLOR_BLUE  0x01

#define LED_ON        0u
#define LED_OFF       1u

#define MODE_3HZ       0
#define MODE_15HZ      1
#define TIMER_3HZ   2000
#define TIMER_15HZ   400

volatile uint8_t led_color = COLOR_GREEN ;
volatile int mode          = MODE_3HZ ;

CY_ISR(timer_isr)
{
    Timer_ClearInterrupt(Timer_INTR_MASK_TC) ;
    if (led_color & COLOR_RED) {
        R_LED_Write(!R_LED_Read()) ;
    }
    if (led_color & COLOR_GREEN) {
        G_LED_Write(!G_LED_Read()) ;
    }
    if (led_color & COLOR_BLUE) {
        B_LED_Write(!B_LED_Read()) ;
    }
}

CY_ISR(sw2_isr)
{
    SW2_ClearInterrupt() ;
    Timer_Stop() ;
    R_LED_Write(LED_OFF) ;
    G_LED_Write(LED_OFF) ;
    B_LED_Write(LED_OFF) ;
    if (mode == MODE_3HZ) {
        mode = MODE_15HZ ;
        led_color = COLOR_BLUE ;
        Timer_WritePeriod(TIMER_15HZ) ;
    } else {
        mode = MODE_3HZ ;
        Timer_WritePeriod(TIMER_3HZ) ;
        led_color = COLOR_GREEN ;
    }   
    Timer_WriteCounter(0) ;
    Timer_Enable() ;
}

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

    SW2_ClearInterrupt() ;
    int_sw2_StartEx(sw2_isr) ;
    
    Timer_ClearInterrupt(Timer_INTR_MASK_TC) ;
    int_timer_StartEx(timer_isr) ;
    Timer_Start() ;

    for(;;) {
    }
}

モト

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/LED-Not-Blinking/m-p/691676

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちはモト、

 

ただ、この元の構成で3Hzと15Hzだったら、人間のスイッチ操作という意味では理解できないかもしれないと思いました。

 

原作ではスイッチ割り込みがあっても、結局は次のタイマ割り込みでスイッチ割り込みの判定をします。

 

TESTBOARD_150PC_OUTで元のプロジェクトの問題点を指摘しましたが、私もあなたが提案しているこの構成は良いと思います。

しかし、このLEDの点滅を実現したいのであれば、LEDを点滅させるだけでタイマが頻繁に割り込み処理を行うのは望ましくないと考えました。

したがって、タイマー割り込みを使用せず、1 つの GPIO 割り込み、1 つの PWM、およびSMART_ADVENT_CALENDAR IO (または UDB の DMUX + LUT) を使用して構成するのが最適だと思います。

 

SW割り込みが発生したら、GPIOを読み出し、PWM速度の設定を変更してください。

SMART_ADVENT_CALENDAR IOのLUTを使用してハードウェアでPWM接続を切り替えることができます。

MiNe_85951_0-1707411491766.png

MiNe_85951_3-1707411612897.png

残念ながら手元に3色LEDとPSoC4Sシリーズ( SMART_ADVENT_CALENDAR IO搭載)環境がないので試すことができません。

 

よろしく

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/LED-Not-Blinking/m-p/691680

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

親愛なる峰さん、

>元のプロジェクトの問題点をTESTBOARD_150PC_OUTに指摘したところです。
>私も、ご提案されているこの構成が良いと思います。

はい、私も同意します。 通常、これは限られた時間内で最大の結果をサポートするための最良のアプローチです。

ただし、組み込みプログラミングやPSoC™プログラミングに慣れていない、または慣れていない顧客にとっては、動作するサンプルを提供することが時間を節約し、デバイスに対する顧客の信頼を保つのに役立つ場合があります。元の質問に投稿された main.c を見ると、その人はPSoC™プログラミングにあまり精通していないように感じました。ただプログラムするのが好きなだけかもしれませんが😜

> しかし、このLEDの点滅を実現させたいのであれば、LEDを点滅させるだけでタイマが頻繁に割り込み処理を行うのは望ましくないと考えました。

賛成です。

LEDを点滅させる必要がある場合は、PWMを使用するのが最も簡単であるか、「SysTick」を使用するのが最も安価であるように思われます。 そこで、最初はSysTickを使うことを提案しました。 それまでの間、最も簡単な実装のためには、PWMを使用するのがいいでしょう、はい、ご想像のとおり、私はPWMを使用して別のサンプルを書くことを計画していました。

そして、色をコントロールすることも、SmartIOが素敵に見えたし、Bang!あなたはすでに戦略を投稿しました!

よろしくお願いいたします
2024年2月9日
田中 基雄

P.S. 後で、時間に余裕があれば、PWMを使用して(SmartIOなしで)サンプルを投稿するかもしれません...)

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/LED-Not-Blinking/m-p/691943

0 件の賞賛
lock attach
Attachments are accessible only for community members.
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちは

LEDの点滅にPWMを使用した別のサンプル。

CY8CKIT-044:

スケマティック

020-schematic.JPG

ピン

021-Pins.JPG

CY8CKIT-042

スケマティック

030-schematic.JPG

ピン

031-Pins.JPG

main.c (042 と 044 で同じ)
注:50行未満にしようとしました。

 

#include "project.h"

#define INTERVAL_3HZ    3 // value does not have much meaning here
#define INTERVAL_15HZ  15 // value does not have much meaning here

#define COLOR_RED     0x6 // B:1, G:1, R:0
#define COLOR_GREEN   0x5 // B:1, G:0, R:1

volatile int interval_mode   = INTERVAL_3HZ ;

CY_ISR(sw_isr)
{
    uint16_t period ;

    switch(interval_mode) {
    default:
    case INTERVAL_3HZ:
        period  =  799 ;
        led_color_Write(COLOR_RED) ;
        interval_mode = INTERVAL_15HZ ;
        break ;
    case INTERVAL_15HZ:
        period  = 3999 ;
        led_color_Write(COLOR_GREEN) ;
        interval_mode = INTERVAL_3HZ ;
        break ;
    }
    PWM_Stop() ;
    PWM_WritePeriod(period) ;
    PWM_WriteCompare(period/2) ; // about 50% duty
    PWM_WriteCounter(0) ;        // activate the values set
    PWM_Start() ;

    SW_ClearInterrupt() ;
}

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

    isr_1_ClearPending() ;
    isr_1_StartEx(sw_isr) ;
    
    PWM_Start() ;

    for(;;) {
    }
}

 

モト

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/PSoC-4/LED-Not-Blinking/m-p/692154

0 件の賞賛