cancel
Showing results for 
Search instead for 
Did you mean: 

PSoC 4

TaDa_1980266
New Contributor II

TimerCounterコンポーネントのinterruptに isr_Timeout1 を追加し、
自動生成された isr_Timeout1.c に #include "xxx.h" を追記しましたが、
しばらくすると Build時に xxx.hの内容が定義されていないという
warning が発生し、isr_Timeout1.cを確認すると #include "xxx.h" が消えていました。

自動生成ファイル(isr_Timeout1.c)への追記内容が消去される原因が分かりますでしょうか?

個人的には isr_Timeout1.cの自動生成後に、何らかの要因で2回目のファイル自動生成処理が走り、
追加した処理が消えてしまったのではないか?と考えております。

0 Likes
1 Solution
MotooTanaka
Esteemed Contributor

こんばんは、

Generated_Source 以下のファイルは基本的に generate application を行う度に上書きされてしまいます。

例外的に(私の例では) isr_Timeout.c の isr_Tiemout_interrupt 関数内の

    /* `#START isr_Timeout_Interrupt` */ と書かれている行から

    /* `#END` */ と書かれている行までの間に記述された内容は保存されるようです。

(timer_isr_test_190419B)

=================

CY_ISR(isr_Timeout_Interrupt)

{

    #ifdef isr_Timeout_INTERRUPT_INTERRUPT_CALLBACK

        isr_Timeout_Interrupt_InterruptCallback();

    #endif /* isr_Timeout_INTERRUPT_INTERRUPT_CALLBACK */

    /*  Place your Interrupt code here. */

    /* `#START isr_Timeout_Interrupt` */

#include "Timer.h"

extern volatile int timeout_flag ;

    Timer_ClearInterrupt(Timer_INTR_MASK_TC) ;

    timeout_flag = 1 ;

  

    /* `#END` */

}

=================

また、このように Generated_Source 以下のファイルを触りたくない場合には

ユーザー領域のソース (main.c 等) 内で下記のように記述すると

ユーザーの ISR がデフォルトの ISR の代わりに使用されるようです。

※ 私はもっぱらこちらを使用しています。

(timer_isr_test_190419A)

=====================

CY_ISR(my_timeout_isr)

{

...

}

...

isr_Timer_StartEx(my_timeout_isr) ;

...

=====================

添付は CY8CKIT-044 用のサンプルプロジェクトです。

moto

View solution in original post

0 Likes
22 Replies
MotooTanaka
Esteemed Contributor

こんばんは、

Generated_Source 以下のファイルは基本的に generate application を行う度に上書きされてしまいます。

例外的に(私の例では) isr_Timeout.c の isr_Tiemout_interrupt 関数内の

    /* `#START isr_Timeout_Interrupt` */ と書かれている行から

    /* `#END` */ と書かれている行までの間に記述された内容は保存されるようです。

(timer_isr_test_190419B)

=================

CY_ISR(isr_Timeout_Interrupt)

{

    #ifdef isr_Timeout_INTERRUPT_INTERRUPT_CALLBACK

        isr_Timeout_Interrupt_InterruptCallback();

    #endif /* isr_Timeout_INTERRUPT_INTERRUPT_CALLBACK */

    /*  Place your Interrupt code here. */

    /* `#START isr_Timeout_Interrupt` */

#include "Timer.h"

extern volatile int timeout_flag ;

    Timer_ClearInterrupt(Timer_INTR_MASK_TC) ;

    timeout_flag = 1 ;

  

    /* `#END` */

}

=================

また、このように Generated_Source 以下のファイルを触りたくない場合には

ユーザー領域のソース (main.c 等) 内で下記のように記述すると

ユーザーの ISR がデフォルトの ISR の代わりに使用されるようです。

※ 私はもっぱらこちらを使用しています。

(timer_isr_test_190419A)

=====================

CY_ISR(my_timeout_isr)

{

...

}

...

isr_Timer_StartEx(my_timeout_isr) ;

...

=====================

添付は CY8CKIT-044 用のサンプルプロジェクトです。

moto

View solution in original post

0 Likes
TaDa_1980266
New Contributor II

回答ありがとうございます。

>Generated_Source 以下のファイルは基本的に generate application を行う度に上書きされてしまいます。

→やはり上書きされていたのですね。納得しました。

ちなみに generate application を行うタイミング = Build実行時 でしょうか?

>例外的に(私の例では) isr_Timeout.c の isr_Tiemout_interrupt 関数内の

