Go Down

Topic: Wait for nanoSeconds (Read 78 times) previous topic - next topic

maxoArduino

Sep 23, 2019, 07:12 am Last Edit: Sep 23, 2019, 07:16 am by maxoArduino
Мне нужен задержка несколько наносекундах. Плата Arduino Uno 16Mhz. Я знаю 1такт = 1/16 * 10^6  И команда NOP требуется такт для выполнения т.е. 62,5наноСек  и 62,5 * 16 = 1000 нано сек = 1мкСек.

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

 
 

Code: [Select]

const byte LED = LED_BUILTIN;

  int mikS = 0;                          
  int milS = 1;
  const uint32_t TOP = 1000000;  // for TOP
  
  void setup() {
    pinMode(LED, HIGH);    // seting pin
  }
  
  void loop() {

    delayNanoseconds(16);
    
   // cslculate 1 sec
   if ((milS * mikS) >= TOP){
    digitalWrite(LED, !digitalRead(LED));
    milS = 1;         // reset var  (mili)
   }

   if (mikS >= 1000){
      milS++;      // increment var   (milisecond)
      mikS = 0;   // reset var          (mikroSecond)
   }
    
  }

  void delayNanoseconds(byte nsec){
    if (nsec == 0) return;
    while (nsec > 0){
      asm volatile("nop \n\t");          
      nsec--;
    }  
     mikS++;
  }

maxoArduino

#1
Sep 23, 2019, 07:32 am Last Edit: Sep 23, 2019, 07:55 am by maxoArduino
 Сделал оптимизацию поднял вверх IF и переменный для мили секондс начинал с нуля а не с одного. Задержка сейчас чуть больше чем раньше но все равно не одно секунда. Вопрос тот же, как мне его исправить

 
Code: [Select]
const byte LED = LED_BUILTIN;
  int mikS = 0;
  int milS = 0;
  const uint32_t TOP = 1000000;
 
  void setup() {
    pinMode(LED, HIGH);
  }
 
  void loop() {
      delayNanoseconds(16);
      if (mikS >= 1000){
        milS++;
        mikS = 0;
     }     
         
     // calculate 1 sec  //I can change this operation by this if (milS >= 1000) then do something...
     if ((milS * mikS) >= TOP){  // Here I lose 1 cycle when the milS = 1 & mikS = 0, but it nothing
      digitalWrite(LED, !digitalRead(LED));
      milS = 0;
     }
  }   
   
  void delayNanoseconds(byte nsec){
    if (nsec == 0) return;
    while (nsec > 0){
      asm volatile("nop \n\t");
      nsec--;
    }   
     mikS++;
  }   

Go Up