Частота вызовов loop()

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Вопрос о частоте вызовов lopp() вставал многократно. Мне ьыло как-то по барабану, а тут потребовалось. Пришлосьпоставить эксперимент. Решил поделиться с общественностью полученной информацией.

Итак, обычная 16МГц Nano. Среда IDE 1.6.5. Загрузчик в Nano тот, что поставляется с этой средой. Скетч:

void setup(void) {
	pinMode(3,OUTPUT);
	cli();
}

void loop(void) {
	PIND |= (1 << 3);
}

Как видите, прервания закрыты, чтобы подсчёт millis() не отъедал время. Внутри loop исполняется одна единственная команда (и компилятор сделат одну команду процессора - sbi 9,3). На третьем пине должен получиться прямоугольный сигнал близкий к меандру. Частота этого сиганала ровно вдвое меньше частоты вызова функции loop(). Вот этот сигнал:

 

 

Таким образом loop() вызывается с частотой 1,136МГц. Вопрос о частоте вызов loop() в IDE 1.6.5 считаю закрытым. В других IDE может отличаться. Скетч есть - проверяйте, кому надо.

allesanbr
Offline
Зарегистрирован: 31.01.2016

ЕвгенийП пишет:
Таким образом loop() вызывается с частотой 1,136МГц. Вопрос о частоте вызов loop() в IDE 1.6.5 считаю закрытым. В других IDE может отличаться. Скетч есть - проверяйте, кому надо.

В IDE(-шках) очень редко пересобирается компилятор, и переписываются основные либы.

Более интересно было бы увидеть подобные исследования различных плат, и одинаковых плат с различным происхождением, например:

Ленардо оригинальная, леонардо китайская, и искра нео.

И всё в таком духе... Да и здесь желательно акцентировать, оригинальная плата или китаец.

Но спасибо и за эти результаты. Думаю эта информация кому-то вполне пригодиться, например собирать программный ШИМ-регулятор.

inspiritus
Offline
Зарегистрирован: 17.12.2012

Спасибо. Как всегда плюсанул.

MagicianT
Offline
Зарегистрирован: 03.10.2015

Информация никакого смысла не имеет. Нет никакого вызова луп. Луп он потому и луп что по кругу крутится, любая команда добавленная внутрь изменит время цикла. Если нужно быстрее попробуйте вставить:

void setup(void) {
	pinMode(3,OUTPUT);
	cli();
}

void loop(void) {
  while(1) {
	PIND |= (1 << 3);
   }
}

 

axill
Offline
Зарегистрирован: 05.09.2011

allesanbr пишет:
ЕвгенийП пишет:
Таким образом loop() вызывается с частотой 1,136МГц. Вопрос о частоте вызов loop() в IDE 1.6.5 считаю закрытым. В других IDE может отличаться. Скетч есть - проверяйте, кому надо.
В IDE(-шках) очень редко пересобирается компилятор, и переписываются основные либы. Более интересно было бы увидеть подобные исследования различных плат, и одинаковых плат с различным происхождением, например: Ленардо оригинальная, леонардо китайская, и искра нео. И всё в таком духе... Да и здесь желательно акцентировать, оригинальная плата или китаец. Но спасибо и за эти результаты. Думаю эта информация кому-то вполне пригодиться, например собирать программный ШИМ-регулятор.

если МК один и частота одна то разницы не будет хоть китаей хоть итальянский оригинал. Частоты вызова луп зависит исключительно от количество тактов попавших в код и от длительности такта. все

axill
Offline
Зарегистрирован: 05.09.2011

дух исследователя очень правильный дух))

вот только смысл в ответе на ворос "как часто вызывается луп"? если эта частота категорическим образом зависит от скетча

Клапауций 322
Offline
Зарегистрирован: 31.12.2015

axill пишет:

если МК один и частота одна то разницы не будет хоть китаей хоть итальянский оригинал. Частоты вызова луп зависит исключительно от количество тактов попавших в код и от длительности такта. все

китайцы в свои контроллеры скорости недокладывают.

axill
Offline
Зарегистрирован: 05.09.2011

Клапауций 322 пишет:

китайцы в свои контроллеры скорости недокладывают.

да ладно! у них глаза узкие, а как известно из школьного курса физики поток воздуха в узких местах скорость увеличивает, главное, чтобы давления докладывали в нужном количестве

allesanbr
Offline
Зарегистрирован: 31.01.2016

axill пишет:

вот только смысл в ответе на ворос "как часто вызывается луп"? если эта частота категорическим образом зависит от скетча

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

Для справки: при delay(1);
Частота вызова loop(); составляет всего лишь 1кГц.

То есть даже для приклажного программирования звука(от 10Гц до 20кГц) эта частота уже не подходит. Тогда как частота в 1мГц покрывает весь звуковой, весь длинноволновый радио диапазон(может применяться в качестве импульсного генератора для металлодетектора), и половину средневолнового диапазона(радио-управляемые устройства).

axill
Offline
Зарегистрирован: 05.09.2011

allesanbr пишет:
т. Тогда как частота в 1мГц покрывает весь звуковой, весь длинноволновый радио диапазон(может применяться в качестве импульсного генератора для металлодетектора), и половину средневолнового диапазона(радио-управляемые устройства).

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

allesanbr
Offline
Зарегистрирован: 31.01.2016

axill пишет:
Все полностью определяется тем какой код упрятан в loop в конкретном скетче.

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

Как результат, я могу каждый из 20 пинов ардуино превратить в ШИМ-регулятор который будет поддерживать не 256 градаций а например 1024.
Для этого мне нужно иметь довольно высокую частоту вызова как минимум в 20 раз(количество пинов) превышающую число градаций - 1024. То есть более 20 кГц.

Что опять много меньше, чем даже 1мГц.
Но намного больше чем 1кГц.
Что оставляет нам возможность написать кучу полезного кода, для того, чтобы всем этим управлять.

Что же касается того, что не всегда важна скорость, не соглашусь: не всегда важна высокая скорость - это ближе к истине.

В данном контексте, речь идёт о полезности исследования автора. Лично для меня оно было полезно.
Для Вас же видимо манипуляции с частотами - дело тёмное. Что ж... поинтересуйтесь. Думаю Вы увидите кучу совершенно неожиданных возможностей для ардуино.

bwn
Offline
Зарегистрирован: 25.08.2014

В любом случае, это знание, а что с ним делать, каждый сам решает. ++

Andy
Andy аватар
Offline
Зарегистрирован: 01.01.2016

Если взглянуть на main.cpp

	for (;;) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        

то можно обнаружить пути для оптимизации. Предлагаю автору провести эксперимент с таким циклом:

	while (1) {
		loop();
		if (serialEventRun) serialEventRun();
	}
        

и убедиться, что цикл выполняется в 4 раза быстрее.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

axill пишет:

дух исследователя очень правильный дух))

На самом деле, в данном случае не совсем правильный. Вернее, исследование неправильное. Если бы нужно было провести исследование, то гораздо точнее было бы посмотреть во что компилируется вызлв loop() из файла main.cpp и посчитать такты.

Данный "эксперимент" появился случайно при проведении другой работы и преимущество его перед подсчётом тактов в наглядности и очевидности для тех коллег, для которых пока что машинные команды и их такты - шаманство.

axill пишет:

вот только смысл в ответе на ворос "как часто вызывается луп"? 

А смысл (т.е. для чего я его выложил) вот какой. Опять же, речь о начинающих коллегах. Они склонны свято верить всяким гуру и пророкам - писателям волшебных "либ". Например, уже не раз на этом форуме приходилось читать о том, что при правильной "либе" (и где они это уродливое слово взяли?!) получается 2650 кГц. Ноги растут из брехливой рекламы, но парни верят, как Святому Писанию.

Как Вы могли заметить, во всем моих постах приводятся простенькие скетчики, которые (я надеюсь) понятны любому и повторяемы любым новичком. И предлагется метод: хотите что-то узнать ...

1. напишите крохотный скетчик;
2. запустите;
3. посмотрите;
4. стряхните лапшу с ушей.

Считаю это тем самым случаем, когда "метод значительно ценнее результата".

--------------

Ну, и, кстати, для внимательных, здесь попутно показано как правильно инверитровать пин. А это уже полезная в жизни информация.

