1 / 1 / 0
Регистрация: 28.03.2015
Сообщений: 93
|
||||||
1 | ||||||
Atmega2560,прерывание в таймере 1 вызванное событием на выходе из компаратора19.02.2021, 02:41. Просмотров 690. Ответов 15
Метки нет Все метки)
(
Что хочу:
Измерить параметры сигнала в прерывании таймера вызванном по захвату от аналогового компаратора, т.е. целью является выделенное жирным. С выводом на дисплей как самого сигнала, так и его параметров. Что делал: Сначала подал сигнал на ICP4, в прерывании по захвату таймера 4 измерил частоту, вывел значение в числовом виде на дисплей. Т.к. таймер 4 не позволяет совершить захват от компаратора, перешел на таймер 1, а у того, в свою очередь, нет на плате ножки ICP1, т.ч. пошагово переползти от таймера 4 к таймеру 1 не получилось, сразу прыжком. Сигнал от генератора теперь подал на пин ADC0, и по моей задумке он должен пройти через компаратор. Проверьте, пожалуйста, правильно ли настроил регистры, или в чем-то другом ошибка, по факту на дисплее осциллограмма сигнала получена, но с показаниями частоты беда, что-то показывается, какой-то набор редко изменяющихся констант, хотя на таймере 4 частоту показывало нормально. показания "дышали". Проверяется все сразу в железе, без симуляции.
Еще из непонятного, на таймере 4 без бита TOIE4 частоту не показывало, а на таймере 1 не показывает что с ним (0Гц), что без него (константа).
0
|
|
19.02.2021, 02:41 | |
Внешнее прерывание ATmega2560 в ASM непонятное прерывание от компаратора atmega128 Не срабатывает прерывание компаратора(AIN0) С# Сохранение текущего времени в таймере при выходе из программы |
|
1 / 1 / 0
Регистрация: 28.03.2015
Сообщений: 93
|
|
20.02.2021, 23:14 [ТС] | 2 |
После того как в инициализации компаратора регистр ADCSRB записал в виде ADCSRB |=(1<<ACME) частоту показывать стало правдиво, но только не текущую частоту, а снимок той частоты которая подавалась от генератора в момент подачи питания на микроконтроллер. Последущее изменение частоты потенциометром показания не меняют, они стоят как памятник. Чтобы увидать новую частоту, которую задал потенциометром, нужно перевключить питание МК, либо нажать кнопку ресет на плате ардуины. Такое впечатление что вход в прерывание по захвату присутствует только какое-то непродолжительное время, а потом программа туда войти не может. Пробовал поднимать амплитуду импульсов, включал усилитель в компараторе, игрался опорным напряжением, ничего не помогает. Мысли кончились, прошу помощь зала.
0
|
1854 / 1179 / 114
Регистрация: 04.01.2010
Сообщений: 4,192
|
|
21.02.2021, 00:46 | 3 |
Переменная "f" должная быть volatile. Остальные, используемые в прерывании - перенесите в само прерывание. Если они используются где-то еще - тоже должны быть "volatile". И еще - читайте сразу: "rising = ICR1;" Арифметика, которую вы написали - она ни к чему. Да и вообще - делить 'long int' в прерывании - это "то" еще занятие, в AVR. Деление лучше перенести прямо перед выводом значения.
Аналоговый компаратор вообще непонятно - что Вы им хотите сделать. В описании вы пишете, что "по прерыванию компаратора", но в коде его нет... PS: посоветую поставить Code Vision AVR и настроить все регистры согласно выбору режимов в мастере проекта. Это намного проще, чем проверять Ваши (простите) каракули битов регистров, которые на память помнят далеко не все, да еще и без комментариев ни к битам, ни к коду.
0
|
1 / 1 / 0
Регистрация: 28.03.2015
Сообщений: 93
|
|||||||||||
22.02.2021, 20:44 [ТС] | 4 | ||||||||||
Код выложил полностью и причесал как советовали.
Да, ошибся с названием темы, в тот момент не знал что бывает еще и прерывание в самом компараторе, отсюда путаница. В тексте первого сообщения пытался исправиться, но вышло как в поговорке "первое слово дороже второго". Если можно исправьте заголовок на следующий: "прерывание в таймере 1 вызванное событием на выходе из компаратора", это то что я пытаюсь построить.
Переменные объявлял всеми возможными способами, на основную проблему это никак не влияет.
0
|
1854 / 1179 / 114
Регистрация: 04.01.2010
Сообщений: 4,192
|
|
22.02.2021, 21:34 | 5 |
0
|
1 / 1 / 0
Регистрация: 28.03.2015
Сообщений: 93
|
|
22.02.2021, 23:20 [ТС] | 6 |
Строки 51-55 разве не он?
0
|
Тутошний я
|
||||||
23.02.2021, 11:06 | 7 | |||||
а что эта строка делает?
и зачем в функцию передаётся ICR1? Добавлено через 12 минут допустим в ADC у нас 50.что будет в arr[i] ?
0
|
1 / 1 / 0
Регистрация: 28.03.2015
Сообщений: 93
|
|
23.02.2021, 19:28 [ТС] | 8 |
А это уже зашквар, конечно же так:
77 arr[i] =ADC_read(ADC)/1024; Оно так и было изначально, просто уже запутался. Все сказанное мной выше в описании проблемы справедливо и для исправленного аргумента.
0
|
1 / 1 / 0
Регистрация: 28.03.2015
Сообщений: 93
|
|
23.02.2021, 23:02 [ТС] | 10 |
Действительно, зачем. В таком виде будет корректно?
77 arr[i] =ADC_read(1)/1024; Но вывод переменной f в реальном времени от этого не появился.
0
|
Тутошний я
|
||||||
24.02.2021, 00:25 | 11 | |||||
раз не используется, правильней так
мне больше интересен этот вопрос Добавлено через 1 час 6 минут https://chipenable.ru/index.ph... r/item/193
0
|
1 / 1 / 0
Регистрация: 28.03.2015
Сообщений: 93
|
|
24.02.2021, 17:57 [ТС] | 12 |
Будет 0.
Добавлено через 2 минуты В таком виде получаю error Напрашивается вывод, что если не будет корректного АЦП преобразования таймер не увидит фронты, и следовательно не будет захвата. Так? Добавлено через 5 минут С другой стороны, частоту показывает корректно как раз в то время когда я вообще удаляю строку с АЦП преобразованием, например, вместо: arr[i] =ADC_read(0); запишу: arr[i] =5; Изображения сигнала естественно теперь нет, но частота - реальна.
0
|
Тутошний я
|
|||||||||||
24.02.2021, 18:49 | 13 | ||||||||||
а функцию исправил?
может так попробовать
0
|
1 / 1 / 0
Регистрация: 28.03.2015
Сообщений: 93
|
|
24.02.2021, 22:45 [ТС] | 14 |
Я тут подумал, если я пропускаю сигнал через компаратор, что я собственно собираюсь после него АЦПировать? Там и будет либо 0, либо единица. А то что я считаю осциллограммой сигнала, может просто является выходом компаратора? Просто сигнал подаю прямоугольный, и у компаратора на выходе тоже прямоугольный будет, при любом сигнале на входе, хоть синусоиду подавай.
0
|
Тутошний я
|
|
25.02.2021, 21:57 | 16 |
короче, подсчёт частоты придётся делать програмно.
чтоб включить компаратор нужно в ADEN записать 0.но при этом АЦП не работает.
0
|
25.02.2021, 21:57 | |
Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь. Предусмотреть возможность изменения компаратора (реализация компаратора в виде передаваемой в подпрограмму функции) Рассчитать напряжение на выходе . Изобразить график напряжения на выходе Перехват события вызванное программы Исключение , вызванное ViewBag.Title Как разрушить вызванное popup - окно?
Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |