Задержка не целого числа delayMicroseconds();

dragonfly
Offline
Зарегистрирован: 02.04.2015

Собственно...

Нужно что бы задержка была допустим 2,7 микросекунды.

Возможно ли это?

 

С Уважением,

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

нет.  да и минимум 3 мкс при кварце в 16 МГц

dimax
dimax аватар
Offline
Зарегистрирован: 25.12.2013

43 команды "nop" на ассемблере = 2,6875µS  :)

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

86 байт всего. :)

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

dragonfly пишет:

Возможно ли это?

Конечно. 100500 способов.

Про 43 нопа Вам уже сказали (кстати, не обязательно прямо в ассемблере, есть макрос).

Те же нопы с циклом, чтобы память не жрали - нет проблем.

Таймер на переполнение, а в программе цикл пока таймер не выставит флаг.

Всё от задачи зависит, делайте как Вам удобно.

dragonfly
Offline
Зарегистрирован: 02.04.2015
 
 
 
{
ON(OUTPUT_IF_MAX);
delayMicroseconds(PULSE_LOW_US);
OFF(OUTPUT_IF_MAX);
delayMicroseconds(PULSE_HIGH_US);
}
 
Т.е. сама команда delayMicroseconds по времени 2,7 микросекунды?
 
Подскажите пожалуйста синтаксис в моем случае с NOP?
С циклом интересно.
 
С Уважением,
dragonfly
Offline
Зарегистрирован: 02.04.2015

Все...

Нашел куда копать, спасибо!

С Уважением,

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

Просто

	_NOP();

сколько надо раз.

С циклом всё просто - этот же макрос в цикле, но там надо считать накладные расходы цикла в тактах. Вам сильно надо? Это с полчаса возни.

sadman41
Offline
Зарегистрирован: 19.10.2016

dragonfly пишет:

Подскажите пожалуйста синтаксис в моем случае с NOP?
C ноп-ами можно так:
  noInterrupts(); 
   asm volatile (
      "nop"                      "\n\t" // 1 nop
      // more nop's here
      "nop"                      "\n\t" // 1 nop
   );
   interrupts(); 

C циклом подсказать не смогу, но у меня лично есть мнение, что с ним задержка не будет столь точна и придется корректировать количество ноп-ов, чтобы учесть время выполнения команд присвоения, вычитания и сравнения с переходом. Хотя я, в этом вашем asm, разбираюсь не так хорошо, как остальные ))

 

 

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

sadman41 пишет:
придется корректировать количество ноп-ов, чтобы учесть
Разумеется!

arduinec
Offline
Зарегистрирован: 01.09.2015

Для проекта "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
  );
}