ちょっとお試しをするときに、delayの関数は便利だ。
webをさまよって、ms単位のdelayを実現するソースを見つけたので覚書きしておく。
1 2 3 4 5 6 7 |
#define SYS_CLK_FREQ 48000000ul void BSP_DelayMs(unsigned short milliseconds){ unsigned long time; time = _CP0_GET_COUNT();//Read Core Timer time += (SYS_CLK_FREQ / 2 / 1000) * milliseconds;//calc the Stop Time while ((long)(time - _CP0_GET_COUNT()) > 0){}; } |
こんなコードで試してみたら、ちゃんとできているようだ。
1 2 3 4 5 6 7 8 9 10 11 |
while (true){ SYS_Tasks ( ); BSP_DelayMs(25); LATAbits.LATA4 ^= 1; BSP_DelayMs(10); LATAbits.LATA4 ^= 1; BSP_DelayMs(5); LATAbits.LATA1 ^= 1; BSP_DelayMs(30); LATAbits.LATA1 ^= 1; } |
1つだけ問題は、SYS_CLK_FREQの値だ。
本来、Harmonyでシステムまわりを準備してあれば、SYS_CLK_FREQは手動で値を設定する必要が無いらしい。
ところが、私の環境、やり方では、明示的に設定しないとエラーになる。
追記
プロジェクト内でSYS_CLK_FREQを検索してみると、system_config.hの中に書かれていた。
ヘッダファイルの読み込まれる順番とかが良く分かっていないのだが、上の関数をmain.cの中に書いているので、main.cに、
#include <system_config.h>
を書いておけばいいと思われた。
そのようにすればエラー無くビルドできた。
なお、
#include <xc.h>
も書いておかないと、_CP0_GET_COUNTがエラーになる。
結局、Harmonyの吐いたmain.cに以下を追加すれば問題なさそうだ。
#include <system_config.h>
#include <xc.h>
1 2 3 4 5 6 7 8 9 |
#include <xc.h> #include <system_config.h> void BSP_DelayMs(unsigned short milliseconds){ unsigned long time; time = _CP0_GET_COUNT();//Read Core Timer time += (SYS_CLK_FREQ / 2 / 1000) * milliseconds;//calc the Stop Time while ((long)(time - _CP0_GET_COUNT()) > 0){}; } |
追記(2017/11/21)
上の記事はHarmonyでの話だ。
MCC(MPLAB Code Configurator)ではsystem_config.hももちろんSYS_CLK_FREQも存在しない。
代わりに、mcc.hの中に#define _XTAL_FREQ 96000000ULのように書かれている。
つまり、上のコードは、MCCでは以下のようにすればいい。
1 2 3 4 5 6 |
void BSP_DelayMs(unsigned short milliseconds){ unsigned long time; time = _CP0_GET_COUNT();//Read Core Timer time += (_XTAL_FREQ / 2 / 1000) * milliseconds;//calc the Stop Time while ((long)(time - _CP0_GET_COUNT()) > 0){}; } |
HarmonyだのMCCだの、なんで2つあるのか良く分からないまま来ているが。
PIC32以外も使う以上、Harmonyだけというわけにはいかないのが現実だ。
よって、最近はPIC32でもMCCを使うようになって、Harmonyは使わなくなった。