2018ǯ12·î09Æü

ATMega328¤Èµº¤ì¤ëÊÑÂÖ¤ÎÏÃ

³«ÀßÅö½é¤Ï¥É¥ß¥Í¡¼¥¿¡¼¤ÎÀ½ºî²áÄø¤òÊó¹ð¤¹¤ë¾ì¤À¤Ã¤¿¤é¤·¤¤¤³¤Î¥Ö¥í¥°¤â¡¢
Åö»þ¤Î¼óËżԤ¬Â´¶È¤·¤Æ¤·¤Þ¤Ã¤¿º£¤È¤Ê¤Ã¤Æ¤Ï¤¹¤Ã¤«¤ê¹Ó¤ìÃϤȤʤäƤ·¤Þ¤Ã¤Æ¤ª¤ê¤Þ¤¹¡£

¤É¤¦¤â³§¤µ¤Þ½é¤á¤Þ¤·¤Æ¡£char str[] = {72,101,108,108,111,44,32,87,111,114,108,100,46,0};¹©³Ø¸¦µæÉô½ê°¤Î16À¸¡¢¥¸¥ã¥°¤È¿½¤·¤Þ¤¹¡£
¤³¤ÎÅ٤Ϲ©³Ø¸¦µæÉô°÷¤Ë¤è¤ëAdvent Calender¤¬¼Â»Ü¤µ¤ì¤ë¤È¤¤¤¦¤³¤È¤Ç¡¢ÉáÃʤÏÉôÊ󤯤餤¤Ç¤·¤«À¤³¦¤Ë°§»¢¤ò¤·¤Ê¤¤(¼«¾Î)ÊÑÂÖ¥×¥í¥°¥é¥Þ¡½¤Ç¤¢¤ë»ä¤â¤¿¤Þ¤Ë¤Ï¥Í¥Ã¥È¤Î³¤¤«¤éÀ¤³¦¤Ë°§»¢¤ò¤·¤Æ¤ß¤è¤¦¤È»×¤¤Î©¤Á¡¢¤³¤¦¤·¤Æ¹©³Ø¸¦µæÉô¤Î¸ø¼°(?)¤Ê¾ì¤ò¤ª¼Ú¤ê¤·¤ÆÀ¤³¦¤Ë°§»¢¤ò¤·¤Æ¤¤¤ë¼¡Âè¤Ç¤¢¤ê¤Þ¤¹¡£


¤µ¤Æ¡¢º£²ó¤ÏÂè68²óÄ´ÉۺפÇÈÒÉÛ¤·¤¿ÉôÊó60¹æ¤Ë·ÇºÜ¤·¤è¤¦¤È¤·¤Æ´Ö¤Ë¹ç¤ï¤Ê¤«¤Ã¤¿¥Ë¥Ã¥Á¤Ç¥Ç¥£¡¼¥×¤ÊÏäò¤·¤Æ¤¤¤³¤¦¤«¤È»×¤¤¤Þ¤¹¡£Ã¯¤«¤Î¤ªÌò¤ËΩ¤Ä¤«¤â¤·¤ì¤Þ¤»¤ó¤¬¡Ä¡Ä¤³¤ó¤Êµ­»ö¤¬Ìò¤ËΩ¤Ä¤«¤É¤¦¤«¡£

º£²ó¤Î¥Æ¡¼¥Þ¤Ï¡ÖATMega328¡×¤ÎÀ­Ç½¤ò¸Â³¦¤Þ¤Ç°ú¤­½Ð¤½¤¦¡¢¤Ç¤¹¡£
À§Èó¶½Ì£¤¬¤¢¤ëÊý¤Ï¤´°ìÆɤò¡¢¶½Ì£¤¬¤Ê¤¤Êý¤Ï¥Ö¥é¥¦¥¶¥Ð¥Ã¥¯¤Î¤´½àÈ÷¤ò¡£
º£¤Ê¤é¤Þ¤À´Ö¤Ë¹ç¤¦¡£Æ¨¤²¤ë¤Ê¤éº£¤Î¤¦¤Á¡£


