Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
ob:o7:first [2026/04/24 11:28] саша |
ob:o7:first [2026/04/24 16:44] (текущий) саша |
||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| ====== Первая программа на языке программирования Оберон ====== | ====== Первая программа на языке программирования Оберон ====== | ||
| - | В предыдущей заметке было описано, | + | В [[ob: |
| - | Теперь разберём детально сам код этого небольшого модуля, | + | Теперь разберём детально сам код этого небольшого модуля, |
| После запуска проекта открывается следующий код: | После запуска проекта открывается следующий код: | ||
| Строка 57: | Строка 57: | ||
| Программа прошивки состоит из модулей, | Программа прошивки состоит из модулей, | ||
| - | **Модуль** всегда начинается с слова | + | **Модуль** всегда начинается с слова |
| < | < | ||
| Строка 71: | Строка 71: | ||
| В общем случае название модуля может быть любым, название главного модуля редактируется в настройках проекта. Именно для главного модуля будет создаваться прошивка при нажатии на кнопку сборки на панели меню. | В общем случае название модуля может быть любым, название главного модуля редактируется в настройках проекта. Именно для главного модуля будет создаваться прошивка при нажатии на кнопку сборки на панели меню. | ||
| - | Секция импорта начинается ключевым словом | + | Секция импорта начинается ключевым словом |
| < | < | ||
| Строка 88: | Строка 88: | ||
| </ | </ | ||
| - | После секции импорта возможно указывать константы и описывать новые типы данных. Однако в этой простой программе это не используются, | + | После секции импорта возможно указывать константы и описывать новые типы данных. Однако в этой простой программе это не используются, |
| < | < | ||
| Строка 113: | Строка 113: | ||
| После описания переменных идёт описание процедур и программный код модуля. В этом примере две процедуры: | После описания переменных идёт описание процедур и программный код модуля. В этом примере две процедуры: | ||
| - | **Setup** — отвечает за настройку микроконтроллера, | + | '' |
| - | **Loop** — содержит главную петлю программы, | + | '' |
| < | < | ||
| Строка 139: | Строка 139: | ||
| </ | </ | ||
| - | Процедура настройки | + | Процедура настройки |
| - установка начального значения глобальной переменной; | - установка начального значения глобальной переменной; | ||
| - | - настройка частоты таймера делается вызовом процедуры | + | - настройка частоты таймера делается вызовом процедуры |
| - | - настройка вывода **PC13** осуществляется с помощью специального модуля | + | - настройка вывода **PC13** осуществляется с помощью специального модуля |
| < | < | ||
| Строка 154: | Строка 154: | ||
| </ | </ | ||
| + | Процедура '' | ||
| + | |||
| + | - условие проверки срабатывание таймера '' | ||
| + | - команда которая отправляет микроконтроллер в спящий режим до срабатывания следующего вызова таймера или иного прерывания '' | ||
| + | |||
| + | < | ||
| + | PROCEDURE Loop; | ||
| + | BEGIN | ||
| + | REPEAT | ||
| + | IF SysTick0.OnTimer() THEN | ||
| + | IF msec = 999 THEN msec := 0 ELSE INC(msec) END; | ||
| + | IF msec = 0 THEN | ||
| + | SYSTEM.PUT(MCU.GPIOCBSRR, | ||
| + | ELSIF msec = 500 THEN | ||
| + | SYSTEM.PUT(MCU.GPIOCBSRR, | ||
| + | END; | ||
| + | END; | ||
| + | ARMv7M.WFI | ||
| + | UNTIL FALSE | ||
| + | END Loop; | ||
| + | </ | ||
| + | |||
| + | Внутри условия, | ||
| + | |||
| + | < | ||
| + | IF msec = 999 THEN msec := 0 ELSE INC(msec) END; | ||
| + | </ | ||
| + | |||
| + | Второе условное ветвление, | ||
| + | |||
| + | < | ||
| + | IF msec = 0 THEN | ||
| + | SYSTEM.PUT(MCU.GPIOCBSRR, | ||
| + | ELSIF msec = 500 THEN | ||
| + | SYSTEM.PUT(MCU.GPIOCBSRR, | ||
| + | END; | ||
| + | </ | ||
| + | |||
| + | {13} — это константа типа SET, которая соответствует двоичному числу с единицей в положении 13. | ||
| + | |||
| + | < | ||
| + | 0000 0000 0000 0000 0001 0000 0000 0000 | ||
| + | </ | ||
| + | |||
| + | Запись такого машинного слова по адресу **MCU.GPIOCBSRR** вызывает документированные изменения напряжений на выводе **PC13**, как описано выше. | ||
| + | |||
| + | {13+16} — это также константа типа SET, которая соответствует двоичному числу с единицей в положении 29. | ||
| + | |||
| + | < | ||
| + | 0001 0000 0000 0000 0000 0000 0000 0000 | ||
| + | </ | ||
| + | |||
| + | Мы специально записали эту константу в виде суммы 13+16, чтобы было легче читать код. Ведь запись такого машинного слова по адресу **MCU.GPIOCBSRR** вызывает установку нуля на ножке **PC13**. | ||
| + | |||
| + | «Почему один регистр управляет и включением и выключением напряжения? | ||
| + | |||
| + | К примеру вот такая команда за один такт работы микроконтроллера включит напряжение на выводах **PC1** и **PC3**, при этом выключит напряжения начиная с **PC6** и до **PC12**. | ||
| + | |||
| + | < | ||
| + | SYSTEM.PUT(MCU.GPIOCBSRR, | ||
| + | </ | ||
| + | |||
| + | BSSR — расшифровывается как Bit Set/Reset Register (регистр для установки и сброса бит). | ||
| + | |||
| + | Подробнее про управление регистрами читайте [[https:// | ||
| + | |||
| + | Управление микроконтроллером — это запись и чтение данных из регистров. Про чтение регистров мы поговорим в следующей заметке, | ||
| + | |||
| + | Задавайте вопросы в группе [[https:// | ||