Jump to content
Lihouzov

Реализация Графического Языка Программирования Для Avr Контроллеров.

Recommended Posts

Программный комплекс Horizont

Самостоятельная реализация проекта автоматики задача сложная, а подчас непосильная в реализации, требующая огромных знаний. Данный проект выливается в тысячи, а иногда миллионы строк кода. Отладка такого проекта занимает львиную долю времени и нет гарантии надежности данного кода. При этом ориентируется в проекте только автор, чтобы разобраться вновь подключенному к проекту человеку ему требуется внимательно пересмотреть весь код, что также отнимает уйму сил и времени. Все вышеперечисленные проблемы подтолкнули к написанию пакета программ Horizont.

Программный комплекс включает в себя:

Runtime- программа исполняющая заложенный в файл конфигурации алгоритм в реальном времени. Программа читает файла конфигурации, строит заложенный в файл проект и исполняет заложенный алгоритм.

Configurator- среда конфигурирования использующая графический язык программирования FBD (Function Block Diagram). Configurator позволяет создать, сохранить, изменить существующий проект, а также по существующему проекту создать файл конфигурации. Также содержаться инструменты для отладки проекта.

Работа проекта:

CTuwDK1qOf0.jpg

Установочный пакет программы Configurator.

Итог:

1. Написал ядро исполнительной программы.

2. Добавил описание FBD блоков

-Порты ввода-вывода;

-Логические блоки (и,или,не,исключающее и,больше);

-константа логическая, константа целочисленная, генератор логический;

-Таймер, фильтр;

-Несколько вариантов ШИМ.

3. Добавил возможность как создания собственных FBD блоков, так и добавление новых типов

контроллеров без перекомпиляции программы Configurator. Для этого необходим лишь текстовый

редактор.

4. В программе Configurator появилась возможность компиляции проекта. Configurator создает

файл конфигурации, копирует необходимые файлы, запускает компилятор. Результатом компиляции

является исполняемый двоичный файл.

5. Добавил несколько типов микроконтроллеров

-AT90S2313

-ATtiny13A

6. Собрал демонстрационный проект "управление дневными ходовыми огнями".

Перспективы:

1. Добавление новых типов микроконтроллеров, описание новых FBD блоков.

2. Добавить поддержку режима отладки. В режиме отладки Configurator подключается к

исполнительной программе, проверяет соответствие конфигурации в исполнительной программе и

текущем проекте, отображает данные входных выходных значений FBD блоков в реальном времени.

3. Добавить описание FBD блоков для связи со SCADA системами (AVR микроконтроллеры и SCADA системы).

Задача:

Реализация исполнительной программы для AVR контроллеров.

Приведу пример возможного проекта "Управления дневными ходовыми огнями".

9mJI0_y0dmQ.jpg

Управление ходовыми огнями осуществляется из условия:

1. Напряжение бортовой сети выше 13,5 вольт. (заведенный двигатель)

2. Обороты двигателя выше 1200 (не холостой ход)

Процесс написания программ для контроллера сведется к добавлению на лист проекта нужных FBD блоков и объединения их в схему. Что избавит многих от написания кода и подвигнет многих радиолюбителей к творчеству.

Ищу заинтересованных людей.

Edited by Lihouzov

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

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

Подробнее

LOGO... Затея конечно хорошая но думаю не нужная в данном случае, в контроллере очень много перефирии и задач которые чтобы сделать на граф языке очень много сил потребуется чтобы это реализовать... Не задумывались почему сам производитель Atmel не стал делать или другая фирма... Да потому что это не нужный вклад денег в разработку такого ПО... Если вы хотите подвинуть к творчеству радиолюбителей то пусть ребята изучают язык СИ.. Он также понятен тех у кого всё впорядке с логикой...

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

Буду следить за развитием, очень интересно что у вас получится...

Share this post


Link to post
Share on other sites

Исполнительную программу буду отлаживать с приведенным выше примером.

Из AVR контроллеров у меня имеется AT90S2313, AT90S8535, ATMEGA8535.

