Как поместить цикл в case оператора switch

Обсуждаем контроллеры компании Atmel.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Как поместить цикл в case оператора switch

Сообщение Demiurg »

В теме ТС-у показали разные примеры. Я выложил два примера. Один просто включение выходов, другой с мигалками. Пример просимулировал в avr-studio. Что ещё нужно?
Реклама
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15585
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Как поместить цикл в case оператора switch

Сообщение BOB51 »

Вернемся к ранее сказанному.
У каждого из нас своя "начальная школа", исходя из которой и строится понимание и восприятие изложенного материала.
Вот тут порой и проблема - мы то, стараясь помочь исходим из собственного опыта и знаний, часто не имея представления о начальной подготовке вопрошающего.
Проще не цапатьтся, а изложить свою точку зрения"как есть", указывая на ее преимущества и недостатки по сравнению с изложенным другими участниками обсуждения материалами но без обидных личных выпадов в их адрес.
Топикстартера наши взаимоуколы не интересуют (они лишь участникам нервы и настроение портят) - а вот изложенный материал в любом варианте полезен - что сочтет "воспринимаемым", то и применит.
Принуждать к применению с нашей стороны более рационального решения типа "то что тут рассказывали есть ГО... а вот это (моё) есть прогресс абсолютный" также не следует (исключения грубые нарушения правил техники безопасности и законодательных норм - и то... "в порядке предупреждения о возможных неприятностях").
В то же время предложить более современное/сложное/затратное/ в качестве рекомендации возможного применения - штука полезная, но опять же "без фанатизьма" и "переходов на личности".
:beer:
Кстати... об отсутствии возможности скомпилировать/проверить пример...
Давно уже отмечено, что в запросе необходима и схема и файлы проекта (или той части, что предложена к рассмотрению) если содержимое выходит за рамки стандартного набора компилятора "по умолчанию".
Особо заметно в случае применения в проектах ардуиноIDE (и/или Си, а возможно, и иных ЯВУ) "сторонних библиотек" -лучше их копию в отдельной папочке в основную папку проекта положить - меньше проблем с поиском и у консультанта и у вопрошающего.
:roll:
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Как поместить цикл в case оператора switch

Сообщение Dimon456 »

BOB51 писал(а):Кстати... об отсутствии возможности скомпилировать/проверить пример...
О чем вы вообще пишите? Если вы про пример VladislavS, то:

Открываем ArduinoIde, целевой контроллер ATmega8 Internal 8MHz,
Файл -> Новый

Стираем вот это
Спойлер

Код: Выделить всё

void setup() {
  // put your setup code here, to run once:

}

void loop() {
  // put your main code here, to run repeatedly:

}
и копируем усе из файла main.cpp

Копируем в рабочую папку файлы AVR_simple_pins.hpp key.hpp и led.hpp

Далее эти файлы надо перетащит мышкой в рабочее окно проекта ArduinoIde

и жмем кнопку "Проверить" и усе
Спойлер

Код: Выделить всё

Скетч использует 558 байт (7%) памяти устройства. Всего доступно 7680 байт.
Глобальные переменные используют 13 байт (1%) динамической памяти, оставляя 1011 байт для локальных переменных. Максимум: 1024 байт.
Далее из папочки Temp вытаскиваете папку arduino_build_xxxxx и можете по отлаживать в протеусе.
veso74
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Как поместить цикл в case оператора switch

Сообщение veso74 »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4305287#p4305287"]... Далее из папочки Temp вытаскиваете папку arduino_build_xxxxx и можете по отлаживать в протеусе.[/uquote]
Еще проще из меню Arduino IDE: меню Скетч -> Экспорт бинарного файла. Файл .hex будет размещен в папке проекта.
Последний раз редактировалось veso74 Сб окт 15, 2022 19:29:41, всего редактировалось 1 раз.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Как поместить цикл в case оператора switch

Сообщение VladislavS »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4305287#p4305287"]и можете по отлаживать в протеусе.[/uquote]Отлаживать в смысле отлаживать или просто запускать на исполнение?

ЗЫ: скетчем мои программы ещё никто не называл :)
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: Как поместить цикл в case оператора switch