Используемая здесь конструкция PIND |= (1 << 3); разворачивается в одну машинную команду (2 такта).

sbi 0x9,3

а, например, конструкция D3_INV из той же CyberLib - в четыре однотактовые команды.

in r24,0xb
ldi r25,lo8(8)
eor r24,r25
out 0xb,r24

т.е. по времени CyberLib хуже вдвое, а по памяти в четыре раза.

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Andy пишет:

Предлагаю автору провести эксперимент с таким циклом:

Сами проводите, нечего всё на ТС грузить  :)))

bwn
Offline
Зарегистрирован: 25.08.2014

ЕвгенийП пишет:

А смысл (т.е. для чего я его выложил) вот какой. Опять же, речь о начинающих коллегах. Они склонны свято верить всяким гуру и пророкам - писателям волшебных "либ". Например, уже не раз на этом форуме приходилось читать о том, что при правильной "либе" (и где они это уродливое слово взяли?!) получается 2650 кГц. Ноги растут из брехливой рекламы, но парни верят, как Святому Писанию.

Кстати  часто встречается и другая крайность. Уверенность, что loop движется со скоростью черепахи и искреннее недоумение, почему кнопка без защелки работает не так, как хотелось бы.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Забавно. Там чел тоже поставил эксперимент и он ПОКАЗАЛ эти самые 2.65мегагерца .. но Вы почему-то назвали тот эксперимент "брехливой рекламой" .. пока что вы сами брехливы.

Разницу в скетчах обнаружить оказалось "не по глазам"? :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhat109-2 пишет:

Разницу в скетчах обнаружить оказалось "не по глазам"? :)

Виноват, ссылкой ошибся - были открыты обе, не оттуда скопировал. "Брехливая реклама" относилось вот к этой ссылке: http://istarik.ru/blog/arduino/1.html

Приношу извинения. Поправить ссылку там уже не могу, на пост ответили.

Если "кто может" заменит сслку в посте №13 на приведённую здесь, буду благодарен.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Принято. :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

На самом деле, цена цикличного вызова loop() действительно слишком высока. Поэтому там где требуется высокая скорость повторений, я вообще обхожусь без него, примерно так:

void setup()
{
  // сначала разовые настройки как и положено

  while(1){
    // импровизированный loop() но без вызова.
  }
}

void loop(){}

А часто просто выкидываю main.cpp и делаю свой main(){}... дешево и сердито. :)

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Кстати любопытно, что вот такой вариант даёт частоту 2МГц,

while(1){
PIND |= (1 << 3);
}

 а такой вариант - 2,667МГц :)

while(1){
PORTD|=1<<3;
PORTD&=~(1<<3);
}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Ну, да. В первом случае накладные расходы на цикл 1/2, а во втором 1/3 - в точности такую разницу и наблюдаем.

Мне тут, как Вы наверное уже догадались, попалась задачка где реально, не по детски, приходится такты считать и за каждый такт бороться. Если интересно, могу написать по результатам.

axill
Offline
Зарегистрирован: 05.09.2011

allesanbr пишет:
axill пишет:
Все полностью определяется тем какой код упрятан в loop в конкретном скетче.
Если я использую loop(); например как шим-генератор, То мне в его теле ничего не нужно кроме инкремента, проверки его переполнения(и обнуления), и вызова функции которая обрабатывает значение переменной после каждой итерации инкремента. Как результат, я могу каждый из 20 пинов ардуино превратить в ШИМ-регулятор который будет поддерживать не 256 градаций а например 1024. Для этого мне нужно иметь довольно высокую частоту вызова как минимум в 20 раз(количество пинов) превышающую число градаций - 1024

как я выше писал - как раз многие задачи не нужно в loop пихать. Ваш пример яркий случай задачи которую не надо в loop пихать. Изучите таймеры. ШИМ легко строится на таймерах. Тем более, что 6 пинов имеют аппаратный ШИМ, а еще 14 можно сделать на таймерах. 

axill
Offline
Зарегистрирован: 05.09.2011

ЕвгенийП пишет:

А смысл (т.е. для чего я его выложил) вот какой.

