Частотомер на arduino

Тема в разделе "Arduino & Shields", создана пользователем Nekto_nikto, 1 авг 2020.

  1. Daniil

    Daniil Гуру

    в случае ардуина+555 или ардуина+ардуина, при питании от 5В, большее напряжение может возникнуть только рук из одного места (статика) или если специально вносить большее напряжение.
     
  2. Nekto_nikto

    Nekto_nikto Гик

    ардуина+555 и у 555 питание от 8 вольт, а до дуни идет понижение сопротивления через резистор и транзистор до примерно 5,1В, но я в этом совсем не уверен..., поэтому отталкиваюсь от худшего варианта.
     
  3. Daniil

    Daniil Гуру

    чтош так сложна)
    первый попавшийся таймер:
    https://www.chipdip.ru/product/icm7555iba
    питание минимум 3 В.
    Или поставить какую-нибудь оптопару с ОК на выходе. (открытый коллектор позволит сделать вых. напряжение любого удобного уровня)
    Вы сами себе усложняете задачу.
    Чтобы измерить максимальное напряжение сделайте интервал вашей 555 2-5 сек и померьте обычным тестером.
     
    Nekto_nikto нравится это.
  4. Nekto_nikto

    Nekto_nikto Гик

    Как то я об этом не подумал.
    Спасибо.
     
  5. Nekto_nikto

    Nekto_nikto Гик

    Дествительно если вынести большую часть кода за пределы обработчика прерывания вроде бы все работает в штатном режиме, диод на платке моргает.
    Код (C++):
    #include <EEPROM.h>
    // Для корректной работы устройства необходимо, чтоб на ножке D2 был подтягивающий к GND резистор на 10-15K, иначе несмотря на то что в конфигурации мы прописали ножку с подтяжкой,
    // равно как и без подтяжки будет происходить срабатывание прерывания даже для ножки болтающейся в воздухе
    ///*
    // Тестирую на частоте 40КГц
    unsigned int Period[200];  // Массив, в котором будут храниться отловленные значения
    unsigned int TimerWas=0;   // Предидущее отловленное значение таймера
    unsigned int TimerVal=0;   // Значение таймера
    unsigned int tmp_TCNT1=0;  // Временная переменная, где будет храниться считанное значение TCNT1
    int i=0;
    boolean FlagToWrite=false; // Флаг для записи
    String S="";               // Переменная передаваемая через COM порт
    void Int0() // Функция прерывания для ножки МК D2
    {
    // Как читать регистр таймера TCNT1 показано на 116 странице ДШ
    tmp_TCNT1=TCNT1-6;                      //это поправка на время считывания значения TCNT1 -2 цикла; -4 поправка на время вхождения в прерывание
    //TimerVal=65534-(tmp_TCNT1+TimerWas);  // Если мы просто напишем TimerVal=tmp_TCNT1-TimerWas; то как минимум сразу после переполнения таймера при расчетах будут возникать неточности
                                          // а если использовать ветвление при расчетах, то это увеличит время исполнения данного куска кода и как следствие уменьшит точность
    TimerVal=tmp_TCNT1-TimerWas;
    TimerWas=tmp_TCNT1;
    Period[i]=TimerVal;
    i++;
    if(i>=199)
      {
      FlagToWrite=true;
      TCCR1B=0;   // Выключаем таймер1
      asm("cli"); // Запрещаем прерывания
      }
    }

    void setup()
    {
      // Конфигурируем нужные ножки МК
      Serial.begin(9600);                 // подключаем последовательный порт
      pinMode(2, INPUT_PULLUP);           // конфигурируем ножку D2
      attachInterrupt(0, Int0, FALLING);  // назначаем обработчик прерывания для ножки D2 по спаду фронта, т.к. если прописать RISING, то прерывание происходит само собой
                                          // также нужно учитывать, что сразу же после прошивки будет срабатыват прерывание, но если ардуино отключить и потом включить, то все будет отрабатываться штатно
                                          // но именно отключить по питанию, а не перезагрузить
      pinMode(3, OUTPUT);                 // конфигурируем ножку D3
      digitalWrite(3, HIGH);              // подаем на ножку D3 высокий логический уровень, чтоб открыть транзистор на оптореле
      pinMode(LED_BUILTIN, OUTPUT);       // конфигурируем ножку, отвечающую за встроенный светодиод на плате

      for(i=0; i<=199; i++)                 // Инициализируем массив значений
        {
        Period[i]=0;
        }
      i=0;

      // инициализируем Timer1
      noInterrupts(); // запрещаем прерывания
      TCNT1H = 0;
      TCNT1L = 0;
      TCCR1A = 0;
      TCNT1  = 0;
      TCCR1B |= (1 << CS10); // Prescaler=1 No prescaling частота 16MHz
    interrupts(); // Разрешаем прерывания

    }


    void loop()
    {
      if(FlagToWrite)
      {
      // Пишем весь массив в энергонезависимую память EEPROM, т.к. при непосредственном подключении к ПК есть вероятность повредить компьютер
      // поэтому доставать значения будем после отключения Arduino, посылая через COM порт команду на чтение
      for(i=0; i<=398; i=i+2)                 //пишем массив в EEPROM
        {
        EEPROM.put((int)i/2, Period[(int)i/2]); // для записи в EEPROM нужна пауза не менее чем 3,3ms
        delay(5);
        }
      // сигналим светодиодом на плате, что запись произведена и можно подключать к ПК и смотреть что получилось
      while(true)
        {
        digitalWrite(LED_BUILTIN, HIGH);
        delay(1000);
        digitalWrite(LED_BUILTIN, LOW);
        delay(1000);
        }
      FlagToWrite=false;
      }
     
      if (Serial.available()) // проверяем, поступают ли какие-то команды на мониторе порта
      {
        S = Serial.readString();  // !!! Читаем строку из терминала
        if(S=="Go")
          {
          TCCR1B=0;   // Выключаем таймер1
          for(i=0; i<=398; i=i+2)   //читаем массив из EEPROOM
            {
            EEPROM.get((int)i/2, Period[(int)i/2]);
            delay(5);
            }
         
          for(i=0;i<=199;i++)     // выводим массив в терминал через COM порт
            {
            Serial.println((String)i+"\t"+(String)((float)(Period[i] * 0.0625))+" mks  => F="+(String)((float)(1000/(Period[i] * 0.0625)))+" KHz");
            }
          for(i=0;i<=199;i++)     // выводим массив в терминал через COM порт
            {
            Serial.println((String)i+"\t"+(String)(Period[i])+" cycles ");
            }
          }
      }
    }

    Вот только удручает то что получается в результате и как следствие возникают сомнения как в программе, так и в 555 таймере
     
  6. Nekto_nikto

    Nekto_nikto Гик

    0 1.13 mks => F=888.89 KHz
    1 48.00 mks => F=20.83 KHz
    2 64.19 mks => F=15.58 KHz
    3 48.25 mks => F=20.73 KHz
    4 48.19 mks => F=20.75 KHz
    5 48.19 mks => F=20.75 KHz
    6 64.19 mks => F=15.58 KHz
    7 96.25 mks => F=10.39 KHz
    8 48.38 mks => F=20.67 KHz
    9 32.19 mks => F=31.07 KHz
    10 400.13 mks => F=2.50 KHz
    11 49.56 mks => F=20.18 KHz
    12 32.19 mks => F=31.07 KHz
    13 48.13 mks => F=20.78 KHz
    14 48.19 mks => F=20.75 KHz
    15 32.19 mks => F=31.07 KHz
    16 48.13 mks => F=20.78 KHz
    17 48.19 mks => F=20.75 KHz
    18 48.19 mks => F=20.75 KHz
    19 48.19 mks => F=20.75 KHz
    20 48.19 mks => F=20.75 KHz
    21 48.19 mks => F=20.75 KHz
    22 32.19 mks => F=31.07 KHz
    23 48.13 mks => F=20.78 KHz
    24 48.19 mks => F=20.75 KHz
    25 48.19 mks => F=20.75 KHz
    26 48.19 mks => F=20.75 KHz
    27 48.19 mks => F=20.75 KHz
    28 48.19 mks => F=20.75 KHz
    29 48.19 mks => F=20.75 KHz
    30 48.19 mks => F=20.75 KHz
    31 32.19 mks => F=31.07 KHz
    32 48.13 mks => F=20.78 KHz
    33 48.19 mks => F=20.75 KHz
    34 48.19 mks => F=20.75 KHz
    35 48.19 mks => F=20.75 KHz
    36 48.19 mks => F=20.75 KHz
    37 96.19 mks => F=10.40 KHz
    38 48.38 mks => F=20.67 KHz
    39 448.19 mks => F=2.23 KHz
    40 49.75 mks => F=20.10 KHz
    41 48.19 mks => F=20.75 KHz
    42 48.19 mks => F=20.75 KHz
    43 48.19 mks => F=20.75 KHz
    44 32.19 mks => F=31.07 KHz
    45 48.13 mks => F=20.78 KHz
    46 48.19 mks => F=20.75 KHz
    47 48.19 mks => F=20.75 KHz
    48 48.19 mks => F=20.75 KHz
    49 48.19 mks => F=20.75 KHz
    50 48.19 mks => F=20.75 KHz
    51 32.19 mks => F=31.07 KHz
    52 48.13 mks => F=20.78 KHz
    53 1552.19 mks => F=0.64 KHz
    54 54.06 mks => F=18.50 KHz
    55 96.19 mks => F=10.40 KHz
    56 48.38 mks => F=20.67 KHz
    57 48.19 mks => F=20.75 KHz
    58 32.19 mks => F=31.07 KHz
    59 48.13 mks => F=20.78 KHz
    60 48.19 mks => F=20.75 KHz
    61 48.19 mks => F=20.75 KHz
    62 48.19 mks => F=20.75 KHz
    63 48.19 mks => F=20.75 KHz
    64 48.19 mks => F=20.75 KHz
    65 48.19 mks => F=20.75 KHz
    66 32.19 mks => F=31.07 KHz
    67 1984.13 mks => F=0.50 KHz
    68 55.75 mks => F=17.94 KHz
    69 96.19 mks => F=10.40 KHz
    70 32.38 mks => F=30.89 KHz
    71 96.13 mks => F=10.40 KHz
    72 48.38 mks => F=20.67 KHz
    73 368.19 mks => F=2.72 KHz
    74 145.44 mks => F=6.88 KHz
    75 48.56 mks => F=20.59 KHz
    76 48.19 mks => F=20.75 KHz
    77 32.19 mks => F=31.07 KHz
    78 48.13 mks => F=20.78 KHz
    79 48.19 mks => F=20.75 KHz
    80 48.19 mks => F=20.75 KHz
    81 48.19 mks => F=20.75 KHz
    82 48.19 mks => F=20.75 KHz
    83 48.19 mks => F=20.75 KHz
    84 32.19 mks => F=31.07 KHz
    85 336.13 mks => F=2.98 KHz
    86 33.31 mks => F=30.02 KHz
    87 48.13 mks => F=20.78 KHz
    88 48.19 mks => F=20.75 KHz
    89 48.19 mks => F=20.75 KHz
    90 48.19 mks => F=20.75 KHz
    91 48.19 mks => F=20.75 KHz
    92 320.19 mks => F=3.12 KHz
    93 321.25 mks => F=3.11 KHz
    94 97.25 mks => F=10.28 KHz
    95 0.38 mks => F=2666.67 KHz
    96 0.00 mks => F= INF KHz
    97 0.00 mks => F= INF KHz
    98 0.00 mks => F= INF KHz
    99 0.00 mks => F= INF KHz
    100 0.00 mks => F= INF KHz
    101 0.00 mks => F= INF KHz
    102 0.00 mks => F= INF KHz
    103 0.00 mks => F= INF KHz
    104 0.00 mks => F= INF KHz
    105 0.00 mks => F= INF KHz
    106 0.00 mks => F= INF KHz
    107 0.00 mks => F= INF KHz
    108 0.00 mks => F= INF KHz
    109 0.00 mks => F= INF KHz
    110 0.00 mks => F= INF KHz
    111 0.00 mks => F= INF KHz
    112 0.00 mks => F= INF KHz
    113 0.00 mks => F= INF KHz
    114 0.00 mks => F= INF KHz
    115 0.00 mks => F= INF KHz
    116 0.00 mks => F= INF KHz
    117 0.00 mks => F= INF KHz
    118 0.00 mks => F= INF KHz
    119 0.00 mks => F= INF KHz
    120 0.00 mks => F= INF KHz
    121 0.00 mks => F= INF KHz
    122 0.00 mks => F= INF KHz
    123 0.00 mks => F= INF KHz
    124 0.00 mks => F= INF KHz
    125 0.00 mks => F= INF KHz
    126 0.00 mks => F= INF KHz
    127 0.00 mks => F= INF KHz
    128 0.00 mks => F= INF KHz
    129 0.00 mks => F= INF KHz
    130 0.00 mks => F= INF KHz
    131 0.00 mks => F= INF KHz
    132 0.00 mks => F= INF KHz
    133 0.00 mks => F= INF KHz
    134 0.00 mks => F= INF KHz
    135 0.00 mks => F= INF KHz
    136 0.00 mks => F= INF KHz
    137 0.00 mks => F= INF KHz
    138 0.00 mks => F= INF KHz
    139 0.00 mks => F= INF KHz
    140 0.00 mks => F= INF KHz
    141 0.00 mks => F= INF KHz
    142 0.00 mks => F= INF KHz
    143 0.00 mks => F= INF KHz
    144 0.00 mks => F= INF KHz
    145 0.00 mks => F= INF KHz
    146 0.00 mks => F= INF KHz
    147 0.00 mks => F= INF KHz
    148 0.00 mks => F= INF KHz
    149 0.00 mks => F= INF KHz
    150 0.00 mks => F= INF KHz
    151 0.00 mks => F= INF KHz
    152 0.00 mks => F= INF KHz
    153 0.00 mks => F= INF KHz
    154 0.00 mks => F= INF KHz
    155 0.00 mks => F= INF KHz
    156 0.00 mks => F= INF KHz
    157 0.00 mks => F= INF KHz
    158 0.00 mks => F= INF KHz
    159 0.00 mks => F= INF KHz
    160 0.00 mks => F= INF KHz
    161 0.00 mks => F= INF KHz
    162 0.00 mks => F= INF KHz
    163 0.00 mks => F= INF KHz
    164 0.00 mks => F= INF KHz
    165 0.00 mks => F= INF KHz
    166 0.00 mks => F= INF KHz
    167 0.00 mks => F= INF KHz
    168 0.00 mks => F= INF KHz
    169 0.00 mks => F= INF KHz
    170 0.00 mks => F= INF KHz
    171 0.00 mks => F= INF KHz
    172 0.00 mks => F= INF KHz
    173 0.00 mks => F= INF KHz
    174 0.00 mks => F= INF KHz
    175 0.00 mks => F= INF KHz
    176 0.00 mks => F= INF KHz
    177 0.00 mks => F= INF KHz
    178 0.00 mks => F= INF KHz
    179 0.00 mks => F= INF KHz
    180 0.00 mks => F= INF KHz
    181 0.00 mks => F= INF KHz
    182 0.00 mks => F= INF KHz
    183 0.00 mks => F= INF KHz
    184 0.00 mks => F= INF KHz
    185 0.00 mks => F= INF KHz
    186 0.00 mks => F= INF KHz
    187 0.00 mks => F= INF KHz
    188 0.00 mks => F= INF KHz
    189 48.00 mks => F=20.83 KHz
    190 48.19 mks => F=20.75 KHz
    191 48.19 mks => F=20.75 KHz
    192 48.19 mks => F=20.75 KHz
    193 32.19 mks => F=31.07 KHz
    194 48.13 mks => F=20.78 KHz
    195 48.19 mks => F=20.75 KHz
    196 48.19 mks => F=20.75 KHz
    197 48.19 mks => F=20.75 KHz
    198 0.19 mks => F=5333.33 KHz
    199 0.00 mks => F= INF KHz
    0 18 cycles
    1 768 cycles
    2 1027 cycles
    3 772 cycles
    4 771 cycles
    5 771 cycles
    6 1027 cycles
    7 1540 cycles
    8 774 cycles
    9 515 cycles
    10 6402 cycles
    11 793 cycles
    12 515 cycles
    13 770 cycles
    14 771 cycles
    15 515 cycles
    16 770 cycles
    17 771 cycles
    18 771 cycles
    19 771 cycles
    20 771 cycles
    21 771 cycles
    22 515 cycles
    23 770 cycles
    24 771 cycles
    25 771 cycles
    26 771 cycles
    27 771 cycles
    28 771 cycles
    29 771 cycles
    30 771 cycles
    31 515 cycles
    32 770 cycles
    33 771 cycles
    34 771 cycles
    35 771 cycles
    36 771 cycles
    37 1539 cycles
    38 774 cycles
    39 7171 cycles
    40 796 cycles
    41 771 cycles
    42 771 cycles
    43 771 cycles
    44 515 cycles
    45 770 cycles
    46 771 cycles
    47 771 cycles
    48 771 cycles
    49 771 cycles
    50 771 cycles
    51 515 cycles
    52 770 cycles
    53 24835 cycles
    54 865 cycles
    55 1539 cycles
    56 774 cycles
    57 771 cycles
    58 515 cycles
    59 770 cycles
    60 771 cycles
    61 771 cycles
    62 771 cycles
    63 771 cycles
    64 771 cycles
    65 771 cycles
    66 515 cycles
    67 31746 cycles
    68 892 cycles
    69 1539 cycles
    70 518 cycles
    71 1538 cycles
    72 774 cycles
    73 5891 cycles
    74 2327 cycles
    75 777 cycles
    76 771 cycles
    77 515 cycles
    78 770 cycles
    79 771 cycles
    80 771 cycles
    81 771 cycles
    82 771 cycles
    83 771 cycles
    84 515 cycles
    85 5378 cycles
    86 533 cycles
    87 770 cycles
    88 771 cycles
    89 771 cycles
    90 771 cycles
    91 771 cycles
    92 5123 cycles
    93 5140 cycles
    94 1556 cycles
    95 6 cycles
    96 0 cycles
    97 0 cycles
    98 0 cycles
    99 0 cycles
    100 0 cycles
    101 0 cycles
    102 0 cycles
    103 0 cycles
    104 0 cycles
    105 0 cycles
    106 0 cycles
    107 0 cycles
    108 0 cycles
    109 0 cycles
    110 0 cycles
    111 0 cycles
    112 0 cycles
    113 0 cycles
    114 0 cycles
    115 0 cycles
    116 0 cycles
    117 0 cycles
    118 0 cycles
    119 0 cycles
    120 0 cycles
    121 0 cycles
    122 0 cycles
    123 0 cycles
    124 0 cycles
    125 0 cycles
    126 0 cycles
    127 0 cycles
    128 0 cycles
    129 0 cycles
    130 0 cycles
    131 0 cycles
    132 0 cycles
    133 0 cycles
    134 0 cycles
    135 0 cycles
    136 0 cycles
    137 0 cycles
    138 0 cycles
    139 0 cycles
    140 0 cycles
    141 0 cycles
    142 0 cycles
    143 0 cycles
    144 0 cycles
    145 0 cycles
    146 0 cycles
    147 0 cycles
    148 0 cycles
    149 0 cycles
    150 0 cycles
    151 0 cycles
    152 0 cycles
    153 0 cycles
    154 0 cycles
    155 0 cycles
    156 0 cycles
    157 0 cycles
    158 0 cycles
    159 0 cycles
    160 0 cycles
    161 0 cycles
    162 0 cycles
    163 0 cycles
    164 0 cycles
    165 0 cycles
    166 0 cycles
    167 0 cycles
    168 0 cycles
    169 0 cycles
    170 0 cycles
    171 0 cycles
    172 0 cycles
    173 0 cycles
    174 0 cycles
    175 0 cycles
    176 0 cycles
    177 0 cycles
    178 0 cycles
    179 0 cycles
    180 0 cycles
    181 0 cycles
    182 0 cycles
    183 0 cycles
    184 0 cycles
    185 0 cycles
    186 0 cycles
    187 0 cycles
    188 0 cycles
    189 768 cycles
    190 771 cycles
    191 771 cycles
    192 771 cycles
    193 515 cycles
    194 770 cycles
    195 771 cycles
    196 771 cycles
    197 771 cycles
    198 3 cycles
    199 0 cycles
    Непонятно почему возникают ноли, а также не понятно почему кажет 20КГц, когда обвес я ставил на 40КГц
    :confused:
     

    Вложения:

    • схема.JPG
      схема.JPG
      Размер файла:
      90,7 КБ
      Просмотров:
      186
  7. Nekto_nikto

    Nekto_nikto Гик

    Схему обвязки прилагаю, пожалуйста гляньте кто шарит, что не правильно, т.к. обвязку делал по статье, из которой вынес для себя, что для того чтоб на выходе таймера был меандр со скважностью 50% нужен только один резистор. В общем у меня это в первый раз :rolleyes:.
     
  8. b707

    b707 Гуру

    сколько же лишнего в коде. ужас....

    Главная ошибка - все переменные, изменяющиеся в прерывании, должны быть описаны как volatile. а то при вычислениях будете получать значения неизветсно откуда
     
  9. Nekto_nikto

    Nekto_nikto Гик

    Нет к сожалению такая конструкция
    Код (C++):
    volatile unsigned int Period[200];  // Массив, в котором будут храниться отловленные значения
    volatile unsigned int TimerWas=0;   // Предидущее отловленное значение таймера
    volatile unsigned int TimerVal=0;   // Значение таймера
    volatile unsigned int tmp_TCNT1=0;  // Временная переменная, где будет храниться считанное значение TCNT1
    volatile int i=0;
    volatile boolean FlagToWrite=false; // Флаг для записи
    проблемы не решила, показания по прежнему плывут
    0 0.00 mks => F= INF KHz
    1 48.00 mks => F=20.83 KHz
    2 64.19 mks => F=15.58 KHz
    3 48.25 mks => F=20.73 KHz
    4 48.19 mks => F=20.75 KHz
    5 48.19 mks => F=20.75 KHz
    6 64.19 mks => F=15.58 KHz
    7 96.25 mks => F=10.39 KHz
    8 48.38 mks => F=20.67 KHz
    9 32.19 mks => F=31.07 KHz
    10 400.13 mks => F=2.50 KHz
    11 49.56 mks => F=20.18 KHz
    12 32.19 mks => F=31.07 KHz
    13 48.13 mks => F=20.78 KHz
    14 48.19 mks => F=20.75 KHz
    15 32.19 mks => F=31.07 KHz
    16 48.13 mks => F=20.78 KHz
    17 48.19 mks => F=20.75 KHz
    18 48.19 mks => F=20.75 KHz
    19 48.19 mks => F=20.75 KHz
    20 48.19 mks => F=20.75 KHz
    21 48.19 mks => F=20.75 KHz
    22 32.19 mks => F=31.07 KHz
    23 48.13 mks => F=20.78 KHz
    24 48.19 mks => F=20.75 KHz
    25 48.19 mks => F=20.75 KHz
    26 48.19 mks => F=20.75 KHz
    27 48.19 mks => F=20.75 KHz
    28 48.19 mks => F=20.75 KHz
    29 48.19 mks => F=20.75 KHz
    30 48.19 mks => F=20.75 KHz
    31 32.19 mks => F=31.07 KHz
    32 48.13 mks => F=20.78 KHz
    33 48.19 mks => F=20.75 KHz
    34 48.19 mks => F=20.75 KHz
    35 48.19 mks => F=20.75 KHz
    36 48.19 mks => F=20.75 KHz
    37 0.19 mks => F=5333.33 KHz
    38 0.00 mks => F= INF KHz
    39 448.00 mks => F=2.23 KHz
    40 49.75 mks => F=20.10 KHz
    41 48.19 mks => F=20.75 KHz
    42 48.19 mks => F=20.75 KHz
    43 48.19 mks => F=20.75 KHz
    44 32.19 mks => F=31.07 KHz
    45 48.13 mks => F=20.78 KHz
    46 48.19 mks => F=20.75 KHz
    47 48.19 mks => F=20.75 KHz
    48 48.19 mks => F=20.75 KHz
    49 48.19 mks => F=20.75 KHz
    50 48.19 mks => F=20.75 KHz
    51 32.19 mks => F=31.07 KHz
    52 48.13 mks => F=20.78 KHz
    53 1552.19 mks => F=0.64 KHz
    54 54.06 mks => F=18.50 KHz
    55 96.19 mks => F=10.40 KHz
    56 48.38 mks => F=20.67 KHz
    57 0.19 mks => F=5333.33 KHz
    58 0.00 mks => F= INF KHz
    59 0.00 mks => F= INF KHz
    60 0.00 mks => F= INF KHz
    61 0.00 mks => F= INF KHz
    62 0.00 mks => F= INF KHz
    63 0.00 mks => F= INF KHz
    64 0.00 mks => F= INF KHz
    65 0.00 mks => F= INF KHz
    66 0.00 mks => F= INF KHz
    67 0.00 mks => F= INF KHz
    68 0.00 mks => F= INF KHz
    69 0.00 mks => F= INF KHz
    70 0.00 mks => F= INF KHz
    71 0.00 mks => F= INF KHz
    72 0.00 mks => F= INF KHz
    73 0.00 mks => F= INF KHz
    74 0.00 mks => F= INF KHz
    75 0.00 mks => F= INF KHz
    76 0.00 mks => F= INF KHz
    77 0.00 mks => F= INF KHz
    78 0.00 mks => F= INF KHz
    79 0.00 mks => F= INF KHz
    80 0.00 mks => F= INF KHz
    81 0.00 mks => F= INF KHz
    82 0.00 mks => F= INF KHz
    83 0.00 mks => F= INF KHz
    84 0.00 mks => F= INF KHz
    85 0.00 mks => F= INF KHz
    86 0.00 mks => F= INF KHz
    87 0.00 mks => F= INF KHz
    88 0.00 mks => F= INF KHz
    89 0.00 mks => F= INF KHz
    90 0.00 mks => F= INF KHz
    91 0.00 mks => F= INF KHz
    92 0.00 mks => F= INF KHz
    93 0.00 mks => F= INF KHz
    94 0.00 mks => F= INF KHz
    95 0.00 mks => F= INF KHz
    96 0.00 mks => F= INF KHz
    97 0.00 mks => F= INF KHz
    98 0.00 mks => F= INF KHz
    99 0.00 mks => F= INF KHz
    100 0.00 mks => F= INF KHz
    101 0.00 mks => F= INF KHz
    102 0.00 mks => F= INF KHz
    103 0.00 mks => F= INF KHz
    104 0.00 mks => F= INF KHz
    105 0.00 mks => F= INF KHz
    106 0.00 mks => F= INF KHz
    107 0.00 mks => F= INF KHz
    108 0.00 mks => F= INF KHz
    109 0.00 mks => F= INF KHz
    110 0.00 mks => F= INF KHz
    111 0.00 mks => F= INF KHz
    112 0.00 mks => F= INF KHz
    113 0.00 mks => F= INF KHz
    114 0.00 mks => F= INF KHz
    115 0.00 mks => F= INF KHz
    116 0.00 mks => F= INF KHz
    117 0.00 mks => F= INF KHz
    118 0.00 mks => F= INF KHz
    119 0.00 mks => F= INF KHz
    120 0.00 mks => F= INF KHz
    121 0.00 mks => F= INF KHz
    122 0.00 mks => F= INF KHz
    123 0.00 mks => F= INF KHz
    124 0.00 mks => F= INF KHz
    125 0.00 mks => F= INF KHz
    126 0.00 mks => F= INF KHz
    127 0.00 mks => F= INF KHz
    128 0.00 mks => F= INF KHz
    129 0.00 mks => F= INF KHz
    130 0.00 mks => F= INF KHz
    131 0.00 mks => F= INF KHz
    132 0.00 mks => F= INF KHz
    133 0.00 mks => F= INF KHz
    134 0.00 mks => F= INF KHz
    135 0.00 mks => F= INF KHz
    136 0.00 mks => F= INF KHz
    137 0.00 mks => F= INF KHz
    138 0.00 mks => F= INF KHz
    139 0.00 mks => F= INF KHz
    140 0.00 mks => F= INF KHz
    141 0.00 mks => F= INF KHz
    142 0.00 mks => F= INF KHz
    143 0.00 mks => F= INF KHz
    144 0.00 mks => F= INF KHz
    145 0.00 mks => F= INF KHz
    146 0.00 mks => F= INF KHz
    147 0.00 mks => F= INF KHz
    148 0.00 mks => F= INF KHz
    149 0.00 mks => F= INF KHz
    150 0.00 mks => F= INF KHz
    151 0.00 mks => F= INF KHz
    152 0.00 mks => F= INF KHz
    153 0.00 mks => F= INF KHz
    154 0.00 mks => F= INF KHz
    155 0.00 mks => F= INF KHz
    156 0.00 mks => F= INF KHz
    157 0.00 mks => F= INF KHz
    158 0.00 mks => F= INF KHz
    159 0.00 mks => F= INF KHz
    160 0.00 mks => F= INF KHz
    161 0.00 mks => F= INF KHz
    162 0.00 mks => F= INF KHz
    163 0.00 mks => F= INF KHz
    164 0.00 mks => F= INF KHz
    165 0.00 mks => F= INF KHz
    166 0.00 mks => F= INF KHz
    167 0.00 mks => F= INF KHz
    168 0.00 mks => F= INF KHz
    169 0.00 mks => F= INF KHz
    170 0.00 mks => F= INF KHz
    171 0.00 mks => F= INF KHz
    172 0.00 mks => F= INF KHz
    173 0.00 mks => F= INF KHz
    174 0.00 mks => F= INF KHz
    175 0.00 mks => F= INF KHz
    176 0.00 mks => F= INF KHz
    177 0.00 mks => F= INF KHz
    178 0.00 mks => F= INF KHz
    179 0.00 mks => F= INF KHz
    180 0.00 mks => F= INF KHz
    181 0.00 mks => F= INF KHz
    182 0.00 mks => F= INF KHz
    183 0.00 mks => F= INF KHz
    184 0.00 mks => F= INF KHz
    185 0.00 mks => F= INF KHz
    186 0.00 mks => F= INF KHz
    187 0.00 mks => F= INF KHz
    188 0.00 mks => F= INF KHz
    189 0.00 mks => F= INF KHz
    190 0.00 mks => F= INF KHz
    191 0.00 mks => F= INF KHz
    192 0.00 mks => F= INF KHz
    193 0.00 mks => F= INF KHz
    194 0.00 mks => F= INF KHz
    195 0.00 mks => F= INF KHz
    196 0.00 mks => F= INF KHz
    197 0.00 mks => F= INF KHz
    198 0.00 mks => F= INF KHz
    199 0.00 mks => F= INF KHz
    И складывается такое ощущение, что нагрузка на процессор выросла и он от этого стал больше дурковать.
     
  10. parovoZZ

    parovoZZ Гуру

    в смысле? Процессор в МК всегда загружен на 100 процентов. В любом.

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

    интересно ты кодишь… На шальную что ле?

    процессор чётко и тупо исполняет инструкции. Если он этого не делает или исполняет криво, то выкинуть такой процессор. Он неисправен.
     
  11. parovoZZ

    parovoZZ Гуру

  12. b707

    b707 Гуру

    Чебурашка. а можете описать смысл вот этого куска кода?
    Код (C++):
    for(i=0; i<=398; i=i+2)                 //пишем массив в EEPROM
        {
        EEPROM.put((int)i/2, Period[(int)i/2]); // для записи в EEPROM нужна пауза не менее чем 3,3ms
        delay(5);
        }
    Зачем i сначала умножать на два (398 вместо 199), а потом делить на два? и что-то мне сдается. что пишете вы в ЕЕПРОМ ерунду
     
  13. Nekto_nikto

    Nekto_nikto Гик

    Дело в том что у элементов массива Period тип unsigned int, т.е. по два байта на элемент, ну и как следствие нужен offset для каждого элемента.

    У меня есть смутные сомнения по поводу строчки
    Код (C++):
    asm("cli");
    в конце обработчика прерывания, которая если верить написаному до этого нивелируется компилятором автоматически в конце прерывания, только мы этого не видим.
    Попробовал перенести в начало обработчика связанного с флагом, нуль получил только один в 199 элементе, где программа частенько глючит, частота однако всеравно в среднем на 22КГц, что наталкивает на мысли о том что у ардуинки которую я использую скорее всего частота без делителя не 16 а 8MHz, завтра запаяю на другую платку и напишу что получилось.
     
  14. b707

    b707 Гуру

    ну я так и подумал. Теперь посмотрите внимательно на свой код - никакого оффсета у вас нет, пишете в ЕЕПРОМ полную фигню
     
    Daniil нравится это.
  15. a1000

    a1000 Гуру

    Я в команде
    Код (C++):
    asm("cli");
    вообще не вижу смысла. Она сбрасывает флаг I в регистре SREG, чем запрещает прерывания. Вы ставите её внутри обработчика прерывания. Но, при вызове прерывания флаг I сбрасывается аппаратно. Выход из прерывания, на ASM, осуществляется командой RETI, которая кроме возврата в основной цикл восстанавливает флаг I. Так-что вне зависимости от выполненных манипуляций внутри обработчика, на выходе вы всегда будете иметь I = 1.
     
  16. Nekto_nikto

    Nekto_nikto Гик

    b707:
    ага...:)

    Собственно переписал код, чтоб не было запретов прерывания, ну и конечно чтоб не сожрать весь EEPROM за один запуск
    Код (C++):
    #include <EEPROM.h>
    // Для корректной работы устройства необходимо, чтоб на ножке D2 был подтягивающий к GND резистор на 10-15K, иначе несмотря на то что в конфигурации мы прописали ножку с подтяжкой,
    // равно как и без подтяжки будет происходить срабатывание прерывания даже для ножки болтающейся в воздухе
    ///*
    // Тестирую на частоте 40КГц
    volatile unsigned int Period[200];  // Массив, в котором будут храниться отловленные значения
    volatile unsigned int TimerWas=0;   // Предидущее отловленное значение таймера
    volatile unsigned int TimerVal=0;   // Значение таймера
    volatile unsigned int tmp_TCNT1=0;  // Временная переменная, где будет храниться считанное значение TCNT1
    volatile int i=0;
    volatile boolean FlagToWrite=false; // Флаг для записи
    String S="";               // Переменная передаваемая через COM порт
    void Int0() // Функция прерывания для ножки МК D2
    {
    if(FlagToWrite==false)
      {
      // Как читать регистр таймера TCNT1 показано на 116 странице ДШ
      tmp_TCNT1=TCNT1-8;                      //это поправка на время считывания значения TCNT1 -2 цикла; -4 поправка на время вхождения в прерывание; -2 цикла на сравнение первого условия
      //TimerVal=65534-(tmp_TCNT1+TimerWas);  // Если мы просто напишем TimerVal=tmp_TCNT1-TimerWas; то как минимум сразу после переполнения таймера при расчетах будут возникать неточности
                                            // а если использовать ветвление при расчетах, то это увеличит время исполнения данного куска кода и как следствие уменьшит точность
      TimerVal=tmp_TCNT1-TimerWas;
      TimerWas=tmp_TCNT1;
      Period[i]=TimerVal;
      i++;
      if(i>=199)
        {
        FlagToWrite=true;
        TCCR1B=0;   // Выключаем таймер1
        }
      }
    }

    void setup()
    {
      // Конфигурируем нужные ножки МК
      Serial.begin(9600);                 // подключаем последовательный порт
      pinMode(2, INPUT_PULLUP);           // конфигурируем ножку D2
      attachInterrupt(0, Int0, FALLING);  // назначаем обработчик прерывания для ножки D2 по спаду фронта, т.к. если прописать RISING, то прерывание происходит само собой
                                          // также нужно учитывать, что сразу же после прошивки будет срабатыват прерывание, но если ардуино отключить и потом включить, то все будет отрабатываться штатно
                                          // но именно отключить по питанию, а не перезагрузить
      pinMode(3, OUTPUT);                 // конфигурируем ножку D3
      digitalWrite(3, HIGH);              // подаем на ножку D3 высокий логический уровень, чтоб открыть транзистор на оптореле
      pinMode(LED_BUILTIN, OUTPUT);       // конфигурируем ножку, отвечающую за встроенный светодиод на плате

      for(i=0; i<=199; i++)                 // Инициализируем массив значений
        {
        Period[i]=0;
        }
      i=0;

      // инициализируем Timer1
      noInterrupts(); // запрещаем прерывания
      TCNT1H = 0;
      TCNT1L = 0;
      TCCR1A = 0;
      TCNT1  = 0;
      TCCR1B |= (1 << CS10); // Prescaler=1 No prescaling частота 16MHz
    interrupts(); // Разрешаем прерывания

    }


    void loop()
    {
      if(FlagToWrite)
      {
      //asm("cli"); // Запрещаем прерывания
      // Пишем весь массив в энергонезависимую память EEPROM, т.к. при непосредственном подключении к ПК есть вероятность повредить компьютер
      // поэтому доставать значения будем после отключения Arduino, посылая через COM порт команду на чтение
      for(i=0; i<=398; i=i+2)                 //пишем массив в EEPROM
        {
        EEPROM.put((int)i, Period[(int)i/2]); // для записи в EEPROM нужна пауза не менее чем 3,3ms
        delay(5);
        }
      // сигналим светодиодом на плате, что запись произведена и можно подключать к ПК и смотреть что получилось
      while(true)
        {
        digitalWrite(LED_BUILTIN, HIGH);
        delay(1000);
        digitalWrite(LED_BUILTIN, LOW);
        delay(1000);
        }
      }
     
      if (Serial.available()) // проверяем, поступают ли какие-то команды на мониторе порта
      {
        S = Serial.readString();  // !!! Читаем строку из терминала
        if(S=="Go")
          {
          TCCR1B=0;   // Выключаем таймер1
          for(i=0; i<=398; i=i+2)   //читаем массив из EEPROOM
            {
            EEPROM.get((int)i, Period[(int)i/2]);
            delay(5);
            }
         
          for(i=0;i<=199;i++)     // выводим массив в терминал через COM порт
            {
            Serial.println((String)i+"\t"+(String)((float)(Period[i] * 0.0625))+" mks  => F="+(String)((float)(1000/(Period[i] * 0.0625)))+" KHz");
            }
          }
      }
    }
     
  17. Nekto_nikto

    Nekto_nikto Гик

    результат получился тоже достаточно странным, я рассчитывал на что то 39~42КГц :confused:
    0 4061.25 mks => F=0.25 KHz
    1 6.44 mks => F=155.34 KHz
    2 1.25 mks => F=800.00 KHz
    3 18.44 mks => F=54.24 KHz
    4 752.69 mks => F=1.33 KHz
    5 0.13 mks => F=8000.00 KHz
    6 0.19 mks => F=5333.33 KHz
    7 0.19 mks => F=5333.33 KHz
    8 0.19 mks => F=5333.33 KHz
    9 0.19 mks => F=5333.33 KHz
    10 0.19 mks => F=5333.33 KHz
    11 0.19 mks => F=5333.33 KHz
    12 0.19 mks => F=5333.33 KHz
    13 0.13 mks => F=8000.00 KHz
    14 0.13 mks => F=8000.00 KHz
    15 0.19 mks => F=5333.33 KHz
    16 0.13 mks => F=8000.00 KHz
    17 0.19 mks => F=5333.33 KHz
    18 0.13 mks => F=8000.00 KHz
    19 0.19 mks => F=5333.33 KHz
    20 0.13 mks => F=8000.00 KHz
    21 0.13 mks => F=8000.00 KHz
    22 0.19 mks => F=5333.33 KHz
    23 0.25 mks => F=4000.00 KHz
    24 0.19 mks => F=5333.33 KHz
    25 0.19 mks => F=5333.33 KHz
    26 0.25 mks => F=4000.00 KHz
    27 0.19 mks => F=5333.33 KHz
    28 0.19 mks => F=5333.33 KHz
    29 0.13 mks => F=8000.00 KHz
    30 0.13 mks => F=8000.00 KHz
    31 0.19 mks => F=5333.33 KHz
    32 0.19 mks => F=5333.33 KHz
    33 0.19 mks => F=5333.33 KHz
    34 0.19 mks => F=5333.33 KHz
    35 0.19 mks => F=5333.33 KHz
    36 0.25 mks => F=4000.00 KHz
    37 0.13 mks => F=8000.00 KHz
    38 0.19 mks => F=5333.33 KHz
    39 0.13 mks => F=8000.00 KHz
    40 0.19 mks => F=5333.33 KHz
    41 0.19 mks => F=5333.33 KHz
    42 0.19 mks => F=5333.33 KHz
    43 0.19 mks => F=5333.33 KHz
    44 0.19 mks => F=5333.33 KHz
    45 0.19 mks => F=5333.33 KHz
    46 0.13 mks => F=8000.00 KHz
    47 0.19 mks => F=5333.33 KHz
    48 0.19 mks => F=5333.33 KHz
    49 0.19 mks => F=5333.33 KHz
    50 0.19 mks => F=5333.33 KHz
    51 0.19 mks => F=5333.33 KHz
    52 0.19 mks => F=5333.33 KHz
    53 0.19 mks => F=5333.33 KHz
    54 0.19 mks => F=5333.33 KHz
    55 0.13 mks => F=8000.00 KHz
    56 0.25 mks => F=4000.00 KHz
    57 1.56 mks => F=640.00 KHz
    58 0.19 mks => F=5333.33 KHz
    59 0.19 mks => F=5333.33 KHz
    60 0.19 mks => F=5333.33 KHz
    61 0.13 mks => F=8000.00 KHz
    62 0.19 mks => F=5333.33 KHz
    63 0.19 mks => F=5333.33 KHz
    64 0.19 mks => F=5333.33 KHz
    65 0.19 mks => F=5333.33 KHz
    66 0.19 mks => F=5333.33 KHz
    67 0.19 mks => F=5333.33 KHz
    68 0.13 mks => F=8000.00 KHz
    69 0.19 mks => F=5333.33 KHz
    70 0.19 mks => F=5333.33 KHz
    71 0.19 mks => F=5333.33 KHz
    72 0.19 mks => F=5333.33 KHz
    73 0.19 mks => F=5333.33 KHz
    74 25.69 mks => F=38.93 KHz
    75 0.69 mks => F=1454.55 KHz
    76 0.56 mks => F=1777.78 KHz
    77 0.19 mks => F=5333.33 KHz
    78 0.19 mks => F=5333.33 KHz
    79 0.19 mks => F=5333.33 KHz
    80 0.13 mks => F=8000.00 KHz
    81 0.19 mks => F=5333.33 KHz
    82 0.19 mks => F=5333.33 KHz
    83 0.19 mks => F=5333.33 KHz
    84 0.19 mks => F=5333.33 KHz
    85 0.19 mks => F=5333.33 KHz
    86 0.19 mks => F=5333.33 KHz
    87 0.19 mks => F=5333.33 KHz
    88 0.13 mks => F=8000.00 KHz
    89 0.19 mks => F=5333.33 KHz
    90 0.19 mks => F=5333.33 KHz
    91 0.19 mks => F=5333.33 KHz
    92 0.19 mks => F=5333.33 KHz
    93 0.19 mks => F=5333.33 KHz
    94 0.19 mks => F=5333.33 KHz
    95 0.19 mks => F=5333.33 KHz
    96 0.13 mks => F=8000.00 KHz
    97 0.19 mks => F=5333.33 KHz
    98 0.19 mks => F=5333.33 KHz
    99 0.19 mks => F=5333.33 KHz
    100 0.38 mks => F=2666.67 KHz
    101 0.19 mks => F=5333.33 KHz
    102 0.69 mks => F=1454.55 KHz
    103 0.19 mks => F=5333.33 KHz
    104 0.56 mks => F=1777.78 KHz
    105 0.19 mks => F=5333.33 KHz
    106 0.31 mks => F=3200.00 KHz
    107 0.38 mks => F=2666.67 KHz
    108 0.19 mks => F=5333.33 KHz
    109 0.19 mks => F=5333.33 KHz
    110 0.19 mks => F=5333.33 KHz
    111 0.19 mks => F=5333.33 KHz
    112 0.13 mks => F=8000.00 KHz
    113 0.19 mks => F=5333.33 KHz
    114 0.19 mks => F=5333.33 KHz
    115 0.19 mks => F=5333.33 KHz
    116 0.19 mks => F=5333.33 KHz
    117 0.19 mks => F=5333.33 KHz
    118 0.19 mks => F=5333.33 KHz
    119 0.19 mks => F=5333.33 KHz
    120 0.13 mks => F=8000.00 KHz
    121 0.19 mks => F=5333.33 KHz
    122 0.19 mks => F=5333.33 KHz
    123 0.19 mks => F=5333.33 KHz
    124 0.19 mks => F=5333.33 KHz
    125 0.19 mks => F=5333.33 KHz
    126 0.19 mks => F=5333.33 KHz
    127 0.19 mks => F=5333.33 KHz
    128 0.13 mks => F=8000.00 KHz
    129 0.19 mks => F=5333.33 KHz
    130 0.19 mks => F=5333.33 KHz
    131 0.19 mks => F=5333.33 KHz
    132 0.19 mks => F=5333.33 KHz
    133 0.19 mks => F=5333.33 KHz
    134 0.19 mks => F=5333.33 KHz
    135 0.13 mks => F=8000.00 KHz
    136 0.19 mks => F=5333.33 KHz
    137 0.19 mks => F=5333.33 KHz
    138 0.19 mks => F=5333.33 KHz
    139 0.19 mks => F=5333.33 KHz
    140 0.25 mks => F=4000.00 KHz
    141 0.13 mks => F=8000.00 KHz
    142 0.19 mks => F=5333.33 KHz
    143 0.13 mks => F=8000.00 KHz
    144 0.19 mks => F=5333.33 KHz
    145 0.19 mks => F=5333.33 KHz
    146 0.19 mks => F=5333.33 KHz
    147 0.19 mks => F=5333.33 KHz
    148 0.19 mks => F=5333.33 KHz
    149 0.19 mks => F=5333.33 KHz
    150 0.19 mks => F=5333.33 KHz
    151 0.13 mks => F=8000.00 KHz
    152 0.19 mks => F=5333.33 KHz
    153 0.19 mks => F=5333.33 KHz
    154 0.19 mks => F=5333.33 KHz
    155 0.19 mks => F=5333.33 KHz
    156 0.19 mks => F=5333.33 KHz
    157 0.19 mks => F=5333.33 KHz
    158 0.19 mks => F=5333.33 KHz
    159 0.13 mks => F=8000.00 KHz
    160 0.19 mks => F=5333.33 KHz
    161 0.19 mks => F=5333.33 KHz
    162 0.19 mks => F=5333.33 KHz
    163 0.19 mks => F=5333.33 KHz
    164 0.19 mks => F=5333.33 KHz
    165 0.19 mks => F=5333.33 KHz
    166 0.19 mks => F=5333.33 KHz
    167 0.13 mks => F=8000.00 KHz
    168 0.19 mks => F=5333.33 KHz
    169 0.19 mks => F=5333.33 KHz
    170 0.19 mks => F=5333.33 KHz
    171 0.19 mks => F=5333.33 KHz
    172 0.19 mks => F=5333.33 KHz
    173 0.19 mks => F=5333.33 KHz
    174 0.19 mks => F=5333.33 KHz
    175 0.13 mks => F=8000.00 KHz
    176 0.19 mks => F=5333.33 KHz
    177 0.19 mks => F=5333.33 KHz
    178 0.19 mks => F=5333.33 KHz
    179 0.19 mks => F=5333.33 KHz
    180 0.19 mks => F=5333.33 KHz
    181 0.19 mks => F=5333.33 KHz
    182 0.19 mks => F=5333.33 KHz
    183 0.13 mks => F=8000.00 KHz
    184 0.19 mks => F=5333.33 KHz
    185 0.19 mks => F=5333.33 KHz
    186 0.19 mks => F=5333.33 KHz
    187 0.19 mks => F=5333.33 KHz
    188 0.19 mks => F=5333.33 KHz
    189 0.19 mks => F=5333.33 KHz
    190 0.13 mks => F=8000.00 KHz
    191 0.19 mks => F=5333.33 KHz
    192 0.19 mks => F=5333.33 KHz
    193 0.19 mks => F=5333.33 KHz
    194 0.19 mks => F=5333.33 KHz
    195 0.19 mks => F=5333.33 KHz
    196 0.19 mks => F=5333.33 KHz
    197 0.19 mks => F=5333.33 KHz
    198 0.13 mks => F=8000.00 KHz
    199 0.00 mks => F= INF KHz
    смущают как мегагерцы, так и ноль в конце :/
    Потому что если я правильно понимаю на мегагерцах 555 таймер не в состоянии работать.
     
  18. Nekto_nikto

    Nekto_nikto Гик

    Также попробовал снова подключить другую ардуино с частотой 40КГц, результаты достаточно странные, в среднем 2,6 МГц
    Код (C++):
    const int PWMPin = 2;    // ножка D2

    void setup()
    {
      // Конфигурируем нужные ножки МК
      pinMode(PWMPin, OUTPUT);

    // Инициализируем Timer1
      noInterrupts(); // запрещаем прерывания
      TCCR1A = 0;
      TCCR1B = 0;
      TCNT1  = 0;               // обнуляем счетчик
      TCCR1B |= (1 << CS10);    // Делитель равен 1, частота 16МГц
      OCR1A = 199;              // (16MHz / 200 = 80kHz которые дадут -> 40kHz в результате, т.к. задействуется только половина периода )
      TCCR1B |= (1 << WGM12);   // CTC mode
      TIMSK1 |= (1 << OCIE1A);  // Прерывание по совпадению
      interrupts(); // Разрешаем прерывания

      PORTD=PORTD||0b00011100;
      PORTD=PORTD&&0b11101111;
    }

    // обработчик прерывания по переполнению таймера1
    ISR(TIMER1_COMPA_vect)      
    {
      PORTD=PORTD^0b00001100;
    }

    0 391.81 mks => F=2.55 KHz
    1 0.38 mks => F=2666.67 KHz
    2 0.38 mks => F=2666.67 KHz
    3 0.44 mks => F=2285.71 KHz
    4 0.38 mks => F=2666.67 KHz
    5 0.38 mks => F=2666.67 KHz
    6 0.38 mks => F=2666.67 KHz
    7 0.38 mks => F=2666.67 KHz
    8 0.44 mks => F=2285.71 KHz
    9 0.38 mks => F=2666.67 KHz
    10 0.38 mks => F=2666.67 KHz
    11 0.38 mks => F=2666.67 KHz
    12 0.44 mks => F=2285.71 KHz
    13 0.38 mks => F=2666.67 KHz
    14 0.38 mks => F=2666.67 KHz
    15 0.38 mks => F=2666.67 KHz
    16 0.44 mks => F=2285.71 KHz
    17 0.38 mks => F=2666.67 KHz
    18 0.38 mks => F=2666.67 KHz
    19 0.38 mks => F=2666.67 KHz
    20 0.44 mks => F=2285.71 KHz
    21 0.38 mks => F=2666.67 KHz
    22 0.38 mks => F=2666.67 KHz
    23 0.38 mks => F=2666.67 KHz
    24 0.44 mks => F=2285.71 KHz
    25 0.38 mks => F=2666.67 KHz
    26 0.38 mks => F=2666.67 KHz
    27 0.38 mks => F=2666.67 KHz
    28 0.44 mks => F=2285.71 KHz
    29 0.38 mks => F=2666.67 KHz
    30 0.38 mks => F=2666.67 KHz
    31 0.38 mks => F=2666.67 KHz
    32 0.44 mks => F=2285.71 KHz
    33 0.38 mks => F=2666.67 KHz
    34 0.25 mks => F=4000.00 KHz
    35 0.13 mks => F=8000.00 KHz
    36 0.81 mks => F=1230.77 KHz
    37 0.38 mks => F=2666.67 KHz
    38 0.38 mks => F=2666.67 KHz
    39 0.38 mks => F=2666.67 KHz
    40 0.38 mks => F=2666.67 KHz
    41 0.44 mks => F=2285.71 KHz
    42 0.38 mks => F=2666.67 KHz
    43 0.38 mks => F=2666.67 KHz
    44 0.44 mks => F=2285.71 KHz
    45 0.38 mks => F=2666.67 KHz
    46 0.38 mks => F=2666.67 KHz
    47 0.38 mks => F=2666.67 KHz
    48 0.38 mks => F=2666.67 KHz
    49 0.44 mks => F=2285.71 KHz
    50 0.38 mks => F=2666.67 KHz
    51 0.38 mks => F=2666.67 KHz
    52 0.38 mks => F=2666.67 KHz
    53 0.44 mks => F=2285.71 KHz
    54 0.38 mks => F=2666.67 KHz
    55 0.38 mks => F=2666.67 KHz
    56 0.38 mks => F=2666.67 KHz
    57 0.44 mks => F=2285.71 KHz
    58 0.38 mks => F=2666.67 KHz
    59 0.38 mks => F=2666.67 KHz
    60 0.38 mks => F=2666.67 KHz
    61 0.44 mks => F=2285.71 KHz
    62 0.38 mks => F=2666.67 KHz
    63 0.38 mks => F=2666.67 KHz
    64 0.38 mks => F=2666.67 KHz
    65 0.44 mks => F=2285.71 KHz
    66 0.38 mks => F=2666.67 KHz
    67 0.38 mks => F=2666.67 KHz
    68 0.38 mks => F=2666.67 KHz
    69 0.44 mks => F=2285.71 KHz
    70 0.38 mks => F=2666.67 KHz
    71 0.38 mks => F=2666.67 KHz
    72 0.38 mks => F=2666.67 KHz
    73 0.44 mks => F=2285.71 KHz
    74 0.38 mks => F=2666.67 KHz
    75 0.38 mks => F=2666.67 KHz
    76 0.38 mks => F=2666.67 KHz
    77 0.44 mks => F=2285.71 KHz
    78 0.38 mks => F=2666.67 KHz
    79 0.38 mks => F=2666.67 KHz
    80 0.38 mks => F=2666.67 KHz
    81 0.44 mks => F=2285.71 KHz
    82 0.38 mks => F=2666.67 KHz
    83 0.38 mks => F=2666.67 KHz
    84 0.38 mks => F=2666.67 KHz
    85 0.44 mks => F=2285.71 KHz
    86 0.38 mks => F=2666.67 KHz
    87 0.38 mks => F=2666.67 KHz
    88 0.38 mks => F=2666.67 KHz
    89 0.44 mks => F=2285.71 KHz
    90 0.38 mks => F=2666.67 KHz
    91 0.38 mks => F=2666.67 KHz
    92 0.38 mks => F=2666.67 KHz
    93 0.44 mks => F=2285.71 KHz
    94 0.38 mks => F=2666.67 KHz
    95 0.38 mks => F=2666.67 KHz
    96 0.38 mks => F=2666.67 KHz
    97 0.44 mks => F=2285.71 KHz
    98 0.38 mks => F=2666.67 KHz
    99 0.38 mks => F=2666.67 KHz
    100 0.38 mks => F=2666.67 KHz
    101 0.44 mks => F=2285.71 KHz
    102 0.38 mks => F=2666.67 KHz
    103 0.38 mks => F=2666.67 KHz
    104 0.38 mks => F=2666.67 KHz
    105 0.44 mks => F=2285.71 KHz
    106 0.38 mks => F=2666.67 KHz
    107 0.38 mks => F=2666.67 KHz
    108 0.38 mks => F=2666.67 KHz
    109 0.44 mks => F=2285.71 KHz
    110 0.38 mks => F=2666.67 KHz
    111 0.38 mks => F=2666.67 KHz
    112 0.38 mks => F=2666.67 KHz
    113 0.44 mks => F=2285.71 KHz
    114 0.38 mks => F=2666.67 KHz
    115 0.38 mks => F=2666.67 KHz
    116 0.38 mks => F=2666.67 KHz
    117 0.44 mks => F=2285.71 KHz
    118 0.38 mks => F=2666.67 KHz
    119 0.38 mks => F=2666.67 KHz
    120 0.38 mks => F=2666.67 KHz
    121 0.44 mks => F=2285.71 KHz
    122 0.38 mks => F=2666.67 KHz
    123 0.38 mks => F=2666.67 KHz
    124 0.38 mks => F=2666.67 KHz
    125 0.44 mks => F=2285.71 KHz
    126 0.38 mks => F=2666.67 KHz
    127 0.38 mks => F=2666.67 KHz
    128 0.38 mks => F=2666.67 KHz
    129 0.44 mks => F=2285.71 KHz
    130 0.38 mks => F=2666.67 KHz
    131 0.38 mks => F=2666.67 KHz
    132 0.38 mks => F=2666.67 KHz
    133 0.44 mks => F=2285.71 KHz
    134 0.38 mks => F=2666.67 KHz
    135 0.38 mks => F=2666.67 KHz
    136 0.38 mks => F=2666.67 KHz
    137 0.44 mks => F=2285.71 KHz
    138 0.38 mks => F=2666.67 KHz
    139 0.38 mks => F=2666.67 KHz
    140 0.38 mks => F=2666.67 KHz
    141 0.44 mks => F=2285.71 KHz
    142 0.38 mks => F=2666.67 KHz
    143 0.38 mks => F=2666.67 KHz
    144 0.38 mks => F=2666.67 KHz
    145 0.44 mks => F=2285.71 KHz
    146 0.38 mks => F=2666.67 KHz
    147 0.38 mks => F=2666.67 KHz
    148 0.38 mks => F=2666.67 KHz
    149 0.44 mks => F=2285.71 KHz
    150 0.38 mks => F=2666.67 KHz
    151 0.38 mks => F=2666.67 KHz
    152 0.38 mks => F=2666.67 KHz
    153 0.38 mks => F=2666.67 KHz
    154 0.44 mks => F=2285.71 KHz
    155 0.38 mks => F=2666.67 KHz
    156 0.38 mks => F=2666.67 KHz
    157 0.38 mks => F=2666.67 KHz
    158 0.44 mks => F=2285.71 KHz
    159 0.38 mks => F=2666.67 KHz
    160 0.38 mks => F=2666.67 KHz
    161 0.38 mks => F=2666.67 KHz
    162 0.44 mks => F=2285.71 KHz
    163 0.38 mks => F=2666.67 KHz
    164 0.38 mks => F=2666.67 KHz
    165 0.38 mks => F=2666.67 KHz
    166 0.44 mks => F=2285.71 KHz
    167 0.38 mks => F=2666.67 KHz
    168 0.38 mks => F=2666.67 KHz
    169 0.38 mks => F=2666.67 KHz
    170 0.44 mks => F=2285.71 KHz
    171 0.38 mks => F=2666.67 KHz
    172 0.38 mks => F=2666.67 KHz
    173 0.38 mks => F=2666.67 KHz
    174 0.44 mks => F=2285.71 KHz
    175 0.38 mks => F=2666.67 KHz
    176 0.38 mks => F=2666.67 KHz
    177 0.38 mks => F=2666.67 KHz
    178 0.44 mks => F=2285.71 KHz
    179 0.38 mks => F=2666.67 KHz
    180 0.38 mks => F=2666.67 KHz
    181 0.38 mks => F=2666.67 KHz
    182 0.44 mks => F=2285.71 KHz
    183 0.38 mks => F=2666.67 KHz
    184 0.38 mks => F=2666.67 KHz
    185 0.38 mks => F=2666.67 KHz
    186 0.44 mks => F=2285.71 KHz
    187 0.38 mks => F=2666.67 KHz
    188 0.38 mks => F=2666.67 KHz
    189 0.38 mks => F=2666.67 KHz
    190 0.44 mks => F=2285.71 KHz
    191 0.38 mks => F=2666.67 KHz
    192 0.38 mks => F=2666.67 KHz
    193 0.38 mks => F=2666.67 KHz
    194 0.44 mks => F=2285.71 KHz
    195 0.38 mks => F=2666.67 KHz
    196 0.38 mks => F=2666.67 KHz
    197 0.38 mks => F=2666.67 KHz
    198 0.44 mks => F=2285.71 KHz
    199 0.00 mks => F= INF KHz

     
  19. parovoZZ

    parovoZZ Гуру

    смысл постинга всего этого?
     
    Nekto_nikto нравится это.
  20. Nekto_nikto

    Nekto_nikto Гик

    В общем то я теряюсь в догадках.
    Сначала думал что дуньки паленые, поменял обе, дальше думал что все таки проблема с чтением из EEPROM, убрал, сделал чтоб непосредственно с массивом работало, т.к. в случае двух дуин могу себе позволить, снова мимо. В порядке бреда попробывал минимизировать телодвижения в обработчике прерывания, снова мимо. Предположил что им просто не хватает питания, т.к. висят они у меня на одном USB и получается так что одна питает другую через пин 5V, подключил к ним блок питания на 5вольт и снова не то. Посмотрел количество циклов таймера, которое снимает прерывание, при частоте источника 40КГц, в среднем получается 6, а если на источнике поставить делитель на 64, так прямо четко с возрастанием на 6 циклов, вместо искомых 400.

    Код (C++):
    // Тестирую на частоте 40КГц
    unsigned int Period[200];  // Массив, в котором будут храниться отловленные значения
    unsigned int TimerWas=0;   // Предидущее отловленное значение таймера
    unsigned int TimerVal=0;   // Значение таймера
    unsigned int tmp_TCNT1=0;  // Временная переменная, где будет храниться считанное значение TCNT1
    int i=0;
    boolean FlagToWrite=false; // Флаг для записи
    String S="";               // Переменная передаваемая через COM порт
    void Int0() // Функция прерывания для ножки МК D2
    {
    if(FlagToWrite==false)
      {
      // Как читать регистр таймера TCNT1 показано на 116 странице ДШ
      /*tmp_TCNT1=TCNT1;    // Не делаю поправку на задержку, т.к. задержка будет каждый раз при регистрации стгнала
      //TimerVal=65534-(tmp_TCNT1+TimerWas);  // Если мы просто напишем TimerVal=tmp_TCNT1-TimerWas; то как минимум сразу после переполнения таймера при расчетах будут возникать неточности
                                            // а если использовать ветвление при расчетах, то это увеличит время исполнения данного куска кода и как следствие уменьшит точность
      TimerVal=tmp_TCNT1-TimerWas;
      TimerWas=tmp_TCNT1;
      Period[i]=TimerVal;*/


      Period[i]=TCNT1;

      i++;
      if(i>199)
        {
        FlagToWrite=true;
        TCCR1B=0;   // Выключаем таймер1
        }
      }
    }

    void setup()
    {
      // Конфигурируем нужные ножки МК
      Serial.begin(9600);                 // подключаем последовательный порт
      pinMode(2, INPUT_PULLUP);           // конфигурируем ножку D2
      attachInterrupt(0, Int0, FALLING);  // назначаем обработчик прерывания для ножки D2 по спаду фронта, т.к. если прописать RISING, то прерывание происходит само собой
                                          // также нужно учитывать, что сразу же после прошивки будет срабатыват прерывание, но если ардуино отключить и потом включить, то все будет отрабатываться штатно
                                          // но именно отключить по питанию, а не перезагрузить
      pinMode(3, OUTPUT);                 // конфигурируем ножку D3
      digitalWrite(3, HIGH);              // подаем на ножку D3 высокий логический уровень, чтоб открыть транзистор на оптореле
      pinMode(LED_BUILTIN, OUTPUT);       // конфигурируем ножку, отвечающую за встроенный светодиод на плате

      for(i=0; i<=199; i++)               // Инициализируем массив значений
        {
        Period[i]=0;
        }
      i=0;

      // инициализируем Timer1
      noInterrupts(); // запрещаем прерывания
      TCNT1H = 0;
      TCNT1L = 0;
      TCCR1A = 0;
      TCNT1  = 0;
      TCCR1B |= (1 << CS10); // Prescaler=1 No prescaling частота 16MHz
    interrupts(); // Разрешаем прерывания

    }


    void loop()
    {
      if(FlagToWrite)
      {
      //asm("cli"); // Запрещаем прерывания
      // Пишем весь массив в энергонезависимую память EEPROM, т.к. при непосредственном подключении к ПК есть вероятность повредить компьютер
      // поэтому доставать значения будем после отключения Arduino, посылая через COM порт команду на чтение
      // сигналим светодиодом на плате, что запись произведена и можно подключать к ПК и смотреть что получилось
        digitalWrite(LED_BUILTIN, HIGH);
        delay(1000);
        digitalWrite(LED_BUILTIN, LOW);
        delay(1000);

      if (Serial.available()) // проверяем, поступают ли какие-то команды на мониторе порта
        {
          S = Serial.readString();  // !!! Читаем строку из терминала
          if(S=="Go")
            {
            for(i=0;i<=199;i++)     // выводим массив в терминал через COM порт
              {
              // Вычисляем значение периода
              TimerVal=Period[i-1]-Period[i];
              //Serial.println((String)(i+1)+"\t"+(String)Period[i]+"\t"+(String)((float)(Period[i] * 0.0625))+" mks  => F="+(String)((float)(1000/(Period[i] * 0.0625)))+" KHz");    //0
              //Serial.println((String)(i+1)+"\t"+(String)TimerVal+"\t"+(String)((float)(TimerVal * 0.0625))+" mks  => F="+(String)((float)(1000/(TimerVal * 0.0625)))+" KHz");       //1
              Serial.println((String)(i+1)+"\t"+(String)Period[i]);
              }
            }
        }

      }


    }