トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

PRG-arduino-asm

Arduino asm

asm("
オペコード1 オペランド1 \n\t
オペコード2 オペランド2 \n\t
");

もしくは

asm volatile(
"オペコード1 オペランド1[マクロA名]" "\n\t"
"オペコード2 オペランド2[マクロB名]" "\n\t"
);

sample LED brink

volatile uint8_t *port;
uint8_t High,Low,Mask;
uint8_t PinNumber = 2;

void setup() {

 DDRD = 0x04;
 PORTD = 0x00;

 port = portOutputRegister(digitalPinToPort(PinNumber));
 Mask = digitalPinToBitMask(PinNumber);
 High = *port | Mask;
 Low = *port | ~Mask;
 ledFlashing();
}

void loop() {

}


void ledFlashing(){

     asm volatile(
     "LEDS:"                 "\n\t"  //LEDS
     "st %a[port], %[High]"  "\n\t"  //I/Oポートに転送
     "rcall delay1000m"      "\n\t"  //1秒待ち
     "st %a[port], %[Low]"   "\n\t"  //I/Oポートに転送
     "rcall delay1000m"      "\n\t"  //1秒待ち
     "rjmp LEDS"             "\n\t"  //繰り返し

     "delay1000m:"           "\n\t"  //サブルーチン
     "ldi R18,60"            "\n\t"  //汎用レジスタに定数60転送
     "delay52:"              "\n\t"  //
     "rcall delay1"          "\n\t"  //delay1を呼ぶ
     "dec r18"               "\n\t"  //R18をデクリメント
     "brne delay52"          "\n\t"  //R18が0でなければdelay52を呼ぶ
     "ret"                   "\n\t"  //復帰

     "delay1:"               "\n\t"  //サブルーチン
     "ldi r19,255"           "\n\t"  //R19に定数255を転送
     "delay12:"              "\n\t"  //
     "rcall delay4"         "\n\t"   //delay4へ
     "dec r19"               "\n\t"  //R19をデクリメント
     "brne delay12"          "\n\t"  //R19が0でなければdelay12
     "ret"                   "\n\t"  //復帰

     "delay4:"              "\n\t"  //サブルーチン 4クロック分
     "ldi r20,255"          "\n\t"  //R20に定数255を転送
     "delay42:"             "\n\t"  //
     "nop"                  "\n\t"  //1クロック何もしない。
     "dec r20"              "\n\t"  //R20をデクリメント
     "brne delay42"         "\n\t"  //
     "ret"                          //復帰
      :[port]"+e"(port)
      :[High]"r"(High),
       [Low]"r"(Low)
     );
 }

参照元

http://qiita.com/TakeoChan/items/8362eaf53cf199262cb7