Сообщение Dimon456 »

VladislavS писал(а):Отлаживать в смысле отлаживать или просто запускать на исполнение?
Под отладкой я имел ввиду elf файл, а не бинарник.
Реклама
veso74
Поставщик валерьянки для Кота
Сообщения: 1916
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Как поместить цикл в case оператора switch

Сообщение veso74 »

В Arduino IDE + MiniCore -> ATmega8 все нормально компилировалось. HEX файл внутри архива.
MCUdude/MiniCore
Вложения
Untitled-1.jpg
(148.58 КБ) 56 скачиваний
3BlinkingLeds_w.zip
(9.44 КБ) 65 скачиваний
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Как поместить цикл в case оператора switch

Сообщение Demiurg »

Видео примера по ТЗ ТС.
Архив примера прикрепил.
Схемы нет. Ибо все просто и тупо. В определениях проекта входы и выходы прописаны. Входы и выходы в моем примере подстроены под STK-500. У которой и входы и выходы по схеме с общим плюсом. То есть. Активный низкий уровень сигнала.

На этом я эту тему заканчиваю. Показываю свой пример как есть.
Вложения
INPUTS_OUTPUTS.rar
(434.53 КБ) 68 скачиваний
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Как поместить цикл в case оператора switch

Сообщение VladislavS »

Demiurg, только есть пара проблемок... Что делает программа не читается вообще ни разу. Ресурсы минимум в два раза по flash и в 14 по ram завышены.
СпойлерИзображение
изображение_2022-10-16_142752190.png
(43.51 КБ) 66 скачиваний
Немного оптимизировал класс мигающего светодиода и заменил отдельные кнопки на клавиатуру. Расход ram по байту на диод и три на клавиатуру.
СпойлерИзображение
изображение_2022-10-16_144322659.png
(247.5 КБ) 74 скачивания
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Re: Как поместить цикл в case оператора switch

Сообщение MLX90640 »

К большому сожалению, там огромная куча файлов, сильные междуусобные, но плохопрослеживаемые зависимости, дублирование действий, общая небрежность. Оформление кода понятно только лишь самому автору, потому что он так привык делать. Ни одного коммента в действительно необходимых местах, не говоря уже о Doxygen, но хотябы краткие пояснения назначения функций и файлов, как это принято делать у уважающих себя и других программистов. Неясно назначение файлов main.c и proba.c с одинаковыми именами ф-ций main(). Неясно, почему в proba.c есть участки "висящего" ничему не принадлежащего кода - сразу после ф-ции main, после закрытия скобки } следуют "оторванные" строки с if (Get_Event (EV_ID_KEY_PRESSED)) { } и if (handle_soft_timer (ST_PROC_DEVICE)) { } - это компилироваться не будет.
К большому сожалению, такой вариант подходит и понятен только лишь для его автора, но остальным людям он неинтересен по причине небрежности оформления и спорности некоторых моментов исполнения. А жаль.

Ну и касательно сброса счета вачдога. Считается, что безусловный его сброс (перезапуск) в начале цикла не является хорошей практикой. Наиболее продвинутые программисты вачдогом защищают те участки кода, в которых возможно зацикливание программы из-за ожидания внешних условий. А перед сбросом вачдога проверяют, что требуемые условия сброса выполнены. То есть, вачдог используется не просто как какая-то условная штука "чтоба была", а именно как предохранитель от неверного поведения программы. Но это уже так... мелочи в данном случае :)
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Как поместить цикл в case оператора switch

Сообщение Demiurg »

Если затронута якобы честь "настоящего и продвинутого программиста".

Назначение watchdog? Применение этого инструмента? На какое время он настроен в моем проекте? Следующий вопрос. Покажите мне хоть один участок кода, где теоретически выполнение кода может выполняться дольше, чем настройка watchdog.

Если вы работали в команде разработчиков МК AVR, я с удовольствием вас выслушаю. Потому что только в этом случае я услышу полезную и ценную для меня информацию.

Не увидел в названиях раздела и темы "конкурс на звание лучшего и продвинутого программиста-затейника"... Уж прастыте.
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Re: Как поместить цикл в case оператора switch

Сообщение MLX90640 »

