GalatZ Опубликовано 23 апреля, 2017 Поделиться Опубликовано 23 апреля, 2017 Вектор точно тот, который нужен, PCINT2 прерывание по уровню группы PCINT23..16, короче, порта D. Как я понял, прерывание PCINT возникает при любом изменении лог уровня на выбранных пинах. так оно ? Пока что сделал так: Обработчик: ISR (PCINT2_vect) { SMCR &=~(1<<SE); PCMSK2 =0x00; PCICR &=~(1<<PCIE2); } if (timersleep > 0x12C) { VFD_clear(); VFD_write("SLEEP", 0x1B); SMCR |=(1<<SE); PCMSK2 |=(1<<PCINT23)|(1<<PCINT22)|(1<<PCINT21)|(1<<PCINT20); PCICR |=(1<<PCIE2); asm("sleep"); timersleep=0x00; } Непосредственно перед переходом в сон, указываю, какие пины могут вызвать прерывание, затем разрешаю прерывание PCINT. А в обработчике сначала "выключаю" прерывание от ранее заданных пинов, затем запрет прерывания PCINT. И как оказалось, работает. Думал почему так, а не иначе, если не затруднит, объясните про это: 45 минут назад, Alexeyslav сказал: Кстати, а прерывание установлено на фронты или на УРОВЕНЬ? Если установить на уровень - то прерывание будет вызываться постоянно пока удерживается уровень на порту. Как я понял, это относится к прерываниям INT0 INT1 , по спадающему/нарастающему фронту либо по низкому уровню. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 23 апреля, 2017 Поделиться Опубликовано 23 апреля, 2017 Это актуально и для прерывания PCINT. Скорей всего они у тебя настроены по уровню, отладка в железе через тестовый пин это бы подтвердила. Единственная разница в функциональности PCINT - не различаются фронт/спад прерывание по фронту реагирует как на переход 1-0 так и 0-1 а для INT0/1 можно выбрать на что реагировать - передний или задний фронт импульса. У PCINT более простая схема детектора состояния - простой XOR между актуальным значением и значением на предыдущем такте, а схема INT0/1 использует триггеры ловя импульсы даже короче периода тактовых импульсов. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
GalatZ Опубликовано 23 апреля, 2017 Поделиться Опубликовано 23 апреля, 2017 Вот поэтому и решил использовать PCINT, так как реагируют на любой переход. сейчас еще перечитаю внимательней, но я никак не нашел регистра, в котором устанавливается как им реагировать, по уровню или по изменению уровня. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Особенности хранения литиевых аккумуляторов и батареекПотеря емкости аккумулятора напрямую зависит от условий хранения и эксплуатации. При неправильном хранении даже самый лучший литиевый источник тока с превосходными характеристиками может не оправдать ожиданий. Технология, основанная на рекомендациях таких известных производителей литиевых источников тока, как компании FANSO и EVE Energy, поможет организовать правильный процесс хранения батареек и аккумуляторов. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Alexeyslav Опубликовано 23 апреля, 2017 Поделиться Опубликовано 23 апреля, 2017 Странно, INT0/1 тоже настраиваются на любой перепад. таб.12-1 и 12-2 в даташите. хммм, PCINT и правда не реагирует на уровни, только на изменения. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
Секреты депассивации литиевых батареек FANSO EVE EnergyСамыми лучшими параметрами по энергоемкости, сроку хранения, температурному диапазону и номинальному напряжению обладают батарейки литий-тионилхлоридной электрохимической системы. Но при длительном хранении происходит процесс пассивации. Разберем в чем плюсы и минусы, как можно ее избежать или уменьшить последствия и как проводить депассивацию батареек на примере продукции и рекомендаций компании FANSO EVE Energy. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
GalatZ Опубликовано 23 апреля, 2017 Поделиться Опубликовано 23 апреля, 2017 Да, INT1/0 4 настройки А PCINT только вкл. или выкл., ну и пины, на которых ловить изменения настраиваются. Еще примеров чужих не нашел, с применением PCINT, все делают INT0/1, и в обработчике отключают. Пока оставлю так, раз работает. У меня в программе так же есть прерывание по переполнению, и там происходит опрос энкодеров, энкодеры эти подключены к пинам, с которых щупается прерывание PCINT(то есть энкодер крутанул - мк из сна вышел), м.б. не поладили между собой 2 прерывания или дребезг контактов энкодера, хрен поймешь в общем. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 23 апреля, 2017 Поделиться Опубликовано 23 апреля, 2017 Прерывания не могут "не ладить", они имеют приоритет. Что-то Вы слишком перестраховываетесь. В обработчике и сон отключаете, и маску разрешения прерываний отключаете, и группу "гасите", т.е. "закрываетесь на все запоры и задвижки" сразу. А не хотите попробовать отключить группу выводов, на которых разрешено прерывание, оставив при этом и сон, и маску выводов без изменений. И сделать это сразу за командой sleep (перед обнулением таймера сна). В самом же обработчике не делать ничего ВООБЩЕ, только возврат (reti). 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
GalatZ Опубликовано 23 апреля, 2017 Поделиться Опубликовано 23 апреля, 2017 Вы правы, это уже мои "выдумки" от недостатка знаний. Сон можно и не в обработчике, а вот отключать прерывания пробовал сразу за командой "sleep" и почему-то то это тоже вызывало нестабильную работу, прерывание вызывалось тогда, когда не надо, но еще надо проверить. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Геннадий Опубликовано 23 апреля, 2017 Поделиться Опубликовано 23 апреля, 2017 А Вам обязательно сон выключать? Не помешает очистить регистр флагов прерывания. Настройки сна на работу влиять не должны, как и установленная маска прерываний по выводам группы (при отключенной группе полностью). 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
GalatZ Опубликовано 23 апреля, 2017 Поделиться Опубликовано 23 апреля, 2017 Это так сказать для надежности, но получается, можно его и не отключать, по прерыванию мк из сна вышел, и до появления "sleep" спать не должен. Так понимаю, говорим об этом регистре: Очистить регистр уже после обработчика ? вот, в даташите написано, флаг очищается когда прерывание выполнилось (или выполняется?), кроме того, флаг может быть очищен записью в него "1". После выполнения, для очистки флагов писать туда 1 или 0 таки? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 23 апреля, 2017 Поделиться Опубликовано 23 апреля, 2017 1 писать. Да и вообще это не нужно, флаг сам сбросится как только будет вызван обработчик и единственная причина по которой флаг там останется при разрешенных прерываниях - событие возникло во время обработки прерывания, но программа уже ничего с этим не сможет сделать - после выхода из обработчика он выполнится вновь, и до тех пор пока флаг не будет сброшен или запрещены прерывания(между прерываниями контроллер успевает исполнить одну инструкцию программы, поэтому у программы прекратить безобразие есть шанс но небольшой). 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
MillyVolt2 Опубликовано 1 мая, 2017 Поделиться Опубликовано 1 мая, 2017 С праздником!!Подскажите, как объявить указатель на 2-мерный массив 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
COKPOWEHEU Опубликовано 1 мая, 2017 Поделиться Опубликовано 1 мая, 2017 а чем он отличается от любого другого указателя? 0 Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз. Часть моих наработок. Ссылка на комментарий Поделиться на другие сайты Поделиться
MillyVolt2 Опубликовано 2 мая, 2017 Поделиться Опубликовано 2 мая, 2017 Объявлением)Студия ругалась предупреждением на вызов функции с именем 2-мерного массива в качестве аргумента при формальном параметре - указателе на char. Функция перебирает весь массив, в итоге обращался к массиву в виде array(i)[j], через указатели более замороченно. Квадратные скобки не поставить где индекс i, поэтому круглые 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Sergey-Ufa Опубликовано 2 мая, 2017 Поделиться Опубликовано 2 мая, 2017 (изменено) unsigned char *Arr[5][5]; ................................ void FuncArr(unsigned char Array[][]) { Array[3][2]=10; }; ............................... FuncArr(Arr); Изменено 2 мая, 2017 пользователем Sergey-Ufa 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
MillyVolt2 Опубликовано 2 мая, 2017 Поделиться Опубликовано 2 мая, 2017 Так и сделал, только объявлять здесь массив через указатель смысла нет, потому что указатель не используется, а идёт обращение к элементам массива. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
MillyVolt2 Опубликовано 2 мая, 2017 Поделиться Опубликовано 2 мая, 2017 unsigned char *Arr[5][5]; Или unsigned char (*parray)[5];? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Sergey-Ufa Опубликовано 2 мая, 2017 Поделиться Опубликовано 2 мая, 2017 3 часа назад, MillyVolt2 сказал: указатель не используется, а идёт обращение к элементам массива Тогда так unsigned char Arr[5][5]; ................................ void FuncArr(unsigned char Array[5][5]) { Array[0][2]=10; }; ............................... FuncArr(Arr); Arr[1][3]=23; 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
MillyVolt2 Опубликовано 2 мая, 2017 Поделиться Опубликовано 2 мая, 2017 Да, так и сделал, т е работа с обычным массивом, без указателей. Теперь курю, есть у Дихалта, как работать с массивами во флеше. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
LexSancho Опубликовано 11 мая, 2017 Поделиться Опубликовано 11 мая, 2017 (изменено) есть задача, нужно запускать преобразование ацп по время открытия ключа (ключ управляется шим сигналом, частота около 8 кГц). контроллер тактируется 16 МГц, делитель таймера 1/8. т.о. получается, что период счета таймера 125 мкс, а один тик таймера примерно 0.5 мкс. ацп нужно запускать перед тем, как ключ шим закроется, например если в регистр сравнения таймера записано 127 (что соответствует скважности ~0.5), нужно получить значение напряжения на входе ацп, примерно в момент, когда таймер шим досчитал до 126. мне в голову приходило только в прерывании по второму каналу сравнения того же таймера запускать преобразование, а прерывание настроить на значение 127 минус время первого преобразования ацп пересчитанное на тики таймера. но при таком подходе во первых приходится частоту ацп задирать до 8 МГц ( а в даташите рекомендуется около 200 кГц) во вторых при значении регистра шим например 1 или 2 ацп уже не успевает выполнить преобразование во время импульса шим. подскажите, как это грамотно реализовать. какую частоту тактирования ацп настроить и когда (по какому событию/с помощью чего запускать ) преобразование ацп? Изменено 11 мая, 2017 пользователем LexSancho 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 11 мая, 2017 Поделиться Опубликовано 11 мая, 2017 (изменено) А что за процессор-то? 1 час назад, LexSancho сказал: 127 минус время первого преобразования ацп Обычно АЦП непрерывно мониторит напряжение на входе, при запуске преобразования отключается от входа и использует сохранённое аналоговое значение для пребразования. Преобразовывать может долго, при этом на входе напряжение изменится, но это не волнует, т.к. вход отключён от АЦП. Если в Вашем процессоре так, то стартуйте при 126, и пусть АЦП хоть 100 тиков затратит на преобразование. Изменено 11 мая, 2017 пользователем Yurkin2015 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
LexSancho Опубликовано 11 мая, 2017 Поделиться Опубликовано 11 мая, 2017 (изменено) 1 час назад, Yurkin2015 сказал: А что за процессор-то? мега328 интересно! только что прочитал в даташите The ADC contains a Sample and Hold circuit which ensures that the input voltage to the ADC is held at a constant level during conversion. A block diagram of the ADC is shown in Figure 23-1 on page 251. получается после записи единицы в adsc он сразу запоминает напряжение на входе ацп или этот процесс все таки занимает какое то время? уже разобрался, нужно было дочитать дальше The actual sample-and-hold takes place 1.5 ADC clock cycles after the start of a normal conversion and 13.5 ADC clock cycles after the start of an first conversion спасибо за наводку! Изменено 11 мая, 2017 пользователем LexSancho 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 11 мая, 2017 Поделиться Опубликовано 11 мая, 2017 (изменено) На входе стоит внутренний конденсатор, при старте АЦП вход отключается от конденсатора, и используется напряжение этого конденсатора, т.е. то последнее напряжение, которое было в момент старта. Изменено 11 мая, 2017 пользователем Yurkin2015 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alexeyslav Опубликовано 11 мая, 2017 Поделиться Опубликовано 11 мая, 2017 Надо смотреть циклограмму в даташите, там используется УВХ. Первый такт АЦП уходит на переключение мультиплексора(даже если он там же остался), второй такт работает УВХ, поэтому в даташите указано "минимум 1.5 ADC clock". С УВХ ещё интересное дело, если вам надо чтобы значение запомнилось БЫСТРО то выходное сопротивление источника напряжения ДОЛЖНО быть достаточно низким где-то это тоже было упомянуто толи в даташите толи в апликейшене. В принципе, можно использовать внешний УВХ с требуемыми характеристиками вплоть до времени "запоминания" в 100нс. Но врятли без подготовки у вас получится лучше чем то что уже встроено. 0 Учение - изучение правил. Опыт - изучение исключений. Ссылка на комментарий Поделиться на другие сайты Поделиться
my504 Опубликовано 12 мая, 2017 Поделиться Опубликовано 12 мая, 2017 16 часов назад, Alexeyslav сказал: В принципе, можно использовать внешний УВХ с требуемыми характеристиками вплоть до времени "запоминания" в 100нс Бессмысленно. Как такового отдельного УВХ у современных SAR ADC нет. Происходит заряд собственно емкости ЦАПа. ЦАП из себя представляет набор конденсаторов, которые дробят исходный заряд с помощью ключей, реализуя алгоритм последовательных приближений. То есть внешний УВХ по любому должен перебросить свой заряд в резидентный АЦП. 0 戦う前に相手のベルトの色に注目 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 12 мая, 2017 Поделиться Опубликовано 12 мая, 2017 18 часов назад, Alexeyslav сказал: "минимум 1.5 ADC clock" Точно, посмотрел сейчас на описание этого Atmega328. Получается, что этот входной конденсатор АЦП отключается по-любому только через 1.5 такта после старта АЦП, а не сразу. То есть при 200кГц частоты тактирования АЦП имеем 7.5мкс задержку плюс ещё 2.5мкс в среднем на несинхронность момента установки старта и фронта тактовых сигналов. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.