
ããªãã¯8ããããŸãã¯32ãããã®ããã°ã©ããŒã§ããïŒç§ãã¡OMZLOã¯ãæ°ãã32ãããARM CortexãããïŒSTM32ããã³SAMDïŒã«æ³šåããŠããŸãããããã¯ãå€ã8ããããã€ã¯ãã³ã³ãã¥ãŒã¿ãŒïŒãã€ã¯ãã³ã³ãããŒã©ãŒãŠããããMCUïŒãšæ¯èŒããŠãéåžžãããå€ãã®RAMãšããåªããããã©ãŒãã³ã¹ãæäŸããŸãã ãããå€ãã®åšèŸºæ©åšã®ãµããŒãããããŠãããããã¹ãŠ-åãããŸãã¯ããäœãäŸ¡æ Œã§ããããã8ãããMCUã¯ãŸã ãã®é¢é£æ§ã倱ã£ãŠããŸãããç¹ã«ãMicrochipã¯æ°ããã·ãªãŒãºã®ããããtinyAVR0ã·ãªãŒãºãããªãªãŒã¹ããŸãããããã¯ã以åã«ãªãªãŒã¹ãããAVRããããšæ¯èŒããŠãããææ°ã®åšèŸºæ©åšã§ã®äœæ¥ãå¯èœã«ããŸããåæã«ãæ°ãããããã¯éåžžã«é åçãªäŸ¡æ Œã§éç«ã£ãŠããŸãããããã®ãããã¯ãæ©èœãå¿ èŠãšããªãåçŽãªããã€ã¹ã®éçºã«æé©ã®ããã§ããæ°ãã32ãããMCUãæäŸãããã®ãããã«ã8ããããã€ã¯ãããã»ããµã¯ããã°ã©ãã³ã°ãã¯ããã«ç°¡åã§ããããããããã«åºã¥ããŠäœæãããããã€ã¹ã®ãœãããŠã§ã¢éšåã®éçºé床ãåäžããŸãã
Arduino UNOã®æåã®ãããã§ã8ãããATmega328ãã€ã¯ãã³ã³ãã¥ãŒã¿ãŒãšATtiny85ã®ãããªå¯Ÿå¿ãããã®ã®ããã°ã©ãã³ã°æ©èœã説æããå€ãã®ãã¥ãŒããªã¢ã«ãã€ã³ã¿ãŒãããäžã«ãããŸãã Arduinoã§äœ¿çšãããŠããããã°ã©ãã³ã°èšèªã䜿çšãããAtmel Studioãªã©ã®ãããã¡ãŒã«ãŒã«ãã£ãŠäœæãããIDEã䜿çšããã«ãã¬ãžã¹ã¿ã«çŽæ¥ã¢ã¯ã»ã¹ããããšã«ã€ããŠè©±ããŠããŸããããã確èªããã«ã¯ãGoogleã§ãatmega328blinkyããæ€çŽ¢ããŠãã ããããã€ã¯ãã¡ãŒã¿ãããã°ã©ã ããã«ã¯ãAVRçšã®Cã³ã³ãã€ã©ãããã¹ããšãã£ã¿ãavrdudeãããã³AVRããã°ã©ãã ããå¿ èŠã§ããããã€ãã®ãªãœãŒã¹ã«ã€ããŠATmega328ããŠãããŒãµã«ãã¬ããããŒãã§çšŒåãããæ¹æ³ã«ã€ããŠã®ã¬ã€ãããããŸãã確ãã«ãæ°ããtinyAVR 0ã·ãªãŒãºãããã«ã€ããŠè©±ãå Žåããã®çš®ã®æ å ±ãèŠã€ããã®ã¯ç°¡åã§ã¯ãããŸããã
ãã¡ãããMicrochipã¯ãWindowså°çšã«èšèšãããIDEã§æ°ããtinyAVRãããã°ã©ã ããããã«å¿ èŠãªãã¹ãŠã®ããŒã«ãæäŸããŸããæ°ãããããã®ããã€ãã«ã¯ããArduinoã³ã¢ãããããŸãããã®ãããã§ããã®ãããªãããã¯ArduinoIDEã䜿çšããŠããã°ã©ã ã§ããŸããããããç¹°ãè¿ãã«ãªããŸããããæ°ã«å ¥ãã®ããã¹ããšãã£ã¿
MakefileãšCã³ã³ãã€ã©ã䜿çšããŠãäœã¬ãã«ãã¹ã¿ã€ã«ã§ãã€ã¯ãã³ã³ãã¥ãŒã¿ã³ãŒããèšè¿°ãããå ŽåãtinyAVRãæäœãããã®ã¢ãããŒãã«é¢ããæ
å ±ã¯ã»ãšãã©èŠã€ãããŸããã
ãã®èšäºã§ã¯ãæãç°¡åãªããŒã«ã䜿çšããŠã掟æãªãã¡ãŒã ãŠã§ã¢ãæåããäœæããæ¹æ³ã説æããŸããATtiny406ã®å Žåã説æããå 容ã®ã»ãšãã©ã¯ãä»ã®tinyAVRMCUã«ãåœãŠã¯ãŸããŸãããã®ãã¥ãŒããªã¢ã«ã¯ãmacOSãšLinuxã䜿çšããŠãããŠãŒã¶ãŒã察象ãšããŠããŸãããWindowsç°å¢ã䜿çšããŠãããŠãŒã¶ãŒã«ããããããªå€æŽãå ããã¢ããã€ã¹ã圹ç«ã¡ãŸãã
ãããžã§ã¯ãã®ããŒããŠã§ã¢éšå
âATtiny406ãç ç©¶ãã
ATtiny406 ã詊ããŠã¿ãããšã«ããŸãããå°æ¥ããã®ãã€ã¯ãã³ã³ãããŒã©ãŒããçŸåšPiWatcherã§äœ¿çšãããŠããATtiny45ã«åã£ãŠä»£ããããšãæåŸ ããŠããŸãããã®éçºã§ã¯ããã®ãããªå¿ èŠãçãããšãã«ãRaspberryPiãå®å šã«ãªããŸãã¯åèµ·åã§ããŸãã ATtiny406ã«ã¯4KBã®ãã©ãã·ã¥ã¡ã¢ãªãš256ãã€ãã®RAMãããããã€ã¯ããããã¯å€éšã¯ããã¯ãœãŒã¹ãªãã§20MHzã§åäœã§ããŸãã
æ°ããtinyAVRMCUãšATtiny85ã®ãããªå€ãæåãªããããšã®äž»ãªéãã®1ã€ã¯ãæ°ããããããUPDIããã°ã©ãã³ã°ãããã³ã«ã䜿çšããããšã§ããåäœããã®ã«å¿ èŠãªãã³ã¯3ã€ã ãã§ãå€ããããã§äœ¿çšãããŠããISPãããã³ã«ã«ã¯6ã€ã®ãã³ãå¿ èŠã§ãã
質åãç°¡åã«èª¿ã¹ãçµæãåçŽãªUSB-ã·ãªã¢ã«ã±ãŒãã«ã𿵿ã䜿çšããŠãUPDIã䜿çšããŠtinyAVRãããã°ã©ã ã§ããããšãããããŸãããããã¯ããã¡ãŒã ãŠã§ã¢ããã€ã¯ãããã»ããµã«ã¢ããããŒãããããã®æ¬¡ã®é ç·å³ãææ¡ããpyupdiPythonããŒã«ã®ãããã§ããããŸããã

