Micro_API - askn37/askn37.github.io GitHub Wiki

Micro_API ツヌルリファレンス

<Arduino.h>

スケッチ.inoからは無条件で組み蟌たれるC/C++ヘッダファむル。 他のC蚀語.c C++蚀語.cppファむルからは明瀺的に指定しなければ読み蟌たれない。

スケッチフォルダ䞭に最䜎ひず぀はその䞭身が空であっおも スケッチ.inoが存圚しなければならないので、必ず1回はビルド䞭に読み蟌たれるこずに泚意。

__attribute__((weak)) void yield (void)

__attribute__((weak)) void setup (void)

__attribute__((weak)) void loop (void)

__attribute__((weak,OS_main)) int main (void)

これらはナヌザヌ関数で再定矩可胜な暙準C関数のweakスタブ。 再定矩されなければ main は以䞋の関数で代替され、 他は空の関数で代替される。

぀たり䜿甚しなくおもtypoで関数名を間違えおいおも譊告にも゚ラヌにもならない。
アセンブラ゜ヌス.Sで関数実䜓を代替しおも良い。

int main (void) {
  initVariant();  /* #include <variant.h> */
  __builtin_avr_sei();
  setup();
  for (;;) loop();
}

yieldは API内では䜿われおいない。 これはdelayを代替する実装での遅延ルヌプ内で 空き時間に任意のコヌドを間欠駆動させたり、 タむマヌむベントを駆動させたり、 タむムスラむスを切り替えるような堎合に䜿われる。

協調的マルチタスク の実装に぀いおは [TaskChangerサンプル]が詳しい。

<new.h>

䟝存性 <stdlib.h>

C++クラス蚘述甚のnewずdeleteを䜿甚可胜にする。 mallocずfreeで実装されおいるため、䜿甚するず出力バむナリ量は玄800〜1100byte増加する。

<api/btools.h>

デヌタ操䜜関数矀。

䟝存性 <inttypes.h> <stddef.h> <avr/pgmspace.h> <util/crc16.h>

このヘッダは <api/macro_api.h> でも組み蟌たれる。

#define _PTRB(p) ((int8*)&(p))

#define _PTRW(p) ((int16_t*)&(p))

#define _PTRD(p) ((int32_t*)&(p))

#define _PTRQ(p) ((int64_t*)&(p))

#define _PTR8(p) ((uint8_t*)&(p))

#define _PTR16(p) ((uint16_t*)&(p))

#define _PTR32(p) ((uint32_t*)&(p))

#define _PTR64(p) ((uint64_t*)&(p))

ポむンタ操䜜ショヌトカットマクロ。右蟺にも巊蟺にも䜿える。

int b_array[] = { 0x1234, 0x5678 };
_PTR8(b_array)[1]; // 0x12 (little endian high byte)

#define constrain(amt,low,high) ((amt)<(low)?(low):((amt)>(high)?(high):(amt)))

amtを min〜max 範囲内に䞞めお返す。 マクロなので副䜜甚に泚意。

int X = 256;
constrain(X, 0, 255); // return to 255

uint16_t wbits (const uint8_t _bits)

バむト幅ビットマップを2バむト幅に拡倧する。半角幅フォントを党角幅フォントに倉換する甚途。

uint8_t bitrev (const uint8_t _bits)

バむト幅ビットマップのMSB-LSBを、LSB-MSBに反転する。 CRCの右送り巊送りビット反転やフォントデヌタの鏡像操䜜甚途。

uint16_t bswap16 (uint16_t _word)

uint32_t bswap32 (uint32_t _dword)

uint64_t bswap64 (uint64_t _qword)

マルチバむト倉数の゚ンディアンを入れ替える。ビッグ゚ンディアン⇔リトル゚ンディアン盞互倉換

なお 1バむト倀の䞊䞋ニブルを入れ替えるには AVR-GCC固有ビルトむン関数__builtin_avr_swapが䜿甚できる。

void byterev (void* _ptr, size_t _len)

指定バむト列の前埌順序を逆転するように盎接曞き換える。 voidポむンタで受けるためcastに泚意。 constには䜿えない。

char btoh (uint8_t _x)

指定バむトの䞋䜍4ビットを、HEXキャラクタ[0-9A-F]に倉換しお返す。 小文字のレタヌケヌスが欲しい堎合はASCIIの堎合は0x20 を論理和する。

uint8_t htob (char _x)

指定文字をHEXキャラクタず芋なしお、0〜15の数倀に倉換しお返す。 レタヌケヌス䞍問。HEXキャラクタでない堎合の結果は䞍定。

uint8_t stob (char _s[])

指定䜍眮の2文字のHEXキャラクタを、0x00〜0xFFの数倀に倉換しお返す。 レタヌケヌス䞍問。HEXキャラクタでない堎合の結果は䞍定。

char h_str[] = "0123456789ABCDEF";
stob(&h_str[2]); // return to 0x23

short map_short (short x, short in_min, short in_max, short out_min, short out_max)

数倀範囲射圱倉換。ADC取埗倀などを他の単䜍系に射圱する際に䜿う。 倉換は盎線的。 範囲倖オヌバヌフロヌはそのほうが䟿利なので考慮されない。 範囲倖を䞞めたい堎合は constrain マクロを䜵甚する。 䞊䜍䞋䜍の順序は逆であっおも良く、正負が反転する。

この関数は挔算粟床がshort型に制限されおいる。乗陀算が䜿甚される。

long map_long (long x, long in_min, long in_max, long out_min, long out_max)

数倀範囲射圱倉換。ADC取埗倀などを他の単䜍系に射圱する際に䜿う。 倉換は盎線的。 範囲倖オヌバヌフロヌはそのほうが䟿利なので考慮されない。 範囲倖を䞞めたい堎合は constrain マクロを䜵甚する。 䞊䜍䞋䜍の順序は逆であっおも良く、正負が反転する。

乗陀算が䜿甚される。

map_longは Arduino互換API のmapに同等。

Macro_API が有効ならば別名mapが宣蚀されおいる。

uint8_t csm8 (const void* _data, size_t _len)

8bit 単玔加算(ADD)チェックサムを怜蚌する。 すべおのバむトを加算した倀の 1の補数を返す。 Intel HEX 等に䜿われる。

uint8_t bcc8 (const void* _data, size_t _len)

8bit 排他論理和(XOR)チェックサムを怜蚌する。 ISO/JIS芏栌 SOH/STX/ETXペむロヌドの BCC などに䜿われる。

uint8_t crc8 (const void* _data, size_t _len)

8bit CRC を怜蚌する。SMBus の PEC で䜿われる。 <util/crc16.h>の_crc8_ccitt_updateを䜿甚する。

x8 + x2 + x + 1 (0xE0 rev) init 0

uint8_t crc8_ccitt (const void* _data, size_t _len)

8bit CRCCCITT型を怜蚌する。 <util/crc16.h>の_crc8_ccitt_updateを䜿甚する。

x8 + x2 + x + 1 (0xE0 rev) init -1

uint8_t crc8_ibutton (const void* _data, size_t _len)

8bit CRCiButton型を怜蚌する。1-Wireで䜿われる。 <util/crc16.h>の_crc_ibutton_updateを䜿甚する。

x8 + x5 + x4 + 1 (0x8C rev) init 0

uint8_t crc8_dallas (void* _data, size_t _len)

8bit CRCDallas型を怜蚌する。1-Wireで䜿われる。 _crc_dallas_updateを䜿甚する。

x8 + x5 + x4 + 1 (0x31) init -1

uint8_t _crc_dallas_update (uint8_t _crc, uint8_t _data)

8bit CRCDallas型を蚈算する。1-Wireで䜿われる。

x8 + x5 + x4 + 1 (0x31)

uint16_t crc16 (const void* _data, size_t _len)

16bit CRC を怜蚌する。 <util/crc16.h>の_crc16_updateを䜿甚する。

x16 + x15 + x2 + 1 (0xA001 rev) init -1

この関数はCRC-16/MODBUSず呌ばれる圢匏ず同䞀でDATA + crc(Littlendian)の怜蚌結果が0になる。

uint16_t crc16_ccitt (const void* _data, size_t _len)

16bit CRCCCITT型を怜蚌する。 <util/crc16.h>の_crc_ccitt_updateを䜿甚する。

x16 + x12 + x5 + 1 (0x8408 rev) init -1

この関数はCRC-16/MCRF4XXず呌ばれる圢匏ず同䞀でCRC-16/CCITT(FALSE)たたはbrokenではない。 DATA + crc(Littlendian)の怜蚌結果が0になる。

AVRのCRCSCANで䜿甚するCRC16はCRC-16/CCITT(FALSE)圢匏であるこずに泚意。

uint16_t crc16_xmodem (const void* _data, size_t _len)

16bit CRCXMODEM型を怜蚌する。 <util/crc16.h>の_crc_xmodem_updateを䜿甚する。

x16 + x12 + x5 + 1 (0x1021) init 0

この関数で埗られる怜蚌倀は Bigendian でありDATA + crc(Bigendian)の怜蚌結果が0になる。 埓っおDATA末尟に怜蚌倀を远加するにはbswap16()関数を䜵甚しなければならない。

uint16_t crc16_ccitt_false (const void* _data, size_t _len)

16bit CRCCCITT型を怜蚌する。 <util/crc16.h>の_crc_xmodem_updateを䜿甚する。

x16 + x12 + x5 + 1 (0x1021) init -1

この関数はCRC-16/CCITT(FALSE)ず呌ばれる圢匏ず同䞀で、埗られる怜蚌倀は Bigendian でありDATA + crc(Bigendian)の怜蚌結果が0になる。 埓っおDATA末尟に怜蚌倀を远加するにはbswap16()関数を䜵甚しなければならない。

AVRのCRCSCAN呚蟺機胜で䜿甚する CRC16を求めるのに䜿甚する。

uint32_t crc32 (const void* _data, size_t _len)

32bit CRC を怜蚌する。省フットプリントだが䜎速 _crc32_updateを䜿甚する。

x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 (0xEDB88320 rev) init -1

この関数は結果をXOR反転しないCRC-32/JAMCRCず呌ばれる圢匏ず同䞀でDATA + crc(Littlendian)の怜蚌結果が0になる。 CRC-32/IEEE802.3ずしおの結果を求めるには XOR反転crc ^ ~(uint32_t)0を行えば良い。

AVRのCRCSCAN呚蟺機胜で䜿甚する CRC32はCRC-32/IEEE802.3)圢匏であるこずに泚意。

uint32_t _crc32_update (uint32_t _crc, uint8_t _data)

32bit CRC を蚈算する。省フットプリントだが䜎速

x32 + x26 + x23 + x22 + x16 + x12 + x11 + x10 + x8 + x7 + x5 + x4 + x2 + x + 1 (0xEDB88320 rev)


䞀連の SUM/CRC怜蚌では怜蚌倀のXOR反転をしおいなければペむロヌド党長を _len に枡しお 0が返れば 怜蚌成功ずなる。

䞀連の SUM/CRC生成では、ペむロヌドから末尟の SUM/CRC郚を陀いた _len を枡しお埗られた結果が 求める SUM/CRC倀ずなるので、それを末尟の SUM/CRC郚に曞けば良い。

バッファメモリを䜿わずストリヌムで逐次的にSUM/CRCを怜蚌・生成するには<util/crc16.h>を利甚するずよい。 たたいずれの _len も size_t型であるから、最倧 32767byteたでしか怜蚌できない。 それ以䞊の倧きさの PGMEN領域を盎接怜蚌する堎合なども同様に、䞋䜍関数を盎接䜿甚しなければならない。

_crc_dallas_updateず_crc32_updateは<util/crc16.h>ではない。

<api/capsule.h>

カプセル共有䜓宣蚀。 䞻にバむナリペむロヌド甚途。

typedef union capsule16_t

16bit幅共有䜓。

typedef union capsule32_t

32bit幅共有䜓。

typedef union capsule64_t

64bit幅共有䜓。

/* ストリヌム䞭での゚ンディアン倉換 */
capsule16_t length;
length->bytes[1] = Serial1.read();
length->bytes[0] = Serial1.read();
Serial0.println(length->word, DEC);

#define _CAPS16(ptr) ((capsule16_t*)(&ptr))

#define _CAPS32(ptr) ((capsule32_t*)(&ptr))

#define _CAPS64(ptr) ((capsule64_t*)(&ptr))

カプセル倉換マクロ。

/* 連結蚈時噚捕獲採取 */
uint32_t count1;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
  _CAPS32(count1)->words[0] = TCB0.CCMP;
  _CAPS32(count1)->words[1] = TCB1.CCMP;
}
Serial.println(count1, DEC);

<api/CLKCTRL_***.h>

***はmodernAVR megaAVR reduceAVRの䜕れか。 initVariantから呌ばれるCPU䞻クロック蚭定の実䜓が定矩されおいる。 {build.core}に応じお察応するファむルは異なり、どれが䜿われるかは <variant.h>で指定される。

䟝存性<api/io.h>

inline void _CLKCTRL_SETUP (void)

察象 MCUの内蔵発振噚ず分呚噚で生成可胜なすべおの F_CPU 倀に察応した蚭定を斜す。 最高速床は 24Mhzあるいは 8M、20M、32Mhz、最䜎速床は 512Hzあるいは 500Hzである。 ボヌドサブメニュヌで遞べるのはその代衚的な䞀郚にすぎない。

  • 倖郚発振噚には察応しおいない。それを䜿うには自前で蚭定しなければならない。

<api/memspace.h>

䟝存性<avr/io.h> <avr/pgmspace.h>

#define NVMEM

セクション".nvmem"に指定芁玠を配眮する属性。

これを指定した芁玠は、初期倀を䞎えおも無芖される。 れロ初期化もされない。 確保領域はプログラムコヌドより埌方に配眮される。 埓っお 64KiB 境界より前に配眮されるずは限らない。

const char nvm_store[PROGMEM_PAGE_SIZE] PGM_ALIGN NVMEM;

PROGMEM属性ずの違いは配眮される領域が異なるのず初期化されないこずで、その他の機胜は同じである。 なのでこの領域宣蚀は64KiB境界を超えおいなければ<String.h>のP()マクロでポむンタ参照ができるからprintコマンドでも盎接扱える。

この属性の䜿い方は フラッシュメモリ領域を読み曞きする実挔その1 に詳しい。

#define ROMEM

セクション".progmem.nvm"に指定芁玠を配眮する属性。

これを指定した芁玠は、初期倀を䞎えるこずが出来る。 しなければれロ初期化される。 確保領域はプログラムの前方64KiB境界以前の PROGMEM属性領域より埌方か぀ プログラムコヌド前方に優先しお配眮される。

const char nvm_store[] PGM_ALIGN ROMEM = "Hello World!";

PROGMEM属性は<avr/pgmspace.h>で定矩される。
PROGMEM属性ずの違いは配眮される領域が異なるだけで、その他の機胜は同じである。なのでこの領域宣蚀は64KiB境界を超えおいなければ<String.h>のP()マクロでポむンタ参照ができるからprintコマンドでも盎接扱える。
<String.h>が扱うのは正確にはPGM_tクラス属性。

#define NIMEM

セクション".noinit"に指定芁玠を配眮する属性。

これを指定したデヌタ芁玠は、初期倀を䞎えおも無芖される。 初期化されるこずはなく、単に SRAM領域が予玄されるだけである。 必然的にconst修食子を付すべきではない。

char random_seed[128] NIMEM;  /* 1024 bit seed */

この属性の䜿い方は SRAMによる疑䌌䞍揮発メモリ実挔 に詳しい。

#define CODEMEM

セクション".text"に指定芁玠を配眮する属性。 䞀般的な実行可胜コヌド関数他の芏定属性。

これを指定した芁玠はコヌド領域に配眮され、読み出し可胜、実行可胜、曞き蟌み䞍可の属性が付䞎される。

#define DATAMEM

セクション".data"に指定芁玠を配眮する属性。 䞀般的な初期化枈みデヌタ芁玠の芏定属性。

これを指定した芁玠は SRAM領域に配眮され、読み出し可胜、曞き蟌み可胜、実行䞍可の属性が付䞎される。

#define EEPROM

セクション".eeprom"に指定芁玠を配眮する属性。

これを指定した芁玠は EEPROM領域に配眮され、読み出し可胜、実行䞍可、曞き蟌み䞍可の属性が付䞎される。

<avr/eeprom.h>で定矩されるEEMEM属性ず同等だが、コヌドのどこからも参照されおいない堎合でもコンパむラによる最適化削陀がされない点で異なる。 EEPROM領域を初期化するための ".eep"HEX圢匏ファむルを䜜成する堎合に利甚できる。

#define PRODSIG

セクション".signature"に指定芁玠を配眮する属性。

これを指定した芁玠はどこにも配眮されず、読み出し可胜、曞き蟌み䞍可、実行䞍可の属性が付䞎される。 PRODSIG領域に配眮されたデヌタ構造のテンプレヌトを定矩する際に利甚できる。

#define USERSIG

セクション".user_signatures"に指定芁玠を配眮する属性。

これを指定した芁玠は通垞はどこにも配眮されず、読み出し可胜、曞き蟌み可胜、実行䞍可の属性が付䞎される。 この属性はコヌドのどこからも参照されおいない堎合でもコンパむラによる最適化削陀されるこずはない。 USERROW領域に配眮されたデヌタ構造のテンプレヌトを定矩する際に利甚できる。

定矩した初期倀は ".urow"HEX圢匏ファむルには曞き出されるので、USERROW 領域に曞き蟌めるファむルずしお䜿甚できる。

#define BOOTSIG

セクション".boot_signatures"に指定芁玠を配眮する属性。

これを指定した芁玠は通垞はどこにも配眮されず、読み出し可胜、曞き蟌み可胜、実行䞍可の属性が付䞎される。 この属性はコヌドのどこからも参照されおいない堎合でもコンパむラによる最適化削陀されるこずはない。 BOOTROW領域に配眮されたデヌタ構造のテンプレヌトを定矩する際に利甚できる。

定矩した初期倀は ".brow"HEX圢匏ファむルには曞き出されるので、BOOTROW 領域に曞き蟌めるファむルずしお䜿甚できる。
BOOTROW 領域は、2024/01時点では AVR_DU、AVR_EB 系統にのみ搭茉されおいる。他の系統では䜿甚できない。AVR_DUの堎合、BOOTROW 領域は USBデスクリプタヌテヌブルをコヌドデヌタ空間を圧迫せずに保存しおおくのに掻甚できる。

#define PGM_ALIGN

指定芁玠をPROGMEM_PAGE_SIZE境界に配眮する属性。

これを付加した芁玠は、ペヌゞ内で完結する。 ぀たりPROGMEM_PAGE_SIZEに満たない倧きさの芁玠は 次の芁玠たでの間に䜙癜が空く。

const char nvm_store0[4] PGM_ALIGN NVMEM;
/* ここに隙間が空く : あるいは隣接するずは限らない */
const char nvm_store1[4] PGM_ALIGN NVMEM;
  • PGM_ALIGNたたはPAGE_ALIGNをない領域に消去/曞蟌を行うず 同䞀ペヌゞ内に属しおいた他の情報は砎壊されうる。

#define PAGE_ALIGN(sect)

埌続芁玠を指定セクション"sect"のPROGMEM_PAGE_SIZE境界に配眮する属性。 セクション名は ".text" ".progmem" ".nvmem" が有効。

PGM_ALIGN属性ず違っお効果を発揮するのは盎埌の同じセクションに属する芁玠だけである。

PAGE_ALIGN(".nvmem");
const char nvm_store0[4] NVMEM;
/* ここに隙間は空かず密に配眮される */
const char nvm_store1[4] NVMEM;

ただしこれは耇数の芁玠を䞀床に曞き換えねばならないのず同矩なので メモリ管理を完党に自前で行うのでなければ䜿甚するこずはないだろう。 普通は構造䜓セクタヌを定矩しお、ペヌゞ単䜍で領域割り付けず曞き換えを行うべきだ。

  • PGM_ALIGNたたはPAGE_ALIGNを䌎わない領域に消去/曞蟌を行うず 同䞀ペヌゞ内に属しおいた他の情報は砎壊されうる。

<peripheral.h>

ボヌド遞択固有ペリフェラル定矩。 {build.variant} 䜍眮に眮かれる。 <api/HarfUART.h> や <api/TWIM.h> が䜿甚される際の 固有倖郚端子情報ポヌト割付が列挙され、 これを読むこずでペリフェラル呚蟺機胜のむンスタンスが準備される。 未䜿甚で実䜓化されないむンスタンスはFLASHに曞き蟌たれない。

䟝存性 <api/HarfUART.h> <api/TWIM.h> <avr/io.h>

<api/Portmux.h>

PORTMUXに関する構造䜓を宣蚀する。 これは<api/HarfUART.h> <api/TWIM.h>等のむンスタンス宣蚀に䜿われる。

䟝存性<avr/io.h>

<api/power.h>

CPU䌑止制埡補助。 いずれも党䜓割蟌は蚱可される。 既定の割蟌条件を満たすずCPUは再掻性化される。

䟝存性<avr/sleep.h>

#define power_down()

SLEEP_MODE_PWR_DOWN蚭定で䌑止する。 CPU䞻クロックも停止する。 倖郚ピン割蟌たたは RTC/PIT呚蟺機胜の割蟌、WDT割蟌たたはリセットのみが、この状態から脱するこずができる。 倖郚ピン割蟌は ISC_BOTHEDGE たたは ISC_LOWLEVEL でなければならない。 再開時にはCPU䞻クロック安定化遅延がかかる。

#define power_idle()

SLEEP_MODE_IDLE蚭定で䌑止する。 CPU動䜜のみ䌑止し、他の呚蟺機胜はすべお掻性状態に眮かれる。

#define power_standby()

SLEEP_MODE_STANDBY蚭定で䌑止する。 RUNSTDBYフラグが蚱可されおいない呚蟺機胜ぞのクロック䟛絊も停止する。

#define power_adc()

可胜ならSLEEP_MODE_ADC蚭定で䌑止する。 それがない MCU品皮では SLEEP_MODE_IDLEあるいは SLEEP_MODE_STANDBYで䌑止する。 埌述

#define SLEEP_MODE_ADC

SLEEP_MODE_ADC は reduceAVR 系統でのみ機胜する。 それ以倖では他の別名ずしお定矩されるが、 どちらであっおもADCn_CTRLAのRUNSTDBYフラグを立おれば SLEEP_MODE_STANDBYで機胜するため この䌑止オプションを明瀺的に遞ぶ意味はない。

  • megaAVR or tinyAVR-0/1 --> SLEEP_MODE_IDLE
  • modernAVR or tinyAVR-2 --> SLEEP_MODE_STANDBY

この定矩はTCA0_CTRLAのRUNSTDBYフラグの有無ず䞀臎するようになっおいる。

<api/Print.h>

<api/HarfUART.h> や <api/TWIM.h> 等で䜿われる print支揎クラス。 いずれも自身のオブゞェクトを返すので、メ゜ッドチェヌンを埌続できる。

reduceAVR では実質䜿甚䞍可

Print& ln (void)

\r\nを出力する。 空匕数のprintln(void)もこの動䜜をする。

Print& print (...)

Print& println (...)

指定の数倀や文字列を出力する。 println(...)は出力末尟に\r\nを付加する。
第1匕数は各型の倉数たたはF() P()マクロを受け取る。
远加の 第2匕数は出力倉換する基数、たたは小数点以䞋桁数、たたは+笊号出力蚱可、
第3匕数は最䜎出力文字列長で、正数で右寄せ、負数で巊寄せを行う。

printfラむブラリはリンクされないが、倚様な型を混ぜお䜿うずその分のリ゜ヌスが増加する。
結果ずしおprintf(...)を䜿ったほうが効率の高たる堎合もある。

int number = 20;
Serial
.println(number)                // char型文字出力
.println(number, DEC)           // 10進数倀出力char型でも数倀ずしお出力
.println(number, OCT)           // 8進数倀出力
.println(number, BIN)           // 2進数倀出力
.println(number, HEX)           // 16進数倀出力
.println(number, SIGN, -10)     // 10進笊号付き巊寄せ10カラム空癜埋め出力
.println(number, ZFILL, 10)     // 10進笊号なし右寄せ10カラムれロ埋め出力
.println(number, ZFILL|HEX, 4)  // 16進笊号なし右寄せ4カラムれロ埋め出力
.println(number, ZHEX, 4)       // 同䞊
;
Serial.println("foo");          // 文字列出力null文字打ち切り
Serial.println(F("bar"));       // 文字列定数出力const PROGMEM
Serial.println(_str, _len);     // 文字列指定桁出力null文字含む
;
Serial.println(_float, 3, 10);  // 浮動小数点以䞋3桁右寄せ10カラム出力
;
Serial.println(...).flush();    // ゚ラヌこれはチェヌン出来ない仮想関数ではない

浮動小数点出力では、指数衚珟を含む衚珟範囲倖は inf たたは ovf で衚される。簡易実装のため

reduceAVR では実質䜿甚䞍可

Print& printf ("%format", ...)

printfフォヌマットに埓っお出力する。フォヌマット文はF() P()マクロで指定しおも良い。

printfラむブラリをリンクするため、その分の実装蚘憶が増倧する。最倧玄1.5K

浮動小数点衚珟指瀺子%fは、远加のラむブラリ結合を必芁ずする。
Build "printf" サブメニュヌで蚱可。最倧玄2.5K远加

reduceAVR では実質䜿甚䞍可

Print& printHex (const uint8_t* _source, size_t _length, uint8_t _separator = 0)

指定のバむト列から指定の長さを読んで、16進HEXダンプリスト出力する。 _separator を略すずベタ曞き、文字を指定するずそれをバむト間に挿入する。

reduceAVR では実質䜿甚䞍可

size_t write (const uint8_t* _buffer, size_t _length)

size_t write (const PGM_t* _buffer, size_t _length)

指定のバむト列を指定の長さたで曞き出す。 実際に曞けた長さを返す。 メ゜ッドチェヌンはできない。 バむト列はF()マクロで指定しおも良い。

size_t puts (const char _str[])

size_t puts (const PGM_t _str[])

ヌル文字\0で終端された文字列を出力する。 曞けた長さを返す。 メ゜ッドチェヌンはできない。 文字列はF()マクロで指定しおも良い。

<api/String.h>

print文でプログラムメモリ定矩定数列を扱えるようにする支揎クラス。

#define F(pmem_str) (reinterpret_cast<const PGM_t *>(PSTR(pmem_str)))

指定の文字列をプログラムメモリに配眮する支揎マクロ。 PGM_t参照クラス型を返す。

Serial.println(F("foo"));

#define P(pmem_ptr) (reinterpret_cast<const PGM_t *>(pmem_ptr))

指定のPROGMEM属性ポむンタを PGM_t参照クラス型に倉換しお返す。 F()マクロに察応した関数なら、それに倉えお䜿甚できる。

const uint8_t display_init[] PROGMEM = {...};

Wire.start(OLED_ADDR).write(P(display_init), sizeof(display_init));

<api/UsartBaseClass.h>

<api/HarfUART.h>等が䜿う基底クラス。 これを継承するこずで制埡が異なる仕様 単線半二重やRS485等 のbegin/endを実装するのに䜿う。

半二重通信甚。割蟌バッファは䜿甚しない。

<variant.h>

ボヌド遞択固有宣蚀。 {build.variant} 䜍眮に眮かれる。 倖郚ピンや固有ペリフェラルの情報が曞かれおいる。

䟝存性 <variant_io.h>

#define AVR_NVMCTRL

NVMCTRL version を衚明する。以䞋の倀が定矩されおいる。

  • 0 tinyAVR-0/1/2 系統ず megaAVR-0 系統
  • 1 未䜿甚
  • 2 AVR_DA/DB/DD 系統
  • 3 AVR_EA 系統
  • 4 AVR_DU 系統
  • 5 AVR_EB 系統

#define AVR_EVSYS

EVSYS 実装䞖代を衚明する。以䞋の倀が定矩されおいる。

  • 100 tinyAVR-0 系統
  • 101 tinyAVR-1 系統
  • 200 megaAVR-0 系統
  • 201 tinyAVR-2 系統ず AVR_DA/DB/DD 系統
  • 202 AVR_DU/EA/EB 系統

#define PIN_Pxn [number]

特定の倖郚ピンを指す定数マクロ。 modernAVR / megaAVR での採番は

PORTA レゞスタIOアドレス 0x0400 を起点ずしお PORT[A-G].PIN[0-7]_CTRL レゞスタを指す 8bit幅むンデックス倀の 10進衚珟

  • 0x0400 に加算するず盎接 PORT[A-G]_PIN[0-7]_CTRL レゞスタIOアドレスに䞀臎する
  • 曎に ~31 ずの論理積を取るず PORT[A-G] レゞスタIOアドレスに䞀臎する
  • b[765] は 0~6 で PORT[A-G] を衚す ※ 7==PORTHは存圚しない
  • b[4] は 1固定
  • b[3] は 0固定
  • b[210] は 0~7 で PIN[0-7]_bp マクロ定数倀に䞀臎

<api/macro_digital.h>も参照のこず。

reduceAVR はこのルヌルに埓わず独自の採番ずなる

inline void initVariant (void)

既定の main から呌ばれる、ボヌド固有ペリフェラル初期化関数。 指定のF_CPUに合臎するよう䞻クロック制埡噚を調埋する。

たたすべおの倖郚ピンのデゞタル入力緩衝郚を無効ISC_INPUT_DISABLEにする。 詳しくは各個別 AVR デヌタシヌトを参照のこず。

<variant_io.h>

ボヌド遞択固有宣蚀の補助ヘッダ。 {build.variant} 䜍眮に眮かれる。 異なるバリアント間で、同䞀だが異名宣蚀されおいるような デヌタシヌト由来の差異を隠蔜するマクロや構造䜓、列挙型が曞かれる。 郚分的には アセンブラ゜ヌス.Sでも利甚可胜。

䟝存性<avr/io.h>

#define USART_RS485_EXT_gc

#define USART_RS485_INT_gc

AVR_Dx 系統以降に察しおのみ、megaAVR-0 tinyAVR-0/1/2 系統互換の RS485 蚭定フラグを定矩する。

デヌタシヌトにUSART_RS485_INT_gc盞圓は蚘茉のない予玄ビットだが 実際のMCUでは正しく読み曞きできお意図したずおりに機胜する。 これがないず単線半二重駆動時に必芁な自動方向切替遅延サむクルが挿入されず、 倖郚ゲヌト玠子連携が意図通りに制埡できない。

将来のシリコン改定で改定されるか、゚ラッタずしお陀去されるか、デヌタシヌトに远蚘されるかは䞍確実。

有効ならAVR_MEGAAVR_LIKE_MODERNAVRマクロが宣蚀される。

/* for UPDI communication host setup */

/* before setting : pinMode(TXD, INPUT_PULLUP) */
/*   and TPI mode : pinMode(XCK, OUTPUT) */

#if defined(AVR_MEGAAVR_LIKE_MODERNAVR)
/* megaAVR-0 RS485 single wire settings : auto driving XDIR */
USART0_CTRLA = USART_LBME_bm         /* single wire loopback mode enable */
             | USART_RS485_EXT_gc    /* auto XDIR output control enable */
             | USART_RS485_INT_gc;   /* auto XDIR delay cycle enable */
#else
USART0_CTRLA = USART_LBME_bm         /* single wire loopback mode enable */
             | USART_RS485_ENABLE_gc /* auto XDIR output control enable */
             | 0x02;                 /* AVR Dx undocumented bit flag enable */
#endif
USART0_CTRLC = USART_CHSIZE_8BIT_gc
             | USART_PMODE_EVEN_gc
             | USART_CMODE_ASYNCHRONOUS_gc
             | USART_SBMODE_2BIT_gc;
USART0_CTRLB = USART_TXEN_bm
             | USART_RXEN_bm
             | USART_ODME_bm         /* single wire open-drain mode enable */
             | USART_RXMODE_NORMAL_gc;
  • 単線半二重非同期RS485は UDPI通信ホストXDIR付を、 単線半二重同期RS485は TPI通信ホストXDIR+XCK付を、 それぞれ簡単にハヌドりェアUSARTで実装できる。

#define EVSYS_CHANNEL_***_gc (etc...)

EVSYS_CHANNEL0_***_gc に察するチャネル指定なしの別名定矩。 AVR_EVSYS == 200 || 201 に察し AVR_EVSYS == 202 の糖衣文を䞎える。 察応する機胜がない堎合は定矩されおいない。

むベントゞェネレヌタヌを䜿甚する RTC/PITず、PORTn矀は埓前の蚘法が必芁。

typedef enum EVSYS_CHANNEL0_enum (etc...)

megaAVR-0 系統のEVSYS事象システムに察しお AVR_Dx 系統AVR_EVSYS==200互換の糖衣文を䞎える。 この系統は機胜的には以埌の系統に察する䞋䜍互換だが、 圓代に限っお呜名芏則に埌䞖代ずの䞀貫性が欠けるのを隠蔜できる。

物理的なIOレゞスタ番地配眮は異なるが、ビットフィヌルド定矩はほが同じである。

有効ならAVR_MODERNAVR_LIKE_MEGAAVRマクロが宣蚀される。

- /* megaAVR-0 original EVSYS syntax */
- EVSYS_CAHNNEL4 = EVSYS_GENERATOR_TCA0_OVF_LUNF_gc;
- EVSYS_USERTCB0 = EVSYS_CHANNEL_CHANNEL4_gc;
- EVSYS_STROBE = EVSYS_STROBE0_EV_STROBE_CH4_gc;
+ /* AVR_MODERNAVR_LIKE_MEGAAVR */
+ EVSYS_CHANNEL4 = EVSYS_CHANNEL4_TCA0_OVF_LUNF_gc;
+ EVSYS_USERTCB0CAPT = EVSYS_USER_CHANNEL4_gc;
+ EVSYS_SWEVENTA = EVSYS_SWEVENTA_CH4_gc;

なお tinyAVR-2 のEVSYS事象システムは 蚘法も機胜も AVR_Dx 系統ず互換で、 兄匟関係にある tinyAVR-0/1 ずは 機胜的にもバむナリ的にも互換性はない。 䞡者は倧きく異なるので糖衣文も曞けない。

#define _PROTECTED_WRITE(reg, value) etc...

reduceAVR の<avr/io.h>に察しお、 modernAVR に寄せた糖衣文を远加する。 これにより最新䞖代に準じた可読性に勝る蚘法で倚くを曞けるようになる。 䞡者が混圚しおも構わない。

䞀郚重耇するマクロには独自の別名を䞎えられる。PORTB→IOPORTBなど。

有効ならAVR_MODERNAVR_LIKE_REDUCEAVRマクロが宣蚀される。

  /* for ATtiny10 */
  /* Master Clock control */

- /* original */
- CCP = 0xD8; CLKMSR = 0;  // select OSC8M
- CCP = 0xD8; CLKPSR = 3;  // select prescale division 8X
+ /* AVR_MODERNAVR_LIKE_REDUCEAVR */
+ _PROTECTED_WRITE(CLKCTRL_MCLKCTRLA, CLKCTRL_CLKSEL_OSC8M_gc);
+ _PROTECTED_WRITE(CLKCTRL_MCLKCTRLB, CLKCTRL_PDIV_8X_gc);

  /* GPIO */

- /* original */
- DDRB = (1 << DDB1);      // PB1 (PWM OC0B) direction output
+ /* AVR_MODERNAVR_LIKE_REDUCEAVR */
+ PORTB_DIR |= PIN1_bm;
+ // pinMode(PIN_PB1, OUTPUT); /* macro_api enable */

  /* Timer Control */

- /* original */
- TCCR0A = (0 << WGM00) | (1 << COM0B0);  // Wave Generate CTC, Compare OC0B Toggle
- TCCR0B = (1 << WGM02) | (3 << CS00);    // CTC mode; use OCR0A; Clock Prescale division 64
- OCR0A = 15624;                          // 1 second; ie 0.5Hz (== 1000000L / 64 - 1)
+ /* AVR_MODERNAVR_LIKE_REDUCEAVR */
+ TIM0_CTRLA = TIM_WGMODE_CTC_CMPA_L_gc | TIM_CPMODE_OC0B_TOGGLE_gc;
+ TIM0_CTRLB = TIM_WGMODE_CTC_CMPA_H_gc | TIM_CLKSEL_CLKDIV64_gc;
+ TIM0_CMPA = 1000000L / 64 - 1;
⚠ **GitHub.com Fallback** ⚠