はじめまして。
RX220を以下開発環境で、Lチカをしようとしています。
作成したプログラムは以下の通りです。
プログラムを走らせて見ると、P46は想定周期でトグルしますが、P42がLowのままで動きません。
但し、26,27行目を
R_PG_IO_PORT_Write_P42(1); R_PG_IO_PORT_Write_P46(1);
にすると、どちらもトグルしてくれます。
(推測原因)
以下の抜粋のプログラムでは省略したのですが、別にCMT3を2msで起動していて、そこでP40,P41をHighに固定しています。但し、Cmt1IntFunc()中のどちらかのR_PG_IO_PORT_Write_P4x()実行タイミングで、P40,P41がLoWに戻されてしまいます。
P41波形
このことから、R_PG_IO_PORT_Write_P4x()関数が、bit単位で書き込みできておらず、他のbitもWriteしてしまっていると想像しています。PDG2のバグは混在してないでしょうか?
または、プログラム上で問題のある箇所がありましたら、ご指摘をお願いします。ご教示の程、よろしくお願いします。
プログラム(抜粋)
//#include "typedefine.h"#ifdef __cplusplus//#include <ios> // Remove the comment when you use ios//_SINT ios_base::Init::init_cnt; // Remove the comment when you use ios#endif
// PDG2関数読み出し#include "R_PG_driver.h"
void main(void);#ifdef __cplusplusextern "C" {void abort(void);}#endif
void main(void){ // 存在しないポートの処理 R_PG_IO_PORT_SetPortNotAvailable();
// クロックの設定 R_PG_Clock_Set(); // LED消灯 R_PG_IO_PORT_Write_P42(0); R_PG_IO_PORT_Write_P46(0); R_PG_IO_PORT_Set_P42(); R_PG_IO_PORT_Set_P46();
// CMT設定 R_PG_Timer_Set_CMT_U0_C1();
// CMTカウント開始 R_PG_Timer_StartCount_CMT_U0_C1();
while(1);}
// 外部割込みvoid Irq0IntFunc(void) {}void Irq1IntFunc(void) {}
// CMT1 (100ms)void Cmt1IntFunc(void){ // 0.5秒毎にLED1の赤と緑を交互に点滅 ++ledCnt; if (ledCnt == 5) { ledCnt = 0; if (!ledState) { R_PG_IO_PORT_Write_P42(0); R_PG_IO_PORT_Write_P46(1); } else { R_PG_IO_PORT_Write_P46(0); R_PG_IO_PORT_Write_P42(1); } ledState = !ledState; }}
#ifdef __cplusplusvoid abort(void){
}#endif
自己解決しました。。
原因は上記ではなく、WDTで定期的に内部リセットかかっていたことが原因でした。。大変失礼しました。。。
PDG2プロジェクトは、過去プロジェクトをコピーし使っていて、WDTは使わないので、チェックを外したのですが、なぜか機能は残っていました。(これで大変はまりました。。。)
全くの新規でPDG2プロジェクトを起こしたところ、WDTが動かなくなり問題解決しました。