Приблизительный расчет используемых ресурсов:

Оценим размер файла конфигурации для вышеприведенной схемы:

1. заголовок файла:

"hr" 2 байта (сокращение от Horizont runtime)

Lines 1 байт (число используемых узлов, максимум 255)

2. описание FBD блоков

вход 3+1 байта (1 байт привязка к узлу, 1 байт порт, 1 байт номер вывода)

вход 3+1 байта (1 байт привязка к узлу, 1 байт порт, 1 байт номер вывода)

вход АЦП 6+1 байта (1 байт привязка к узлу, 1 байт номер вывода, 4 байта внутренние данные)

Константа 3+1 байта (1 байт привязка к узлу, 2 байта значение константы)

частот. 8+1 байта (1 байт вход, 1 байт выход, 6 байт внутренние данные)

больше 3+1 байта (2 байта входа, 1 байт выход)

больше 3+1 байта (2 байта входа, 1 байт выход)

блок И 3+1 байта (2 байта входа, 1 байт выход)

выход 3+1 байта (1 байт привязка к узлу, 1 байт порт, 1 байт номер вывода)

------------------------------------------

47 байт Приблизительный размер файла конфигурации

Требуемый объем оперативной памяти:

1. данные узловых переменных 8*2=16 байт ()

2. данные FBD блоков

ADC- 4 байта

freq- 6 байта

------------------------------------------

26 байт оперативной памяти

для используемого проекта буду использовать AT90S2313. (должно хватить ресурсов)

Среда разработки исполнительной программы AVR studio 5.1

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

...для используемого проекта буду использовать AT90S2313. (должно хватить ресурсов)...

Позднова-то. Он уже снят с производства.

Share this post


Link to post
Share on other sites

...для используемого проекта буду использовать AT90S2313. (должно хватить ресурсов)...

Позднова-то. Он уже снят с производства.

Я не буду привязываться к функциональным блокам микроконтроллера, а так как набор ассемблерных команд один и тот же что у tini и mega то значить и программа легко перенесется на другие контроллеры. А если удастся сделать на достаточно слабом (немного оперативной памяти, маленькая flash и eeprom) то будет шикарно.

Share this post


Link to post
Share on other sites

Реализация:

1. Ядро программы и описание функций всех FBD блоков будет во flash памяти

2. Значение узловых переменных и данные FBD блоков (если необходимо для реализации блока) в RAM

3. Файл конфигурации будет храниться в EEPROM

Упрощенная схема работы исполнительной программы:

H8mbSRTT_pE.jpg

Edited by Lihouzov

Share this post


Link to post
Share on other sites

...а так как набор ассемблерных команд один и тот же что у tini и mega...

Отнюдь, у Тинек набор много беднее, чем у Мег.

Share this post


Link to post
Share on other sites

Что будет храниться в контроллере, "исходный код" или полученная из него прошивка? Вообще-то логичнее хранить прошивку: не так много памяти и быстродействия чтобы позволить себе содержать виртуальную машину со своим языком, да еще графическим. Контроллеру, в большинстве случаев, и отображать-то его негде. Для разработки же прошивки (*.hex файла, грубо говоря) изобретать свой графический "язык" тоже странно, вроде же существуют flowcode или еще что в этом же роде.

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

Со средами разработки для контроллеров, правда, дела не имел, сужу, в основном, по Labview, по сути довольно близкая задача: автоматизация измерений. Контроллер в любой схеме занимается тем же самым. Прежде чем начинать разработку, задумайтесь хотя бы о некоторых вещах:

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

Внешний вид диаграммы вне среды разработки. Можно ли будет писать программы на бумажке и быстро переносить их на целевое устройство? Скорее всего, нет: расстановка компонентов мышью гораздо медленнее печати текста, не говоря уж о сложных конструкциях, где на одном месте экрана могут быть разные комбинации элементов (аналогия с вкладками во многих программах).

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

