Реклама на сайте English version  DatasheetsDatasheets

KAZUS.RU - Электронный портал. Принципиальные схемы, Datasheets, Форум по электронике

Новости электроники Новости Литература, электронные книги Литература Документация, даташиты Документация Поиск даташитов (datasheets)Поиск PDF
  От производителей
Новости поставщиков
В мире электроники

  Сборник статей
Электронные книги
FAQ по электронике

  Datasheets
Поиск SMD
Он-лайн справочник

Принципиальные схемы Схемы Каталоги программ, сайтов Каталоги Общение, форум Общение Ваш аккаунтАккаунт
  Каталог схем
Избранные схемы
FAQ по электронике
  Программы
Каталог сайтов
Производители электроники
  Форумы по электронике
Помощь проекту

Микроконтроллеры, АЦП, память и т.д Темы касающиеся микроконтроллеров разных производителей, памяти, АЦП/ЦАП, периферийных модулей...

 
Опции темы
Непрочитано 07.08.2010, 17:07  
ask_e
Прохожий
 
Регистрация: 31.10.2006
Сообщений: 6
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ask_e на пути к лучшему
Вопрос Конфликт прерываний таймера и АЦП

Есть генератор прямоугольных импульсов частотой 30 кГц, реализованный на таймере с прерываниями. Импульсы должны генерироваться НЕПРЕРЫВНО ВСЕ ВРЕМЯ, с неизменной частотой.

Также есть АЦП, анализирующий сигнал на пине. Результат АЦП преобразования (104 мкс) считывается и обрабатывается в прерывании АЦП. Затем АЦП снова запускается и делается новое преобразование и т.д.

Проблема:

В VMLAB видно (да и так понятно), что прерывания АЦП изменяют длительность импульсов генератора. Прерывания АЦП конфликтуют с прерываниями таймера.

Что можно сделать, чтобы и генератор работал и АЦП (чтобы и овцы были сыты и волки целы).

Может можно реализовать генератор прямоугольных импульсов по-другому в МК (главное, чтобы именно в МК)?
Реклама:
ask_e вне форума  
Непрочитано 07.08.2010, 17:11  
_guardianangel
Почётный гражданин KAZUS.RU
 
Регистрация: 01.04.2009
Адрес: Рязань
Сообщений: 1,140
Сказал спасибо: 21
Сказали Спасибо 635 раз(а) в 344 сообщении(ях)
_guardianangel на пути к лучшему
По умолчанию Re: Конфликт прерываний таймера и АЦП

Ну для начала код в студию. И по пробуйте в прерывании АЦП только считывать результат, а обрабатывать в основном цикле.
_guardianangel вне форума  
Сказали "Спасибо" _guardianangel
ask_e (07.08.2010)
Непрочитано 07.08.2010, 17:24  
picavr
Почётный гражданин KAZUS.RU
 
Аватар для picavr
 
Регистрация: 07.10.2007
Адрес: Луганск
Сообщений: 1,816
Сказал спасибо: 13
Сказали Спасибо 399 раз(а) в 214 сообщении(ях)
picavr на пути к лучшему
По умолчанию Re: Конфликт прерываний таймера и АЦП

Сообщение от _guardianangel Посмотреть сообщение
обрабатывать в основном цикле.
Нафиг нужно основной цикл если всё моно сделать в прерываниях...
Сообщение от ask_e Посмотреть сообщение
Проблема:
В чём проблема?
в прерываниях АЦП разрешите прерыывания таймера...
ИЛИ
опрашивайте АЦП в прерывании того же таймера.
в начале обработки формируете собственно имульсы а потом АЦП.
время преобразования=104 мкс(что то долго как то)
30 кгц это 33 мксек. 33*4=132 мксек.
Счётчик оргнизовать на 4. За 3 прерывания таймера АЦП будет преобразовывать.
а на 4 раз прочитать... и снова запустить АЦП и загрузить счётчик на 4.
__________________
"picavr(ГАВ)мыло.ру" USB_Analyzer, Digital_Storage_Oscilloscope "picavr.kr1.ru" заказы в Китай компонентов/изготовление: плат/ЖКИ/мембраных клавиатур/имп трансформаторов

Последний раз редактировалось picavr; 07.08.2010 в 17:31.
picavr вне форума  
Сказали "Спасибо" picavr
ask_e (07.08.2010)
Непрочитано 07.08.2010, 17:33  
kison
Почётный гражданин KAZUS.RU
 