> /* `#START isr_Timeout_Interrupt` */ と書かれている行から

> /* `#END` */ と書かれている行までの間に記述された内容は保存されるようです。

→これは私も同様です。

#START〜#END間の 独自タイムアウト関数の呼び出し処理は残っている為、

prj.M0121: implicit declaration of function '独自関数' で注意されています。

(isr_Timeout1.c)

CY_ISR(isr_Timeout1_Interrupt)

{

#ifdef isr_Timeout1_INTERRUPT_INTERRUPT_CALLBACK

isr_Timeout1_Interrupt_InterruptCallback();

#endif /* isr_Timeout1_INTERRUPT_INTERRUPT_CALLBACK */

/* Place your Interrupt code here. */

/* `#START isr_Timeout1_Interrupt` */

// タイムアウト処理

独自関数();

/* `#END` */

}

>添付は CY8CKIT-044 用のサンプルプロジェクトです。

→添付ファイルがありません or 受け取れません。

本メール以外での添付ファイル受け渡しは可能でしょうか?

isr_Timeout1.cの関数内で独自関数用ヘッダファイルをインクルードしてみましたが、

やはりエラーが出ましたので main.c でユーザISRを定義する方法を確認したいです。

0 Likes
TakashiM_61
Moderator
Moderator

Cleanした後にBuild、もしくはClean & Buildした時にGenerated_Source 以下のファイルは上書きされてしまいます。

一度ビルドした後に、例えばisr_Timerout.cを変更しBuildのみ実行した場合、isr_Timerout.cは上書きされません。

尚、Generated_Source 以下のファイルを変更し、Debug-->Program、Debug-->Debugを実行した際、自動的に変更ファイルのみビルドします。この時Generated_Source 以下のファイルは上書きされません。

TaDa_1980266
New Contributor II

回答ありがとうございます。

ファイル自動更新タイミングについて理解しました。

サンプルコードについて教えて下さい。

CY_ISR()の引数名称が異なっていますが、複数タイマを設定した場合、

main.c CY_ISR()の引数は何を設定すれば良いでしょうか?

timer_isr_test_190419A.cydsn

mai.c CY_ISR(my_timeout_isr)

isr_Timeout.c CY_ISR(isr_Timeout_Interrupt)

mai.c CY_ISR(???????????)

isr_Timeout.c CY_ISR(isr_Timeout_Interrupt)

isr_Timeout2.c CY_ISR(isr_Timeout2_Interrupt)

0 Likes
TaDa_1980266
New Contributor II

すみません。isr_Timeout1_StartEx()で区別すればOKと理解しました。

mai.c isr_Timeout1_StartEx(my_timeout_isr)

mai.c isr_Timeout1_StartEx(my_timeout_isr2)

mai.c CY_ISR(my_timeout_isr)

mai.c CY_ISR(my_timeout_isr2)

isr_Timeout.c CY_ISR(isr_Timeout_Interrupt)

isr_Timeout2.c CY_ISR(isr_Timeout2_Interrupt)

TaDa_1980266
New Contributor II

Timer Component でPeriodで指定する単位はms で合っていますでしょうか?

Period 1000ms = 1s

Period 60000ms = 60s = 1min

サンプルコード(timer_isr_test_190419A.cydsn)を参考に

下記コードで経過時間を確認しようとしましたが、時間が更新されず、

タイマ値の妥当性を判断出来ません。

sprintf(str, "Timer ISR test (%s %s)\n", __DATE__, __TIME__);

print(str);

0 Likes
MotooTanaka
Esteemed Contributor

こんにちは、

> sprintf(str, "Timer ISR test (%s %s)\n", __DATE__, __TIME__);

> print(str);

この部分は、プログラムがコンパイルされた日時の値で

定数になっているため、更新はされません。

また、ご指定のサンプルでは、1kHz クロックの PWM Timer の period を 3000 と

設定していますので、3秒毎にタイムアウトが発生しているかと思います。

この period の値を 1000 にしていただきますと、1秒毎の割込みにすることができます。

Timer_config.JPG

moto

0 Likes
TaDa_1980266
New Contributor II

すみません。__TIME__が現在時間かと勘違いしておりました。

Period単位がmsである事は了解しました。

ただ、Period設定と実動作がリンクしておらず困っております。

timer_isr_test_190419A.cydsnはCY8CKIT-044用プロジェクトの為、

CY8CKIT-145-40XXプロジェクトに内容をコピーして動作を確認しております。

