Если используется SCADA система, то разработчики частенько грешат такой избыточностью… которая лишь приводит к удорожанию проекта… но бывает конечно и техпроцессы где такой подход крайне необходим… но в большинстве случаях это делается без внятных аргументов… каждое требование должно иметь под собой основание… если это требует технологический процесс – это другое дело. А закладывать отслеживание всех исполнительных механизмов ради того чтобы было (так все делают) – или глупость по незнанию, или с целью повысить стоимость проекта…
Мелкие вопросы по МК и ПЛИС.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3683349#p3683349"]но в АСУ, проектированием которых я занимаюсь, обратная связь идет не только от регулируемого параметра, но и от исполнительных механизмов. И это требование прописывается в техпроектах почти всегда. Исключений я даже припомнить не могу.[/uquote]
Если используется SCADA система, то разработчики частенько грешат такой избыточностью… которая лишь приводит к удорожанию проекта… но бывает конечно и техпроцессы где такой подход крайне необходим… но в большинстве случаях это делается без внятных аргументов… каждое требование должно иметь под собой основание… если это требует технологический процесс – это другое дело. А закладывать отслеживание всех исполнительных механизмов ради того чтобы было (так все делают) – или глупость по незнанию, или с целью повысить стоимость проекта…
Если используется SCADA система, то разработчики частенько грешат такой избыточностью… которая лишь приводит к удорожанию проекта… но бывает конечно и техпроцессы где такой подход крайне необходим… но в большинстве случаях это делается без внятных аргументов… каждое требование должно иметь под собой основание… если это требует технологический процесс – это другое дело. А закладывать отслеживание всех исполнительных механизмов ради того чтобы было (так все делают) – или глупость по незнанию, или с целью повысить стоимость проекта…
- Реклама
Самсусамыч, для примера, ПИД, управляющий ТЭН-ом может подать сигнал аварии на пульт оператору или когда он обнаружит, что исполнительный механизм (ТЭН) неисправен, или же когда регулируемый параметр выйдет за допустимые пределы. Как не сложно догадаться, между этими двумя событиями может произойти немало времени. И если в первом случае оператор вполне успеет вмешаться и исправить ситуацию, то во втором - уже не факт.
В описываемой же ТС ситуации, после перезагрузки (или при включении) МК узнать, в каком положении находятся переключающие реле и механические переключатели невозможно. Можно лишь экспериментально щелкать реле и ждать реакции на это нагрузки. Что выглядит несколько некузяво, на мой взгляд. Особенно, если реакция нагрузки возникает с значительной задержкой относительно ее включения или выключения.
В описываемой же ТС ситуации, после перезагрузки (или при включении) МК узнать, в каком положении находятся переключающие реле и механические переключатели невозможно. Можно лишь экспериментально щелкать реле и ждать реакции на это нагрузки. Что выглядит несколько некузяво, на мой взгляд. Особенно, если реакция нагрузки возникает с значительной задержкой относительно ее включения или выключения.
[uquote="ПростоНуб",url="/forum/viewtopic.php?p=3684059#p3684059"]И если в первом случае оператор вполне успеет вмешаться и исправить ситуацию, то во втором - уже не факт.[/uquote]
По большому счёту автоматические системы управления в период поддержания заданного режима, и тем более при аварийных ситуациях, обязаны работать без участия оператора – это во-первых. Во-вторых, каждый регулируемый параметр в технологическом процессе имеет разную степень важности. На основании требуемых задач и закладывается степень реагирования каждого параметра. Переизбыточность системы значительно увеличивает затраты на её поддержание безотказной работы при её эксплуатации. Не говоря уже о сомой стоимости «раздутого» проекта.
Не буду более разводить флуд… возможно у вас (молодых специалистов) критерии построения АСУ уже совсем иные.
По большому счёту автоматические системы управления в период поддержания заданного режима, и тем более при аварийных ситуациях, обязаны работать без участия оператора – это во-первых. Во-вторых, каждый регулируемый параметр в технологическом процессе имеет разную степень важности. На основании требуемых задач и закладывается степень реагирования каждого параметра. Переизбыточность системы значительно увеличивает затраты на её поддержание безотказной работы при её эксплуатации. Не говоря уже о сомой стоимости «раздутого» проекта.
Не буду более разводить флуд… возможно у вас (молодых специалистов) критерии построения АСУ уже совсем иные.
[uquote="Самсусамыч",url="/forum/viewtopic.php?p=3684121#p3684121"]у вас (молодых специалистов)[/uquote]
Спасибо за комплимент! Меня уже лет 20 молодым специалистом не называли )
Спасибо за комплимент! Меня уже лет 20 молодым специалистом не называли )
Что то не пойму:
Перенёс проект из Atollic в IAR и теперь IAR'у не нравится такой #define:
а код такой:
ошибка такая:
его устраивает.
Как переписать дефайн, чтобы заработало?
Макрофункцией? Тоже не работает (data|0x00);
есть ещё способы?
Спасибо.
Перенёс проект из Atollic в IAR и теперь IAR'у не нравится такой #define:
Код: Выделить всё
#define SPI_Tx while (SPI1->SR & SPI_SR_BSY); SPI1->DR = (uint16_t)Код: Выделить всё
SPI_Tx (data|0x00);А такой код:Error[Pe018]: expected a ")" D:\My designs\PJT\IAR\Nokia_1616.c 101
Код: Выделить всё
SPI_Tx 0x11;Как переписать дефайн, чтобы заработало?
Макрофункцией? Тоже не работает (data|0x00);
Код: Выделить всё
#define SPI_Tx(cd) while (SPI1->SR & SPI_SR_BSY); SPI1->DR = (uint16_t)cd
SPI_Tx(0x11);Спасибо.
- Реклама
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Chettuser",url="/forum/viewtopic.php?p=3695815#p3695815"]Как переписать дефайн, чтобы заработало?[/uquote]Оба варианта рабочие. Ошибка скорее всего где-то в другом месте по коду выше. Это и есть слабое место макросов - плохо отлаживать. Во втором варианте аргумент cd надо в скобки взять.
[uquote="Chettuser",url="/forum/viewtopic.php?p=3695815#p3695815"]есть ещё способы?[/uquote]Функцию надо оформлять функцией и не парить себе мозги.
Обрати внимание, я включил интуицию и предположил, что тебе нужна 16-битная операция записи в регистр SPI->DR. Это делается так как у меня в функции, а не как у тебя в макросе. Ну и (data|0x00) это прикол такой? 
ЗЫ: На самостоятельную проработку предлагаю подумать что будет с таким применением твоего макроса и функции.Поэтому макрос вообще правильно вот так
Код: Выделить всё
#define SPI_Tx(cd) while (SPI1->SR & SPI_SR_BSY); SPI1->DR = (uint16_t)(cd)Код: Выделить всё
static inline void SPI_Tx(uint32_t cd)
{
while (SPI1->SR & SPI_SR_BSY);
*(uint16_t *)&SPI1->DR = cd;
}
ЗЫ: На самостоятельную проработку предлагаю подумать что будет с таким применением твоего макроса и функции.
Код: Выделить всё
if(data==0xAA)
SPI_Tx(data|0x01);
else
SPI_Tx(data|0x02);
Код: Выделить всё
#define SPI_Tx(cd) do{while (SPI1->SR & SPI_SR_BSY); SPI1->DR = (uint16_t)(cd);}while(false)
Последний раз редактировалось VladislavS Пт сен 06, 2019 21:49:53, всего редактировалось 1 раз.
а, извиняюсь, чего вы хотели добиться вот этим data|0x00 ?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
А ещё вот так можно сделать
Или даже лучше вот так
Всё контролируется и диагностируется на этапе компиляции, всё инлайнится и оптимизируется - красота.
Код: Выделить всё
template<typename T>
static inline void SPI_Tx(uint32_t data)
{
while (SPI1->SR & SPI_SR_BSY);
*(T*)&SPI1->DR = data;
}Код: Выделить всё
template<typename T>
static inline void SPI_Tx(uint32_t data)
{
static_assert(std::is_same_v<T,uint8_t> || std::is_same_v<T,uint16_t>, "User fool");
while (SPI1->SR & SPI_SR_BSY);
*(T*)&SPI1->DR = data;
}Код: Выделить всё
if(x>255)
SPI_Tx<uint16_t>(x);
else
SPI_Tx<uint8_t>(x);
data|0x00 - по шаблону написал, на время отладки, чтобы не путаться.
Всё оказалось просто - в IAR нет поддержки записи двоичных чисел. GCC судя по всему поддерживает.
Всё оказалось просто - в IAR нет поддержки записи двоичных чисел. GCC судя по всему поддерживает.
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="VladislavS",url="/forum/viewtopic.php?p=3695868#p3695868"]Функцию надо оформлять функцией и не парить себе мозги.
[/uquote]
Конечно, только эта функция не рабочая, volatile нельзя пропускать:
Код: Выделить всё
static inline void SPI_Tx(uint32_t cd)
{
while (SPI1->SR & SPI_SR_BSY);
*(uint16_t *)&SPI1->DR = cd;
}Конечно, только эта функция не рабочая, volatile нельзя пропускать:
Код: Выделить всё
static inline void SPI_Tx(uint32_t cd)
{
while (SPI1->SR & SPI_SR_BSY) {}
*(volatile uint16_t*)&SPI1->DR = cd;
}- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="Chettuser",url="/forum/viewtopic.php?p=3696000#p3696000"]Всё оказалось просто - в IAR нет поддержки записи двоичных чисел. GCC судя по всему поддерживает.[/uquote]Вот так новость, а мы пользуемся и не подозреваем.
[uquote="Reflector",url="/forum/viewtopic.php?p=3696015#p3696015"]Конечно, только эта функция не рабочая, volatile нельзя пропускать:[/uquote]Согласен, просто IAR такие вещи "прощает" и при компиляции им эта функция рабочая. А так да, volatile, конечно же.
[uquote="Reflector",url="/forum/viewtopic.php?p=3696015#p3696015"]Конечно, только эта функция не рабочая, volatile нельзя пропускать:[/uquote]Согласен, просто IAR такие вещи "прощает" и при компиляции им эта функция рабочая. А так да, volatile, конечно же.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3696100#p3696100"]а мы пользуемся и не подозреваем.[/uquote]
Я переправил 0b100000000 на 0x100 и заработало, ЧЯДНТ?
(В двоичном виде удобнее менять регистры дисплея, чем писать простыни для изменения пары бит, как это любят делать программеры)
Я переправил 0b100000000 на 0x100 и заработало, ЧЯДНТ?
(В двоичном виде удобнее менять регистры дисплея, чем писать простыни для изменения пары бит, как это любят делать программеры)
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Вот кусок из рабочего проекта
ЧМДНТ?
Попробуй вот это скомпилировать
Код: Выделить всё
enum class STM32F1_PinMode : uint32_t
{
NotDefined = 0x12345678,
// ODR[4] : CNF[3:2] : MODE[1:0]
Floating = 0b0'01'00, // 0x04
PullUp = 0b1'10'00, // 0x18
PullDown = 0b0'10'00, // 0x08
// Analog mode
Analog = 0b0'00'00, // 0x00
// Output Open Drain modes
OpenDrain_LowSpeed = 0b0'01'10, // 0x06
OpenDrain_MediumSpeed = 0b0'01'01, // 0x05
OpenDrain_HighSpeed = 0b0'01'11, // 0x07
// Output Push-Pull modes
PushPull_LowSpeed = 0b0'00'10, // 0x02
PushPull_MediumSpeed = 0b0'00'01, // 0x01
PushPull_HighSpeed = 0b0'00'11, // 0x03
// Alternate Function Open Drain modes
AF_OpenDrain_LowSpeed = 0b0'11'10, // 0x0E
AF_OpenDrain_MediumSpeed = 0b0'11'01, // 0x0D
AF_OpenDrain_HighSpeed = 0b0'11'11, // 0x0F
// Alternate Function Push-Pull modes
AF_PushPull_LowSpeed = 0b0'10'10, // 0x0A
AF_PushPull_MediumSpeed = 0b0'10'01, // 0x09
AF_PushPull_HighSpeed = 0b0'10'11 // 0x0B
};
Попробуй вот это скомпилировать
Код: Выделить всё
int main()
{
[](){[](){[](){[](){[](){}();}();}();}();}();
for(;;);
}
- Сообщения: 2089
- Зарегистрирован: Вс июн 19, 2016 09:32:03
[uquote="Chettuser",url="/forum/viewtopic.php?p=3696000#p3696000"]Всё оказалось просто - в IAR нет поддержки записи двоичных чисел. GCC судя по всему поддерживает.[/uquote]
Не gcc, а С++14.
Не gcc, а С++14.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Тссс, я плавно подвожу либо к включению С++ режима компилятора, либо обновлению последнего. Но я уже даже забыл когда он С++14 не поддерживал и где такую древнюю версию можно откопать.
[uquote="VladislavS",url="/forum/viewtopic.php?p=3696152#p3696152"]и где такую древнюю версию можно откопать.[/uquote]
С официального сайта с ограничением )
С официального сайта с ограничением )
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
IAR Embedded Workbench for ARM 8.40.1.21539 - свежак ) Ещё мухи не снош..сь!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
Тогда поставь галку С++ в настройках проекта раз и навсегда и не пудри нам мозги.