Оптимизация скорости. Парсинг файла блок-схемы - занятие небыстрое, особенно учитывая его размер. Но еще медленнее отображение этого файла на экране, особенно при прокрутке листа. При этом ведь приходится анализировать каждый компонент, определять его видимость и текущий координаты. Несколько напоминает задачу вывода спрайтов в какой-нибудь двумерной игрушке. Точно так же, ресурсов на такое удовольствие может и не хватить.

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

Простота. "Интуитивная понятность" интерфейса и "языка" это, конечно, хорошо, но вряд ли достижимо. Всегда есть какие-то особенности, которые придется учить специально (пример из Labview - перевод числа в строку. На первый взгляд неочевидно, что это всего лишь видоизмененный sprintf() и, тем более неочевидно, откуда брать обозначения для различных типов данных, целочисленное там, символьное, строковое, %d,%с,%s соответственно. Не все изучали Си).

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

Универсальность. У каждого контроллера свои интерфейсы ввода-вывода. Разное количество портов, разные модули (у той же AT90S2313, да и у ATmega8515 нет встроенной шины I2C, а у какой-нибудь ATmega8 есть)

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

Стандартные библиотеки. Поскольку "язык" новый - придется писать все с нуля.

В общем, о графических языках программирования я невысокого мнения и предостерегаю от повторения известных ошибок и недостатков.

Share this post


Link to post
Share on other sites

В контроллере будет храниться:

1. исполнительная программа во flash памяти.

2. файл конфигурации в EEPROM памяти.

Контроллер не хранит никакого графического интерпритатора или виртуальной машины. Файл конфигурации это последовательность FBD блоков.

Среда разработки Configurator работает с пользователем, позволяет сформировать нужную схему, в дальнейшем по данной схеме создается файл конфигурации и заливается в EEPROM контроллера.

Первая реализация исполнительной программы: https://sites.google.../runtime/hr_avr, в дальнейшем данные файлы я постараюсь обновлять.

В симуляторе работает, в понедельник попробую залить в контроллер.

Edited by Lihouzov

Share this post


Link to post
Share on other sites

"исполнительная программа", которая во flash-памяти, по сути и есть виртуальная машина, она же интерпретатор блок-схемы. А уж как она хранится - не так уж важно.

Важнее другое, стоит ли хранить эту блок-схему или лучше все-таки скомпилировать в нормальную прошивку? Стоит ли терять такты контроллера и байты памяти ради этого? В чем преимущества?

Share this post


Link to post
Share on other sites

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

На счет байт памяти. Какая разница какая размером программа 300 байт или 2 килобайта, важно то как она выполняет свою задачу насколько стабильно. При данном подходе стабильность программы складывается из правильности работы FBD блоков. Если ты описал функции работы блока без ошибок то и сотни копий этих блоков будут работать без ошибок. А пользователь использующий стабильные блоки в своем проекте получит стабильный проект.

Плюсы в том что:

1. Не вдаваясь в дебри программирования владея компьютером на уровне пользователя человек может создать рабочий проект на AVR контроллерах.

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

Share this post


Link to post
Share on other sites
На счет байт памяти. Какая разница какая размером программа 300 байт или 2 килобайта
У той же AT90S2313 всего 2 кБайта флеша, а EEPROM'а и вовсе 128 байт, может и не влезть, я уж не говорю про какую-нибудь ATtiny11.

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

Тоже кистати, вспомнил, это флеша в контроллерах достаточно, и то не всегда, а вот EEPROM как раз маленькая. Как вариант, можно воспользоваться самозагрузчиком (bootloader) чтобы в начале памяти хранить программу а в конце - интерпретатор.

Share this post


Link to post
Share on other sites

IDE не создает исполнительную программу а, только файл конфигурации.

На данный момент исполнительная программа занимает 35% от флеш памяти AT90S2313 приблизительно 700 байт. Данная программа содержит само ядро и описание FBD блоков для работы с выводами контроллера.

Файл конфигурации для приведенного выше примера будет составлять около 80 байт. EEPROM у AT90S2313 128 байт.

Share this post


Link to post
Share on other sites

"Приведенный выше пример" это какой? Термостат, ходовые огни или еще что-то? На первый взгляд задача не слишком сложная а вот, уже больше половины (62,5%) памяти съедено.Что же будет на более-менее серьезных проектах?

Дело, конечно, ваше. Я лишь пытался указать на способы оптимизации и, в 10 посте, на основные проблемы, которые могут возникнуть.

Share this post


Link to post
Share on other sites

Универсальность. У каждого контроллера свои интерфейсы ввода-вывода. Разное количество портов, разные модули (у той же AT90S2313, да и у ATmega8515 нет встроенной шины I2C, а у какой-нибудь ATmega8 есть)

Добавлю, разный набор и таблицы векторов прерываний, разные размеры векторов прерываний. Разный состав таймеров и их модулей. Наличие/отсутствие ЦАП, TWI, JTAG, DebugWire, компараторов. Укороченный набор команд в семействе Attiny. Что еще... Различие в адресах и наборах служебных регистров.

Все это должна будет учесть ваша среда. И только ради лентяйства "программистов-неучек"? Ваше право! Но пока вы осваиваете все существующие МК (хотя бы AVR) их уже снимут с производства и забудут пользователи. А на новые разработки потребуется новая среда, т.к. слишком уж сильно отличаются новые МК от существующих и архитектурой, и программированием. Существующий пример тому подтверждение (пора бы забыть AT90S2313). Даже ее новый прототип Attiny2313 не полностью совместим с ней аппаратно.

Edited by Геннадий

Share this post


Link to post
Share on other sites

Залил проект в контроллер, не пошло. Не пишется данные в EEPROM использую код:

//================ Работа с EEPROM =================
EEWrite:
//wdr ; Сброс сторожевого таймера
SBIC EECR,EEWE ; Ждем готовности памяти к записи. Крутимся в цикле
RJMP EEWrite ; до тех пор пока не очистится флаг EEWE

CLI ; Затем запрещаем прерывания.
#ifdef EEARH
OUT EEARL, Adr_EEPROM_L ; загружаем адрес нужной ячейки
OUT EEARH, Adr_EEPROM_H ; его старшие и младшие байты
#else
OUT EEAR, Adr_EEPROM_L ; загружаем адрес нужной ячейки
#endif
OUT EEDR,C ; и сами данные, которые нам нужно загрузить

SBI EECR,EEMWE ; взводим предохранитель
SBI EECR,EEWE ; записываем байт

SEI ; разрешаем прерывания
ADIW Adr_EEPROM_L, 1 ; перевод указателя
RET ; возврат из процедуры

EERead:
//wdr ; Сброс сторожевого таймера
SBIC EECR,EEWE ; Ждем пока будет завершена прошлая запись.
RJMP EERead ; также крутимся в цикле.
#ifdef EEARH
OUT EEARL, Adr_EEPROM_L ; загружаем адрес нужной ячейки
OUT EEARH, Adr_EEPROM_H ; его старшие и младшие байты
#else
OUT EEAR, Adr_EEPROM_L ; загружаем адрес нужной ячейки
#endif
SBI EECR,EERE ; Выставляем бит чтения
IN C, EEDR ; Забираем из регистра данных результат
ADIW Adr_EEPROM_L, 1 ; перевод указателя
RET

Функция переноса данных из flash в EEPROM:

Test_cfg:
   .DB 0x68,0x72,3,  4,2,1,0x09,  4,2,1,0x07,  3,5,2,  4,2,2,0x08, 0 
.equ Size_Test_cfg    = 50	  //Адрес начала конфигурации
EEWrite_Test_cfg:
  ldi A, Size_Test_cfg			  ; количество байт для переноса в EEPROM
  ldi Adr_flash_L, Low(Test_cfg*2)  ; адрес тестовой конфигурации во flash
  ldi Adr_flash_H, High(Test_cfg*2) ; адрес тестовой конфигурации во flash
  ldi Adr_EEPROM_L, Low(Addr_Cfg)   ; адрес тестовой конфигурации в EEPROM
  ldi Adr_EEPROM_H, High(Addr_Cfg)  ; адрес тестовой конфигурации в EEPROM
 loop_EEWrite:
  lpm C, Z+						 ; читаем flash
  rcall EEWrite					 ; пишем в EEPROM
  dec   A						   ; уменьшить
  brne  loop_EEWrite			    ; проверка записанных байт
