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

Реализация многозадачности на Atmega8


Андрей Немцов

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

Имеется некоторая функция в бесконечном цикле, отслеживающая температуру с датчика и включающая и отключающая реле при определённых условиях.

Как можно реализовать, чтобы по нажатию кнопки производился выход с данной функции и вызывалась функция по работе и обработке команд с кнопок, а затем по окончанию работы с меню через некоторое время работа функции с датчиком снова продолжалась?

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

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

Можно подключить кнопку к INT0 или INT1 и настроить прерывание.

При срабатывании прерывания ставите флаг, который в цикле переключит действие.

А по окончании меню сбрасываете флаг.

 

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

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

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

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

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

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

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

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

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

То есть что то типа

#define STEP_TEMP 0
#define STEP_MENU 1
...

uint8_t step = STEP_TEMP;

ISR (INT0_vect)
{
	step = STEP_MENU;
}

int main (void) {
	...

	while (1) {
		switch (step) {
			case STEP_TEMP:
				// код обработки температуры
				break;
			case STEP_MENU:
				// работа с меню
				break;
		}
	}

	return 0;
}

 

в конце работы с меню опять 

step = STEP_TEMP;

 

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

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

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

Только что, Андрей Немцов сказал:

, и просто так из него не выйти

while (1) {
	if (что то) {
		// не основной код
	} else {
		// основной код
	}
}

что мешает вместо "что то" поставить проверку нажатия кнопки если не хотите прерывания например

21 минуту назад, Андрей Немцов сказал:

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

Запускаете таймер, например на 5 сек, если в течении 5 сек проводится работа с меню, то таймер сбрасываете. То есть нажали кнопку - таймер обнулили и сделали что там от кнопки зависит. Нажали еще раз, опять обнулили.

Если в течении 5 минут не нажималась кнопка, то прерывание сработает по переполнению, и в нем делаем обратно

step = STEP_TEMP;

 

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

4 часа назад, Андрей Немцов сказал:

вызывалась функция ...... а затем по окончанию работы с меню через некоторое время работа функции с датчиком снова продолжалась

И где тут многозадачность ? Обычный вызов функции, по окончании которой управление отдаётся обратно.

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

Ещё один вопрос если можно. Я получаю некоторое число раз в 5 секунд. Как можно выводить данное число на семисегментный индикатор? Везде в интернете таймеры используются и обычные счётчики для вывода чисел например от 0 до 99, а мне нужно выводить (одно- двухзначное число) конкретное полученное с другой функции.

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

Вопросы какие-то некорректные. Что значит "как ?". Очевидно - написать программу, которая будет это делать.
Примеров с дн. индикацией в нэте - пруд пруди...

Конкретизируйте свои вопросы.

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

Алекс, я не смог найти пример динамичной индикации где выводится число полученное из другой функции. везде простые счётчики

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

Алекс вы меня конечно извините но вы наверное слепой. Если б я мог вывести число то я бы и заданное число смог вывести. Везде приводится вывод в виде секундамера. Я НЕ смог найти образец где выводится просто одно число какое либо. Так достаточно понятно для вас?

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

35 минут назад, Андрей Немцов сказал:

число на семисегментный индикатор

Светодиод зажигать умеете?

Так вот индикатор это всего лишь кучка светодиодов. Чаще всего 1 общая ножка для одного индикатора. Либо "питание" либо "ноль" подаете на нее, а на остальные 7. То есть либо общий анод либо катод.

Что бы вывести число, нужно зажечь просто нужные вам светодиоды.

Либо подключаете как светодиоды через резистор к портам мк, я обычно для этого использую 74hc595 или 74hc164 что бы не сжечь ножки мк грешным делом да и ног мк нужно тогда всего 3.

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

Вы можете создать массив

uint8_t data = { ... };

Где ключ 0 - будет задавать биты которые надо выставить что бы загорелись светодиоды отрисовывающие 0. Это будут 6 светодиодов.

В ключе 1 будут биты что бы загорелись 2 светодиода, для подсвечивания единицы.

И т.д.

Какие биты выставить зависит от того как вы подключили, к каким ножкам.

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

Алгоритм примерно такой:

Допустим у вас общий вывод "0".

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

Дальше зависит от того прямое подключение к мк, через hc164 или hc595. То есть либо все повторяем сначала, либо можно вначале влить в hc595 данные потом переключить.

Вообщем чередуем вывод цифр на разные индикаторы, глазом это заметно не будет если это сделано с достаточной частотой.

Схем в интернете 10050 и описаний и примеров кода.

Только что, DrobyshevAlex сказал:

Вы можете создать массив

Ах да, не договорил)

Потом просто что бы вывести 0 на индикатор, шлете данные в hc595 или в порт мк просто

data[0] // для 0
data[1] // для 1
...

 

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

59 минут назад, Андрей Немцов сказал:

Если б я мог вывести число то я бы и заданное число смог вывести.

Слепой, похоже Вы, а не я. Вы совсем не читаете вопросы, которые Вам задают.
Вас спрашивают что конкретно не получается, Вы отвечаете про какие-то функции.
 

1 час назад, Андрей Немцов сказал:

везде простые счётчики

А счётчик - это не переменная ???
Похоже, Вы нас просто троллите. Иного варианта я не вижу.

59 минут назад, Андрей Немцов сказал:

Я НЕ смог найти образец где выводится просто одно число какое либо.

Это - ложь. Если Вы не нашли, значит не искали вообще. Примеров с выводом переменных и без оных - просто огромное количество в интернете. Эта тема изъезжена вдоль и поперёк.

https://yandex.ru/search/?clid=2186620&text=динамическая индикация на AVR&lr=2&redircnt=1545310488.1

Сразу же первая ссылка - https://diodov.net/dinamicheskaya-indikatsiya-programmirovanie-mikrokontrollerov-avr/
Всё просто подробно расписано. Подробней уже некуда. Плюс пример с выводом переменной на индикатор.

Вторая ссылка - http://www.customelectronics.ru/avr-dinamicheskaya-indikatsiya/
Тоже с примером вывода числа.

Третья ссылка - https://radioparty.ru/all-files/finish/4/279
Тоже вывод переменной.

PS: Не нашли, говорите ?  Эти три ссылки я нашёл менее, чем за минуту. Плюс успел посмотреть на код. Может просто ленимся и ждём, когда всё в рот положат ?

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

@Alex , я так понял, что товарищь не знает, как сделать динамическую индикацию, потому что не понимает, что динамическая индикация - это просто ещё один из параллельно выполняемых процессов. У него и основной-то вопрос был - как организовать параллельное выполнение процессов и их взаимодействие.

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

5 минут назад, Lexter сказал:

товарищь не знает, как сделать динамическую индикацию

Возможно. Но, найти описание как это делается - не проблема. И с примерами даже.
Неужели он ждёт, что ему тут всё распишут, что уже расписано 100500 раз ?

Я понимаю, если у него появится конкретный вопрос, который его будет мучить. Да, можно задать тут и ему расскажут.
Но спрашивать "как сделать дин индикацию ?" равносильно вопросу "Как построить дом ?". Вариантов ответов миллион. Один из них - заплатить бабки и не париться - он сам построится :)

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

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

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

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

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

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

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

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

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

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

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