ãã€ã¯ãã³ã³ãããŒã©ãŒæ¥ç¶å³
âATtiny406ã®ããŒããã¶ã€ã³
ATtiny406çšã®ãããã«ãªãã¬ã€ã¯ã¢ãŠãããŒããäœæããŸããããã®ããŒãã¯ãUSBãã5Vã§çµŠé»ã§ããŸãããŸãã¯ãå°çšã®VCC / GNDãã³ã䜿çšããŠã3.3Vã®äœãé»å§ãå°å ããããšãã§ããŸããããŒãäžã«ãã¿ã³ãšLEDã®å ŽæããããŸããå®éšãè¡ãããã«ãUPDIãããã³ã«ã䜿çšããããã«å¿ èŠãª4.7 kOhmã®æµæãããŒãã«çµã¿èŸŒãããšã«ããŸããïŒããã¯æµæR2ã§ãïŒããã®çµæã以äžã®ããŒãã¬ã€ã¢ãŠããåŸãããŸããã

ããŒãã¬ã€ã¢ãŠã
â宿ããããŒã
宿ãããã¬ã€ã¯ã¢ãŠãããŒãã¯éåžžã«ã³ã³ãã¯ãã§ãå°ããªãã¬ããããŒãã«ããŸãåãŸããŸããããŒãã®æŠç¥å³ã¯ããã«ãããŸãã

ãããã¿ã€ãããŒãã«åãä»ããããããã¯ãã¬ãŒã³
ATtiny406ãããã°ã©ã ããã«ã¯ãUSB-ã·ãªã¢ã«ã±ãŒãã«ãããŒãã®ãã³ã䜿çšããŠããŒãã«æ¥ç¶ããŸãã

ã±ãŒãã«æ¥ç¶å³
ãããžã§ã¯ãã®ãœãããŠã§ã¢éšå
âpyupdi
ãããžã§ã¯ã ãªããžããªã®æç€ºã«åŸã£ãŠpyupdiãã€ã³ã¹ããŒã«ããŸããã
USB-ã·ãªã¢ã«ã±ãŒãã«ã¯ã4ã€ã®UPDIãã³ã䜿çšããŠããŒãã«æ¥ç¶ãããŸãããç§ãã¡ã®USB-ã·ãªã¢ã«ã³ã³ããŒã¿ãŒã¯ãmacOSã§ã¯ãšããŠèŠãããŠããŸãã
/dev/tty.usbserial-FTF5HUAVã
ããã°ã©ããŒãATtiny406ãèªèããŠããããšã確èªããããã«ããã¡ã€ã«ãã¹ãç·šéããŠã次ã®ãããªã³ãã³ããå®è¡ã§ããŸãã
pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -i
ãã¹ãŠãæ£ããæ§æãããŠããå Žåãæ¬¡ã®ãããªã³ãã³ããå®è¡ãããšã次ã®ãããªåºåã«ãªããŸãã
Device info: {'family': 'tinyAVR', 'nvm': 'P:0', 'ocd': 'D:0', 'osc': '3', 'device_id': '1E9225', 'device_rev': '0.1'}
âCã³ã³ãã€ã©
Homebrew ã䜿çšããŠmacOSã«ã€ã³ã¹ããŒã«ã§ããéåžžã®avr-gccã³ã³ãã€ã©ã§ã¯ãATtiny406ãã³ã³ãã€ã«ã¿ãŒã²ãããšããŠèšå®ã§ããªãããšã倿ããŸããããã®ãããMicrochipãæäŸããavr-gccãã€ã³ã¹ããŒã«ããããšã«ããŸãããã³ã³ãã€ã©ãããŠã³ããŒãããã«ã¯ãMicrochipã®Webãµã€ãã§ã¢ã«ãŠã³ããäœæããå¿ èŠããããŸãããããã¯å°ãé¢åã§ãã

ã³ã³ãã€ã©ã®
ããŠã³ããŒãã¢ãŒã«ã€ãã®åœ¢åŒã§æç€ºãããå¿ èŠãªè³æãããŠã³ããŒãããåŸããã®ã¢ãŒã«ã€ããå¥ã®ãã©ã«ãã«è§£åããŸããã
binãã®ãã©ã«ãã«ãããã£ã¬ã¯ããªãžã®ãã¹ãã«è¿œå ããå¿
èŠããããŸãPATHãããã«ãããå°æ¥ã®äœæ¥ã容æã«ãªããŸããã³ã³ãã€ã©ããã©ã«ã$HOME/Src/avr8-gnu-toolchain-darwin_x86_64ã«ä¿åãããŠãããšä»®å®ãããšPATHããã¡ã€ã«ã«æ¬¡ã®ã³ãã³ãã远å ããŠç·šéã§ããŸã.bash_profileã
export PATH=$PATH:$HOME/Src/avr8-gnu-toolchain-darwin_x86_64/bin/
ææ°ã®ATtinyMCUã¯ã远å ã®æ§æããªããšãMicrochipã®avr-gccã³ã³ãã€ã©ã§ã¯ãµããŒããããŸããããããããµããŒãããã«ã¯ãATtinyããã€ã¹ããã¯ãããŠã³ããŒãããå¿ èŠããããŸãã