RET					 ; возврат из процедуры

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

Почему???

Share this post


Link to post
Share on other sites

Размер области флеша, в которой находятся данные, лучше было сделать так

Test_cfg:
       .DB 0x68,0x72,3,  4,2,1,0x09,  4,2,1,0x07,  3,5,2,  4,2,2,0x08, 0
Test_cfg_end:
.equ Size_Test_cfg  = Test_cfg_end - Test_cfg      //Адрес начала конфигурации

Зачем sei в процедуре чтения?

Addr_flash соответствует регистру Z?

Можно проверить фуз-бит EESAVE, либо для отладки передавать считанные данные по UART например. Либо, хотя бы, считать какой-нибудь из записанных байтов и сравнить с константой, если не равно - зажечь светодиод ошибки (например, считать 2-й байт и сравнить с 0x72).

Share this post


Link to post
Share on other sites

.equ Size_Test_cfg  = Test_cfg_end - Test_cfg	 //Адрес начала конфигурации

Грамотно, не догадался.

1. sei нет в процедуре чтения.

2. регистры

.def Adr_RAM_H	 = r27  //Указатель на оперативную память	   (X)
 .def Adr_RAM_L	 = r26  //Указатель на оперативную память	   (X)
 .def Adr_EEPROM_H = r29  //Указатель на энергонезависимую память (Y)
 .def Adr_EEPROM_L = r28  //Указатель на энергонезависимую память (Y)
 .def Adr_flash_H	 = r31  //Указатель flash памяти			    (Z)
 .def Adr_flash_L	 = r30  //Указатель flash памяти			    (Z)

3. Читаю результат программатором ChipProg, в EEPROM записывается какая то ерунда.

Может контроллер дохлый?

Share this post


Link to post
Share on other sites

Спасибо разобрался, я заливал прошивку скомпилированную на ATtiny2313 в AT90S2313. Интересно то что AVR studio начиная с версии 5 больше не поддерживает AT90S2313. Приобрету ATtiny2313. Придется собрать собственный программатор для PonyProg, ChipProg не поддерживает ATtiny2313.

Edited by Lihouzov

Share this post


Link to post
Share on other sites

Тогда уж не на ATtiny2313 переходи а на что-нибудь поновее. Хотя бы ATmega48/88/168, вроде они самые компактные из мег.

Share this post


Link to post
Share on other sites

Пример реализации FBD блока "генератор".

FBD Блок имеет один выход и четыре внутренних свойства:

- время высокого состояния

- время низкого состояния

- начальное состояние (высокое или низкое)

- начальное время данного состояния

6VGlHZdLBUk.jpg

Реализация блока

#ifndef _FBD5_
#define _FBD5_ FBD5
#message define FBD5 Generators __FILE__

//Размер описания FDB блока 5 байта
//1 байт- привязка к узлу
//1 байт- время высокого состояния
//1 байт- время низкого состояния
//1 байт- начальное состояние (высокое или низкое)
//1 байт- начальное время данного состояния
//Необходимый размер оперативной памяти
//1 байт- текущее состояние (высокое или низкое)
//1 байт- текущее время данного состояния

FBD5_init:
ADIW Adr_EEPROM_L, 3 ;пропускаем первые три байта конфигурации
rcall EERead ;Читаем начальное состояние
st X+, C ;Сохраняем начальное состояние
rcall EERead ;Читаем начальное начальное время
st X+, C ;Сохраняем начальное начальное время
ret ;Окончание инициализации блока

