Перейти к содержанию

Прерывания В Avr. Вопрос По Реальному Устр-Ву.


TWIN

Рекомендуемые сообщения

Для того, чтобы получить правильный ответ, опишу подробно исходные данные...

Устройство - бортовой автомобильный компьютер. Находится в завершающей стадии разработки.

МК - ATmega128, 16МГц. Пишу на Си в IAR...

Раз в пол-секунды происходит прерывание по таймеру, в обработчике этого прерывания устанавливается только флаг, далее, в основной программе:

1. считываются "параллельно" с трех раздельных портов (для увеличения быстродействия) данные с трех датчиков DS18B20, естественно, с запретом прерываний на отдельные команды (ow_reset, read_bit, write_bit). Запрет прерываний выполняю с сохранением вектора прерываний и, разрешая их вновь, указываю сохраненный вектор (si = __save_interrupt(); __disable_interrupt(); ......... __restore_interrupt(si); )

2. считываются данные с DS1307 посредством обращения к аппаратному интерфейсу МК TWI. Явно нигде прерывания не запрещаю.

3. произвожу последовательно три ADC-преобразования, тоже нигде явно не запрещая прерывания.

Так вот, вопрос: также необходимо реализовать в устройстве цифровой одометр. Сигнал от датчика скорости подаю на INT2 меги (выводы INT0,INT1 заняты - на них висит аппаратный TWI). Срабатываем внешнее прерывание по нарастающему фронту, прерывание INT2 в моем устройстве будет как я понимаю с самым высоким приоритетом (судя по описанию прерываний из даташита).

Теперь прошу помощи - объясните мне пожалуйста не будет ли "пропусков" в инкриментировании счетчика срабатывания INT2? Поскольку сигнал теоретически (и, уверен, практически) будет приходить и во время явно указанных запретов прерываний(1wire), и при работе с TWI и во время преобразований ADC...

А так же еще интересует вопрос - возможно, лучше запрещать прерывания не на время чтения\записи одного бита по 1wire, а на время чтения\записи всего байта?

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

В AVR нет приоритета у irq, это его минус, так что если вы запретите его, то его не будет. Однако, флаг останется и при разрешении прерываний вы попадете в обработчик.

Что такого в 1-wire, что прерывания нужно стопать?

Ссылка на комментарий
Поделиться на другие сайты

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

А если за время запрета прерываний произойдет, например 2, или 3 прерывания INT2? Обработчик вызовется соотв. число раз?

В 1-wire есть строгие тайминги, в которые нужно попадать... Капризненький протокол обмена :) Ну и, представьте, происходит например отсылка байта (последовательно передаются 8 бит) и МК периодически "отвлекается" на прерывания в этот момент...

Вот тут прикинул частоту следования импульсов от датчика при скорости... скажем, 120 км/ч

Датчик выдает 6000 имп на 1км пройденного пути.

Значит, за одну минуту проедем 2км и получим 12000 импульсов.

Т.е. 200 импульсов в секунду, соответственно частота следования импульсов 0,005с (5кГц)

Ссылка на комментарий
Поделиться на другие сайты

Организация питания на основе надежных литиевых аккумуляторов EVE и микросхем азиатского производства

Качественное и безопасное устройство, работающее от аккумулятора, должно учитывать его физические и химические свойства, профили заряда и разряда, их изменение во времени и под влиянием различных условий, таких как температура и ток нагрузки. Мы расскажем о литий-ионных аккумуляторных батареях EVE и нескольких решениях от различных китайских компаний, рекомендуемых для разработок приложений с использованием этих АКБ. Представленные в статье китайские аналоги помогут заменить продукцию западных брендов с оптимизацией цены без потери качества. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Вот я, когда собирал бортовик, не смог придумать ничего кроме как воткнуть 2 меги: 1 работает переферией(температура, adc, ds1307) а вторая чисто на прерываниях(декодирование комманд пульта ду, скорости, оборотов).

Ссылка на комментарий
Поделиться на другие сайты

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

последовательно передаются 8 бит

Порадовали:)

После того как вы записали в UDR больше ничего ждать не надо. Запись в регистр выполняется за один такт... Это при условии что у вас функция отправки не блокирующая. Если мне не изменяет память то 1-wire требует тайминги миллисекундные, но я могу ошибаться.

Я более чем уверен что у вас получится реализовать все на одном камне.

от датчика при скорости

Вы уже что-то предприняли по устранению дребезга контактов?

Ссылка на комментарий
Поделиться на другие сайты

Литиевые аккумуляторы EVE Energy и решения для управления перезаряжаемыми источниками тока (материалы вебинара)

Опубликованы материалы вебинара Компэл, посвященного литиевым аккумуляторам EVE Energy и решениям для управления перезаряжаемыми источниками тока.

На вебинаре мы представили информацию не только по линейкам аккумуляторной продукции EVE, но и по решениям для управления ею, что поможет рассмотреть эти ХИТ в качестве дополнительной альтернативы для уже выпускающихся изделий. Также рассмотрели нюансы работы с производителем и сервисы, предоставляемые Компэл по данной продукции. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

UDR? Если честно, не понял о чем Вы... С USART (если это имелось ввиду) я не работаю...

1-wire реализован программно - "дергаю" пином в соответствии со стандартами протокола...

Тайминги при передаче/приеме инфы микросекундные, но вот "стартовая" команда PRESENCE - она длится 550 мкс (при запрещенных прерываниях).

По поводу устранения дребезга контактов. Ничего не предпринимал - надеялся на то, что внешнее прерывание сработает только один раз при нарастании фронта импульса. Ошибаюсь? :(

Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

А кто мешает 1-wire так же "прозрачно" по таймеру реализовать? Всего-то в обработчике будет сдвинуть байт и послать нужный бит. Ну, считать ещё эти биты надо ) А одометр свой аналогично считайте обработчиком внешнего прерывания, в котором только инкрементация некоторой переменной (для увеличения быстродействия желательно явно прописать на асме регистр из первых 32-х, а то он норовит во "внешнюю" RAM пихнуть). И никаких прерываний запрещать не надо. Главная пиранья в этом озере - короткий аппаратный стек. Если из одного прерывания вызовется другое, а до этого функция выполнялась, да ещё вызванная из другой - может случится полный алес, да так, что без джитага не поймать.

Демократия лишь укрепляет наш родной крепостнический строй! (с)

Ссылка на комментарий
Поделиться на другие сайты

не будет ли "пропусков" в инкриментировании счетчика срабатывания INT2? Поскольку сигнал теоретически (и, уверен, практически) будет приходить и во время явно указанных запретов прерываний(1wire), и при работе с TWI и во время преобразований ADC...

А так же еще интересует вопрос - возможно, лучше запрещать прерывания не на время чтения\записи одного бита по 1wire, а на время чтения\записи всего байта?

Советую вам почитать доступное, краткое и толковое описание "Прерывания в AVR механизм работы" http://tinyurl.com/ykg3flh - там как раз пример с несколькими INTx рассматривается.

AVR не запоминает сколько раз случилось не обработаное прерывание. Главное делать код в обработчиках прерываний как можно лаконичней и быстрей по исполнению.

Ссылка на комментарий
Поделиться на другие сайты

Я больше скажу, не бывает вообще "бесприоритетной" системы прерываний )) На чисто физическом уровне нереально это. Хотя бы в случае прихода двух прерываний на одном такте. По крайней мере в машинах с последовательным исполнением команд )

Изменено пользователем ProniX

Демократия лишь укрепляет наш родной крепостнический строй! (с)

Ссылка на комментарий
Поделиться на другие сайты

А если все-таки по теме? Про приоритет прерываний я то в курсе...

Я так понимаю, самое проблемное в моём случае - это решить вопрос с запрещением прерываний во время "задержек" (таймингов) протокола 1-wire? В принципе, конечно можно заморочиться делать эти задержки через прерывания по таймеру...

Тогда отклонения в таймингах (из-за вызова по внешнему прерыванию) от необходимых будет совсем небольшим (но, теоретически возможны).

Мысль такая: просто сделать таймер, например, на 2us и запускать его в необходимые моменты. Этим таймером инкриментировать переменную-счетчик, сравнивая в функции (в которй нужно сделать задержку) с необходимым значением нужной в данный момент задержки.

Например:

unsigned int counter=0;
f()
{
 1. нужна заержка 500us
 2. запускаем счетчик с переполнением в 2us
 while(counter<250) {}   // Ничего не делаем, пока не пройдет 500us (250x2us)
 counter = 0;
 3. останавливаем таймер.
 4. делаем то, что необходимо после задержки (читаем состояние пина и пр...)
}

timer_interrupt()  // обработчик прерывания по переполнению таймера (2us)
{
 counter++;
}

Как Вам такое решение? 2us - это минимальный интервал (тайминг) для обмена протокола 1-wire...

И еще... При тактовой частоте меги 16МГц - 2us это 32 тика. Будут ли какие-то поправки или мысли связанные с этим моментом?

Изменено пользователем TWIN
Ссылка на комментарий
Поделиться на другие сайты

Была у меня подобная ситуация. Нужно было управлять в реальном времени очень быстрым изделием, с жёсткими требованиями на скорость реагирования, и одновременно измерять температуру. 

Никак не мог я разрулить ситуацию. Добавлю интеллекта в программу - она(программа)не умещается в доступный объём. Делаю попроще, время от времени не укладываюсь в указанные выше жесткие временные рамки.

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

Пока ты жив, надежда есть.

Ссылка на комментарий
Поделиться на другие сайты

...Вот тут прикинул частоту следования импульсов от датчика при скорости... скажем, 120 км/ч

Датчик выдает 6000 имп на 1км пройденного пути.

Значит, за одну минуту проедем 2км и получим 12000 импульсов.

Т.е. 200 импульсов в секунду, соответственно частота следования импульсов 0,005с (5кГц)

Здравствуйте. Зачеркнутое, видимо, было написано впопыхах.

Ссылка на комментарий
Поделиться на другие сайты

И все-таки, никто не отписался по поводу идеи делать тайминги 1-wire через таймеры? Думаю, если произойдет одно или несколько внешних прерываний (в теле которых будет только инкремент) во время временной задержки 1-wire не повлечет ощутимого отклонения.

Как думаете?

Ссылка на комментарий
Поделиться на другие сайты

мое мнение - получиться тоже самое: обьясню почему: реализовав на таймерах задержку вы может и получите реально работающий алгоритм - но так как программу будет необходимо и далее усложнять - а это может повлечь в новых работах с таймером. и вот в тот момент вся работа мк упадел с 1проводом. опять таки чисто мое мнение.

Ссылка на комментарий
Поделиться на другие сайты

В программе задействован сейчас только один таймер по переполнению - для обновления информации с датчиков. Еще один таймер будет использован в режиме ШИМ для регулировки подсветки LCD. Т.е. 2 уже железно "заняты" и третий таймер для реализации задержек 1-wire. Остается еще один свободный... Пока планов по его использованию нет... Но, в принципе, можно использовать для рассчета скорости движения, хотя планов делать электронный спидометр нету...

Ссылка на комментарий
Поделиться на другие сайты

Кстати, а кто-нибудь знает как реализована в IAR задержка __delay_cycles?

В чем, собственно, мысль - если эта функция сравнивает задержку именно с внутренним счетчиком тактов процессора, то нет необходимости делать задержки через таймеры... :)

Изменено пользователем TWIN
Ссылка на комментарий
Поделиться на другие сайты

Ответов нету...

Может я задаю просто глупые вопросы? Или сложные?

Видимо, придется реализацию строить по методу проб и ошибок...

Что ж, начну просто с __delay_cycles, без запрета прерываний. Посмотрю на результат. Жаль только что до установки девайса на автомобиль еще далековато - нескоро испытания <_<

Ссылка на комментарий
Поделиться на другие сайты

Xt там есть такой счетчик ??? сумлеваюсь.

Сейчас врядли найду, но когда-то вычитывая даташит что-то подобное отложилось в памяти.

А как Вы думаете реализовано прерывание по переполнению? Это же не подпрограмма какая-то в МК по подсчету тиков. Иначе, логично было бы предположить, что какое-то время (такты) отъедалось бы на ее исполнение ;)

Изменено пользователем TWIN
Ссылка на комментарий
Поделиться на другие сайты

Вы както догадками пытаетесь понять устройство AVR.

Я вам советую почитать на русском языке устройство микроконтроллера AVR и русский даташит, пусть ан мега128 но принцыпы одинаковы - http://www.google.ru/search?hl=ru&newwindow=1&q=%22%D0%A0%D1%83%D1%81%D1%81%D0%BA%D0%B8%D0%B9+%D0%B4%D0%B0%D1%82%D0%B0%D1%88%D0%B8%D1%82+ATmega128%22&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=&aq=f&oq=

Ссылка на комментарий
Поделиться на другие сайты

Да читал я... Давно уже на винте... Ну, про таймеры счетчики, допустим загнул я... Ну, естественно, что отдельные модули (устройства) микроконтроллера, с использованием общего тактирования...

Кстати, в ДШ упомянут несколько раз программный счетчик, о котором ничего подробно, он 16-битный. Но, как я понял он используется для адресации внутри программы МК. Т.е. не то...

Да, и еще... Я вообще-то именно на АТмеге 128 девайс и собираю - в начале темы сказано ;)

Изменено пользователем TWIN
Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...