Periodで10000(10秒) Countinuousと設定してもCY_ISR()内のブレイクポイントが

1秒以内で反応している状況です。

Timer_Start() から CY_ISR()までの処理時間を実測したいのですが、

現在時刻を取得するAPIはありますでしょうか?

0 Likes
MotooTanaka
Esteemed Contributor

> Timer_Start() から CY_ISR()までの処理時間を実測したいのですが、

> 現在時刻を取得するAPIはありますでしょうか?

どのくらいの精度を期待されているかによって、測り方は違ってくるかと思います。

現在時刻とおっしゃっているので、秒単位で良いのであれば、

丁度先ほどポストした 7SEG LED のサンプルで RTC を使用していますので、

そのコード等ご参考になればと思います。

TSoC CY8C4146LQI-S433 基板 7SEG LED サンプル

また、もっと粒度の細かい測定が必要なのであれば、

速度の速いカウンタを動かしておいて、

測定開始時と測定時のカウンタ値を取得するといった方法もあるかと思います。

moto

0 Likes
TaDa_1980266
New Contributor II

秒単位で構いません。

サンプルコードのRTCを参考に確認してみます。

0 Likes
TaDa_1980266
New Contributor II

サンプルプロジェクトを参考に

RTCコンポーネントを追加し、RTC_Start()を呼び出し後、下記で日時を取得しましたが、

値が変化しませんでした。

GetDateAndTime()で初期値(1970/1/1 00:00:00)から更新されない原因について

想定できるものはありますでしょうか?

void current_time_disp(void)

{

RTC_1_DATE_TIME date_time;

RTC_1_GetDateAndTime(&date_time);

uiYear = RTC_1_GetYear(date_time.date);

uiMonth = RTC_1_GetMonth(date_time.date);

uiDay = RTC_1_GetDay(date_time.date);

uiHour = RTC_1_GetHours(date_time.time);

uiMin = RTC_1_GetMinutes(date_time.time);

uiSec = RTC_1_GetSecond(date_time.time);

sprintf(str, "a Y%04d M%02d D%02d H%02d M%02d S%02d \n", uiYear, uiMonth, uiDay, uiHour, uiMin, uiSec);

print(str);

}

又、SetUnixTime()で現在時刻 1556254800(=2019/04/26 14:00:00) を設定してみた所、

GetHours()の戻り値が ‘5’となっており、想定の”14”と異なっておりました。

(時間以外は期待通り)

時間については時差等を考慮する必要がありますでしょうか?

RTC_1_SetUnixTime(1556251200); // 2019/04/26 13:00:00 uiHour=4

RTC_1_SetUnixTime(1556254800); // 2019/04/26 14:00:00 uiHour=5

0 Likes
MotooTanaka
Esteemed Contributor

こんにちは、

> RTCコンポーネントを追加し、RTC_Start()を呼び出し後、下記で日時を取得しましたが、

> 値が変化しませんでした。

はい、私も同じ問題にハマりました。

手探りで原因を探したところ、Project の Design Wide Resources > Clocks で

RTC_Sel にクロックが設定されていないことがわかりました。

そこで、RTC_Sel の行をダブルクリックして表示される

クロックコンフィグの Low Frequency Clocks で、使用可能なクロックを RTC_Sel に

アサインしました。もし、お使いの基板に WCO 用のクリスタル等が実装されている場合には

そちらをお使いいただいて 1Hz のクロックを RTC に提供するのが良いかと思います。

Clock_Tree.JPG

> 又、SetUnixTime()で現在時刻 1556254800(=2019/04/26 14:00:00) を設定してみた所、

> GetHours()の戻り値が ‘5’となっており、想定の”14”と異なっておりました。

> (時間以外は期待通り)

Unix の時間は GS (グリニッジ標準時間) で管理されています。

日本で表示する時にタイムゾーンの差分計算をして表示するので、

日本時刻 = JST = "UTC+9" となっています。

ご参考になりそうな URL を下記に引用しておきます。

https://www.jisakeisan.com/timezone/jst/

タイムゾーン呪いの書 - Qiita

UNIX時間 - Wikipedia

moto

0 Likes
TaDa_1980266
New Contributor II

早速のコメントありがとうございます。

Design Wide Resources > Clocks を確認しましたが、RTC_selが表示されていません[画像02]

RTCコンポーネントは追加しています[画像01]

又、私の環境ではDesign Wide Resources > Clocks の Timer(WDT)が無効になっていますが、

