0 / 0 / 0
Регистрация: 25.09.2024
Сообщений: 5
|
|
1 | |
Выдать определенное количество импульсов с заданной частотой25.09.2024, 16:49. Показов 891. Ответов 19
Метки нет (Все метки)
Добрый день.
Нужно выдать на ножку Atmega88 определенное количество импульсов (N=125) с заданной частотой (F=440 Гц). Запрограммировать таймер Timer1 на 440 герц я справился. Подскажите, как попроще (надежнее) посчитать эти импульсы. Думаю , что через Timer0, но не соображу как. Пишу на ассемблере.
0
|
25.09.2024, 16:49 | |
Ответы с готовыми решениями:
19
Аппаратно выдать определенное количество импульсов Последовательность импульсов с изменяющейся частотой Создание в LabView Имитации работы генератора импульсов тока с частотой 1кГц Выполнение заданной команды определённое количество раз Запуск bat-файла определенное количество раз и определенное количество дней |
57 / 43 / 14
Регистрация: 12.12.2020
Сообщений: 439
|
|
25.09.2024, 18:31 | 2 |
Сообщение было отмечено Ap-o-stol как решение
Решение
Так в таймере1 и считайте. Сработал таймер - счетчик ++ и ногу в инверт. Проверяем значение счетчика. Если больше 250 то все, тушим таймер. Как раз байта одного хватает под перемменую.
0
|
3 / 3 / 1
Регистрация: 27.02.2014
Сообщений: 101
|
||||||
25.09.2024, 22:15 | 3 | |||||
Давно не писал под AVR и возможно есть ошибки - нужно в железе проверять.
Можно скомпилировать и глянуть транслятор в асм и от этого толкнуться
0
|
57 / 43 / 14
Регистрация: 12.12.2020
Сообщений: 439
|
|
25.09.2024, 22:15 | 4 |
Частота 440 я так понимаю это 440 импульсов в секунду. Импульс это ногу поднял и ногу опустил. То есть частота инвертирования ног должна быть 880. А pulse_count показывает именно кол-в переключений которых так же должно быть не 125 а 250 (по два переключения на импульс.
И волатиле вроде не нужен - переменная только в прерывании и "живет".
0
|
3 / 3 / 1
Регистрация: 27.02.2014
Сообщений: 101
|
|
25.09.2024, 22:41 | 5 |
На сколько помнится, из прерывания глобальная переменная недоступна без volatile, но могу ошибаться.
Тоже не буду спорить, но проверять в железе лень) Тут скорее сам смысл важнее как дергать лапами в таймере. А еще нам не сказали какой % заполнения импульс должен быть, но это так, лирическое отступление)
1
|
57 / 43 / 14
Регистрация: 12.12.2020
Сообщений: 439
|
|
25.09.2024, 22:52 | 6 |
не, она явно не про это, она про то что переменная может изменяться не только из главного потока и ее нельзя оптимизировать.
это да. Чувствуется какая то недосказанность в задаче
0
|
3 / 3 / 1
Регистрация: 27.02.2014
Сообщений: 101
|
||||||
25.09.2024, 23:46 | 7 | |||||
Точно до буквы!
Тогда можно переменную счетчика закинуть в прерывание.
Не особо понятно куда конкретно в данном случае лучше запихать.
0
|
594 / 284 / 42
Регистрация: 22.09.2023
Сообщений: 836
|
|
26.09.2024, 09:58 | 8 |
Сообщение было отмечено Ap-o-stol как решение
Решение
Лучше этого не делать. Потому что "значение статической переменной присваивается при первом вызове функции", а это проверка, которая будет тратить время при каждом вызове прерывания до выключения питания.
Теперь запрограммируйте его на выдачу импульсов (изучите раздел документации "Output compare units"). И в прерывании таймера считайте количество импульсов. Как только насчитате сколько нужно - выключайте таймер.
1
|
0 / 0 / 0
Регистрация: 25.09.2024
Сообщений: 5
|
|
26.09.2024, 10:53 [ТС] | 9 |
-50%.Да в принципе не важно,главное длительность импульса должна быть >50 мкс
- Учту, спасибо. - На ассемблере такой проблемы нет - регистр он и есть регистр. - А вот это вернее всего - придется подгонять. !!! В точку !!! То есть в прерывании отключить прерывание ? Сработает ли ? Попробую конечно.
0
|
13 / 12 / 1
Регистрация: 23.01.2019
Сообщений: 69
|
|
26.09.2024, 11:19 | 10 |
Сообщение было отмечено Ap-o-stol как решение
Решение
440Гц, предполагаю, что что то музыкальное выводится на ножку.
Можно порсто отключить ногу в TCCR1A. Или вам переключать ноты нужно?
1
|
0 / 0 / 0
Регистрация: 25.09.2024
Сообщений: 5
|
|
26.09.2024, 12:31 [ТС] | 11 |
0
|
57 / 43 / 14
Регистрация: 12.12.2020
Сообщений: 439
|
|
26.09.2024, 19:11 | 12 |
а почему не должно? вы отключаете возникновение прерывание выполнение кода в прерывании продолжится
0
|
629 / 386 / 73
Регистрация: 21.09.2008
Сообщений: 1,317
|
|
27.09.2024, 10:55 | 13 |
В архитектуре AVR при входе в обработчик прерывания дальнейшие прерывания автоматически заблокированы , вложенные прерывания исключены (пожалуй, только сигнал RESET невозможно заблокировать). Отсюда проистекает требование к обработчику прерывания как можно быстрее отработать причину своего вызова и отдать управление.
Например, это может повлиять на точный отсчёт времени таймером, как это реализоано в платформе Arduino для AVR (функция millis()). Можете написать пример сохранения значения SREG из обработчика в ячейку памяти, а вывести значение этой ячеки в консоль уже после выхода из обработчика, чтобы убедиться лично в моих сказаниях.
0
|
0 / 0 / 0
Регистрация: 25.09.2024
Сообщений: 5
|
|
27.09.2024, 11:56 [ТС] | 14 |
Да, но флаги других прерываний (если наступили) устанавливаются, по выходу из прерывания общий запрет снимается и диспетчер прерываний запускает другие прерывания согласно иерархии.
0
|
57 / 43 / 14
Регистрация: 12.12.2020
Сообщений: 439
|
|
27.09.2024, 12:42 | 15 |
Да, все правильно. При входе в прерывание глобально прерывания запрещаются, но прерывание конкретное можно выключить.
И да, флаги прерывания устанавливаются и при выходе из одного прерывания можно сразу улететь на другое (вроде не сразу, вроде одна команда отработает, но точно не помню).
0
|
629 / 386 / 73
Регистрация: 21.09.2008
Сообщений: 1,317
|
|
28.09.2024, 17:59 | 16 |
0
|
0 / 0 / 0
Регистрация: 25.09.2024
Сообщений: 5
|
|
30.09.2024, 12:57 [ТС] | 17 |
Если есть система приоритетов - есть иерархия и есть кусок микропрограммного кода который это отслеживает - чем не диспетчер ?
0
|
57 / 43 / 14
Регистрация: 12.12.2020
Сообщений: 439
|
|
30.09.2024, 17:07 | 18 |
так и понимать. Если во время обработки прерывания установились флаги нескольких прерываний, то при выходе из прерывания программа уходит на следующее, то что выше в иерархии прерываний.
0
|
629 / 386 / 73
Регистрация: 21.09.2008
Сообщений: 1,317
|
|
01.10.2024, 11:05 | 19 |
В AVR порядок приоритета прерывания заложен в таблице векторов прерываний: чем меньше адрес в таблице, тем выше приоритет прерывания. Например, в ATmega328P/164РА/324РА/644РА/1284Р внешнее прерывание INT0 более приоритетно, чем INT1, PCINT0, PCINT1, PCINT2, WDT и так далее. Выше INT0 только немаскируеое RESET - у неё наивысший приоритет.
0
|
57 / 43 / 14
Регистрация: 12.12.2020
Сообщений: 439
|
|
01.10.2024, 16:47 | 20 |
Ну я про то же самое и говорил просто без подробностей
0
|
01.10.2024, 16:47 | |
01.10.2024, 16:47 | |
Помогаю со студенческими работами здесь
20
По нажатию кнопки выдать последовательность прямоугольных импульсов скважностью 3 (ATmega16, ASM) Вставить в массив определенный элемент определенное количество раз на определенное место Как считать определённое количество цифр заданного числа (считать число до заданной цифры)? Генерация звука с заданной частотой Амплитудный спектр заданной последовательности импульсов Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |