Обсуждаем контроллеры компании Atmel.
Ответить

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

Пт окт 14, 2022 22:38:09

В теме ТС-у показали разные примеры. Я выложил два примера. Один просто включение выходов, другой с мигалками. Пример просимулировал в avr-studio. Что ещё нужно?

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

Сб окт 15, 2022 11:04:01

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

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

Сб окт 15, 2022 18:24:45

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

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

Стираем вот это
и копируем усе из файла main.cpp

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

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

и жмем кнопку "Проверить" и усе
Далее из папочки Temp вытаскиваете папку arduino_build_xxxxx и можете по отлаживать в протеусе.

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

Сб окт 15, 2022 18:39:17

... Далее из папочки Temp вытаскиваете папку arduino_build_xxxxx и можете по отлаживать в протеусе.

Еще проще из меню Arduino IDE: меню Скетч -> Экспорт бинарного файла. Файл .hex будет размещен в папке проекта.
Последний раз редактировалось veso74 Сб окт 15, 2022 19:29:41, всего редактировалось 1 раз.

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

Сб окт 15, 2022 18:49:06

и можете по отлаживать в протеусе.
Отлаживать в смысле отлаживать или просто запускать на исполнение?

ЗЫ: скетчем мои программы ещё никто не называл :)

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

Сб окт 15, 2022 19:38:41

VladislavS писал(а):Отлаживать в смысле отлаживать или просто запускать на исполнение?
Под отладкой я имел ввиду elf файл, а не бинарник.

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

Сб окт 15, 2022 19:39:43

В Arduino IDE + MiniCore -> ATmega8 все нормально компилировалось. HEX файл внутри архива.
MCUdude/MiniCore
Вложения
Untitled-1.jpg
(148.58 KiB) Скачиваний: 37
3BlinkingLeds_w.zip
(9.44 KiB) Скачиваний: 43

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

Сб окт 15, 2022 21:07:01

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

На этом я эту тему заканчиваю. Показываю свой пример как есть.
Вложения
INPUTS_OUTPUTS.rar
(434.53 KiB) Скачиваний: 46

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

Вс окт 16, 2022 14:46:28

Demiurg, только есть пара проблемок... Что делает программа не читается вообще ни разу. Ресурсы минимум в два раза по flash и в 14 по ram завышены.


Немного оптимизировал класс мигающего светодиода и заменил отдельные кнопки на клавиатуру. Расход ram по байту на диод и три на клавиатуру.

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

Вс окт 16, 2022 16:57:56

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

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

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

Вс окт 16, 2022 18:12:01

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

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

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

Не увидел в названиях раздела и темы "конкурс на звание лучшего и продвинутого программиста-затейника"... Уж прастыте.

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

Вс окт 16, 2022 18:41:30

Тогда зачем вообще нужен такой бесполезный вачдог, если даже теоретически он никогда не переполнится из-за зацикливания кода где-то там в недрах и переплетения функций? Остановка кварца - не в счет.
Да, это распространенное заблуждение о вачдоге как таковом. И не важно, какой МК перед вами. Важно лишь то, что с вачдогом работают, не до конца понимая весь его смысл.

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

Вс окт 16, 2022 18:47:48

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

ЗЫ: Только собака то не от ошибок в программе.

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

Пн окт 17, 2022 08:49:53

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

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

У вас три мигалки. Кстати, могли бы архивы своих примеров выкладывать.

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

Пн окт 17, 2022 09:54:34

1 - предметно. В чем именно не читается.
Ну то и значит, что открываю код и не вижу что он делает.

2 - ТЗ ТС:
ТЗ ТС так же чётко написано как его код :)


Первый выход вкл-выкл. Вторая кнопка. Второй выход. Мигалка. Третья кнопка. Третий выход. Генератор 60 гц.
Заменить первый диод на немигающий - несколько строк кода. Мигалка от 60 Гц отличается только делителем. Для примера вообще непринципиальна частота - с мигающим разной частотой диодом нагляднее.

У вас три мигалки.
Да легко. См 42, 47 и 52 строки. Просто используем обычный диод вместо мигающего.
В таком варианте разгром по ресурсам вообще неприличный.

Кстати, могли бы архивы своих примеров выкладывать.

SRC.ZIP
(3.65 KiB) Скачиваний: 40

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

Пн окт 17, 2022 10:16:39

Первое. Техническое задание топикстартера. Первый выход. Вкл-выкл. Второй выход. Мигалка. Третий выход. Генератор 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 раз(а).

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

Пн окт 17, 2022 10:27:44

...
Ну и касательно сброса счета вачдога. Считается, что безусловный его сброс (перезапуск) в начале цикла не является хорошей практикой....

Собака в МК выполняет функционал защиты от отказа главного тактового генератора, заищиты МК от сбоев при воздействии внешних помех и лишь затем от "сбоев по ошибке автора программы" - ("сбоев при "зацикливании" программы")...
8)
Собственно ежли программа при отсутствии внешних помех и ошибок в схемотехнике устройства требует еще и аппаратной защиты от ошибок программного кода - это уже не программа, а БАГ/ВИРУС от автора такого "шедевра".
:roll:

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

Пн окт 17, 2022 10:58:43

Где соответствие в вашем примере?
Соответствие с точностью до частоты 60 Гц. Кто-то мешает поставить константу делителя на 60 Гц?

Если у меня нет задачи вылизывать, чтобы сэкономить пару байтов flash либо SRAM, я не буду тратить свое время. Напишу проект в лоб.
Не пару байт, а 4 байта SRAM и 84 это в 21 раз. По FLASH тоже больше двух раз.

Так как работает только какой-нибудь один режим, объединение трёх светодиодов в одну функцию имеет смысл.
Всех трёх не имеет, они поразному управляются. Немугающий включается/выключается просто статическими методами. Это компилируется в простейшие команды cbi/sbi. Там нечего экономить. Оставшиеся два мигающих, скорее всего, тоже не имеет смысла объединять. Логика по выбору с каким диодом работать будет сложнее логики мигалки.

А вот замена трёх отдельных кнопок на клавиатуру реально дала экономию. Опять же, у меня в библиотеке есть класс клавиатуры и замена заняла 5 минут. Если бы не было, то вопрос "время <-> ресурсы".

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

Пн ноя 28, 2022 12:06:41

Код:
case 0: // Init IO
         io_init ();
         all_outs_off ();
         _proc_device = 1;
         break;

.

а помоему вы зря ругаетесь. это прикольная штука инициализация автоматом. я бы попробовал так.

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

Пн ноя 28, 2022 12:35:15

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