Понятно. Я не в плане критики поста. Согласен, что для новичков наглядно на первом этапе. Но уже на втором этапе даже новичкам надо понимать, что скорость вызова loop во первых не самоцель и часто нужно рассчитывать на переферию которая от loop не зависит, а во вторых что как только мы в loop добавили новую строку все предыдущие замеры теряют смысл

ЕвгенийП пишет:

Ну, и, кстати, для внимательных, здесь попутно показано как правильно инверитровать пин. А это уже полезная в жизни информация.

Используемая здесь конструкция PIND |= (1 << 3); разворачивается в одну машинную команду (2 такта).

sbi 0x9,3

а, например, конструкция D3_INV из той же CyberLib - в четыре однотактовые команды.

здесь важно так же понимать, что этот трюк работает не на всех МК

на атмега8 если верно помню не работает

 

p.s. Извиняюсь за микс формата выше, почему то не закрывает коментарий, какой то баг форума

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

axill пишет:

здесь важно так же понимать, что этот трюк работает не на всех МК

Конечно, о таких вещах всегда нужно помнить. Ничего в этой жизни не работает "на всех МК".

Меня вот знает что удивляет. Есть целая куча разного качества библиотек для работы с пинами на более низком уровне, чем в стандартной среде (та же CyberLib, или вон Архат тут свою наваял), но почему-то ни в одной я не видел групповых операций в пределах порта. Не могу сказать, чтобы специально искал - такие вещи быстрее написать, чем искать, но вот ни разу не попадалось. Почему никто не делает?

Например, поставить в нужный режим сразу пачку пинов одной командой или там подать HIGH/LOW на пачку пинов,  да хоть то же инвертирование. Cкажем, digital_write(2,3,4,5,HIGH) вполне можнов одну машинную команду развернуть. Это-то, кстати, и работает везде, и действительно иногда реально нужно бывает включать пины именно одновременно, а не с двухтактовой задержкой. И чего не сделать-то? А вот подиш-ты.

axill
Offline
Зарегистрирован: 05.09.2011

да все просто) програмистам тоже иногда лень думать. это первая причина. вариант с групповыми операциями ребует отдельного продумывания

во вторых (по моему опыту) часто при рисовании схемы и последующей разводки бывает необходимо мешать пины. т.е. например семисегментный индикатор - логично все 8 сегментов завести на один порт и дальше управлять целым портом. Но во первых иногда приходится разбивать между портами, а иногда ставить пины не по порядку. И здесь попытка использовать порт целиком может быть минусом с точки зрения эффективности кода, а не плюсом

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Во-первых, я тут где-то уже давал ссыль на либу с групповыми операциями и даже на плюсах .. группируете порты и даже не обязательно от одного порта и управляете как единым целым .. оно конечно, если пины от разных портов, то одной командой не получится .. но код генерится максимально оптимальный и для случая одного порта получается вполне одной командой. мне либа очень понравилась, почему свою версию в развитии приостановил - не вижу особого смысла. У меня достоинство только одно: использование традиционных функций для однокомандной работы: в скетчах ничего менять особо не приходится.

На самом деле, пины имеют свои спец. функции и подобрать управление пачкой на одном порту .. достаточно редкая экзотика, я уж молчу про то, что ногодрыг сам по себе малоприменим, кроме как в учебных целях. Вся работа в основном со спец. назначениями...

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhat109-2 пишет:

подобрать управление пачкой на одном порту .. достаточно редкая экзотика, 

Ну, почему? Тот же семисегментный индикатор - вовсе не экзотика, сплошь и рядом. Любые реализации spi-подобных протоколов, там очень удобно по два пина за раз дёргать, да, нет, много есть применений, что уж Вы так.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

axill пишет:

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

Это-то понятно, но всё равно такую штуку можно применять часто. Например, у ATTiny85 всего один порт, там вообще Бог велел. У ATmega328 (в DIP) порт D весь на одной стороне микросхемы, тоже, можно по-разному разводить, а порт всё тот же. Да, не, пригодилась бы такая возможность, не панацея, но пригодилась бы. 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Arhat109-2 пишет:

я тут где-то уже давал ссыль на либу с групповыми операциями 