Регистрация: 13.12.2004
Сообщений: 3,172
Сказал спасибо: 11
Сказали Спасибо 692 раз(а) в 504 сообщении(ях)
kison на пути к лучшему
По умолчанию Re: Конфликт прерываний таймера и АЦП

Проще всего сделать обработку АЦП в том же самом прерывании от таймера, что и для генерации сигнала используется. Выполнили действия нужные для генерации - проверяйте флаг готовности АЦП. Не готово - выход, готово - обработка обычным порядком и запуск повторного измерения.
kison вне форума  
Сказали "Спасибо" kison
ask_e (07.08.2010)
Непрочитано 07.08.2010, 17:39  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Конфликт прерываний таймера и АЦП

Сообщение от ask_e Посмотреть сообщение
Есть генератор прямоугольных импульсов частотой 30 кГц, реализованный на таймере с прерываниями. Импульсы должны генерироваться НЕПРЕРЫВНО ВСЕ ВРЕМЯ, с неизменной частотой.
А почему не задействовать для генерации импульсов хардварный ШИМ ?
st_1 вне форума  
Сказали "Спасибо" st_1
ask_e (07.08.2010)
Непрочитано 07.08.2010, 17:51  
ask_e
Прохожий
 
Регистрация: 31.10.2006
Сообщений: 6
Сказал спасибо: 7
Сказали Спасибо 0 раз(а) в 0 сообщении(ях)
ask_e на пути к лучшему
По умолчанию Re: Конфликт прерываний таймера и АЦП

Благодарю всех за советы.

Сообщение от picavr Посмотреть сообщение
Счётчик оргнизовать на 4. За 3 прерывания таймера АЦП будет преобразовывать.
а на 4 раз прочитать... и снова запустить АЦП и загрузить счётчик на 4.
Попробую. Но у меня еще данные АЦП должны анализироваться. Если получится так, что времени не хватит за одно прерывание таймера это сделать? В этом случае наверное нужно будет делать как _guardianangel написал, обрабатывать в основном цикле.

Сообщение от st_1 Посмотреть сообщение
А почему не задействовать для генерации импульсов хардварный ШИМ ?
Не знаю, не пробовал. Что на него прерывания не действуют?
ask_e вне форума  
Непрочитано 07.08.2010, 18:03  
st_1
Заблокирован
 
Регистрация: 26.12.2009
Сообщений: 3,124
Сказал спасибо: 116
Сказали Спасибо 867 раз(а) в 614 сообщении(ях)
st_1 на пути к лучшему
По умолчанию Re: Конфликт прерываний таймера и АЦП

Если не менять параметры ШИМ на лету, то на него ничего не действует.
st_1 вне форума  
Непрочитано 07.08.2010, 19:51  
MasterMushi
Вид на жительство
 
Регистрация: 14.10.2009
Сообщений: 338
Сказал спасибо: 35
Сказали Спасибо 92 раз(а) в 73 сообщении(ях)
MasterMushi на пути к лучшему
По умолчанию Re: Конфликт прерываний таймера и АЦП

Не забывайте что само прерывание очень сильно отбирает процессорное время. Вход и выход кушает драгоценные циклы которых может и не хватить на переход из прерывание в прерывание. Мне как-то подсказали что это порядка 20-40 циклов. Очень помогло вообще отказаться от работы с таймеров при декодинге быстрых сигналов.

Обработку сигналов в прерываниях вообще нельзя делать. Используй прерывания с 1-3 операциями.

Например прерывание Ацп:
Присвоить значение преобразования в переменную и поднять флаг наличия результата. Снять флаг АЦП занят

А в прерывании по таймеру:
Если есть поднятый флаг наличия результата и снят флаг занятости АЦП то остановить таймер, обработать данные, запустить таймер. Иначе, начать преобразование, поднять флаг АЦП занят.

Тоесть, данные будут получаться ТОЛЬКО когда нет входящих необработанных значений.
Соответственно в функции обработки данных нужно предусмотреть предохранительный выход.

Если работа устройства позволяет пропускать такты
__________________
Найди путь или проложи сам!
MasterMushi вне форума  
Сказали "Спасибо" MasterMushi
ask_e (08.08.2010)
Непрочитано 07.08.2010, 21:14  
SasaVitebsk
Гражданин KAZUS.RU
 
Регистрация: 04.08.2006
Сообщений: 911
Сказал спасибо: 28
Сказали Спасибо 180 раз(а) в 139 сообщении(ях)
SasaVitebsk на пути к лучшему
По умолчанию Re: Конфликт прерываний таймера и АЦП

Сообщение от MasterMushi Посмотреть сообщение
Не забывайте что само прерывание очень сильно отбирает процессорное время. Вход и выход кушает драгоценные циклы которых может и не хватить на переход из прерывание в прерывание. Мне как-то подсказали что это порядка 20-40 циклов. Очень помогло вообще отказаться от работы с таймеров при декодинге быстрых сигналов.
На самом деле вход в прерывание 3 такта + ‹4 на завершение прерываемой команды + 1 для сохранения SREG + 1 на разрешение вложенного. Итого 9 при обработке вложенного прерывания на ASM. На Си будет чуть больше, но при грамотном написании тоже иногда используется.
Цитата:
Обработку сигналов в прерываниях вообще нельзя делать. Используй прерывания с 1-3 операциями.
Зачем же так категорично. В программировании можно всё. Просто надо чётко знать что именно ты делаешь. Например делаем выборку с частотой 8 кгц и фильтруем сигнал в прерывании. И что плохого? Если я успеваю - то ничего.
Цитата:
Например прерывание Ацп:
Присвоить значение преобразования в переменную и поднять флаг наличия результата. Снять флаг АЦП занят

А в прерывании по таймеру:
Если есть поднятый флаг наличия результата и снят флаг занятости АЦП то остановить таймер, обработать данные, запустить таймер. Иначе, начать преобразование, поднять флаг АЦП занят.

Тоесть, данные будут получаться ТОЛЬКО когда нет входящих необработанных значений.
Соответственно в функции обработки данных нужно предусмотреть предохранительный выход.

Если работа устройства позволяет пропускать такты
Я ни разу не использовал прерывания от АЦП. И абсолютно согласен с теми, кто предлагает обрабатывать АЦП в прерывании от таймера. Причём я готовность бы вообще не проверял. Я бы считывал гарантированный результат. Это имеет дополнительный смысл - чтение АЦП должно быть регулярным.
SasaVitebsk вне форума  
Сказали "Спасибо" SasaVitebsk
ask_e (08.08.2010)
Непрочитано 07.08.2010, 21:40  
nml
Супер-модератор
 
Аватар для nml
 
Регистрация: 13.03.2004
Адрес: Minsk
Сообщений: 2,378
Сказал спасибо: 1,956
Сказали Спасибо 1,328 раз(а) в 578 сообщении(ях)
nml на пути к лучшему
По умолчанию Re: Конфликт прерываний таймера и АЦП

Сообщение от SasaVitebsk Посмотреть сообщение
На самом деле вход в прерывание 3 такта + ‹4 на завершение прерываемой команды + 1 для сохранения SREG + 1 на разрешение вложенного. Итого 9
Ну, поскольку тут - судя по всему - речь идет об АВРках, то немного не соглашусь. Во первых, вход в прерывание не 3, а 4 такта. И плюс еще два на JMP из векторов на сам обработчик.

Сохранение одного только SREG да еще за один такт - то есть в РОН - возможно только в совсем уж простенькой программе, в общем же случае - как минимум - push R16 ; in R16, sreg ; push R16. а это уже пять тактов. Да и про восстановление забывать не надо - еще пять. Как раз 20 и будет. Другой вопрос, что при 16-ти тактовой это чуть более микросекунды
__________________
[ жизнь приятна и красива, если выпить литр пива ]
nml вне форума  
Сказали "Спасибо" nml
ask_e (08.08.2010)
 

Закладки
Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
"Глюк" AVR таймера от кварца 32768 Гц alexgap Коллекция глюков 23 16.09.2013 07:29
АЦП 12-bit + ATMega32 моделирование в Proteus Flash_vrn Proteus 4 22.05.2010 05:20
Грабли с обработчиками прерываний в AVR _reckless Микроконтроллеры, АЦП, память и т.д 30 11.05.2010 00:36
Проблема с АЦП на PIC16C77 и PIC16F777 SonGoku Микроконтроллеры, АЦП, память и т.д 0 18.01.2010 23:58
Помогите с ЦАП AD7708/AD7718 или их аналогами ST_Senya Микроконтроллеры, АЦП, память и т.д 9 30.11.2009 19:03


Часовой пояс GMT +4, время: 00:38.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot