Micro_API - askn37/askn37.github.io GitHub Wiki
ã¹ã±ãã.inoããã¯ç¡æ¡ä»¶ã§çµã¿èŸŒãŸããC/C++ããããã¡ã€ã«ã
ä»ã®Cèšèª.c C++èšèª.cppãã¡ã€ã«ããã¯æç€ºçã«æå®ããªããã°èªã¿èŸŒãŸããªãã
ã¹ã±ãããã©ã«ãäžã«æäœã²ãšã€ã¯ïŒãã®äžèº«ã空ã§ãã£ãŠãïŒ
ã¹ã±ãã.inoãååšããªããã°ãªããªãã®ã§ãå¿ ã1åã¯ãã«ãäžã«èªã¿èŸŒãŸããããšã«æ³šæã
ãããã¯ãŠãŒã¶ãŒé¢æ°ã§åå®çŸ©å¯èœãªæšæºC颿°ã®weakã¹ã¿ãã
åå®çŸ©ãããªããã° main ã¯ä»¥äžã®é¢æ°ã§ä»£æ¿ããã
ä»ã¯ç©ºã®é¢æ°ã§ä»£æ¿ãããã
ã€ãŸã䜿çšããªããŠãïŒtypoã§é¢æ°åãééããŠããŠãïŒèŠåã«ããšã©ãŒã«ããªããªãã
ã¢ã»ã³ãã©ãœãŒã¹.Sã§é¢æ°å®äœã代æ¿ããŠãè¯ãã
int main (void) {
initVariant(); /* #include <variant.h> */
__builtin_avr_sei();
setup();
for (;;) loop();
}yield㯠APIå
ã§ã¯äœ¿ãããŠããªãã
ããã¯delayã代æ¿ããå®è£
ã§ã®é
å»¶ã«ãŒãå
ã§
空ãæéã«ä»»æã®ã³ãŒãã鿬 é§åããããã
ã¿ã€ããŒã€ãã³ããé§åããããã
ã¿ã€ã ã¹ã©ã€ã¹ãåãæ¿ãããããªå Žåã«äœ¿ãããã
å調çãã«ãã¿ã¹ã¯ ã®å®è£ ã«ã€ããŠã¯ [TaskChangerãµã³ãã«]ã詳ããã
äŸåæ§ïŒ <stdlib.h>
C++ã¯ã©ã¹èšè¿°çšã®newãšdeleteã䜿çšå¯èœã«ããã
mallocãšfreeã§å®è£
ãããŠããããã䜿çšãããšåºåãã€ããªéã¯çŽ800ã1100byteå¢å ããã
ããŒã¿æäœé¢æ°çŸ€ã
äŸåæ§ïŒ <inttypes.h> <stddef.h> <avr/pgmspace.h> <util/crc16.h>
ãã®ãããã¯
<api/macro_api.h>ã§ãçµã¿èŸŒãŸããã
ãã€ã³ã¿æäœã·ã§ãŒãã«ãããã¯ããå³èŸºã«ã巊蟺ã«ã䜿ããã
int b_array[] = { 0x1234, 0x5678 };
_PTR8(b_array)[1]; // 0x12 (little endian high byte)amtã minãmax ç¯å²å
ã«äžžããŠè¿ãã
ãã¯ããªã®ã§å¯äœçšã«æ³šæã
int X = 256;
constrain(X, 0, 255); // return to 255ãã€ãå¹ ããããããã2ãã€ãå¹ ã«æ¡å€§ãããåè§å¹ ãã©ã³ããå šè§å¹ ãã©ã³ãã«å€æããçšéã
ãã€ãå¹ ããããããã®MSB-LSBããLSB-MSBã«å転ããã CRCã®å³éãïŒå·Šéããããå転ããã©ã³ãããŒã¿ã®é¡åæäœçšéã
ãã«ããã€ã倿°ã®ãšã³ãã£ã¢ã³ãå ¥ãæ¿ãããïŒããã°ãšã³ãã£ã¢ã³âãªãã«ãšã³ãã£ã¢ã³çžäºå€æïŒ
ãªã 1ãã€ãå€ã®äžäžããã«ãå
¥ãæ¿ããã«ã¯
AVR-GCCåºæãã«ãã€ã³é¢æ°__builtin_avr_swapã䜿çšã§ããã
æå®ãã€ãåã®ååŸé åºãé転ããããã«çŽæ¥æžãæããã
voidãã€ã³ã¿ã§åããããcastã«æ³šæã
constã«ã¯äœ¿ããªãã
æå®ãã€ãã®äžäœ4ãããããHEXãã£ã©ã¯ã¿[0-9A-F]ã«å€æããŠè¿ãã
å°æåã®ã¬ã¿ãŒã±ãŒã¹ã欲ããå Žåã¯ïŒASCIIã®å Žåã¯ïŒ0x20 ãè«çåããã
æå®æåãHEXãã£ã©ã¯ã¿ãšèŠãªããŠã0ã15ã®æ°å€ã«å€æããŠè¿ãã ã¬ã¿ãŒã±ãŒã¹äžåãHEXãã£ã©ã¯ã¿ã§ãªãå Žåã®çµæã¯äžå®ã
æå®äœçœ®ã®2æåã®HEXãã£ã©ã¯ã¿ãã0x00ã0xFFã®æ°å€ã«å€æããŠè¿ãã ã¬ã¿ãŒã±ãŒã¹äžåãHEXãã£ã©ã¯ã¿ã§ãªãå Žåã®çµæã¯äžå®ã
char h_str[] = "0123456789ABCDEF";
stob(&h_str[2]); // return to 0x23æ°å€ç¯å²å°åœ±å€æãADCååŸå€ãªã©ãä»ã®åäœç³»ã«å°åœ±ããéã«äœ¿ãã
倿ã¯çŽç·çã
ç¯å²å€ãªãŒããŒãããŒã¯ïŒãã®ã»ãã䟿å©ãªã®ã§ïŒèæ
®ãããªãã
ç¯å²å€ãäžžãããå Žå㯠constrain ãã¯ãã䜵çšããã
äžäœäžäœã®é åºã¯éã§ãã£ãŠãè¯ããæ£è² ãå転ããã
ãã®é¢æ°ã¯æŒç®ç²ŸåºŠãshortåã«å¶éãããŠãããä¹é€ç®ã䜿çšãããã
æ°å€ç¯å²å°åœ±å€æãADCååŸå€ãªã©ãä»ã®åäœç³»ã«å°åœ±ããéã«äœ¿ãã
倿ã¯çŽç·çã
ç¯å²å€ãªãŒããŒãããŒã¯ïŒãã®ã»ãã䟿å©ãªã®ã§ïŒèæ
®ãããªãã
ç¯å²å€ãäžžãããå Žå㯠constrain ãã¯ãã䜵çšããã
äžäœäžäœã®é åºã¯éã§ãã£ãŠãè¯ããæ£è² ãå転ããã
ä¹é€ç®ã䜿çšãããã
map_long㯠ArduinoäºæAPI ã®mapã«åçã
Macro_API ãæå¹ãªãã°å¥å
mapã宣èšãããŠããã
8bit åçŽå ç®(ADD)ãã§ãã¯ãµã ãæ€èšŒããã ãã¹ãŠã®ãã€ããå ç®ããå€ã® 1ã®è£æ°ãè¿ãã Intel HEX çã«äœ¿ãããã
8bit æä»è«çå(XOR)ãã§ãã¯ãµã ãæ€èšŒããã ISO/JISèŠæ Œ SOH/STX/ETXãã€ããŒãã® BCC ãªã©ã«äœ¿ãããã
8bit CRC ãæ€èšŒãããSMBus ã® PEC ã§äœ¿ãããã
<util/crc16.h>ã®_crc8_ccitt_updateã䜿çšããã
x8 + x2 + x + 1 (0xE0 rev) init 0
8bit CRCïŒCCITTåïŒãæ€èšŒããã
<util/crc16.h>ã®_crc8_ccitt_updateã䜿çšããã
x8 + x2 + x + 1 (0xE0 rev) init -1
8bit CRCïŒiButtonåïŒãæ€èšŒããã1-Wireã§äœ¿ãããã
<util/crc16.h>ã®_crc_ibutton_updateã䜿çšããã
x8 + x5 + x4 + 1 (0x8C rev) init 0
8bit CRCïŒDallasåïŒãæ€èšŒããã1-Wireã§äœ¿ãããã
_crc_dallas_updateã䜿çšããã
x8 + x5 + x4 + 1 (0x31) init -1
8bit CRCïŒDallasåïŒãèšç®ããã1-Wireã§äœ¿ãããã
x8 + x5 + x4 + 1 (0x31)
16bit CRC ãæ€èšŒããã
<util/crc16.h>ã®_crc16_updateã䜿çšããã
x16 + x15 + x2 + 1 (0xA001 rev) init -1
ãã®é¢æ°ã¯CRC-16/MODBUSãšåŒã°ãã圢åŒãšåäžã§DATA + crc(Littlendian)ã®æ€èšŒçµæã0ã«ãªãã
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)圢åŒã§ããããšã«æ³šæã
16bit CRCïŒXMODEMåïŒãæ€èšŒããã
<util/crc16.h>ã®_crc_xmodem_updateã䜿çšããã
x16 + x12 + x5 + 1 (0x1021) init 0
ãã®é¢æ°ã§åŸãããæ€èšŒå€ã¯ Bigendian ã§ããDATA + crc(Bigendian)ã®æ€èšŒçµæã0ã«ãªãã
åŸã£ãŠDATAæ«å°Ÿã«æ€èšŒå€ã远å ããã«ã¯bswap16()颿°ã䜵çšããªããã°ãªããªãã
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ãæ±ããã®ã«äœ¿çšããã
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)圢åŒã§ããããšã«æ³šæã
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>ã§ã¯ãªãã
ã«ãã»ã«å ±æäœå®£èšã äž»ã«ãã€ããªãã€ããŒãçšéã
16bitå¹ å ±æäœã
32bitå¹ å ±æäœã
64bitå¹ å ±æäœã
/* ã¹ããªãŒã äžã§ã®ãšã³ãã£ã¢ã³å€æ */
capsule16_t length;
length->bytes[1] = Serial1.read();
length->bytes[0] = Serial1.read();
Serial0.println(length->word, DEC);ã«ãã»ã«å€æãã¯ãã
/* é£çµèšæåšæç²æ¡å */
uint32_t count1;
ATOMIC_BLOCK(ATOMIC_RESTORESTATE) {
_CAPS32(count1)->words[0] = TCB0.CCMP;
_CAPS32(count1)->words[1] = TCB1.CCMP;
}
Serial.println(count1, DEC);***ã¯modernAVR megaAVR reduceAVRã®äœããã
initVariantããåŒã°ããCPUäž»ã¯ããã¯èšå®ã®å®äœãå®çŸ©ãããŠããã
{build.core}ã«å¿ããŠå¯Ÿå¿ãããã¡ã€ã«ã¯ç°ãªããã©ãã䜿ããããã¯
<variant.h>ã§æå®ãããã
äŸåæ§ïŒ<api/io.h>
察象 MCUã®å
èµçºæ¯åšãšååšåšã§çæå¯èœãªãã¹ãŠã® F_CPU å€ã«å¯Ÿå¿ããèšå®ãæœãã
æé«é床㯠24MhzïŒããã㯠8Mã20Mã32MhzïŒãæäœé床㯠512HzïŒããã㯠500HzïŒã§ããã
ããŒããµãã¡ãã¥ãŒã§éžã¹ãã®ã¯ãã®ä»£è¡šçãªäžéšã«ãããªãã
- å€éšçºæ¯åšã«ã¯å¯Ÿå¿ããŠããªããããã䜿ãã«ã¯èªåã§èšå®ããªããã°ãªããªãã
äŸåæ§ïŒ<avr/io.h> <avr/pgmspace.h>
ã»ã¯ã·ã§ã³".nvmem"ã«æå®èŠçŽ ãé
眮ãã屿§ã
ãããæå®ããèŠçŽ ã¯ãåæå€ãäžããŠãç¡èŠãããã ãŒãåæåããããªãã 確ä¿é åã¯ããã°ã©ã ã³ãŒãããåŸæ¹ã«é 眮ãããã åŸã£ãŠ 64KiB å¢çããåã«é 眮ããããšã¯éããªãã
const char nvm_store[PROGMEM_PAGE_SIZE] PGM_ALIGN NVMEM;
PROGMEM屿§ãšã®éãã¯é 眮ãããé åãç°ãªãã®ãšåæåãããªãããšã§ããã®ä»ã®æ©èœã¯åãã§ããã ãªã®ã§ãã®é å宣èšã¯ïŒ64KiBå¢çãè¶ ããŠããªããã°ïŒ<String.h>ã®P()ãã¯ãã§ãã€ã³ã¿åç §ãã§ãããã
ãã®å±æ§ã®äœ¿ãæ¹ã¯ ãã©ãã·ã¥ã¡ã¢ãªé åãèªã¿æžããã宿Œãã®1 ã«è©³ããã
ã»ã¯ã·ã§ã³".progmem.nvm"ã«æå®èŠçŽ ãé
眮ãã屿§ã
ãããæå®ããèŠçŽ ã¯ãåæå€ãäžããããšãåºæ¥ãã
ããªããã°ãŒãåæåãããã
確ä¿é åã¯ããã°ã©ã ã®åæ¹ïŒ64KiBå¢ç以åïŒã®
PROGMEM屿§é åããåŸæ¹ãã€
ããã°ã©ã ã³ãŒãåæ¹ã«åªå
ããŠé
眮ãããã
const char nvm_store[] PGM_ALIGN ROMEM = "Hello World!";
PROGMEM屿§ã¯<avr/pgmspace.h>ã§å®çŸ©ãããã
PROGMEM屿§ãšã®éãã¯é 眮ãããé åãç°ãªãã ãã§ããã®ä»ã®æ©èœã¯åãã§ããããªã®ã§ãã®é å宣èšã¯ïŒ64KiBå¢çãè¶ ããŠããªããã°ïŒ<String.h>ã®P()ãã¯ãã§ãã€ã³ã¿åç §ãã§ãããã
<String.h>ãæ±ãã®ã¯æ£ç¢ºã«ã¯PGM_tã¯ã©ã¹å±æ§ã
ã»ã¯ã·ã§ã³".noinit"ã«æå®èŠçŽ ãé
眮ãã屿§ã
ãããæå®ããããŒã¿èŠçŽ ã¯ãåæå€ãäžããŠãç¡èŠãããã
åæåãããããšã¯ãªããåã« SRAMé åãäºçŽãããã ãã§ããã
å¿
ç¶çã«const修食åãä»ãã¹ãã§ã¯ãªãã
char random_seed[128] NIMEM; /* 1024 bit seed */ãã®å±æ§ã®äœ¿ãæ¹ã¯ SRAMã«ããçäŒŒäžæ®çºã¡ã¢ãªå®æŒ ã«è©³ããã
ã»ã¯ã·ã§ã³".text"ã«æå®èŠçŽ ãé
眮ãã屿§ã
äžè¬çãªå®è¡å¯èœã³ãŒãïŒé¢æ°ä»ïŒã®èŠå®å±æ§ã
ãããæå®ããèŠçŽ ã¯ã³ãŒãé åã«é 眮ãããèªã¿åºãå¯èœãå®è¡å¯èœãæžã蟌ã¿äžå¯ã®å±æ§ãä»äžãããã
ã»ã¯ã·ã§ã³".data"ã«æå®èŠçŽ ãé
眮ãã屿§ã
äžè¬çãªåæåæžã¿ããŒã¿èŠçŽ ã®èŠå®å±æ§ã
ãããæå®ããèŠçŽ ã¯ SRAMé åã«é 眮ãããèªã¿åºãå¯èœãæžã蟌ã¿å¯èœãå®è¡äžå¯ã®å±æ§ãä»äžãããã
ã»ã¯ã·ã§ã³".eeprom"ã«æå®èŠçŽ ãé
眮ãã屿§ã
ãããæå®ããèŠçŽ ã¯ EEPROMé åã«é 眮ãããèªã¿åºãå¯èœãå®è¡äžå¯ãæžã蟌ã¿äžå¯ã®å±æ§ãä»äžãããã
<avr/eeprom.h>ã§å®çŸ©ãããEEMEM屿§ãšåçã ããã³ãŒãã®ã©ããããåç
§ãããŠããªãå Žåã§ãã³ã³ãã€ã©ã«ããæé©ååé€ããããªãç¹ã§ç°ãªãã
EEPROMé åãåæåããããã® ".eep"ïŒHEX圢åŒïŒãã¡ã€ã«ãäœæããå Žåã«å©çšã§ããã
ã»ã¯ã·ã§ã³".signature"ã«æå®èŠçŽ ãé
眮ãã屿§ã
ãããæå®ããèŠçŽ ã¯ã©ãã«ãé
眮ããããèªã¿åºãå¯èœãæžã蟌ã¿äžå¯ãå®è¡äžå¯ã®å±æ§ãä»äžãããã
PRODSIGé åã«é
眮ãããããŒã¿æ§é ã®ãã³ãã¬ãŒããå®çŸ©ããéã«å©çšã§ããã
ã»ã¯ã·ã§ã³".user_signatures"ã«æå®èŠçŽ ãé
眮ãã屿§ã
ãããæå®ããèŠçŽ ã¯éåžžã¯ã©ãã«ãé
眮ããããèªã¿åºãå¯èœãæžã蟌ã¿å¯èœãå®è¡äžå¯ã®å±æ§ãä»äžãããã
ãã®å±æ§ã¯ã³ãŒãã®ã©ããããåç
§ãããŠããªãå Žåã§ãã³ã³ãã€ã©ã«ããæé©ååé€ãããããšã¯ãªãã
USERROWé åã«é
眮ãããããŒã¿æ§é ã®ãã³ãã¬ãŒããå®çŸ©ããéã«å©çšã§ããã
å®çŸ©ããåæå€ã¯ ".urow"ïŒHEX圢åŒïŒãã¡ã€ã«ã«ã¯æžãåºãããã®ã§ãUSERROW é åã«æžã蟌ãããã¡ã€ã«ãšããŠäœ¿çšã§ããã
ã»ã¯ã·ã§ã³".boot_signatures"ã«æå®èŠçŽ ãé
眮ãã屿§ã
ãããæå®ããèŠçŽ ã¯éåžžã¯ã©ãã«ãé
眮ããããèªã¿åºãå¯èœãæžã蟌ã¿å¯èœãå®è¡äžå¯ã®å±æ§ãä»äžãããã
ãã®å±æ§ã¯ã³ãŒãã®ã©ããããåç
§ãããŠããªãå Žåã§ãã³ã³ãã€ã©ã«ããæé©ååé€ãããããšã¯ãªãã
BOOTROWé åã«é
眮ãããããŒã¿æ§é ã®ãã³ãã¬ãŒããå®çŸ©ããéã«å©çšã§ããã
å®çŸ©ããåæå€ã¯ ".brow"ïŒHEX圢åŒïŒãã¡ã€ã«ã«ã¯æžãåºãããã®ã§ãBOOTROW é åã«æžã蟌ãããã¡ã€ã«ãšããŠäœ¿çšã§ããã
BOOTROW é åã¯ã2024/01æç¹ã§ã¯ AVR_DUãAVR_EB 系統ã«ã®ã¿æèŒãããŠãããä»ã®ç³»çµ±ã§ã¯äœ¿çšã§ããªããAVR_DUã®å ŽåãBOOTROW é å㯠USBãã¹ã¯ãªãã¿ãŒããŒãã«ãïŒã³ãŒãïŒããŒã¿ç©ºéãå§è¿«ããã«ïŒä¿åããŠããã®ã«æŽ»çšã§ããã
æå®èŠçŽ ã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ããªãé åã«æ¶å»/æžèŸŒãè¡ããš åäžããŒãžå ã«å±ããŠããä»ã®æ å ±ã¯ç Žå£ããããã
åŸç¶èŠçŽ ãæå®ã»ã¯ã·ã§ã³"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ã䌎ããªãé åã«æ¶å»/æžèŸŒãè¡ããš åäžããŒãžå ã«å±ããŠããä»ã®æ å ±ã¯ç Žå£ããããã
ããŒãéžæåºæããªãã§ã©ã«å®çŸ©ã
{build.variant} äœçœ®ã«çœ®ãããã
<api/HarfUART.h> ã <api/TWIM.h> ã䜿çšãããéã®
åºæå€éšç«¯åæ
å ±ïŒããŒãå²ä»ïŒãåæããã
ãããèªãããšã§ããªãã§ã©ã«åšèŸºæ©èœã®ã€ã³ã¹ã¿ã³ã¹ãæºåãããã
æªäœ¿çšã§å®äœåãããªãã€ã³ã¹ã¿ã³ã¹ã¯FLASHã«æžã蟌ãŸããªãã
äŸåæ§ïŒ <api/HarfUART.h> <api/TWIM.h> <avr/io.h>
PORTMUXã«é¢ããæ§é äœã宣èšããã
ããã¯<api/HarfUART.h> <api/TWIM.h>çã®ã€ã³ã¹ã¿ã³ã¹å®£èšã«äœ¿ãããã
äŸåæ§ïŒ<avr/io.h>
CPUäŒæ¢å¶åŸ¡è£å©ã ããããå šäœå²èŸŒã¯èš±å¯ãããã æ¢å®ã®å²èŸŒæ¡ä»¶ãæºãããšCPUã¯å掻æ§åãããã
äŸåæ§ïŒ<avr/sleep.h>
SLEEP_MODE_PWR_DOWNèšå®ã§äŒæ¢ããã
CPUäž»ã¯ããã¯ã忢ããã
å€éšãã³å²èŸŒãŸã㯠RTC/PITåšèŸºæ©èœã®å²èŸŒãWDTå²èŸŒãŸãã¯ãªã»ããã®ã¿ãããã®ç¶æ
ããè±ããããšãã§ããã
å€éšãã³å²èŸŒã¯ ISC_BOTHEDGE ãŸã㯠ISC_LOWLEVEL ã§ãªããã°ãªããªãã
åéæã«ã¯CPUäž»ã¯ããã¯å®å®åé
å»¶ããããã
SLEEP_MODE_IDLEèšå®ã§äŒæ¢ããã
CPUåäœã®ã¿äŒæ¢ããä»ã®åšèŸºæ©èœã¯ãã¹ãп޻æ§ç¶æ
ã«çœ®ãããã
SLEEP_MODE_STANDBYèšå®ã§äŒæ¢ããã
RUNSTDBYãã©ã°ãèš±å¯ãããŠããªãåšèŸºæ©èœãžã®ã¯ããã¯äŸçµŠã忢ããã
å¯èœãªãSLEEP_MODE_ADCèšå®ã§äŒæ¢ããã
ããããªã MCUåçš®ã§ã¯
SLEEP_MODE_IDLEãããã¯
SLEEP_MODE_STANDBYã§äŒæ¢ããã
ïŒåŸè¿°ïŒ
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/HarfUART.h> ã <api/TWIM.h> çã§äœ¿ããã printæ¯æŽã¯ã©ã¹ã
ããããèªèº«ã®ãªããžã§ã¯ããè¿ãã®ã§ãã¡ãœãããã§ãŒã³ãåŸç¶ã§ããã
reduceAVR ã§ã¯å®è³ªäœ¿çšäžå¯
\r\nãåºåããã
ç©ºåŒæ°ã®println(void)ããã®åäœãããã
æå®ã®æ°å€ãæååãåºåããã
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 ã§ã¯å®è³ªäœ¿çšäžå¯
printfãã©ãŒãããã«åŸã£ãŠåºåããããã©ãŒãããæã¯F() P()ãã¯ãã§æå®ããŠãè¯ãã
printfã©ã€ãã©ãªããªã³ã¯ããããããã®åã®å®è£ èšæ¶ãå¢å€§ãããïŒæå€§çŽ1.5KïŒ
æµ®åå°æ°ç¹è¡šçŸæç€ºå%fã¯ã远å ã®ã©ã€ãã©ãªçµåãå¿
èŠãšããã
Build "printf" ãµãã¡ãã¥ãŒã§èš±å¯ãïŒæå€§çŽ2.5K远å ïŒ
reduceAVR ã§ã¯å®è³ªäœ¿çšäžå¯
æå®ã®ãã€ãåããæå®ã®é·ããèªãã§ã16é²HEXãã³ããªã¹ãåºåããã
_separator ãç¥ããšãã¿æžããæåãæå®ãããšããããã€ãéã«æ¿å
¥ããã
reduceAVR ã§ã¯å®è³ªäœ¿çšäžå¯
æå®ã®ãã€ãåãæå®ã®é·ããŸã§æžãåºãã
å®éã«æžããé·ããè¿ãã
ã¡ãœãããã§ãŒã³ã¯ã§ããªãã
ãã€ãåã¯F()ãã¯ãã§æå®ããŠãè¯ãã
ãã«æå\0ã§çµç«¯ãããæååãåºåããã
æžããé·ããè¿ãã
ã¡ãœãããã§ãŒã³ã¯ã§ããªãã
æååã¯F()ãã¯ãã§æå®ããŠãè¯ãã
printæã§ããã°ã©ã ã¡ã¢ãªå®çŸ©å®æ°åãæ±ããããã«ããæ¯æŽã¯ã©ã¹ã
æå®ã®æååãããã°ã©ã ã¡ã¢ãªã«é
眮ããæ¯æŽãã¯ãã
PGM_tåç
§ã¯ã©ã¹åãè¿ãã
Serial.println(F("foo"));æå®ã®PROGMEM屿§ãã€ã³ã¿ã
PGM_tåç
§ã¯ã©ã¹åã«å€æããŠè¿ãã
F()ãã¯ãã«å¯Ÿå¿ãã颿°ãªããããã«å€ããŠäœ¿çšã§ããã
const uint8_t display_init[] PROGMEM = {...};
Wire.start(OLED_ADDR).write(P(display_init), sizeof(display_init));<api/HarfUART.h>çã䜿ãåºåºã¯ã©ã¹ã
ãããç¶æ¿ããããšã§å¶åŸ¡ãç°ãªã仿§
ïŒåç·åäºéãRS485çïŒ
ã®begin/endãå®è£
ããã®ã«äœ¿ãã
åäºééä¿¡çšãå²èŸŒãããã¡ã¯äœ¿çšããªãã
ããŒãéžæåºæå®£èšã
{build.variant} äœçœ®ã«çœ®ãããã
å€éšãã³ãåºæããªãã§ã©ã«ã®æ
å ±ãæžãããŠããã
äŸåæ§ïŒ <variant_io.h>
NVMCTRL version ã衚æããã以äžã®å€ãå®çŸ©ãããŠããã
- 0 tinyAVR-0/1/2 系統㚠megaAVR-0 系統
- 1 ïŒæªäœ¿çšïŒ
- 2 AVR_DA/DB/DD 系統
- 3 AVR_EA 系統
- 4 AVR_DU 系統
- 5 AVR_EB 系統
EVSYS å®è£ äžä»£ã衚æããã以äžã®å€ãå®çŸ©ãããŠããã
- 100 tinyAVR-0 系統
- 101 tinyAVR-1 系統
- 200 megaAVR-0 系統
- 201 tinyAVR-2 系統㚠AVR_DA/DB/DD 系統
- 202 AVR_DU/EA/EB 系統
ç¹å®ã®å€éšãã³ãæã宿°ãã¯ãã 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 ã¯ãã®ã«ãŒã«ã«åŸããç¬èªã®æ¡çªãšãªã
æ¢å®ã® main ããåŒã°ãããããŒãåºæããªãã§ã©ã«åæå颿°ã
æå®ã®F_CPUã«åèŽããããäž»ã¯ããã¯å¶åŸ¡åšã調åŸããã
ãŸããã¹ãŠã®å€éšãã³ã®ããžã¿ã«å
¥åç·©è¡éšãç¡å¹ïŒISC_INPUT_DISABLEïŒã«ããã
詳ããã¯ååå¥ AVR ããŒã¿ã·ãŒããåç
§ã®ããšã
ããŒãéžæåºæå®£èšã®è£å©ãããã
{build.variant} äœçœ®ã«çœ®ãããã
ç°ãªãããªã¢ã³ãéã§ãåäžã ãç°å宣èšãããŠãããããª
ããŒã¿ã·ãŒãç±æ¥ã®å·®ç°ãé èœãããã¯ããæ§é äœãåæåãæžãããã
éšåçã«ã¯ ã¢ã»ã³ãã©ãœãŒã¹.Sã§ãå©çšå¯èœã
äŸåæ§ïŒ<avr/io.h>
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ã§å®è£ ã§ããã
EVSYS_CHANNEL0_***_gc ã«å¯Ÿãããã£ãã«æå®ãªãã®å¥åå®çŸ©ã
AVR_EVSYS == 200 || 201 ã«å¯Ÿã AVR_EVSYS == 202 ã®ç³è¡£æãäžããã
察å¿ããæ©èœããªãå Žåã¯å®çŸ©ãããŠããªãã
ã€ãã³ããžã§ãã¬ãŒã¿ãŒã䜿çšãã RTC/PITãšãPORTn矀ã¯åŸåã®èšæ³ãå¿ èŠã
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 ãšã¯
æ©èœçã«ããã€ããªçã«ãäºææ§ã¯ãªãã
äž¡è
ã¯å€§ããç°ãªãã®ã§ç³è¡£æãæžããªãã
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;