タイマをWatchDogTimer用途として使わない場合は無効状態でも問題ないでしょうか?[画像03]

(画像)

http://gunze-si.if.tv/dl/01_TipDesign_cysch.jpg

http://gunze-si.if.tv/dl/02_Design_Wide_Resources_Clocks.jpg

http://gunze-si.if.tv/dl/03_Design_Wide_Resources_Clocks_Timer_sel.jpg

0 Likes
MotooTanaka
Esteemed Contributor

> 又、私の環境ではDesign Wide Resources > Clocks  の Timer(WDT)が無効になっていますが、

> タイマをWatchDogTimer用途として使わない場合は無効状態でも問題ないでしょうか?

画像03 を拝見すると、私の構成と表示されているTimerの数が随分と違いますね。

この状態でプロジェクトは正常にコンパイル出来ているのでしょうか?

もし、可能であれば当該プロジェクトを下記の手順で

レスポンスに添付してはいただけないでしょうか?

(1) Workspace Explorer で当該プロジェクトを選択 (Set As Active Project にして、黒くハイライトされた状態にする)

(2) Build > Clean <project名>

(3) Project > Archive Workspace/Project...

(4) Minimal を選択して > Archive

(5) 表示される <project名>.zip を添付

moto

0 Likes
TaDa_1980266
New Contributor II

はい。

タイマ動作、TRCによる時間取得は出来ていませんが、ビルドは通ります。

http://gunze-si.if.tv/dl/GBTN_FW_V0400.cywrk.Archive01.zip

0 Likes
MotooTanaka
Esteemed Contributor

プロジェクトを拝啓しました。

確かに Low Frequency Clocks に他の選択肢がないようですので、

試しに Timer (WDT) を Free Running Timer でイネーブルにして影響があるか実験していただけないでしょうか?

Mode は恐らく Watchdog (w/ Interrupt) が必要と思いますが、設定可能な両方をお試しください。

moto

0 Likes
TaDa_1980266
New Contributor II

影響無しでした。

Timer(WDT)を有効にし、以下の2パターンを確認しましたが、

以下の症状は改善されませんでした。

・RTC GetSecond()は更新されず、固定値(0)

・Timer_1のタイムアウト関数(CY_ISR(my_timeout_isr))もすぐ呼び出され、

Period設定の10秒後(10000)は実感できず

Mode :Free Running Timer

Period:819.2ms(デフォルト値)

Mode :Watchdog(w/ Interrupt)

Period:819.2ms(デフォルト値)

RTC及びTimerについて別の確認方法があれば教えて下さい。GW明けに確認します。

0 Likes
MotooTanaka
Esteemed Contributor

プロジェクトを拝見したところ、お使いのデバイスが持っているタイマー 5個の内、

既に5個を使用されていますので、新たにタイマーを追加することは出来ません。

そこで、既存のタイマーの内、常に動いているタイマーがあるとすると

恐らく Timer_1 で、2MHz の clock で 20000  サイクル毎に割込みを発生していますので

それを利用して試してみました。

プロジェクトは手元にある TSoC (CY8C4146LQI-S433) を使用しました。

初期設定で

    uint32_t ticks = 20000 ; /* Timer は 20000 クロック毎に割込みを発生 */

    uint32_t ref_OneSecTicks = 2000000 ; /* Timer が使用しているクロックで1秒分のカウントは 2,000,000 */

    RTC_SetPeriod(ticks, ref_OneSecTicks) ;

として、割込みの間隔を RTC に設定後、

Timer_1 割込みの度に

 RTC_Update()

を呼びます。

これで、main ループ内で一秒毎に時間を書かせたところ

概ね正しく動いているようでした。

000-TeraTerm-log.JPG

schematic

schematic.JPG

main.c

======================

#include "project.h"

#include "stdio.h"

CY_ISR(timer1_isr)

{

    Timer_1_ClearInterrupt(Timer_1_INTR_MASK_TC) ;

    RTC_Update() ;

}

char str[128] ; /* print buffer */

void print(char *str)

{

    UART_UartPutString(str) ;

}

void init_hardware(void)

{

    uint32_t ticks = 20000 ;

    uint32_t ref_OneSecTicks = 2000000 ; /* 2MHz */

  

    CyGlobalIntEnable; /* Enable global interrupts. */

  

    UART_Start() ;

  

    Timer_1_ClearInterrupt(Timer_1_INTR_MASK_TC) ;

    isr_Timeout1_StartEx(timer1_isr) ;

    Timer_1_Start() ;

  

    RTC_SetPeriod(ticks, ref_OneSecTicks) ;

    RTC_Start() ;

}