FBD5_run:
//======== Читаем данные блока из файла конфигураций =========
rcall EERead ;Привязку к узлу
mov B, C ;Привязка к узлу
rcall EERead ;время высокого состояния
mov E, C ;время высокого состояния
rcall EERead ;время низкого состояния
mov F, C ;время низкого состояния
ADIW Adr_EEPROM_L, 2 ;пропускаем два байта конфигурации
//========= Читаем данные блока из оперативной памяти =========
ld G, X+ ;текущее состояние
ld H, X ;текущее время данного состояния
//============= Логика работы FBD блока ==================
inc H ;Увеличиваем время данного состояния
breq FBD5_change_sost ;Сменить состояние
cp H, E ;Сравнить с временем низкого состояния
sbrs G, 0 ;Текущее состояние
cp H, F ;Сравнить с временем низкого состояния
brpl FBD5_change_sost ;Сменить состояние
st X+, H ;Сохраняем текущее время
rjmp FBD5_run_end; ;Переход
FBD5_change_sost:
inc G ;Меняем состояние
andi G, 0b00000001 ;Меняем состояние
clr H ;Установить время на ноль
st X, H ;Сохраняем текущее время
st -X, G ;Сохраняем текущее состояние
ADIW Adr_RAM_L, 2 ;Смещаем указатель на конец блока
FBD5_run_end:
clr Uz1H ;Устанавливаем значение узловой переменной
mov Uz1L, G ;Устанавливаем значение узловой переменной
rcall Save_Uz1 ;Сохраняем значение узла по индексу B
ret ;Окончание исполнения логики блока

FBD5:
.db 5, 2 //Размер FBD блока, необходимая оперативная память
.dw FBD5_run, FBD5_init
#else
#error redeclared FBD2 __FILE__
#endif

Чтобы исполнительная программа могла использовать данный блок достаточно к проекту подключить файл с описанием данного блока. Пример:

.include "FBD_pin.inc"		 //FBD блоки работы с ножками контроллера
.include "FBD_gen.inc"		 //FBD блоки источники (константы, генераторы)

где FBD_gen.inc содержит описание блока генератор.

Конфигурация для отладки данного блока:

.DB 0x68,0x72,3, 7,5,2,4,2,1,0, 7,5,0,4,2,0,0, 4,2,2,0x08, 0

7,5,2,4,2,1,0 -описание первой копии генератора

7,5,0,4,2,0,0 -описание второй копии генератора

4,2,2,0x08 -привязка к ножке контроллера

Файл конфигурации составляю вручную, в дальнейшем после оценки целесообразности я доработаю программу Configurator, добавлю поддержку AVR контроллеров.

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

Edited by Lihouzov

Share this post


Link to post
Share on other sites

Скачал AVR studio 4, собрал проект для AT90S23213, добавил описание блока "логическое И".

Тестовая конфигурация:

-CFbs_eIrx0.jpg

По данной схеме составил файл конфигурации:

Test_cfg:
.DB 0x68,0x72,4, 7,5,0,4,2,1,0, 7,5,1,250,250,0,0, 4,2,0,8+0, 4,2,1,8+1, 4,2,2,0+7, 5,10,1,2,3, 4,2,3,8+2, 0
Test_cfg_end:

Прошил контроллер, РАБОТАЕТ!!!

