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

Вопросы от начинающих по МК


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

Вектор точно тот, который нужен, 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 , по спадающему/нарастающему фронту либо по низкому уровню.

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

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

  • Ответов
  • Создана
  • Последний ответ

Топ авторов темы

Это актуально и для прерывания PCINT. Скорей всего они у тебя настроены по уровню, отладка в железе через тестовый пин это бы подтвердила. Единственная разница в функциональности PCINT - не различаются фронт/спад прерывание по фронту реагирует как на переход 1-0 так и 0-1 а для INT0/1 можно выбрать на что реагировать - передний или задний фронт импульса.

У PCINT более простая схема детектора состояния - простой XOR между актуальным значением и значением на предыдущем такте, а схема INT0/1 использует триггеры ловя импульсы даже короче периода тактовых импульсов.

Учение - изучение правил. Опыт - изучение исключений.

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

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

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

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

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

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

Вот поэтому и решил использовать PCINT, так как реагируют на любой переход.

сейчас еще перечитаю внимательней, но я никак не нашел регистра, в котором устанавливается как им реагировать, по уровню или по изменению уровня.

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

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

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

Странно, INT0/1 тоже настраиваются на любой перепад. таб.12-1 и 12-2 в даташите.

хммм, PCINT и правда не реагирует на уровни, только на изменения.

Учение - изучение правил. Опыт - изучение исключений.

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

Да, INT1/0 4 настройки

58fca6fb2e948_.jpg.a82149dced6bc1ff941c446477691713.jpg

А PCINT только вкл. или выкл., ну и пины, на которых ловить изменения настраиваются.

Еще примеров чужих не нашел, с применением PCINT, все делают INT0/1, и в обработчике отключают.

Пока оставлю так, раз работает.

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

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

Прерывания не могут "не ладить", они имеют приоритет.

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

А не хотите попробовать отключить группу выводов, на которых разрешено прерывание, оставив при этом и сон, и маску выводов без изменений. И сделать это сразу за командой sleep (перед обнулением таймера сна). В самом же обработчике не делать ничего ВООБЩЕ, только возврат (reti).

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

Вы правы, это уже мои "выдумки" от недостатка знаний.

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

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

А Вам обязательно сон выключать?

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

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

Это так сказать для надежности, но получается, можно его и не отключать, по прерыванию мк из сна вышел, и до появления "sleep" спать не должен.

Так понимаю, говорим об этом регистре:

58fcea7f2ef35_2.thumb.jpg.b1a705e96ea5f2889e13b4f197253986.jpg

Очистить регистр уже после обработчика ?

вот, в даташите написано, флаг очищается когда прерывание выполнилось (или выполняется?), кроме того, флаг может быть очищен записью в него "1".

После выполнения, для очистки флагов писать туда 1 или 0 таки?

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

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

Учение - изучение правил. Опыт - изучение исключений.

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

а чем он отличается от любого другого указателя?

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

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

Объявлением)

Студия ругалась предупреждением на вызов функции с именем 2-мерного массива в качестве аргумента при формальном параметре - указателе на char.

Функция перебирает весь массив, в итоге обращался к массиву в виде array(i)[j], через указатели более замороченно.

 Квадратные скобки не поставить где индекс i, поэтому круглые

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

unsigned char *Arr[5][5];

................................
void FuncArr(unsigned char Array[][])
 {
  Array[3][2]=10;
 };

...............................

FuncArr(Arr);

 

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

Так и сделал, только объявлять здесь массив через указатель смысла нет, потому что указатель не используется, а идёт обращение к элементам массива.

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

3 часа назад, MillyVolt2 сказал:

указатель не используется, а идёт обращение к элементам массива

Тогда так

unsigned char Arr[5][5];

................................

void FuncArr(unsigned char Array[5][5])

 { Array[0][2]=10;

};

...............................

FuncArr(Arr);

Arr[1][3]=23; 
Ссылка на комментарий
Поделиться на другие сайты

  • 2 недели спустя...

есть задача, нужно запускать преобразование ацп по время открытия ключа (ключ управляется шим сигналом, частота около 8 кГц). контроллер тактируется 16 МГц, делитель таймера 1/8. т.о. получается, что период счета таймера 125 мкс, а один тик таймера примерно 0.5 мкс.

ацп нужно запускать перед тем, как ключ шим закроется, например если в регистр сравнения таймера записано 127 (что соответствует скважности ~0.5), нужно получить значение напряжения на входе ацп, примерно в момент, когда таймер шим досчитал до 126.

мне в голову приходило только в прерывании по второму каналу сравнения того же таймера запускать преобразование, а прерывание настроить на значение 127 минус время первого преобразования ацп пересчитанное на тики таймера. но при таком подходе во первых приходится частоту ацп задирать до 8 МГц ( а в даташите рекомендуется около 200 кГц) во вторых при значении регистра шим например 1 или 2 ацп уже не успевает выполнить преобразование во время импульса шим.

подскажите, как это грамотно реализовать. какую частоту тактирования ацп настроить и когда (по какому событию/с помощью чего запускать ) преобразование ацп?

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

А что за процессор-то?

1 час назад, LexSancho сказал:

127 минус время первого преобразования ацп

Обычно АЦП непрерывно мониторит напряжение на входе, при запуске преобразования отключается от входа и использует сохранённое аналоговое значение для пребразования. Преобразовывать может долго, при этом на входе напряжение изменится, но это не волнует, т.к. вход отключён от АЦП.

Если в Вашем процессоре так, то стартуйте при 126, и пусть АЦП хоть 100 тиков затратит на преобразование.

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

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

спасибо за наводку!

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

На входе стоит внутренний конденсатор, при старте АЦП вход отключается от конденсатора, и используется напряжение этого конденсатора, т.е. то последнее напряжение, которое было в момент старта.

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

Надо смотреть циклограмму в даташите, там используется УВХ. Первый такт АЦП уходит на переключение мультиплексора(даже если он там же остался), второй такт работает УВХ, поэтому в даташите указано "минимум 1.5 ADC clock". С УВХ ещё интересное дело, если вам надо чтобы значение запомнилось БЫСТРО то выходное сопротивление источника напряжения ДОЛЖНО быть достаточно низким где-то это тоже было упомянуто толи в даташите толи в апликейшене. В принципе, можно использовать внешний УВХ с требуемыми характеристиками вплоть до времени "запоминания" в 100нс. Но врятли без подготовки у вас получится лучше чем то что уже встроено.

Учение - изучение правил. Опыт - изучение исключений.

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

16 часов назад, Alexeyslav сказал:

В принципе, можно использовать внешний УВХ с требуемыми характеристиками вплоть до времени "запоминания" в 100нс

Бессмысленно. Как такового отдельного УВХ у современных SAR ADC нет. Происходит заряд  собственно емкости ЦАПа. ЦАП из себя представляет набор конденсаторов, которые дробят исходный заряд с помощью ключей, реализуя алгоритм последовательных приближений.

То есть внешний УВХ по любому должен перебросить свой заряд в резидентный АЦП.

戦う前に相手のベルトの色に注目

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

18 часов назад, Alexeyslav сказал:

"минимум 1.5 ADC clock"

Точно, посмотрел сейчас на описание этого Atmega328. Получается, что этот входной конденсатор АЦП отключается по-любому только через 1.5 такта после старта АЦП, а не сразу. То есть при 200кГц частоты тактирования АЦП имеем 7.5мкс задержку плюс ещё 2.5мкс в среднем на несинхронность момента установки старта и фронта тактовых сигналов.

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...