¤Þ¤º½é¤á¤Ë¡¢³«È¯´Ä¶­¤Ë¤Ä¤¤¤Æ¡£
»È¤¦¥Þ¥¤¥³¥ó¤ÏATMega328P¡£½©·îÅÅ»ÒÄ̾¦¤µ¤ó¤Ç°ì¸Ä230±ß¤Ç¹ØÆþ²Äǽ¤Ç¤¹¡£(2018/12/09¸½ºß)
IDE¤ÏAtmel Studio 7.0¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£Æþ³ØÅö½é¤Ë¥¤¥ó¥¹¥È¡¼¥ë¤·¤¿¤â¤Î¤Ê¤Î¤ÇºÇ¿·ÈǤȤϼ㴳¥Ð¡¼¥¸¥ç¥ó¤¬°ã¤¤¤Þ¤¹¤¬(É®¼Ô¤¬»ÈÍѤ·¤Æ¤¤¤ë¤Î¤Ï7.0.1006)¡¢¥á¥¸¥ã¡¼¥¢¥Ã¥×¥Ç¡¼¥È¤Ï¤µ¤ì¤Æ¤Ê¤¤¤Î¤Ç¤Þ¤¡Æ±¤¸¤Ç¤·¤ç¤¦¡£
¥é¥¤¥¿¡¼¤Ïº£¤Ç¤ÏÀäÈǤȤʤäƤ·¤Þ¤Ã¤¿½ãÀµ¥é¥¤¥¿ AVR ISP mark­¶¤ò»È¤Ã¤Æ¤¤¤Þ¤¹¡£¤È¸À¤Ã¤Æ¤â¡¢¥é¥¤¥¿¤¬°ã¤Ã¤¿¤È¤³¤í¤Ç»È¤¤Êý¤¬°ã¤¦¤À¤±¤Ç¡¢Àµ¤·¤¯½ñ¤­¹þ¤ß¤¬¹Ô¤ï¤ì¤¿¤¢¤È¤ÎATMega328¤Ëº¹¤ÏÀ¸¤¸¤Ê¤¤¤Ï¤º¤Ç¤¹¤¬¡£


¤µ¤Æ¡¢¤¤¤í¤¤¤í¥Í¥¿¤Ï¤¢¤ë¤Î¤Ç¤¹¤¬¡¢¤ï¤«¤ê¤ä¤¹¤¤(?)¤Î¤Çº£²ó¤ÏSPIÄÌ¿®¤ò»È¤Ã¤ÆÀ­Ç½¸Â³¦¤ËÄ©À路¤Æ¤ß¤Þ¤·¤ç¤¦¡£
¼õ¿®¤¹¤ë¤È¤­¤Ï¹Í¤¨¤ë¤³¤È¤¬Áý¤¨¤ë¤Î¤Ç¡¢º£²ó¤ÏÁ÷¿®¤À¤±¤ËÃíÌܤ·¤Þ¤¹¡£
¤¢¤È¡¢¼õ¿®Â¦¤Ï°ìÊýŪ¤Ë¥Ç¡¼¥¿¤ò¼õ¤±¼è¤ë¡¢¼õ¤±¼è¤ì¤ëÁ°Äó¤ÇÏäò¿Ê¤á¤Þ¤¹¡£(¼õ¿®Â¦¤Î¥¨¥é¡¼¤È¤«¤ò°ìÀڹͤ¨¤Ê¤¤¡£)

ATMega328¤Ë¤Ï¥Ï¡¼¥É¥¦¥§¥¢SPI¤¬È÷¤ï¤Ã¤Æ¤¤¤ë¤Î¤Ç¡¢½êÄê¤Î¥ì¥¸¥¹¥¿(SPCR,SPSR)¤Ë½ô¡¹ÀßÄꤷ¤¿¤¦¤¨¤ÇSPDR¥ì¥¸¥¹¥¿¤ËÃͤò½ñ¤­¹þ¤à¤È¡¢¤½¤ÎÃͤ¬¾¡¼ê¤ËÁ÷½Ð¤µ¤ì¤Þ¤¹¡£
¥Ç¡¼¥¿½ç¡¢SCK¶ËÀ­¡¢SCK°ÌÁꤢ¤¿¤ê¤Ï³Æ¼«¤ÇŬÅö¤Ê¤â¤Î¤òÁª¤Ö¤È¤·¤Æ¡¢
¤È¤ê¤¢¤¨¤ººÇ¹â®¤Ç¥Ç¡¼¥¿Á÷½Ð(¼çÁõÃÖÆ°ºî)¤¹¤ë¤È¤¹¤ì¤Ð

