- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
! 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
http://qiita.com/TakeoChan/items/8362eaf53cf199262cb7
http://edu.net.c.dendai.ac.jp/micom/2018/2/index.html#flash