Arduino UNO R4でLチカ、、タイマーで。 [Arduino]
Arduino UNO R4でタイマーを使ったLチカをやってみた。
まだよくわかっていないものの、とりあえず動いたという感じです。
以下のスケッチが正しいかは怪しい。
ちょっと調べてみると、、
・AVRのようにレジスタを直接いじるのはちょっと難しそう
・FspTimerというのを使うといいっぽい
・FSPとは Flexible Software Package のことらしい
・2種類のタイマー GPT (General PWM Timer)、AGT(Asynchronous General Purpose Timer)がある
・AGTタイマーは2つだけで、1つ(channel 0)は millis()、microseconds()に使用済
・get_available_timer で使用可能なタイマーのタイプとチャンネルを取得(GPTから先に探している)
FspTimerについて詳しく調べられた方のページ:
Arduino UNO R4のFspTimerライブラリの使い方 - Qiita
https://qiita.com/yasuhiro-k/items/93efb640aa12f3db9086
これをもとに作ってみた。
2.0Hz(=500msec毎)でLEDのON/OFFを切り替えます。
周波数の指定はfloat型だけど1Hz未満では動作しなかった。
タイマーはGPTから先に空きを調べていくのでGPTを使用していると思われる。
つづいてもう一つ。
AGTをライブラリに仕上げられた方のページ:
GitHub - washiyamagiken/AGTimer_R4_Library
https://github.com/washiyamagiken/AGTimer_R4_Library
これをもとにライブラリをLチカ専用に展開。AGTのチャンネル1を使用。
TIMER_SOURCE_DIV_64 のとき、period countsが 32768 だと1Hz、16384だと2Hz (500msec毎)。
<FSPタイマー関連プログラムの在処>
%localAppdata%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\FspTimer.h
%localAppdata%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\FspTimer.cpp
まだよくわかっていないものの、とりあえず動いたという感じです。
以下のスケッチが正しいかは怪しい。
ちょっと調べてみると、、
・AVRのようにレジスタを直接いじるのはちょっと難しそう
・FspTimerというのを使うといいっぽい
・FSPとは Flexible Software Package のことらしい
・2種類のタイマー GPT (General PWM Timer)、AGT(Asynchronous General Purpose Timer)がある
・AGTタイマーは2つだけで、1つ(channel 0)は millis()、microseconds()に使用済
・get_available_timer で使用可能なタイマーのタイプとチャンネルを取得(GPTから先に探している)
FspTimerについて詳しく調べられた方のページ:
Arduino UNO R4のFspTimerライブラリの使い方 - Qiita
https://qiita.com/yasuhiro-k/items/93efb640aa12f3db9086
これをもとに作ってみた。
2.0Hz(=500msec毎)でLEDのON/OFFを切り替えます。
周波数の指定はfloat型だけど1Hz未満では動作しなかった。
タイマーはGPTから先に空きを調べていくのでGPTを使用していると思われる。
#include <FspTimer.h>
static FspTimer fsp_timer;
void blinkLED(timer_callback_args_t __attribute((unused)) *p_args) {
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
uint8_t timer_type;
int8_t timer_ch = FspTimer::get_available_timer(timer_type);
if (timer_ch < 0) return;
fsp_timer.begin( TIMER_MODE_PERIODIC, timer_type, timer_ch, 2.0f, 0.0f, blinkLED, nullptr );
fsp_timer.setup_overflow_irq();
fsp_timer.open();
fsp_timer.start();
}
void loop() {
}
つづいてもう一つ。
AGTをライブラリに仕上げられた方のページ:
GitHub - washiyamagiken/AGTimer_R4_Library
https://github.com/washiyamagiken/AGTimer_R4_Library
これをもとにライブラリをLチカ専用に展開。AGTのチャンネル1を使用。
TIMER_SOURCE_DIV_64 のとき、period countsが 32768 だと1Hz、16384だと2Hz (500msec毎)。
#include <FspTimer.h>
static FspTimer fsp_timer;
void blinkLED(timer_callback_args_t __attribute((unused)) *p_args) {
digitalWrite(LED_BUILTIN, !digitalRead(LED_BUILTIN));
}
void setup() {
pinMode(LED_BUILTIN, OUTPUT);
fsp_timer.begin( TIMER_MODE_PERIODIC, AGT_TIMER, 1, 16384, 0, TIMER_SOURCE_DIV_64, blinkLED, nullptr );
IRQManager::getInstance().addPeripheral( IRQ_AGT, (void*)fsp_timer.get_cfg() );
fsp_timer.open();
fsp_timer.start();
}
void loop() {
}
<FSPタイマー関連プログラムの在処>
%localAppdata%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\FspTimer.h
%localAppdata%\Arduino15\packages\arduino\hardware\renesas_uno\1.0.2\cores\arduino\FspTimer.cpp
2023-08-28 00:44
nice!(0)
コメント(0)
コメント 0