SPCR = 0b01x1xx00;
SPSR = 0b00000001;

¤òÀßÄꤹ¤ì¤Ð¤è¤¤¤Ç¤·¤ç¤¦¡£º£²ó¤Ïx¤ÎÉôʬ¤òÁ´Éô0¤Ë¤·¤¿ÀßÄê¤ÇÏäò¿Ê¤á¤Æ¤¤¤­¤Þ¤¹¡£

¤µ¤Æ¡¢8bit¤Î¥Ç¡¼¥¿¤¬datÊÑ¿ô¤Ë³ÊǼ¤µ¤ì¤Æ¤¤¤ë¤È¤·¤Æ¡¢¤³¤ì¤òÁ÷¤ë¤Ê¤é

SPDR = dat;

¤È¤¹¤ì¤Ð¤è¤¤¤ï¤±¤Ç¤¹¡£¤·¤«¤·¤³¤ì¤Ç¤Ï°ì¤ÄÌäÂ꤬¤¢¤Ã¤Æ¡¢¥Ç¡¼¥¿¤ÎÁ÷½ÐÃæ¤ËSPDR¥ì¥¸¥¹¥¿¤ËÃͤò½ñ¤­¹þ¤à¤È¥Ç¡¼¥¿¤Î¾å½ñ¤­¤¬µ¯¤­¤Æ¤·¤Þ¤¤¤Þ¤¹¡£(¥Ç¡¼¥¿¤¬Á÷½Ð¤µ¤ì¤Ê¤¤¡£)
¤³¤ì¤ò²óÈò¤¹¤ë¤¿¤á¤Ë¡¢°ìÈÌŪ¤Ë¤Ï

SPDR = dat;
while(!(SPSR & (1 << SPIF)));

¤È¤·¤ÆÁ÷½Ð¤¬½ª¤ï¤Ã¤Æ¤«¤é¼¡¤Î½èÍý¤Ë¿Ê¤à¤«¡¢¤¢¤ë¤¤¤Ï

while(!(SPSR & (1 << SPIF)));
SPDR = dat;

¤È¤·¤ÆÁ°¤Î¥Ç¡¼¥¿¤ÎÁ÷½Ð¤¬´°Î»¤·¤Æ¤«¤é¥Ç¡¼¥¿¤ÎÁ÷½Ð¤ò¹Ô¤¦¤è¤¦¤Ë¤·¤Þ¤¹¡£

°ìÏ¢¤Î½èÍý¤ò¤Þ¤È¤á¤Æ´Ø¿ô²½¤¹¤ì¤Ð

void SendSerial(unsigned char dat) {
SPDR = dat;
while(!(SPSR & (1 << SPIF)));
}

¤Î¤è¤¦¤Ë¤Ç¤­¤Þ¤¹¤¬¡¢´Ø¿ô¸Æ¤Ó½Ð¤·¤Î¥ª¡¼¥Ð¡¼¥Ø¥Ã¥É¤¬ÝµÆ«¤·¤¤¤Î¤Ç

#define SendSerial(dat) do { SPDR = (dat); while(!(SPSR & (1 << SPIF))); } while(0)

¤È¤¤¤¦¥Þ¥¯¥í´Ø¿ô¤ò½ñ¤¯¤Î¤âÎɤ¤¤«¤â¤·¤ì¤Þ¤»¤ó¡£
¥Þ¥¯¥í´Ø¿ô¤Î°­¤¤¤È¤³¤í¤Ï·¿°ÂÁ´¤Ç¤Ê¤¤(¤Þ¤¡º£²ó¤Î¾ì¹ç¤Ç¤Ï¥³¥ó¥Ñ¥¤¥é¤¬·Ù¹ð¤ò½Ð¤¹¤Ç¤·¤ç¤¦¤¬¡Ä¡Ä)¤³¤È¤Ê¤Î¤Ç¡¢

