Ускоряем свою Arduino

DLL
Offline
Зарегистрирован: 27.01.2013

В сети наткнулся на такую статью http://habrahabr.ru/post/141442/ . Не понимаю каким образом реализуется ускарение функции digitalWrite().

leshak
Offline
Зарегистрирован: 29.09.2011

Таким что выкидывается она (и вместе с ней универсальность и независимость от железа). Выкинули один слой абстракции - получили прирост скорости (универсальность и простота - даром не дается. Если ардуино библиотека взяла на себя "черновоую работу" по выяснению порта, мина, "не зацепить соседние", возможность использовать аналоговые.... то ей для этого требуется не манна, а такты процессора.

Идите в раздел програмирование и почитайте статью "Прямое управление выходами....". 

carduino.ru
Offline
Зарегистрирован: 06.12.2011

Вот Вам еще статья про ускорение Arduino

В результате скорость  выросла в 22 раза

AlexFisher
AlexFisher аватар
Offline
Зарегистрирован: 20.12.2011

carduino.ru пишет:

Вот Вам еще статья про ускорение Arduino

В результате скорость  выросла в 22 раза

Это и есть прямое управление через регистры. Там в h-файле просто набор макроопределений. Для использования подобной "фишки" нужно иметь такие файлы для каждой платы и подключать, соответственно, "ручками" (хотя, наверно, можно как-то привязаться к среде, чтобы автоматом выбиралось).

Делать такие вещи имеет смысл только если действительно очень нужно быстрее сделать. Иначе смысла нет. То, что переносимость скетча теряется - весский аргумент так не делать :)

stdima
stdima аватар
Offline
Зарегистрирован: 11.03.2015

Сейчас работает c nano, mega, leonardo. Вопрос с переносимостью отпадает. Правда с мегой работает частично, но главное (дёрганье ногой) работает.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а я делаю по другому. что для меня удобней

взял обычную функцию digitalWrite. выкинул из нее все лишее и объявил новую dWrite (чтобы не заморачиваться с названием)

потом конечно протестировал. digitalWrite 100 или 110 мкс. точно не помню

dWrite 11 мкс

через регистры 10мкс

так как разница небольшая проще dWrite использовать. не нужен под рукой даташит. использование как у digitalWrite (только шим не отключает если был включен)

вот тестировал на 8 или 16мгц ардуине не помню. но все меняется пропорционально

stdima
stdima аватар
Offline
Зарегистрирован: 11.03.2015

Важно то, что пользователи ардуины углубляются в суть работы МК.

kisoft
kisoft аватар
Offline
Зарегистрирован: 13.11.2012

Ах если бы так. Тогда бы на форуме жил только один раздел "Проекты" и вопросы бы никто не задавал. Прям коммунизм! :)

 

carduino.ru
Offline
Зарегистрирован: 06.12.2011

+100

Radjah
Offline
Зарегистрирован: 06.08.2014

Я вот иногда CyberLib из второй ссылки использую. Она для nano, uno и mega отлично подходит. Для дерганья пинов самое то, да программа худеет заметно. Там и замена для delay есть.

RANDREY
Offline
Зарегистрирован: 10.06.2012

jeka_tm пишет:

взял обычную функцию digitalWrite. выкинул из нее все лишее и объявил новую dWrite (чтобы не заморачиваться с названием)

А где и что выкинуть, это здесь кухня wiring_digital.c  ?

Там мало понятная каша с таймеров....

dmitriykisliy
Offline
Зарегистрирован: 03.03.2015

cyberliib рулит, но когда в скетч добавился таймер компилятор начал ругаться, приходится учить битовые операции. а ее delay действительно в прерываниях работает

stdima
stdima аватар
Offline
Зарегистрирован: 11.03.2015

>cyberliib рулит, но когда в скетч добавился таймер компилятор начал ругаться

Пкажите скетч.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
void dWrite(byte pin, byte val){
  byte bit = digitalPinToBitMask(pin);
  volatile byte *out;
  out = portOutputRegister(digitalPinToPort(pin));
  (val)? *out |= bit : *out &=~bit;
}

пользоваться как с digitalWrite

krepton85
Offline
Зарегистрирован: 02.02.2016

jeka_tm пишет:

void dWrite(byte pin, byte val){
  byte bit = digitalPinToBitMask(pin);
  volatile byte *out;
  out = portOutputRegister(digitalPinToPort(pin));
  (val)? *out |= bit : *out &=~bit;
}

пользоваться как с digitalWrite

Где то это я уже видел в библиатеках, а как сделать тоже самое но для команды DigitalRead и AnalogRead, AnalogWrite ?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Так это тоже саме, просто убрал защиту от дурака. В остальные я не лез

krepton85
Offline
Зарегистрирован: 02.02.2016

Я хотел на меге использовать CyberLib для чтения аналоговых портов, но оказалось эту библиатеку не дописали для Меги по аналоговым портам. :)

Green
Offline
Зарегистрирован: 01.10.2015

jeka_tm пишет:

void dWrite(byte pin, byte val){
  byte bit = digitalPinToBitMask(pin);
  volatile byte *out;
  out = portOutputRegister(digitalPinToPort(pin));
  (val)? *out |= bit : *out &=~bit;
}

пользоваться как с digitalWrite

bool val будет правильнее.)