Быстродействие arduino. Чтение ключа от домофона метаком.
- Войдите на сайт для отправки комментариев
Втр, 27/01/2015 - 05:03
Пытаюсь сделать эмулятор ключа от домофона метаком. Столкнулся с проблемой быстродействием ардуино.
Тайм слот передачи бита от 80 до 200 мкс. В течении тайм слота необходимо 2 раза измерить продолжительность (высокого и низкого уровня тока) сигнала. А у ардуино AnalogRead() — скорость выполнения 110 мкс. В инете нашел способ ускорения ардуино. вот этот ускоритель
#define FASTADC 1 // defines for setting and clearing register bits #ifndef cbi #define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) #endif #ifndef sbi #define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) #endif #if FASTADC // set prescale to 16 sbi(ADCSRA,ADPS2) ; cbi(ADCSRA,ADPS1) ; cbi(ADCSRA,ADPS0) ; #endif
После применения этого "ускорителя" все норм читается, но перестали выполняться свои функции. ( Для удобства хотел разбить код на несколько кусков и вывести из setup loop на отд. функции и вызывать их из основного цикла). Хотел задать вопрос опытным программистам, что делает этот "ускоритель"? и как вызовать свои функции?
Этот код всего лишь устанавливает в трех младших разрядах регистра ADCSRA (одного из регистров управляющих АЦП) комбинацию бит которая переводит АЦП на тактирование частотой 1МГц. При этом AnalogRead() выполняется примерно за 16-18 мкс. Но сделано это чрезмерно замудренно. Проще так:
Повышение частоты ухудшает точность АЦП но не должно никак влиять на выполнение программы. Ищите в ней ошибки.
Alex_Sk Спасибо!
Все работает и код укоротился Вот код может кому пригодится или кто подскажет пути дальнейшей оптимизации. В коде много лишнего из за необходимости отладки ,так как готовых скетчей и библиотек не нашел.
Код устанавливающий делитель частоты для АЦП не нужен в loop() и тем более в цикле в этой программке. Его достаточно один раз выполнить в Setup(). Это уменьшит время цикла и повысит точность определения длительности посылок.
Логику работы не смотрел, но сразу бросается в глаза куча умножений типа i*8 и k*8 в теле циклов при этом сами переменные циклов i и k используются в несколько раз реже. Если умножение на 8 перенести в условия задания циклов а там где надо i и k применить деление то быстродействие повысится. И в случае операнда 8 лучше использовать бинарный сдвиг который выполняется на порядок-два быстрее: i*8 = i<<3 и i/8 = i>>3
Пока на руках клон ключа, завтра будет орг. ключа с которого сделали этот ключ. Сравню результаты и выложу код оптимизированный учитывая рекомендации Alex_Sk. Не так уж и прост это ардуино для начинающего, чем казалось на первый взляд. Еще раз выражаю благодарность Alex_Sk.
Разница длительности тайм слота оригинала и клона небольшая. Оба ключи читаются норм.
Здравствуйте! Подскажите пожалуйста , на каой Arduino был изготовлен эулятор, к каким выводам подключен считыватель ключей? На схеме для считывания кода ключа нет номинолов элементов.
на три года опоздал с вопросом....
Выводы. к которым подключен эмулятор - очевидны из скетча, смотрите внимательнее.
Недавно начал осваивать Arduino,в программировании слаб. В какой строке смотреть?
Я Вам настоятельно рекомендую прочитать все строки.
Просматривал не однократно. По моим догадкам в этой строке-while(analogRead(0)
Какую ардуину можно использовать для данного скетча?
Не корректно читает код ключа. Чтение производилось разными считывателями, ускоритель бесполезный, без него результат тот-же. Всем спасибо за помощь!