Тогда зачем вообще нужен такой бесполезный вачдог, если даже теоретически он никогда не переполнится из-за зацикливания кода где-то там в недрах и переплетения функций? Остановка кварца - не в счет.
Да, это распространенное заблуждение о вачдоге как таковом. И не важно, какой МК перед вами. Важно лишь то, что с вачдогом работают, не до конца понимая весь его смысл.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Как поместить цикл в case оператора switch

Сообщение VladislavS »

Если что-то где-то зациклится, то выполнение главного цикла прекратится и собака сработает.

ЗЫ: Только собака то не от ошибок в программе.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Как поместить цикл в case оператора switch

Сообщение Demiurg »

VladislavS.
1 - предметно. В чем именно не читается. Смотрим объективно. Названия функций внятны, названия переменных внятны. Определения внятны. Проект разделен на логические блоки. Внутри логических блоков в свою очередь тоже логические блоки. Что не так?

2 - ТЗ ТС: Первая кнопка. Первый выход вкл-выкл. Вторая кнопка. Второй выход. Мигалка. Третья кнопка. Третий выход. Генератор 60 гц.

У вас три мигалки. Кстати, могли бы архивы своих примеров выкладывать.
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Как поместить цикл в case оператора switch

Сообщение VladislavS »

[uquote="Demiurg",url="/forum/viewtopic.php?p=4305873#p4305873"]1 - предметно. В чем именно не читается.[/uquote]Ну то и значит, что открываю код и не вижу что он делает.

[uquote="Demiurg",url="/forum/viewtopic.php?p=4305873#p4305873"]2 - ТЗ ТС:[/uquote]ТЗ ТС так же чётко написано как его код :)


[uquote="Demiurg",url="/forum/viewtopic.php?p=4305873#p4305873"]Первый выход вкл-выкл. Вторая кнопка. Второй выход. Мигалка. Третья кнопка. Третий выход. Генератор 60 гц.[/uquote]Заменить первый диод на немигающий - несколько строк кода. Мигалка от 60 Гц отличается только делителем. Для примера вообще непринципиальна частота - с мигающим разной частотой диодом нагляднее.

[uquote="Demiurg",url="/forum/viewtopic.php?p=4305873#p4305873"]У вас три мигалки.[/uquote]Да легко. См 42, 47 и 52 строки. Просто используем обычный диод вместо мигающего.
СпойлерИзображение
изображение_2022-10-17_093551618.png
(150.84 КБ) 54 скачивания
В таком варианте разгром по ресурсам вообще неприличный.

[uquote="Demiurg",url="/forum/viewtopic.php?p=4305873#p4305873"]Кстати, могли бы архивы своих примеров выкладывать.[/uquote]
SRC.ZIP
(3.65 КБ) 61 скачивание
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Как поместить цикл в case оператора switch

Сообщение Demiurg »

Первое. Техническое задание топикстартера. Первый выход. Вкл-выкл. Второй выход. Мигалка. Третий выход. Генератор 60 гц. Где соответствие в вашем примере?

Разгром не разгром. Не суть. Требования к проекту. К камню. Если у меня нет задачи вылизывать, чтобы сэкономить пару байтов flash либо SRAM, я не буду тратить свое время. Напишу проект в лоб.

Кстати, подсмотрел пример у MLX90640. Так как работает только какой-нибудь один режим, объединение трёх светодиодов в одну функцию имеет смысл. Действия однотипные, работает только какой то один режим.

Структура программных таймеров в моем примере.

Код: Выделить всё

typedef struct soft_timer

{
   bool status;
   u08 sys_tick_prev;
   u16 cnt;       // Counter.

#ifdef __ST_PERIOD__
   u16 period;    // Period.
#endif
} soft_timer_t;
Status - Таймер активен-неактивен. Bool. 1 байт.
sys_tick_prev - при установке таймера считывается текущее значение счётчика, который считает временные интервалы в прерывании. Аппаратный таймер настраивается на системный тик. В данном примере это 1 мс. 1 байт.
cnt - Задаваемое время таймера. Если системный 1 мс, значит дискретность 1 мс. Максимальное время 65535 мс.
Итого, каждый программный таймер это 4 байта, в случае без периода, 6 байтов в случае наличия элемента period.

