roboforum.ruТехнический форум по робототехнике. |
|
|
Если на бейсике получается даже оптимальней - тогда в топку такой ардуиновый язык мы же на меге пишем, там и там не много мегагерц, хотя конечно уклонение от препятствий и лабиринт с 2-3 датчиками можно и нём писать.
Виталий писал(а):1. Ну про бейсик это конечно неправда.
Виталий писал(а):2. Кто-то недавно порывался на С++ писать под авр.
А в ардуино элементарное чтение пина через digitalRead - ок. 150 байт кода, и соотв. количество тактов процессора.
reading = digitalRead(inPin);
f2: 80 91 00 01 lds r24, 0x0100
f6: 0e 94 dd 01 call 0x3ba <digitalRead>
fa: ec 01 movw r28, r24
fc: 90 93 0b 01 sts 0x010B, r25
100: 80 93 0a 01 sts 0x010A, r24
...............................................
int digitalRead(uint8_t pin)
{
uint8_t timer = digitalPinToTimer(pin);
3ba: 48 2f mov r20, r24
3bc: 55 27 eor r21, r21
3be: ca 01 movw r24, r20
3c0: 81 56 subi r24, 0x61 ; 97
3c2: 9f 4f sbci r25, 0xFF ; 255
3c4: fc 01 movw r30, r24
3c6: 24 91 lpm r18, Z
uint8_t bit = digitalPinToBitMask(pin);
3c8: ca 01 movw r24, r20
3ca: 85 57 subi r24, 0x75 ; 117
3cc: 9f 4f sbci r25, 0xFF ; 255
3ce: fc 01 movw r30, r24
3d0: 94 91 lpm r25, Z
uint8_t port = digitalPinToPort(pin);
3d2: 49 58 subi r20, 0x89 ; 137
3d4: 5f 4f sbci r21, 0xFF ; 255
3d6: fa 01 movw r30, r20
3d8: 34 91 lpm r19, Z
if (port == NOT_A_PIN) return LOW;
3da: 33 23 and r19, r19
3dc: 19 f4 brne .+6 ; 0x3e4 <digitalRead+0x2a>
3de: 80 e0 ldi r24, 0x00 ; 0
3e0: 90 e0 ldi r25, 0x00 ; 0
3e2: 08 95 ret
// If the pin that support PWM output, we need to turn it off
// before getting a digital reading.
if (timer != NOT_ON_TIMER) turnOffPWM(timer);
3e4: 22 23 and r18, r18
3e6: 31 f1 breq .+76 ; 0x434 <digitalRead+0x7a>
3e8: 23 30 cpi r18, 0x03 ; 3
3ea: 21 f4 brne .+8 ; 0x3f4 <digitalRead+0x3a>
3ec: 80 91 80 00 lds r24, 0x0080
3f0: 8f 77 andi r24, 0x7F ; 127
3f2: 05 c0 rjmp .+10 ; 0x3fe <digitalRead+0x44>
3f4: 24 30 cpi r18, 0x04 ; 4
3f6: 31 f4 brne .+12 ; 0x404 <digitalRead+0x4a>
3f8: 80 91 80 00 lds r24, 0x0080
3fc: 8f 7d andi r24, 0xDF ; 223
3fe: 80 93 80 00 sts 0x0080, r24
402: 18 c0 rjmp .+48 ; 0x434 <digitalRead+0x7a>
404: 21 30 cpi r18, 0x01 ; 1
406: 19 f4 brne .+6 ; 0x40e <digitalRead+0x54>
408: 84 b5 in r24, 0x24 ; 36
40a: 8f 77 andi r24, 0x7F ; 127
40c: 04 c0 rjmp .+8 ; 0x416 <digitalRead+0x5c>
40e: 22 30 cpi r18, 0x02 ; 2
410: 21 f4 brne .+8 ; 0x41a <digitalRead+0x60>
412: 84 b5 in r24, 0x24 ; 36
414: 8f 7d andi r24, 0xDF ; 223
416: 84 bd out 0x24, r24 ; 36
418: 0d c0 rjmp .+26 ; 0x434 <digitalRead+0x7a>
41a: 26 30 cpi r18, 0x06 ; 6
41c: 21 f4 brne .+8 ; 0x426 <digitalRead+0x6c>
41e: 80 91 b0 00 lds r24, 0x00B0
422: 8f 77 andi r24, 0x7F ; 127
424: 05 c0 rjmp .+10 ; 0x430 <digitalRead+0x76>
426: 27 30 cpi r18, 0x07 ; 7
428: 29 f4 brne .+10 ; 0x434 <digitalRead+0x7a>
42a: 80 91 b0 00 lds r24, 0x00B0
42e: 8f 7d andi r24, 0xDF ; 223
430: 80 93 b0 00 sts 0x00B0, r24
if (*portInputRegister(port) & bit) return HIGH;
434: e3 2f mov r30, r19
436: ff 27 eor r31, r31
438: ee 58 subi r30, 0x8E ; 142
43a: ff 4f sbci r31, 0xFF ; 255
43c: e4 91 lpm r30, Z
43e: ff 27 eor r31, r31
440: 80 81 ld r24, Z
442: 20 e0 ldi r18, 0x00 ; 0
444: 30 e0 ldi r19, 0x00 ; 0
446: 89 23 and r24, r25
448: 11 f0 breq .+4 ; 0x44e <digitalRead+0x94>
44a: 21 e0 ldi r18, 0x01 ; 1
44c: 30 e0 ldi r19, 0x00 ; 0
44e: c9 01 movw r24, r18
return LOW;
}
450: 08 95 ret
in R24, PINB
and R24, 0x80
sts somevar, R24
Виталий писал(а):У всех у кого есть необходимость в платформе для быстрой проверки идей - очень советую.
Виталий писал(а):Ну и пиши на ассемблере
somevar = PINB & 0x80;
0: 86 b3 in r24, 0x16 ; 22
2: 80 78 andi r24, 0x80 ; 128
4: 80 93 00 00 sts 0x0000, r24
6: R_AVR_16 somevar
FireFly писал(а):нифига это не отечественный, это амерский вариант - открытый проект как собстна и все ардуино-клоны, его все кому не лень лепят
Вернуться в Arduino и другие Xduino
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 3