static inline void SendSerial(unsigned char dat) {
SPDR = dat;
while(!(SPSR & (1 << SPIF)));
}

¤³¤Î¤è¤¦¤Ë½ñ¤±¤Ð·¿¥Á¥§¥Ã¥¯¤â¤µ¤ì¤ë¤·´Ø¿ô¤¬¥¤¥ó¥é¥¤¥óŸ³«¤µ¤ì¤Æ´ò¤·¤¤¤Ç¤¹¤Í¡£
¤¿¤À¤·Â¿ÍѤ¹¤ë¤È¥×¥í¥°¥é¥à¤ÎÈîÂç²½¤Ë¤Ä¤Ê¤¬¤ê¤Þ¤¹¤·¡¢inline¡¢static inline¡¢extern inline¤òÀµ¤·¤¯»È¤¤Ê¬¤±¤Ê¤¤¤È¥³¥ó¥Ñ¥¤¥ë¤Ç¤­¤Ê¤«¤Ã¤¿¤êÀµ¤·¤¤µóÆ°¤ò¼¨¤µ¤Ê¤«¤Ã¤¿¤ê¤¹¤ë¤³¤È¤âµ¯¤³¤êÆÀ¤ë¤Î¤Ç¤Á¤ç¤Ã¤Èµ»Î̤òɬÍפȤ·¤Þ¤¹¤Í¡£

¤µ¤Æ¡¢¤³¤ì¤Ç¤Ò¤È¤Þ¤º¤ª¼ê·Ú¤Ë¥Ç¡¼¥¿¤ÎÁ÷½Ð¤¬¹Ô¤¨¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¤ï¤±¤Ç¤¹¤¬¡¢ËÜÅö¤Ë¤³¤ì¤ÇËþ­¤·¤Æ¤¤¤¤¤Î¤Ç¤·¤ç¤¦¤«¡£»î¤·¤Ë

SendSerial(0x40);
SendSerial(0x60);

¤È¤·¤Æ2¥Ð¥¤¥Èʬ¥Ç¡¼¥¿¤òÁ÷½Ð¤¹¤ë¥³¡¼¥É¤ò½ñ¤­¤Þ¤¹¡£
ºÇŬ²½¤Ë¤è¤Ã¤Æ¥¢¥»¥ó¥Ö¥é¤¬ÊѤï¤Ã¤Æ¤·¤Þ¤¦¤È¤Þ¤¿Ï䬤ä¤ä¤³¤·¤¯¤Ê¤ë¤Î¤Ç¥Ç¥Õ¥©¥ë¥È¤ÇÍÑ°Õ¤µ¤ì¤Æ¤¤¤ëDebug¥Ó¥ë¥É¤ÎÀßÄê¤Ç¥Ó¥ë¥É¤·¤Æ(==ºÇŬ²½¤Ê¤·)¡¢½ÐÎϤµ¤ì¤¿¥¢¥»¥ó¥Ö¥é¤ò³Îǧ¤·¤Æ¤ß¤Þ¤¹¡£

ldi r24, 0x40
ldi r25, 0x60
out 0x2e, r24
in r0, 0x2d
sbrs r0, 7
rjmp .-6
out 0x2e, r25
in r0, 0x2d
sbrs r0, 7
rjmp .-6