ATtinyããã€ã¹ããã¯ã®ããŠã³ããŒããã®
çµæãããã±ãŒãžãããŠã³ããŒãããŸãã
Atmel.ATtiny_DFP.1.6.326.atpackïŒãã®ãã¡ã€ã«ã®ååãç°ãªãå Žåããããååã«ç°ãªãããŒãžã§ã³çªå·ãå«ãŸããŠããå ŽåããããŸãïŒããã¡ã€ã«æ¡åŒµåã¯ã§ãããatpackãããã¯å®éã«ã¯éåžžã®.zipã¢ãŒã«ã€ãã§ãããã®æ¡åŒµåãã«å€æŽã.zipãããã±ãŒãžã®å
容ããã©ã«ããŒ$HOME/Src/Atmel.ATtiny_DFP.1.6.326ãã€ãŸãã³ã³ãã€ã©ãŒãã¡ã€ã«ãæ¢ã«ãã£ãå Žæãšåãå Žæã«æœåºããŸããã
âCããã°ã©ã ã®äœæ
次ã®ããã°ã©ã ãäœæããŸããããã®ããã°ã©ã ã¯ã1 Hzã®åšæ³¢æ°ã§ãATtinyããŒãã®B5ãã³ã«æ¥ç¶ãããŠããLEDãç¹æ» ãããŸãã
#include <avr/io.h>
#include <util/delay.h>
int main() {
_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0); // 20 (, 0x02 2)
PORTB.DIRSET = (1<<5);
for (;;) {
PORTB.OUTSET = (1<<5);
_delay_ms(500);
PORTB.OUTCLR = (1<<5);
_delay_ms(500);
}
}
ãã®ã³ãŒãã¯ãäœ¿ãæ £ããAVRãã€ã¯ãããã»ããµçšã«äœæãããLEDç¹æ» ããã°ã©ã ãšéåžžã«ãã䌌ãŠããŸããæåã®æ³šç®ãã¹ã倿Žã¯ãMCUã¬ãžã¹ã¿ã«ã¢ã¯ã»ã¹ããããã®æ§é ã®äœ¿çšã§ããããšãã°ããåç §ãã代ããã«ãã
PORTBåç
§ãPORTB.DIRSETãŸãã
å¥ã®å€æŽã¯ãåšæ³¢æ°èšå®ã³ãŒãã§è¡šãããŸã
(_PROTECTED_WRITE(CLKCTRL.MCLKCTRLB, 0)ïŒãæ°ããATtiny406ã¯ãåèµ·ååŸã«3.33 MHzã§å®è¡ãããŸããããã¯ã20MHzã®ããŒã¹ã¯ããã¯ã6ã§å²ã£ãå€ã«çžåœããŸãããããã20MHzã®ãã«ã¹ããŒãã§å®è¡ããã«ã¯ãã¬ãžã¹ã¿ãã¯ãªã¢ããŸãCLKCTRL.MCLKCTRLBããã®ã¬ãžã¹ã¿ã¯å¶çºçãªå€æŽããä¿è·ããå¿
èŠããããããATtiny406ã§ã¯ãç¹å¥ãªãœãããŠã§ã¢æ§é ãé©çšããŠå€æŽããå¿
èŠããããŸãã幞ãããã¯ãã䜿çšãããšãããç°¡åã«ãªã_PROTECTED_WRITEãŸããããªãã¯ããã«ã€ããŠãã£ãšèªãããšãã§ããŸããããã
ãã®ã³ãŒããSTM32ãŸãã¯SAMD21çšã«äœæãããã³ãŒããšæ¯èŒãããšãã¯ããã«åçŽã§ããããšãããããŸãã
âMakefile
ããã§ã¯ã次ã®ãã£ã¬ã¯ããªæ§é ã䜿çšããŠããŸãã
src/Atmel.ATtiny_DFP.1.6.326/-Microchip DevicePackãžã®ãã¹ãsrc/attiny406-test/-ãã¡ã€ã«åmain.cã§äžèšã®ã³ãŒããä¿åãããŠãããã©ã«ããŒã
ãã£ã¬ã¯ããªããã®ã³ãŒãã®ã³ã³ãã€ã«ã¯ã
attiny406-test/次ã®ã³ãã³ãã§å®è¡ã§ããŸãã
avr-gcc -mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/ -O3 -I ../Atmel.ATtiny_DFP.1.6.326/include/ -DF_CPU=20000000L -o attiny406-test.elf main.c
ãã®ãã©ã°ã
-O䜿çšãããšã颿°åŒã³åºããæ£åžžã«æ©èœããããã«å¿
èŠãªæé©åãå®è¡ã§ããŸã_delay_ms()ã-DF_CPUå
容ããããã®äºæ³ãããåšæ³¢æ°ãåæ ãã倿°ã«ã€ããŠãåãããšãèšããŸããæ®ãã®ãã©ã¡ãŒã¿ãŒã«ã¯ã以åã«ããã€ã¹ããã¯ã¢ãŒã«ã€ãããããŠã³ããŒãããŠæœåºããATtiny406ã®ãã¡ã€ã«ã®å Žæã«é¢ããæ
å ±ãå«ãŸããŠããŸãã
ãã¡ãŒã ãŠã§ã¢ãMCUã«ããŠã³ããŒãããã«ã¯ãçºçããããšãIntelHEX圢åŒã«å€æããå¿ èŠããããŸãããã®åŸãpyupdiã䜿çšããå¿ èŠããããŸãã
Makefileãããã®ã¿ã¹ã¯ã«å¯Ÿããã·ã³ãã«ã§èªååããããœãªã¥ãŒã·ã§ã³ãäœæããŸããã
OBJS=main.o
ELF=$(notdir $(CURDIR)).elf
HEX=$(notdir $(CURDIR)).hex
F_CPU=20000000L
CFLAGS=-mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/ -O3
CFLAGS+=-I ../Atmel.ATtiny_DFP.1.6.326/include/ -DF_CPU=$(F_CPU)
LDFLAGS=-mmcu=attiny406 -B ../Atmel.ATtiny_DFP.1.6.326/gcc/dev/attiny406/
CC=avr-gcc
LD=avr-gcc
all: $(HEX)
$(ELF): $(OBJS)
$(LD) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
$(HEX): $(ELF)
avr-objcopy -O ihex -R .eeprom $< $@
flash: $(HEX)
pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -f attiny406-test.hex
read-fuses:
pyupdi -d tiny406 -c /dev/tty.usbserial-FTF5HUAV -fr
clean:
rm -rf $(OBJS) $(ELF) $(HEX)
ã³ãŒããã³ã³ãã€ã«ããã«ã¯ãã³ãã³ããå®è¡ããã ã
makeã§ãããã€ã¯ãã³ã³ãã¥ãŒã¿ãžã®ã³ãŒãã®ããŠã³ããŒãã¯ãã³ãã³ãã«ãã£ãŠå®è¡ããmake flashãŸããæåºããããã®Makefileã¯ãå¿
èŠã«å¿ããŠä¿®æ£ããããšãã§ããŸãã
çµæ
æ°ããTinyAVRã¯ãåäžä»£ã®MCUãšåããããç°¡åã«ããã°ã©ãã³ã°ã§ããŸããéèŠãªã®ã¯ãé©åãªããŒã«ãèŠã€ããããšã§ããAVRTinyãããã°ã©ãã³ã°ããããã®ãã³ããããã°ãTwitterãŸãã¯ä»¥äžã®ã³ã¡ã³ãã§å ±æããŠãã ããã
ãããžã§ã¯ãã§æ°ããTinyAVRã䜿çšããããšãèšç»ããŠããŸããïŒ
