РЕШЕНО Подсчёт поступающих импульсов с помощью аппаратного таймера.

Тема в разделе "Arduino & Shields", создана пользователем MaksOne, 5 май 2023.

Статус темы:
Закрыта.
  1. parovoZZ

    parovoZZ Гуру

    при аппаратном методе процессор вообще не затратит ни одного такта на подсчёт. Всё сделает счётчик таймера.

    есть ровно два метода подсчёта частоты импульсов:
    1. Считать количество импульсов в единицу времени
    2. Считать период следования импульсов.

    Первый метод хорош тогда, когда частота следования импульсов очень высока. Тогда через определённые промежутки времени мы просто считываем значения счётчика и дальше простая арифметика. Надо следить только лишь за тем, чтобы счётчик не переполнялся.

    Второй метод хорош тогда, когда частота следования импульсов крайне низка. Бонусом мы ещё получим и значение скважности (коэффициент заполнения). Здесь также надо следить за тем, чтобы счётчик таймера не переполнялся, но уже тот, который считает время.

    Оба этих метода реализуются полностью на таймерах без привлечения процессора. Поэтому на что там затрачивается целая секунда, когда можно затратить всего 10 тактов - вообще не понимаю.
     
  2. parovoZZ

    parovoZZ Гуру

    а как по-твоему происходит считывание сигналов с внешнего мира?

    как это???
    с таймером есть немного здесь
    https://breadboard.ru/607/реализовать-алгоритм-плавного-увеличения-яркости-светодиода?show=607#q607
     
    MaksOne нравится это.
  3. parovoZZ

    parovoZZ Гуру

    допустим, что мы читаем UART в прерывании. Уход на прерывание и выход из него - 8 тактов. Считать значение регистра - ещё пара тактов. Итого - 10 тактов. При тактовой частоте 20 МГц всё это займёт 0.5 мс. Честно говоря не понимаю, как надо извратиться, чтобы на всё это уходили мс.
     
  4. User248

    User248 Гик

    Убираю задержку delay(1) и получаю столбик вместо строки. Это симулятор, но в реальности точно так же.

    Безымянный76867876.png
     
  5. a1000

    a1000 Гуру

    А какая разница что программировать. В любом случае мы общаемся с МК и что там напихано вокруг него не имеет значения. В МК мы заливаем HEX файл и не имеет никакого значения на чём был написан исходник. И абсолютно не важно как он в МК попадает, через загрузчик или с помощью программатора.
     
    Airbus нравится это.
  6. MaksOne

    MaksOne Нерд

    А какой смысл? :D Знай я ассемблер, я бы взял какой-нибудь голый PIC и погнал бы. На тему АВР, да уж тем более ардуино, я бы не стал загоняться ))) По моему скромному мнению, человек, знающий языки низкого уровня и разбирающийся в электронике, не нуждается в "дурине" (процитирую товарища parovoZZ), и уж тем более в подобных подсказках.
    Знал, что есть куча способов. Но до этого момента для меня лично существовали лишь digitalRead, analogRead и разные модули-датчики с прилагающимися библиотеками. Теперь ещё и таймеры использовать буду )
    Очень просто. Гугл на запрос по использованию таймера/счетчика не выдавал ссылок на breadboard. А когда ты упомянул про него впервые, я его пролистал, но не обнаружил того, на что ты дал мне ссылку. Может, плохо искал, не спорю.
    Вот когда ты тыкнул меня носом конкретно сюда, я увидел, да. В частности, я нашёл там пример того, что искал изначально:
    Код (C++):
    Old_time = TCNT2;
    За это спасибо, это то, что нужно. :)
     
    Последнее редактирование: 12 май 2023
  7. parovoZZ

    parovoZZ Гуру

    способов всего два: из регистра скопировать в РОН и второй способ: из регистра скопировать в ОЗУ. Не всегда есть возможность применить оба этих способа. Для этого и надо знать ассемблер.
    Всё остальное - это многочисленные обёртки этих двух способов.
     
  8. a1000

    a1000 Гуру

    Да вроде не пойдёт так. Или имелось ввиду РОН - регистр общего назначения.
     
  9. parovoZZ

    parovoZZ Гуру

    Чтобы так пошло, делают виртуальные регистры.
     
  10. MaksOne

    MaksOne Нерд

    Ну это я знаю и без знания ассемблера. О том, как работа МК происходит на самом нижнем программно-аппаратном уровне, я имею представление. Я имел ввиду Си.
     
  11. a1000

    a1000 Гуру

    Чесно говоря не слышал о таком. Не подскажешь где можно об этом почитать?
     
  12. MaksOne

    MaksOne Нерд

    Р
    Речь шла о считывании информации из регистра аппаратного таймера, а ни портов ввода-вывода. То, как обозначать направление работы порта через регистры DDRx, выставлять единицу/ноль через регистры PORTx и считывать состояние через регистры PINx - это элементарщина.
     
    Последнее редактирование: 12 май 2023
  13. a1000

    a1000 Гуру

    У вас какая-то непонятная проблема. Как всегда говорил parovoZZ, читайте Datasheet. Открываем Datasheet на ATmega328 на странице 92. Видим готовые образцы кода от разработчиков даного МК. Хоть Assembly Code
    Код (C++):
    ...
    ; Set TCNT1 to 0x01FF
    ldi r17,0x01
    ldi r16,0xFF
    out TCNT1H,r17
    out TCNT1L,r16
    ; Read TCNT1 into r17:r16
    in r16,TCNT1L
    in r17,TCNT1H
    ...
    Хоть C Code
    Код (C++):
    unsigned int i;
    ...
    /* Set TCNT1 to 0x01FF */
    TCNT1 = 0x1FF;
    /* Read TCNT1 into i */
    i = TCNT1;
    ...
     
  14. parovoZZ

    parovoZZ Гуру

    в даташитах на XMEGA и её производных.
     
    a1000 нравится это.
  15. MaksOne

    MaksOne Нерд

    Проблема давно решена и была понятна с самого начала. Собственно, с самого начала я высказал верное предположение, и просил лишь подтвердить его состоятельность, например, ответив что-то вроде "да, всё верно".
    Но я учту ваши советы по поводу чтения датащитов. Ибо вы мне показали, что там, вероятно, действительно довольно просто найти ответ на интересующий вопрос.
    Для тех, кто не следит за темой, повторюсь: ВОПРОС ЗАКРЫТ, ОТВЕТ НАЙДЕН :)
     
  16. Airbus

    Airbus Радиохулиган Модератор

    Ну и славно!
     
Статус темы:
Закрыта.