³ºÅö¤¹¤ëÉôʬ¤Î¥¢¥»¥ó¥Ö¥é¤Ï¤³¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£

  • r24¡¢r25¥ì¥¸¥¹¥¿¤Ë½ÐÎϤ·¤¿¤¤ÃͤòÆɤ߹þ¤ß

  • ¥ì¥¸¥¹¥¿¶õ´Ö¤Î0x2e(SPDR¥ì¥¸¥¹¥¿¤Î¥¢¥É¥ì¥¹)¤Ër24(r25)¤ÎÃͤò½ñ¤­¹þ¤ß

  • r0¥ì¥¸¥¹¥¿¤Ë¥ì¥¸¥¹¥¿¶õ´Ö¤Î0x2d(SPSR¥ì¥¸¥¹¥¿¤Î¥¢¥É¥ì¥¹)¤«¤éÃͤòÆɤ߹þ¤ß

  • r0¥ì¥¸¥¹¥¿¤Î7¥Ó¥Ã¥ÈÌܤ¬¥»¥Ã¥È¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð(0¤Ê¤é¤Ð)rjmpÌ¿Îá¤Ç2Ì¿ÎáʬÌá¤Ã¤Æ·«¤êÊÖ¤·

  • ¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¸å³¤Î½èÍý¤ò¹Ô¤¦


¤È¤¤¤Ã¤¿´¶¤¸¤Ç¤¹¤Í¡£

Æ°ºî¤È¤·¤Æ¤Ï¤³¤ì¤ÇÌäÂꤢ¤ê¤Þ¤»¤ó¤¬¡¢¶Ë¸Â¤Þ¤Ç®ÅÙ¤òÄɤ¤µá¤á¤Æ¤¤¤ë¤è¤¦¤Ê¿Í¤¬¤³¤ì¤ÇËþ­¤·¤Æ¤¤¤¤¤â¤Î¤Ç¤·¤ç¤¦¤«¡£¾å¤Ç½Ð¤Æ¤­¤¿Ì¿Îá¤Ï¤½¤ì¤¾¤ì¼Â¹Ô¤Ë

  • ldi : 1

  • out : 1

  • in : 1

  • sbrs: 1(¾ò·ïÉÔÀ®Î©) or 2(¾ò·ïÀ®Î©) (¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï3)

  • rjmp: 2


¥¯¥í¥Ã¥¯¤«¤«¤ê¤Þ¤¹¡£

¤µ¤Æ¡¢Àè¤Û¤É¤Î¥×¥í¥°¥é¥à¤ò¼ÂºÝ¤ËATMega328¤Ë½ñ¤­¹þ¤ó¤Ç¥Ô¥ó¤Î½ÐÎϤò³Îǧ¤·¤¿¤È¤³¤í¼¡¤Î¤è¤¦¤Ë¤Ê¤ê¤Þ¤·¤¿¡£
spi_1

°ìÈÖ²¼¤ÎÀĤ¤ÇÈ·Á¤ÏÆâÉô¥¯¥í¥Ã¥¯(¥Ò¥å¡¼¥º¥Ó¥Ã¥ÈCKOUT¤ò¥»¥Ã¥È¤·PB0¤«¤é¼èÆÀ)¡¢¿¿¤óÃæ¤ÎÀÖ¤¤ÇÈ·Á¤¬MOSI(PB3)¡¢°ìÈÖ¾å¤ÎÎФÎÇÈ·Á¤¬SCK(PB5)¤Ç¤¹¡£

¥Ç¡¼¥¿¤ÎÁ÷½Ð¤ÏoutÌ¿Î᤬¼Â¹Ô¤µ¤ì¤¿¼¡¤Î¥¯¥í¥Ã¥¯¤«¤é»Ï¤Þ¤ê¡¢8bit*2¥¯¥í¥Ã¥¯ = 16¥¯¥í¥Ã¥¯¤«¤«¤ê¤Þ¤¹¡£¾å¤Î¥³¡¼¥É¤Ç¤ÏSPSR¥ì¥¸¥¹¥¿¤ÎÃͤòÆɤ߹þ¤ß¤½¤ÎÃͤˤè¤Ã¤Æʬ´ô½èÍý¤ò¹Ô¤¤¤Þ¤¹¡£²¾¤ËoutÌ¿Îá¼Â¹Ô¸å¤Á¤ç¤¦¤É16¥¯¥í¥Ã¥¯¸å¤ËSPSR¥ì¥¸¥¹¥¿¤¬¹¹¿·¤µ¤ì¤ë¤È¤¹¤ì¤Ð¡¢1¥ë¡¼¥×¼Â¹Ô¤Ë4¥¯¥í¥Ã¥¯¤«¤«¤ë¤³¤È¤ËÃí°Õ¤¹¤ë¤È¡¢4²ó·«¤êÊÖ¤·½èÍý¤ò¹Ô¤Ã¤¿¸åin,sbrs(¾ò·ïÉÔÀ®Î©)¤È¿Ê¤ß¡¢·ë²ÌoutÌ¿Îá¼Â¹Ô¸å19¥¯¥í¥Ã¥¯¤Ç¥Ç¡¼¥¿¤ÎÁ÷½Ð¤¬¹Ô¤ï¤ì¤ë¤³¤È¤Ë¤Ê¤ê¤Þ¤¹¡£
¤È¤³¤í¤¬¼ÂºÝ¤Ë¬Äꤷ¤¿¤È¤³¤í¡¢outÌ¿Îᤫ¤é16¥¯¥í¥Ã¥¯¸å¤Ë¼Â¹Ô¤µ¤ì¤¿inÌ¿Îá¤Ç¼èÆÀ¤·¤¿ÃͤϤޤÀÁ÷½Ð´°Î»¤òɽ¤¹¥Ó¥Ã¥È(SPIF)¤¬Î©¤Ã¤Æ¤¤¤Ê¤¤¤è¤¦¤Ç¤¹¡£¤³¤ì¤Ë¤è¤Ã¤Æ(¿®¹æ¤È¤·¤Æ¤Ï)1¥Ð¥¤¥ÈÌܤÎÁ÷½Ð¤¬´°Î»¤·¤¿¤Ë¤â¤«¤«¤ï¤é¤º¡¢¤µ¤é¤Ë4¥¯¥í¥Ã¥¯¾ÃÈñ¤·¤Æ¥Ç¡¼¥¿¤ÎÁ÷½Ð´°Î»¤Þ¤Ç·×23¥¯¥í¥Ã¥¯¤òÍפ·¤Æ¤¤¤Þ¤¹¡£

¤½¤³¤Ç¡¢¤¢¤é¤«¤¸¤á1¥¯¥í¥Ã¥¯Ê¬nopÌ¿Îá¤ÇÂÔµ¡¤·¤Æ¤«¤é¥ë¡¼¥×¤ËÆþ¤ë¤è¤¦¤Ë¤·¤Æ¤ß¤Þ¤·¤ç¤¦¡£´Ø¿ô¤ò

static inline void SendSerialWithNop(unsigned char dat) {
SPDR = dat;
__asm__ __volatile__ ("nop");
while(!(SPSR & (1 << SPIF)));
}

¤³¤ÎÄ̤ê½ñ¤­´¹¤¨¡¢

SendSerialWithNop(0x40);
SendSerialWithNop(0x60);

¤È¤·¤Æ¸Æ¤Ó½Ð¤·¤Þ¤¹¡£À¸À®¤µ¤ì¤¿¥¢¥»¥ó¥Ö¥é¤Ï

ldi r18, 0x40
ldi r25, 0x60
ldi r24, 0x04
out 0x2e, r18
nop
in r0, 0x2d
sbrs r0, 7
rjmp .-6
out 0x2e, r25
nop
in r0, 0x2d
sbrs r0, 7
rjmp .-6

¤È¤Ê¤ê¡¢³Î¤«¤Ë¥ë¡¼¥×½èÍý¤ÎÁ°¤ËnopÌ¿Î᤬ÁÞÆþ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£(r24¥ì¥¸¥¹¥¿¤ËÂåÆþ¤µ¤ì¤Æ¤¤¤ë0x04¤Ï¡¢ÇÈ·Á³ÎǧÍѤΥé¥Ã¥Á½ÐÎϤ˻ÈÍѤµ¤ì¤Æ¤¤¤Þ¤¹¡£)

¤³¤ì¤ò¼Â¹Ô¤·¤¿·ë²Ì¡¢¤³¤¦¤Ê¤ê¤Þ¤·¤¿¡£
spi_2

³Î¤«¤Ë¥ë¡¼¥×²ó¿ô¤¬1²ó¸º¤Ã¤Æ¤Æ¡¢¤¤¤¤´¶¤¸¤Ç¤¹¤Í¡£outÌ¿Îá¼Â¹Ô¸å·×20¥¯¥í¥Ã¥¯¤ÇÁ÷½Ð´°Î»¤·¤Æ¤¤¤Þ¤¹¡£

¤µ¤Æ¡¢¾å¤Î·ë²Ì¤«¤é¤É¤¦¤â1¥Ð¥¤¥È¤ÎÁ÷½Ð¤Ë¤Ï17¥¯¥í¥Ã¥¯¤òÍפ¹¤ë¤È¤¤¤¦¤³¤È¤¬¤ï¤«¤ê¤Þ¤¹¡£
¤½¤ì¤Ê¤é¤Ð¡¢¤µ¤é¤ËÀÚ¤êµÍ¤á¤Æ¡¢34¥¯¥í¥Ã¥¯¤Ç2¥Ð¥¤¥Èʬ¤Î¥Ç¡¼¥¿¤¬Á÷½Ð¤¬¤Ç¤­¤ë¤è¤¦¤Êµ¤¤¬¤·¤Æ¤­¤Þ¤¹¤Í?¼ÂºÝ¤Ë¤ä¤Ã¤Æ¤ß¤Þ¤·¤ç¤¦¡£


static inline void SendSerialAsAssembler(unsigned char dat) {
SPDR = dat;
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
__asm__ __volatile__ ("nop");
}

¤³¤ó¤Ê´Ø¿ô¤òÄêµÁ¤·¤Þ¤·¤Æ¡¢

SendSerialAsAssembler(0x40);
SendSerialAsAssembler(0x60);

¤³¤Î¤è¤¦¤Ë¸Æ¤Ó½Ð¤·¤Þ¤¹¡£À¸À®¤µ¤ì¤¿¥¢¥»¥ó¥Ö¥é¤Ï

90: 20 e4 ldi r18, 0x40 ; 64
92: 90 e6 ldi r25, 0x60 ; 96
94: 84 e0 ldi r24, 0x04 ; 4
96: 2e bd out 0x2e, r18 ; 46
...
b8: 9e bd out 0x2e, r25 ; 46
...
da: (ÇÈ·Á³ÎǧÍѤΥé¥Ã¥ÁÁàºî¥³¡¼¥É)

¤â¤Ï¤äϢ³¤¹¤ënopÌ¿Îá¤Ï½ÐÎϤ·¤Æ¤¯¤ì¤Þ¤»¤ó¤Ç¤·¤¿¡£(¤ï¤«¤é¤Ê¤¯¤Ê¤ë¤Î¤Ç¤³¤ÎÎã¤À¤±¥¢¥É¥ì¥¹¤âÊ»¤»¤Æɽ¼¨¤·¤Æ¤¤¤Þ¤¹¡£)³Î¤«¤ËnopÌ¿Îá¤Ï¥Ð¥¤¥Ê¥ê¤Ç00 00¤Ç¤¹¤«¤é¤³¤Î¤è¤¦¤Ê¾Êά·Á¤Î½ÐÎϤ¬¤µ¤ì¤ë¤Î¤â¤¦¤Ê¤º¤±¤Þ¤¹¡£

¤³¤ì¤ò¼Â¹Ô¤·¤¿¤È¤³¤í¡¢¤³¤¦¤Ê¤ê¤Þ¤·¤¿¡£
spi_3

¤¿¤Ö¤ó¤³¤ì¤¬°ìÈÖÁᤤ¤È»×¤¤¤Þ¤¹¡£

¤Þ¤¡¡¢¾õ¶·¤Ë¤è¤Ã¤Æ¤Ï16¥¯¥í¥Ã¥¯°ÊÆâ¤ËÁ÷½Ð¤·¤¿¤¤Ãͤη׻»¤¬½ª¤ï¤é¤Ê¤¤¾ì¹ç¤â¤¢¤ë¤È»×¤¦¤Î¤Ç¡¢¤½¤¦¤¤¤¦»þ¤Ï¤â¤Ï¤änopÌ¿Îá¤òÆþ¤ì¤Ê¤¯¤Æ¤âÁ÷½Ð¤Ç¤­¤ë¤Ç¤·¤ç¤¦¤·¡¢Æþ¤ì¤ë¤À¤±ÌµÂ̤Ǥ¹¤Í¡£¾õ¶·¤´¤È¤Ë¥Á¥å¡¼¥Ë¥ó¥°¤·¤¿¤¤¿Í¤Ï¤â¤¦¾¡¼ê¤Ë¤¬¤ó¤Ð¤ì¤È¤·¤«¸À¤¨¤Ê¤¤(¤½¤ì¤Ï¤½¤¦)¡£¤³¤ì¤Ï¤¢¤¯¤Þ¤Ç¤âÁ÷½Ð¤¬½ªÎ»¤¹¤ë¥¯¥í¥Ã¥¯¤«¤é¸å³¤Î½èÍý¤ò¼Â¹Ô¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Æ¤ß¤¿¡¢¤È¤¤¤¦¤À¤±¤Ç¤¹¡£

µ¤¤òÉÕ¤±¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤Î¤Ï¡¢¤³¤ì¤ÏSCK¼þÇÈ¿ô¤òfOSC/2¤ËÀßÄꤷ¤¿¾ì¹ç¤Ë¤Î¤ß»È¤¨¤ëµ»Ë¡¤À¤È¤¤¤¦¤³¤È¤Ç¤¹¡£SCK¼þÇÈ¿ô¤òÊѤ¨¤¿¤éÅöÁ³1¥Ð¥¤¥È¤ÎÁ÷½Ð¤Ë¤«¤«¤ë¥¯¥í¥Ã¥¯¿ô¤¬ÊѤï¤Ã¤Æ¤·¤Þ¤¦¤Î¤Ç¡¢Àµ¤·¤¯¥Ç¡¼¥¿¤ÎÁ÷½Ð¤¬¤Ç¤­¤Ê¤¤¤Ç¤·¤ç¤¦¡£¤½¤¦¤Ï¤¤¤Ã¤Æ¤â¡¢Æ±¤¸¤è¤¦¤ÊȯÁۤǥ¯¥í¥Ã¥¯¿ô¤òµÍ¤á¤ë¤³¤È¤Ï¤Ç¤­¤ë¤È»×¤¤¤Þ¤¹¡£³Æ¼«´èÄ¥¤Ã¤Æ¤¯¤À¤µ¤¤¡£


¤½¤ó¤Ê¤ï¤±¤Ç¡¢ºÇ¶á¤Ï¤³¤ó¤Ê´¶¤¸¤Ç1¥¯¥í¥Ã¥¯¤ò¤Ò¤Í¤ê½Ð¤¹¤³¤È¤Ë¥ï¥¯¥ï¥¯¤ò´¶¤¸¤Ê¤¬¤éAVR¤Èµº¤ì¤Æ¤ª¤ê¤Þ¤¹¡£¤â¤¦¤Á¤ç¤Ã¤È(µ»Î̤Ϥ¤¤ë¤±¤É)¤ª¼ê·Ú¤Ë¤Ç¤­¤ë1¥¯¥í¥Ã¥¯¤ò¤Ò¤Í¤ê½Ð¤¹µ»Ë¡¤È¤«¤â¤¢¤Ã¤¿¤ó¤Ç¤¹¤±¤É¡¢¤¢¤ó¤Þ¤êÉáÊ×À­¤¬¹â¤¯¤Ê¤¤¤Î¤Ç¤ä¤á¤Þ¤·¤¿¡£(°·¤¦¥Ç¡¼¥¿¹½Â¤¤Ë°Í¸¤·¤¿¤ê¤¹¤ë¡£)º£²ó¤ÎÆâÍƤ¬ÉáÊ×À­¹â¤¤¤«¤ÏÈù̯¤À¤±¤É¤Í¡£

¤½¤ì¤Ç¤Ïº£Æü¤Ï¤³¤ÎÊդǡ£Îɤ¤AVR¥é¥¤¥Õ¤ò¡£  

Posted by ueckoken at 22:31 ¨¢Comments(0)