Алгоритм. Обработчик программного таймера работает в основном цикле. Если Status, считывается текущее значение счётчика, который тикает в прерывании, сравнивается с sys_tick_prev. Если значение изменилось, значит, как минимум 1 мс прошла. Декремент cnt. Если нуль, время вышло. Если есть элемент period, это значение, если не нуль, записывается в cnt. Таймер выдает признак, что время вышло и если есть элемент period считает заново.

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

По поводу якобы перерасхода. Когда у меня нет острой необходимости экономить память, я использую эти программные таймеры как есть. Мне не нужно париться, ужиматься. Я беру и использую эти программные таймеры. Пусть у нас три светодиода, значит это три программных таймера. Да, это займет 4 или 6 (если есть элемент period) байтов на каждый таймер. Плюс переменная состояние мигалки. Зато эти 3 мигалки работают независимо.
Последний раз редактировалось Demiurg Пн окт 17, 2022 10:53:34, всего редактировалось 3 раза.
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15585
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Как поместить цикл в case оператора switch

Сообщение BOB51 »

[uquote="MLX90640",url="/forum/viewtopic.php?p=4305650#p4305650"]...
Ну и касательно сброса счета вачдога. Считается, что безусловный его сброс (перезапуск) в начале цикла не является хорошей практикой....[/uquote]
Собака в МК выполняет функционал защиты от отказа главного тактового генератора, заищиты МК от сбоев при воздействии внешних помех и лишь затем от "сбоев по ошибке автора программы" - ("сбоев при "зацикливании" программы")...
8)
Собственно ежли программа при отсутствии внешних помех и ошибок в схемотехнике устройства требует еще и аппаратной защиты от ошибок программного кода - это уже не программа, а БАГ/ВИРУС от автора такого "шедевра".
:roll:
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Как поместить цикл в case оператора switch

Сообщение VladislavS »

[uquote="Demiurg",url="/forum/viewtopic.php?p=4305894#p4305894"]Где соответствие в вашем примере?[/uquote]Соответствие с точностью до частоты 60 Гц. Кто-то мешает поставить константу делителя на 60 Гц?

[uquote="Demiurg",url="/forum/viewtopic.php?p=4305894#p4305894"]Если у меня нет задачи вылизывать, чтобы сэкономить пару байтов flash либо SRAM, я не буду тратить свое время. Напишу проект в лоб.[/uquote]Не пару байт, а 4 байта SRAM и 84 это в 21 раз. По FLASH тоже больше двух раз.

[uquote="Demiurg",url="/forum/viewtopic.php?p=4305894#p4305894"]Так как работает только какой-нибудь один режим, объединение трёх светодиодов в одну функцию имеет смысл.[/uquote]Всех трёх не имеет, они поразному управляются. Немугающий включается/выключается просто статическими методами. Это компилируется в простейшие команды cbi/sbi. Там нечего экономить. Оставшиеся два мигающих, скорее всего, тоже не имеет смысла объединять. Логика по выбору с каким диодом работать будет сложнее логики мигалки.

А вот замена трёх отдельных кнопок на клавиатуру реально дала экономию. Опять же, у меня в библиотеке есть класс клавиатуры и замена заняла 5 минут. Если бы не было, то вопрос "время <-> ресурсы".
Viktorkin
Первый раз сказал Мяу!
Сообщения: 26
Зарегистрирован: Вт май 17, 2022 09:49:48

Re: Как поместить цикл в case оператора switch

Сообщение Viktorkin »

[uquote="Demiurg",url="/forum/viewtopic.php?p=4301583#p4301583"]

Код: Выделить всё

case 0: // Init IO
         io_init ();
         all_outs_off ();
         _proc_device = 1;
         break;
.[/uquote]
а помоему вы зря ругаетесь. это прикольная штука инициализация автоматом. я бы попробовал так.
Demiurg
Это не хвост, это антенна
Сообщения: 1480
Зарегистрирован: Ср июн 25, 2008 15:19:44
Контактная информация:

Re: Как поместить цикл в case оператора switch

Сообщение Demiurg »

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

Вернуться в «AVR»