Видимо, я пропустил. Не поделитесь?

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Для групповых операций с разными битами на одном порту можно использовать функцию __builtin_avr_insert_bits . 

Ссылки:

1. Интересная функция в avr-gcc 4.7 .

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

uni пишет:

Для групповых операций с разными битами на одном порту можно использовать функцию __builtin_avr_insert_bits . 

Спасибо, не знал про такую.

Но я не это имел в виду. Я имел в виду некий макрос, который, например вот такую конструкцию  digital_write(2,3,4,5,HIGH) развернёт в одну машинную команду. А с использованием этой функции в одну таки не получится.

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

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Если развернёшь в одну, то испортишь состояние других выводов. Нужно считать состояние порта, изменить и записать обратно. Такой способ может иметь побочные эффекты, если между этими командами сработает прерывание, которое как раз зависит от состояния оставшихся выводов. Поэтому такой код ещё придётся обернуть как атомарный специальными макросами. В общем, если работаешь с отдельными выводами, то пользуйся соответствующими командами, чтобы избежать влияния на другие.

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

Ещё частота зависит от адреса порта в ОЗУ. Адрес может быть однобайтовым, а может - двух. Один и тот же по виду код может разворачиваться в разный ассемблерный листинг. Можно пользоваться Proteus'ом для отладки скетчей, если периферия не сложная и присутствует в его библиотеке.

v3ib5k92o.png

uni
uni аватар
Offline
Зарегистрирован: 24.09.2015

По поводу влияния регистра порта на частоту (см. строку статуса на картинке, там указано время, прошедшее с последней остановки).

Вариант 1. Переключение установкой PIND2 в 1. Период = 2 x 250 нс = 500 нс (2.0 МГц, 500 нс / 62.5 нс = 8 такта на период). Здесь адрес регистра PIND = 0x09 (для функций LD и ST нужно прибавлять 0x20 к адресу).

v46dmxsz9.png

Вариант 2. Совместное использование инструкций SBI и CBI. Период = 375 нс (2.667 МГц, 375 нс / 62.5 нс = 6 тактов на период). Инструкции работают только с адресами 0x00 - 0x1F.

v46jg6fum.png

Вариант 3. Переключение изменением бита PINL7 в регистре PINL. Период = 2 x 437.5 нс = 875 нс (1.143 МГц, 875 нс / 62.5 нс = 14 тактов на период). Здесь адрес регистра PINL = 0x0109, для работы с регистром используются команды LDS, STS.

v47m9ta2h.png

Вариант 4. То же, что и в варианте 3 (инструкции ассемблера), но с использованием регистра порта PORTL. Период = 750 нс (1.333 МГц, 750 нс / 62.5 нс = 12 тактов на период). Здесь адрес регистра PORTL = 0x010B, для работы с регистром используются команды LDS, STS.

v47tkmi7c.png

Комментарий из документации на мк ATmega2560:

All ATmega640/1280/1281/2560/2561 I/Os and peripherals are placed in the I/O space. All I/O locations may be accessed by the LD/LDS/LDD and ST/STS/STD instructions, transferring data between the 32 general purpose working registers and the I/O space. I/O Registers within the address range 0x00 - 0x1F are directly bit-accessible using the SBI and CBI instructions. In these registers, the value of single bits can be checked by using the SBIS and SBIC instructions. Refer to the “Instruction Set Summary” on page 404 for more details. When using the I/O specific commands IN and OUT, the I/O addresses 0x00 - 0x3F must be used. When addressing I/O Registers as data space using LD and ST instructions, 0x20 must be added to these addresses.

Команды SBI и CBI можно использовать напрямую:
#include <compat/deprecated.h>

void setup() 
{
	sbi( DDRD, DDD2 );
	cli();
}

void loop() 
{
    sbi( PORTD, PORTD2 );
    cbi( PORTD, PORTD2 );
}

 

 

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

ЕвгенийП, ссылка есть в обсуждении оптимизаций (тема пришпилена), пост №109

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Это не свосем то, что я имел в виду, но всё равно спасибо.

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

>Брехливая реклама" относилось вот к этой ссылке: http://istarik.ru/blog/arduino/1.html

Что-то я не понял, в чём брехня?

