関数
システム関数
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
ユーティリティ関数
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
Loading...
DIO 汎用ディジタルIO
汎用ディジタルIO(DIO)の操作には以下の関数を利用します。
pinMode()
digitalWrite()
digitalRead()
attachIntDio()
detachIntDio()
const uint8_t PIN_DIGITAL::DIO0 .. 19
DIOピン0~19
const uint8_t PIN_DIGITAL::DO0 .. 1
DOピン0,1
以下の列挙値は型名 E_PIN_MODE
で取り扱われます。
PIN_MODE::INPUT
無
入力
PIN_MODE::OUTPUT
無
出力
PIN_MODE::INPUT_PULLUP
有
入力
PIN_MODE::OUTPUT_INIT_HIGH
無
出力(初期状態HIGH)
PIN_MODE::OUTPUT_INIT_LOW
無
出力(初期状態LOW)
PIN_MODE::WAKE_FALLING
無
入力、起床ピン、立下り
PIN_MODE::WAKE_RISING
無
入力、起床ピン、立上り
PIN_MODE::WAKE_FALLING_PULLUP
有
入力、起床ピン、立下り
PIN_MODE::WAKE_RISING_PULLUP
有
入力、起床ピン、立上り
PIN_MODE::DISABLE_OUTPUT
有
入力状態に戻す
以下の列挙値は型名 E_PIN_MODE
で取り扱われます。
PIN_MODE::OUTPUT
出力
PIN_MODE::OUTPUT_INIT_HIGH
出力(初期状態HIGH)
PIN_MODE::OUTPUT_INIT_LOW
出力(初期状態LOW)
PIN_MODE::DISABLE_OUTPUT
出力設定をやめる
以下の列挙値は型名 E_PIN_STATE
で取り扱われます。
PIN_STATE::HIGH
1
HIGHレベル(=Vccレベル)
PIN_STATE::LOW
0
LOWレベル(=GNDレベル)
以下の列挙値は型名 E_PIN_INT_MODE
で取り扱われます。
PIN_INT_MODE::FALLING
立ち下り
PIN_INT_MODE::RISING
立ち上がり
millis()
システム時刻[ms]を得ます。
システム時刻はTickTimerの割り込みで更新されます。
random()
乱数を生成します。
1行目は0..(maxval-1)
の値を戻します。maxvalの値が最大値ではないことに注意してください。
2行目はminval..maxval-1
の値を戻します。
digitalWrite()
ディジタル出力ピンの設定を変更します。
事前にpinMode()
にて設定対象のピンを出力用に設定しておきます。1番目のパラメータは、設定対象のピン番号を指定します。2番目のパラメータはHIGH
かLOW
のいずれかを指定します。
入力が E_PIN_STATE
型となっています。E_PIN_STATE
からint
型への変換演算子は定義していませんので、数値による直接の入力はできないようになっています。
delay()
ポーリングによる時間待ちを行います。
ms
にて与えられた期間待ち処理を行います。
時間の計測はTickTimerのカウントによって行っています。また長い時間待ちを行う場合はCPUのクロックを低下してポーリング処理を行います。
delay()
を呼び出してから約5ms経過するごとにTWELITEマイコン内部のウォッチドッグ処理を行います。
※例えばwhile(1) delay(1);
を実行した場合は、delay()
内部で5ms経過しないためウォッチドッグ処理が行われず、一定時間後リセットが実行されます。
setup(), wakeup()
関数内では、TickTimerがまだ動作していないため、whileループによる時間待ち処理になります。この場合、指定値との誤差は大きくなります。このループカウンタは32Mhzに合わせて調整しています。これら関数内でCPUクロックを変化させた場合は、そのクロックに比例した誤差が発生します。
パラメータに1,2といった短い時間を指定した場合は、誤差が大きくなる場合があります。
delayMicroseconds()
MWSDK2020_05 には含まれません。対応パッケージはMWSDK_2020_07_UNOFFICIAL以降となります。
ポーリングによる時間待ちを行います(μ秒指定)。
microsec
にて与えられた期間待ち処理を行います。
時間の計測はTickTimerのカウントによって行っています。また長い時間待ちを行う場合はCPUのクロックを低下してポーリング処理を行います。
setup(), wakeup()
関数内では、TickTimerがまだ動作していないため、whileループによる時間待ち処理になります。この場合、指定値との誤差は大きくなります。このループカウンタは32Mhzに合わせて調整しています。これら関数内でCPUクロックを変化させた場合は、そのクロックに比例した誤差が発生します。
パラメータに10以下といった短い時間を指定した場合は、誤差が大きくなる場合があります。
pinMode()
DIO(汎用ディジタルIO)ピンの設定を行います。
この関数では DIO0..19 と、DO0,1のピンの状態を変更できます。設定内容は E_PIN_MODE
の列挙値のとを参照してください。
DO0,1は特殊なピンで、原則として他の目的で利用されるものですが、出力としても設定可能です。ただしハード的な制約があるピンですので、利用には注意が必要です。
両方のピンは、電源投入時にHIGHレベルが担保される必要があります。不安定な電圧をとったりするような回路構成の場合、モジュールが起動しないなどの問題が出ます。
DESC
入力設定のポートの値を読み出す。
事前に入力に設定したピンの入力値をLOW
またはHIGH
で得ます。
E_PIN_STATE
型からint
型への変換演算子は定義していないため、数値型への直接的な代入はできません。
attachIntDio()
DIO割り込みを有効にします。
事前に入力設定したピンに対して、1番目のパラメータは割り込みを有効にしたいピン番号で、2番目は割り込み方向(立ち上がり、立ち下がり)を指定します。
割り込みハンドラ、イベントハンドラの記述はアプリケーションビヘイビアで行います。
DIO5のピンがHIGHからLOWに変化したときに割り込みが発生する設定を行う。
アプリケーションビヘイビアmyAppClass
の基本定義。詳細は省略している。
アプリケーションビヘイビアmyAppClass
の割り込みハンドラの記述。DIO5の割り込み発生時にDIO12の出力設定を反転させ、割り込みハンドラが終了してから発生するイベントではシリアルポートSerial
に*
を表示する。
printfの実装
mwxライブラリでは、書式出力をC言語で常用されるprintfの実装を用いています。いくつかの関数の関数定義が利用できます。
mwx_printf()
はSerialオブジェクトに対してprintf出力を行います。Serial.printfmt()
と同じ処理になります。
mwx_snprintf()
はバッファに対してsnprintfを行います。
配列クラスに対してprintfでバッファを構築したい場合は、を参照してください。
digitalReadBitmap()
mwxライブラリ 0.1.4 以降に収録
入力設定のポートの値を一括読み出しします。
LSB側から順にDIO0 ... DIO19 の順に値が格納されます。
HIGH側のピンには 1 が、LOW側のピンには 0 が設定されます。
要素データを並べてバイト列を生成
要素データを並べてバイト列を生成します。
pack_bytes
はコンテナクラスのbegin()
,end()
イテレータをパラメータとし、続くパラメータで指定されるデータをバイト列としてコンテナに書き込みます。
可変引数パラメータに与えるデータは以下に示すとおりです。
uint8_t
1
uint16_t
2
ビッグエンディアン並びで格納される
uint32_t
4
ビッグエンディアン並びで格納される
uint8_t[N]
N
uint8_t
型の固定長配列
std::pair<char*,N>
N
char*
,uint8_t*
型の配列と配列長のペア。make_pair()
で生成できる。
pack_bytes
はコンテナオブジェクトをパラメータとし、続くパラメータで指定されるデータをバイト列としてコンテナに書き込みます。コンテナの.push_back()
メソッドで末尾に追加します。
可変引数パラメータに与えるデータは以下に示すとおりです。
uint8_t
1
uint16_t
2
ビッグエンディアン並びで格納される
uint32_t
4
ビッグエンディアン並びで格納される
uint8_t[N]
N
uint8_t
型の固定長配列
std::pair<char*,N>
N
char*
,uint8_t*
型の配列と配列長のペア。make_pair()
で生成できる。
smplbuf_u8?
.size()
uint8_t
型のsmplbuf<>
コンテナ。コンテナ長(.size()
)のデータを格納する。
この例では受信パケットの各属性やペイロードを別のバッファbuf
に再格納しています。
無全パケットのデータペイロードの生成やデータの取り出しで用いられるuint8_t
型のバイト配列の記述を簡素化するため。
上記はもっとも単純な記述だが、以下のようにByte array utilsを用いてバイト配列を生成できる。
detachIntDio()
割り込みハンドラの登録を解除します。
バイト列を分解し変数に格納
バイト列を分解し変数に格納します。
expand_bytes()
は、パラメータにuint8_t*
型のイテレータの組み合わせを指定します。これは解析対象の先頭と末尾の次のイテレータの指定となります。e
の位置まで解析が進んだ場合はエラーとなりnullptr
を返します。
展開にエラーがない場合は、次の読み出しを行うイテレータを戻します。
可変数パラメータには以下を指定します。
uint8_t
1
uint16_t
2
ビッグエンディアン並びとして展開する
uint32_t
4
ビッグエンディアン並びとして展開する
uint8_t[N]
N
uint8_t
型の固定長配列
std::pair<char*,N>
N
char*
,uint8_t*
型の配列と配列長Nのペアmake_pair()
で生成できる
この例では、まず4バイトの文字列を読み出しています。ここではmake_pair()
を用いて明示的に4バイト分のデータを読み出します。
戻されたイテレータnp
をもとに、次のデータを読み出します。次のデータはuint8_t
型、あとはuint16_t
型が5つ続いています。
無全パケットのデータペイロードの生成やデータの取り出しで用いられるuint8_t
型のバイト配列の記述を簡素化するため。
上記はもっとも単純な記述だが、以下のようにByte array utilsを用いてバイト配列から読み出せる。
collect_bits()
整数から指定したビット位置の値を取得し、指定した順番のビットマップを作成します。
パラメータbmに指定する値から、その後の可変数パラメータで指定する0..31のビット位置に対応する値を取り出します。取り出した値はパラメータ順に並べビットマップとして戻り値になります。
ビットマップの並び順は、最初のパラメータを上位ビットとし末尾のパラメータがbit0になります。
例ではb1のビット4,2,1,0を取り出すと (1,0,1,0) になります。これをb1010として0x10のように計算されます。
IOポート(DI,DO)の状態など各種ビットマップに値を参照・設定する場面があり、その記述を簡素化するため。
除算(`x*1000/255`)の替わり
8bit値(0..255など)の値とユーザが取り扱いやすい0..1000(千分率, ‰)値でスケール(拡縮)する。低い演算コストで実施するため、除算(x*1000/255
)の替わりに乗算とビットシフトによって近似計算します。
0..1000 を 0..127 にスケールします。(16646*x+65000)>>17
を用いて近似計算します。
0..127 を 0..1000 にスケールします。(2064000UL*x+131072)>>18
を用いて近似計算します。
0..1000 を 0..255 にスケールします。(33423*x+65000)>>17
を用いて近似計算します。
0..255 を 0..1000 にスケールします。(1028000UL*uint32_t(x)+131072)>>18
を用いて近似計算します。
0..1000 を 0..256 にスケールします。(33554*x+66000) >> 17
を用いて近似計算します。
注: x=999,1000は計算値が256になりますがuint8_t
の範囲として255を返します。
0..256 を 0..1000 にスケールします。(1028000UL*uint32_t(x)+131072)>>18
を用いて近似計算します。
ハードウェアに設定すべき値は0..255といった2進数が前提になることが多く、ユーザアプリケーションで取り扱う数は0..1000といった10進数基準のほうが扱いやすい。これらのスケール変換に除算を行わない式を定義した。
CRC8, XOR, LRC
チェックサムの計算で良く用いられる値です。
CRC8, XOR, LRC(アスキー形式で使用)の計算を行います。
CRC8_u8CalcU16(), CRC8_u8CalcU32()
はu16c, u32c
をビッグエンディアン並びとして、CRC8を計算します。
CRC8は、計算式や初期値などによって種類がありますが、本ライブラリでは多項式をX^8+X^5+X^4+1
(Polynomial Valueを0x31)をとしたものを使用しています。これはCRC8-CCITT や CRC8-Maximと呼ばれることがあります。
XORは各要素の排他的論理和 XOR をとったものです。
LRCは各要素の値の合計を計算し、下位8ビットの2の補数を取ります。結果、チェックサムを含め全要素を足し算すると0になります。
無線パケットのデータ列、アスキー形式のチェックサム(LRC)、各種センサーのデータチェック用に利用されるため、ライブラリ手続きとして追加した。
10、100または1000で割った商と余りを計算
10、100または1000で割った商と余りを計算します。
センサー値などで100倍した値をuint16_t
型にして受け渡しする場合がありますが、除算回路がないマイコンでの計算処理には相応の時間がかかるため、加算・減算・乗算とビットシフトを用いた近似計算と補正により計算を行います。
val
に計算したい値、rem
は余りの格納変数、neg
は符号を格納する変数を渡します。
戻り値は商の値(常に正)、rem
には余りの値(常に正)、neg
は負ならtrue
が格納されます。
計算アルゴリズムの制約(桁あふれ)からdiv100()
とdiv1000()
での計算可能な値域が決まっています。div100()
は-99999~99999までの値に対応し、div1000()
は-999999~999999までの値に対応します。
商を得る近似計算式
10倍程度になります。
割り算の結果を格納するdiv_result_i32
クラスにはformat()
メソッドを用い_div_chars
クラスオブジェクトを得ることが出来る。_div_chars()
クラスオブジェクトは文字列バッファを内包していてconst char*
型として文字列バッファにアクセスするメソッドが用意されている。また、Serial
オブジェクトに対する<<
演算子も実装している。
format()
メソッドのパラメータの1番目dig_quo
は出力桁数(符号部を含まず)を指定します。出力桁数に足りない場合(以下、不足桁)は空白または0
で埋めます。2番目のパラメータopt
は書式を指定します。
DIVFMT::STD
標準的な出力で、不足桁は空白で埋め、負の値に限り-
を付加します。
DIVFMT::PAD_ZERO
不足桁は0
で埋めます。
DIVFMT::SIGN_PLUS
正の値にも+
符号を付加します。
DIVFMT::PAD_ZERO_SIGN_PLUS
不足桁は0
で埋め、正の値にも+
符号を付加します。
DIVFMT::SIGN_SPACE
正の値の場合は+
符号の替わりに空白を付加します。
DIVFMT::PAD_ZERO_SIGN_SPACE
不足桁は0
で埋め、正の値の場合は+
符号の替わりに空白を付加します。
TWELITE 無線マイコンでは除算はコストが高い演算であるため、目的を限定した除算アルゴリズムを追加した。
ライブラリ内では温度・湿度といった一部のセンサー値、100倍の値(25.12℃なら2512)を用いて表現しているため、100で割った商と余りを得るための簡素な手続きを定義した。
dev_result_i32::format()
については、書式出力を行う際の煩雑さを避けるためである。