void splash(void)

{

    sprintf(str, "RTC Test (%s %s)\n", __DATE__, __TIME__) ;

    print(str) ;

}

void current_time_disp(void)

{

    RTC_DATE_TIME date_time;

    int uiYear, uiMonth, uiDay, uiHour, uiMin, uiSec ;

  

    RTC_GetDateAndTime(&date_time);

    uiYear = RTC_GetYear(date_time.date);

    uiMonth = RTC_GetMonth(date_time.date);

    uiDay = RTC_GetDay(date_time.date);

    uiHour = RTC_GetHours(date_time.time);

    uiMin = RTC_GetMinutes(date_time.time);

    uiSec = RTC_GetSecond(date_time.time);

    sprintf(str, "a Y%04d M%02d D%02d H%02d M%02d S%02d \n", uiYear, uiMonth, uiDay, uiHour, uiMin, uiSec);

    print(str);

}

int main(void)

{

    init_hardware() ;

  

    splash() ;

  

    for(;;)

    {

        current_time_disp() ;

        CyDelay(1000) ;

    }

}

======================

moto

0 Likes
TaDa_1980266
New Contributor II

情報ありがとうございます。

秒数取得はOKですが、タイマはまだ意図通りに動かせておりません。

1)RTC時間取得
  RTC_SetPeriod()とRTC_1_Update()の追加で1秒間隔の秒数取得は出来ました。
    RTC_SetPeriod(ticks(=20000 1000ms毎), ref_OneSecTicks(=2000000 2MHz));  ->  1秒間隔

  RTCデータシート RTC_SetPeriod()の説明からref_OneSecTicksの値の10分の1が 100msと理解しました。

  Timerコンポーネント

TopDesign.jpg

Period_20000_Configure_Timer_1.jpg

  秒数表示

Period_20000_TeraTerm.jpg

2)指定秒数後のTimeout

  ただ、やはりCY_ISR(my_timeout_isr)は20ms間隔で呼び出されており、
  TimerコンポーネントのPeriod設定=20000ms=20秒後想定とはリンクしておりませんでした。

  指定秒数後にCY_ISR(my_timeout_isr)が呼び出される設定方法はありますでしょうか?

0 Likes
MotooTanaka
Esteemed Contributor

RTC コンポーネントにはアラーム機能が用意されています。

下図のように Enable alarm functionality にチェックを入れると

アラーム機能の API が使用可能になります。

001-RTC_Config.JPG

ただ、アラームは 何時何分にアラームを掛けるという設定になりますので、

20秒毎のアラームとなりますと、アラームの ISR 内で、現在時刻に次の時間を足した時間を

次のアラームに設定してやる必要があるかと思います。

CY_ISR(my_20sec_alarm)

{

    RTC_DATE_TIME alarm_time ;

    uint32_t sec, min, hour ;

  

    RTC_ClearAlarmStatus() ;

    alarm_20sec_flag = 1 ;

  

    RTC_GetDateAndTime(&alarm_time) ;

    sec = RTC_GetSecond(alarm_time.time) ;

    sec = (sec + 20) % 60 ;

    alarm_time.time = RTC_SetHours(alarm_time.time, 0) ;

    alarm_time.time = RTC_SetMinutes(alarm_time.time, 0) ;

    alarm_time.time = RTC_SetSecond(alarm_time.time, sec) ;

  

    RTC_SetAlarmDateAndTime(&alarm_time) ;

}

とりあえず20秒毎にアラームの割込みが入るサンプルを作ってみました。

動作は下記のようになりました。

000-TeraTerm-log.JPG

尚、このスレッドは当初の件名・ご質問内容とかなり乖離して来ておりますので、

以降のご質問がある場合には他のスレッド(ディスカッション)を新たに作成して

ご質問いただけたならと思います。

moto

0 Likes
TaDa_1980266
New Contributor II

アラーム機能の情報ありがとうございます。

頂いた内容がやりたい事に一番近そうです。

ご指摘通り、内容がタイトルとかけ離れておりますので、本件はクローズ致します。

アラーム機能を試して問題があった場合には

新規質問を登録致します。

0 Likes
TakashiM_61
Moderator
Moderator

本スレッドを一旦Lockさせて頂きます。

宜しくお願い致します。

0 Likes