Помогите с датчиком пульса разобраться, пожалуйста

Тема в разделе "Arduino & Shields", создана пользователем iBoy, 8 июл 2016.

  1. iBoy

    iBoy Гик

    Поэтому я по 6 раз запускаю функцию проверки датчика
     
  2. ostrov

    ostrov Гуру

    Значит опрашивайте датчик по прерыванию таймера. Прерывание самый простой способ все сделать хорошо без переписывания всей программы.
     
    iBoy нравится это.
  3. iBoy

    iBoy Гик

    Тоесть?
     
  4. ostrov

    ostrov Гуру

    Про прерывания слышали?
     
    iBoy нравится это.
  5. iBoy

    iBoy Гик

    Нет. Что это?
     
  6. ostrov

    ostrov Гуру

    iBoy и DIYMan нравится это.
  7. iBoy

    iBoy Гик

    А это не то же, что и nointerrupts(я ещё не дочитал)?
     
  8. ostrov

    ostrov Гуру

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

    iBoy Гик

    А в ардуино леонардо же другой контроллер - там таймеры не другие?
     
  10. DIYMan

    DIYMan Guest

    Принцип всё равно тот же - есть регистры, всё через них. Главное понять принцип, остальное - выкуривается с даташитов.
     
    ostrov нравится это.
  11. ostrov

    ostrov Гуру

    Все на AVR, разница есть но принцип одинаков. В леонардо, если не ошибаюсь, мега 328, как в Уно, про нее и почитать.
     
  12. iBoy

    iBoy Гик

    Там ATMega32u4
     
  13. ostrov

    ostrov Гуру

    У него один 8 битный таймер и два16 битных. Даже лучше чем 328.
     
  14. iBoy

    iBoy Гик

    Я нашёл библиотеку для леонардо, которая всем этим(таймерами-счётчиками) оперирует: https://www.pjrc.com/teensy/td_libs_TimerOne.html
    Не помогло. Зато я, после долгих поисков проблемы, обнаружил, что функция по определению пульса возвращает пульс только тогда, когда его нужно написать в Сериал порт. Когда его запрашивает функция return(), он возвращает (2^n)+1, где n начинается с 8 и дальше периодически нарастает.
     
    Последнее редактирование: 9 июл 2016
  15. iBoy

    iBoy Гик

    Причём даже в программе, где ничего, кроме этой и вызывающей функций нет, такая же ошибка.
     
    Последнее редактирование: 9 июл 2016
  16. ostrov

    ostrov Гуру

    Не надо библиотек никаких. Сегодня вечером поищу у себя Леонардо, если найду кину код.
     
  17. iBoy

    iBoy Гик

    Подождите! Библиотека работает, причём бесперебойно. Я вообще всё, кроме пульса убрал из программы. Функция по определению пульса, почему-то, если пульс запросила функция Serial.println(), пишет правильный пульс, а неправильный идёт, если его запросила функция return(). Вот тогда и идут значения, которые я описал выше. И спасибо Вам огромное вообще за всё, где Вы меня консультировали и в частности за темы с пульсом.
     
  18. iBoy

    iBoy Гик

    Спасибо Вам огромное! Оказалось, что проблема была в том, что после функции возврата значения, программа заканчивала выполнение функции и не засекала таймер.