Это я писал статью, и я лично проверял осциллографом - это первое.

Второе - это то, что обе ссылки ведут на одну и ту же библиотеку.

Так что Вы, уважаемый, и есть тот самый балабол.

 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

stdima, видать просто попалась под горячую руку :) Я сам  не одобряю подобные библиотеки, они не дают начинающим самостоятельно  развиваться. Из-за них люди по нескольку лет занимаются ардуино-строением, а знания их стоят на уровне 3х месячного обучения..:-\

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

Кто, чем и сколько времени занимается, нас с вами не должно касаться. Подавляющие большинство пользователей ардуино, не планируют перерастать в программистов. Тем кто делает что-то разовое или тем для кого это просто хобби, эта библиотека поможет справится с задачей, а у увлечённых людей, скорее всего, вызовет живой интерес и тем самым подтолкнёт их к изучению.

Дело не в том, что мы одобряем или нет, дело в многогранности объективной реальности, не все строят Байконур.

 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

stdima пишет:

Кто, чем и сколько времени занимается, нас с вами не должно касаться.

Касается к сожалению.  Как говорил товарищ Сухов -"Мне за державу обидно".  Люди не могут сосчитать в уме сколько будет 2&2 , и всё из-за этих очень удобных функций и библиотек.

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Предлагаете всем вернуться в кодирование ПО цифирьками, напрямую в битовой кодировке? Сами-то, на память кодировку команды ldi к примеру, помните?

Библиотеки как раз для того и пишутся, чтобы народ занимался делом, используя удобные средства, в частности редакторы, компиляторы, отладчики, эмуляторы и т.д. Они тоже писаны не в автокодах, а с использованием тех же самых библиотек. Кстати, glibc Вы тоже каждый раз ручками переписываете по мере надобности?

Да, а заодно, давайте выбросим на помойку все ЯВУ, СУБД и ОС тоже. А то "уровень пользователей компов" бесстыдно упал .. теперь даже 3-х летние детишки вполне могут зайти в гугль с айфона. Непорядок, однако. :)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

stdima пишет:

>Брехливая реклама" относилось вот к этой ссылке: http://istarik.ru/blog/arduino/1.html

Что-то я не понял, в чём брехня?

Это я писал статью, и я лично проверял осциллографом - это первое.

Не знаю что Вы там проверяли и каким осцилом, но разница в коде обоих ссылок - существенна. В правильной ссылке на cyberlib внутри loop() используется goto для организации цикла. Соответственно исполняется ровно 3(три) команды: 2 дерга лапкой и переход на начало. А по второй ссылке использование функций Cyberlib.h указано непосредственно в loop, вызов которого и происходит в цикле.. ощущаете разницу?

Вот как раз она и явилась темой этого топика. Ну не может вызов подпрограммы в цикле выдать ту же самую частоту, что и прямой goto!

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Arhat109-2, ну вы же понимате что я имею ввиду, или нет? Если так проводить аналогию, то давайте в школах не будем учить правила математических операций, саму таблицу умножения. Есть калькуляторы, компьютеры, пусть они считают.  ps: в битовой кодировке я никаких ассемблеровских  команд не знаю, как и собссно ассемблера :-)

Arhat109-2
Offline
Зарегистрирован: 24.09.2015

Ну вот видите. Сколько лет вы программируете МК? А всё на одном уровне .. TCCR2B, PCINT2 ... давно уже пора освоить ассемблер! :)

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

stdima пишет:

>Брехливая реклама" относилось вот к этой ссылке: http://istarik.ru/blog/arduino/1.html

Что-то я не понял, в чём брехня?

Это я писал статью, и я лично проверял осциллографом - это первое.

Проверьте ещё раз именно эту программу, что по этой ссылке. И убедитесь, что 2650 КГц - брехня.

Скорее всего Вы проверяли оригинальную программу с форума библиотеки - а привели эту.

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

Так скажите, какая частота получилась у Вас?

Клапауций 112
Клапауций 112 аватар
Offline
Зарегистрирован: 01.03.2017

stdima пишет:

Так скажите, какая частота получилась у Вас?

я засекретил эту информацию ещё в марте 2016-го.