Задержка не целого числа delayMicroseconds();
- Войдите на сайт для отправки комментариев
Пнд, 20/11/2017 - 12:46
Собственно...
Нужно что бы задержка была допустим 2,7 микросекунды.
Возможно ли это?
С Уважением,
Собственно...
Нужно что бы задержка была допустим 2,7 микросекунды.
Возможно ли это?
С Уважением,
нет. да и минимум 3 мкс при кварце в 16 МГц
43 команды "nop" на ассемблере = 2,6875µS :)
86 байт всего. :)
Возможно ли это?
Конечно. 100500 способов.
Про 43 нопа Вам уже сказали (кстати, не обязательно прямо в ассемблере, есть макрос).
Те же нопы с циклом, чтобы память не жрали - нет проблем.
Таймер на переполнение, а в программе цикл пока таймер не выставит флаг.
Всё от задачи зависит, делайте как Вам удобно.
Все...
Нашел куда копать, спасибо!
С Уважением,
Просто
сколько надо раз.
С циклом всё просто - этот же макрос в цикле, но там надо считать накладные расходы цикла в тактах. Вам сильно надо? Это с полчаса возни.
noInterrupts(); asm volatile ( "nop" "\n\t" // 1 nop // more nop's here "nop" "\n\t" // 1 nop ); interrupts();C циклом подсказать не смогу, но у меня лично есть мнение, что с ним задержка не будет столь точна и придется корректировать количество ноп-ов, чтобы учесть время выполнения команд присвоения, вычитания и сравнения с переходом. Хотя я, в этом вашем asm, разбираюсь не так хорошо, как остальные ))
Для проекта "Transistor Tester for Arduino" (http://arduino.ru/forum/proekty/transistor-tester-arduino) переделал функцию delayMicroseconds(), чтобы она была на 500 нс дольше:
void us500delay(unsigned int us) // = delayMicroseconds(us) + 500ns { #if F_CPU >= 20000000L __asm__ __volatile__ ( "nop" "\n\t" "nop"); // just waiting 2 cycles if (--us == 0) return; us = (us<<2) + us; // x5 us #elif F_CPU >= 16000000L if (--us == 0) return; us <<= 2; #else if (--us == 0) return; if (--us == 0) return; us <<= 1; #endif __asm__ __volatile__ ( "1: sbiw %0,1" "\n\t" // 2 cycles "brne 1b" : "=w" (us) : "0" (us) // 2 cycles ); }