Edited by Lihouzov

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Similar Content

    • By Максим123456789
      делаю диплом, в схеме у меня микроконтроллер PIC16F688 и мне нужно его заменить на ATmega. Не могу найти похожий
    • By Вячеслав_НС
      Здравствуйте ! подскажите , какую лучше библиотеку использовать (и где ее взять) для управления i2c atmega8 в atmel studio 7  .  задача - управлять atmega8 по i2c ,  цап  PCF8591T .
      понимаю , в интернете много примеров и библиотек , но хотелось бы пример максимально простой и точно рабочий . т.к. пока что все мои попытки не привели к успеху ... то Atmel Studio 7 при компиляции ругается на несуществующий файл ( к примеру - "stream.h") при использовании библиотеки i2c , то еще какие то грабли .
    • By Антон Плюшкин
      В общем есть небольшая тривиальная задача - сделать свитюльку. Контроллер управляет светодиодиками, цвета меняются, людишки довольны.
      Схема проста: Attiny44a -> 2n3904 x3 -> RGB-светодиод.
      Собрал, протестил, всё норм, но!
      Как только в коде я использую функцию задержки - _delay_ms (util/delay.h) - контроллер повисает!
      #define F_CPU 16000000UL #include <avr/io.h> #include <util/delay.h> int main(void) { // Input/Output Ports initialization // Port A initialization // Function: Bit7=Out Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In DDRA=(1<<DDA7) | (1<<DDA6) | (0<<DDA5) | (0<<DDA4) | (0<<DDA3) | (0<<DDA2) | (0<<DDA1) | (0<<DDA0); // State: Bit7=0 Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T PORTA=(0<<PORTA7) | (0<<PORTA6) | (0<<PORTA5) | (0<<PORTA4) | (0<<PORTA3) | (0<<PORTA2) | (0<<PORTA1) | (0<<PORTA0); // Port B initialization // Function: Bit3=In Bit2=Out Bit1=In Bit0=In DDRB=(0<<DDB3) | (1<<DDB2) | (0<<DDB1) | (0<<DDB0); // State: Bit3=T Bit2=0 Bit1=T Bit0=T PORTB=(0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Phase correct PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Non-Inverted PWM // Timer Period: 0,031875 ms // Output Pulse(s): // OC0A Period: 0,031875 ms Width: 0 us // OC0B Period: 0,031875 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (1<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (0<<CS02) | (0<<CS01) | (1<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 16000,000 kHz // Mode: Ph. correct PWM top=0x00FF // OC1A output: Non-Inverted PWM // OC1B output: Disconnected // Noise Canceler: Off // Input Capture on Falling Edge // Timer Period: 0,031875 ms // Output Pulse(s): // OC1A Period: 0,031875 ms Width: 0 us // Timer1 Overflow Interrupt: Off // Input Capture Interrupt: Off // Compare A Match Interrupt: Off // Compare B Match Interrupt: Off TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (1<<WGM10); TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10); TCNT1H=0x00; TCNT1L=0x00; ICR1H=0x00; ICR1L=0x00; OCR1AH=0x00; OCR1AL=0x00; OCR1BH=0x00; OCR1BL=0x00; // Timer/Counter 0 Interrupt(s) initialization TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (0<<TOIE0); // Timer/Counter 1 Interrupt(s) initialization TIMSK1=(0<<ICIE1) | (0<<OCIE1B) | (0<<OCIE1A) | (0<<TOIE1); // External Interrupt(s) initialization // INT0: Off // Interrupt on any change on pins PCINT0-7: Off // Interrupt on any change on pins PCINT8-11: Off MCUCR=(0<<ISC01) | (0<<ISC00); GIMSK=(0<<INT0) | (0<<PCIE1) | (0<<PCIE0); // USI initialization // Mode: Disabled // Clock source: Register & Counter=no clk. // USI Counter Overflow Interrupt: Off USICR=(0<<USISIE) | (0<<USIOIE) | (0<<USIWM1) | (0<<USIWM0) | (0<<USICS1) | (0<<USICS0) | (0<<USICLK) | (0<<USITC); // Analog Comparator initialization // Analog Comparator: Off // The Analog Comparator's positive input is // connected to the AIN0 pin // The Analog Comparator's negative input is // connected to the AIN1 pin ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0); ADCSRB=(0<<ACME); // Digital input buffer on AIN0: On // Digital input buffer on AIN1: On DIDR0=(0<<ADC1D) | (0<<ADC2D); // ADC initialization // ADC disabled ADCSRA=(0<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (0<<ADPS0); unsigned char VL_OCR0A = 0, VL_OCR0B = 0, VL_OCR1A = 0; OCR0A = 0; OCR0B = 0; OCR1A = 0; while(1) { _delay_ms( 100 ); VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } } Т.е. если указать задержку в начале цикла, то светодиод не светится вообще.
      Если задержку убрать - светодиод немного подсвечивает всеми цветами.
      while(1) { _delay_ms( 100 ); // <--- ЗАДЕРЖКА --- VL_OCR0A = VL_OCR0A + 1; VL_OCR0B = VL_OCR0B + 1; VL_OCR1A = VL_OCR1A + 1; if( VL_OCR0A >= 250 ){ VL_OCR0A = 0; } if( VL_OCR0B >= 250 ){ VL_OCR0B = 0; } if( VL_OCR1A >= 250 ){ VL_OCR1A = 0; } OCR0A = VL_OCR0A; OCR0B = VL_OCR0B; OCR1A = VL_OCR1A; } Где я накосячил?
      З.Ы.: Замечаний по поводу оптимизации кода, излишних переменных и п.р. прошу не писать - изощряюсь как могу ибо не пойму почему не работает
    • By кип-сервис
      Продам новые комплектующие пневматического оборудования для систем автоматизации. Недорого. Цены по запросу.












    • By LegionKC
      Добрый день.
      Экспериментирую с платой TP4056 и MK ATmega8, конкретнее - пытаюсь собрать простенькое зарядное устройство с выводом параметров при зарядке/разрядке на АЦП МК. Для измерения тока нашел ACS712. Думаю, что получится выводить ток при зарядке (т.е. когда идет питание на TP4056 и нагрузка отключена) и при разрядке (питание выключено, нагрузка подключена). Нагрузка - резистор. Возникла проблема с измерением напряжения на АКБ. Вернее, проблема с отсутствием идей как это сделать. Может какую-нибудь схему делителя напряжения нужно сделать? Прошу помочь советом. Схему из пэинта прилагаю.
      Спасибо.
       

  • Сообщения

    • Мне очень запала эта схемка,кто бы ее правильно на кварц.стабилизацию качнул!?Хотя жалоб о стабильности от меня.Просто хотелось бы увести его из этого диапазона.  представляю мощного жука #1²  и #1³ Т1 КТ3130Б; Т2 Bfr93; Т3 Bfr93. Т1 КТ3107Л; Т2 КТ368; КТ913Б.     Для антенн буду использовать посеребренный провод. .ля,как же я доволен вашей схемкой!
    • Вопрос следовало задать в теме защиты акустики, так так собственно к усилителю она имеет опосредованное отношение. По вопросу, я делаю так       
    • Здарова друзья!Ну что пробовал я собирать как и обещал,эту схему!Так как на схемке. Работает жучек,но мощность сильно падает,до 150метров,катушку на выходе делал так :L3 3+3витка(2катушки)спаивал в одну катушку,получался центральный выход на коллектор s9018,и катушечка L4 на 2виточка, от которой идет уже конкретно антенна,своими двумя витками помещалась посредине L3,3миллиметровый латунный сердечник плотно проходил внутри,и это не добавляло особо мощности,только взлетала частота до 145мГц что немножко упрощало его поиск и все. Потому я от этого каскада отказался.Просто перед антенной поставил конденсатор от 10--22pf!
    • То есть цифровой вольтметр определяет направление тока и по этому принципу ставит знак? И высчитывает разность потенциалов этого минуса?
    • Еще раз напишу, что стрелочки указывают направление тока. Если батарейку (любую) перевернуть, тока не будет, светодиод светится не будет. Ионы не перейдут через запрещённую зону PN-перехода диода  при "не той" полярности. Считай, что в мультиметре знак "минус" подсвечивает тот светодиод, который правый. Переворачиваешь правую батарейку, и мультиметр твой покажет напряжение без знака "минус".
    • @Slavka Всё именно так, как вы сказали. Но и с vg155 согласен, что вызванивать каждый контакт без конкретной схемы, а только аналогов. Нет гарантий что найду все контакты или не допущу ошибки. По этому и посмотрел барахолку и нашёл экземпляр с более простой проблемой. А так вот мой парк (маленьких DT182 даже 2шт)  
    • Прошу объясните. Вот если чёрный щуп мультиметра ставлю между двумя батарейками, а красный ставлю на плюс или минус, то почему мультиметр показывает знак минус в случае если ставлю на минус красный щуп? Как мультиметр определяет где минус, где плюс?
  • Покупай!

×
×
  • Create New...