Кто любит RISC в жизни, заходим, не стесняемся.
Ответить

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 14:25:27

Ну хорошо а как в тиках Знак > или >= или == как будет правильно работать.Если в прерывании мы выставляем тики.В AVR запрещают прерывания потом разрешают при знаке > и >=.А как в stm32?

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 14:43:13

ivan dimir, чисто ради интереса, ты же электрик, на одной фазе 6В, на двух других 300В, напряжение измерено по отношению фаза и нуль. В чем причина?

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 14:54:06

Две причины. Перекос фаз говорит что на этой фазе перегруз. А если на других 300.То плохой ноль на подстанции или на подходе по ЛЭП или ВЛ(воздушная линия).Одна фаза перегружена.Если бы был уверенный ноль.То такого перекоса не было.Ну 6в по мне это КЗ короткое замыкание.Почти 30 лет стажа.

Добавлено after 1 minute 23 seconds:
Dimon456, Вы наверное работаете программистом?.

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 14:55:48

Ну хорошо а как в тиках Знак > или >= или == как будет правильно работать.Если в прерывании мы выставляем тики.В AVR запрещают прерывания потом разрешают при знаке > и >=.А как в stm32?

Какие тики выставляем? Зачем?
В прерывании обычно делают минимальную обработку.
А те операторы, что Вы перечислили, это:
> - оператор сравнения: больше
>= - оператор сравнения: больше или равно
== - оператор сравнения: равно.

Прерывание - лишь выполнение кода в другом месте.
Скажем, Вы читаете Есенина, вдруг рядом пролетает муха и её нужно отогнать. Затем Вы продолжаете чтение.

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

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 14:58:57

В моём случае если настройки определить в основной цикл. Нужно это или нет?..И ещё я правильно ответил на ваш вопрос по поводу перекоса фаз?

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 15:49:27

ivan dimir писал(а):Ну 6в по мне это КЗ короткое замыкание.
Я удивлен, наш электрик не знает этого, хотя в начальниках ходит, инженер. Его первый вопрос был - а такое бывает.
ivan dimir писал(а): Вы наверное работаете программистом?
Нет, я уголь в топку кидаю, за это платят.
А за программу пока заплатят, и заплатят ли, больше времени потратишь.

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 15:59:50

Ну в начальниках я никогда не ходил.А вот бетон на работе приходилось.Мисить.Дело не хитрое.Подобноле бывает.Но не 6 в и 300 в .А фА 150в ф В 200 в .И фС 300 в.6в в трёхфазном токе относительно 0.4кВ классифицируется как короткое оносительно нуля.

Добавлено after 3 minutes 12 seconds:
Да и за это остался без работы.Не захотел бетон месить. Я нанимался электриком.Почему я так спросил.Потому что тут и неполное короткое.И непоолный обрыв.Это редко.В моей практики такого не было.

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 16:28:00

ivan dimir писал(а):Хотя если флаг таки не выставится - то процессор и не выйдет из цикла и программа зависнет.

И это нормально? Ну-ну.

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 17:37:52

[code][/code]
while (!(I2C1->SR1 & I2C_SR1_TXE));
А вот так правильно?

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 18:17:30

Код:

while (!(I2C1->SR1 & I2C_SR1_TXE));
А вот так правильно?

Код ниже- это компиляция из нескольких источников. Основной вдохновитель- Vladislav_S. В waitBit() нужно добавить счётчик циклов, тогда код, даже теоретически, никогда не зависнет.

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 18:59:29

Хорошо.Но как лучше уйти от дребезга контакта?В кнопке.

Добавлено after 1 minute 4 seconds:
Может лучше ацп использовать?

Добавлено after 25 minutes 18 seconds:
А при нажатии + а потом - виснет программа?

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 19:36:38

Есть несколько алгоритмов. По-моему, один из самых простых:

1) если поймали фронт сигнала нажатия кнопки, запустили таймер задержки для этой кнопки;
2) если таймер закончил счёт, то проверяем состояние кнопки. Если состояние кнопки всё равно нажатое, то действительно нажали кнопку.

Дребезг не только у кнопок, но и сигнальных контактов. На кнопках дребезг, обычно, 10-50мс, а вот на конечниках с оборудования может доходить до 500мс. Поэтому я и похихикал про аппаратное подавление дребезга конденсатором на 0.1мкФ.

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 19:47:00

tonyk, Зачем задерживать нажатие кнопки? Нажал и обработал. Какие проблемы? Если хочешь второй раз нажать, то это другая тема.

Re: stm32 cubeide два инкремента не совместимы.

Пн янв 17, 2022 19:51:28

tonyk, Зачем задерживать нажатие кнопки? Нажал и обработал. Какие проблемы? Если хочешь второй раз нажать, то это другая тема.

А при нажатии дикримента подвесает.Инкремент работает в норме.

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 11:12:06

Если обработка кнопки приводит к зависанию - то что-то не так в коде.
Проверьте, что:
1. Выполнение кода точно доходит до обработчика нажатия;
2. Обработчик при нажатии кнопки выполняется ОДИН раз;
3. Обработчик после обработки ФАКТА нажатия кнопки, отдаёт управление коду за ним;
4. В конце концов, что после 1-2-3 что-то происходит и это можно увидеть. Да хотя бы диоды подключите на ножки, чтобы видеть события. Если не хочется диоды - используйте вывод в консоль (SW-TRACE) и выводите сообщения в эту самую консоль. Всё станет в разы понятнее.

Собственно, я всегда стараюсь придерживаться этих правил и код работает.
А по логам значительно проще понять что где происходит (главное не повесить ядро самими логами и использовать их минимально необходимое количество).

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 11:23:35

Не та переменная била установленна.Тип не тот unsigned int.unsigned short int-нужно.В мкрочип студии таких багов небыло.Да и в Атолике не было.И ещё один факт кнопки не тактовые.Замыкаешь контакты идёт.А так Нужно повторно.Не достаёт площадка.Дорого но некачественно.Китай.

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 12:15:39

Для STM32 unsigned int = uint32_t, unsigned short int скорее всего окажется uint16_t. Вторая на 32 битном ядре может оказаться медленнее.
> В мкрочип студии таких багов небыло.
Не факт, что баг. Для разной архитектуры размер int'а может меняться. Это стандарт языка Си.

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 13:38:55

Для STM32 unsigned int = uint32_t, unsigned short int скорее всего окажется uint16_t. Вторая на 32 битном ядре может оказаться медленнее.
> В мкрочип студии таких багов небыло.
Не факт, что баг. Для разной архитектуры размер int'а может меняться. Это стандарт языка Си.

в этом то и прикол что unsigned int а я считаю декремент.И у меня в коде вроде переход нуля если я поменяю код напишу как ваш колега подсказал.У меня идут значения через ноль потом показывает минус и уменьшаются в минусах.Проверенно в железе.Я сижу и играюсь.И поменял я просто тип переменной.uint32_t -пишет ошибку кода.Так как число 2 байтовое то я его принимаю побайтно a=((unsigned int )a1<<8)|a2;
и вывожу на экран потом разделяю
a1=a/256;
a2=a%256;
и записую в EEPROM по байтно.Функции использовал.А они особенно по приёму не читают.Да я как Шариков .Взять и разделить.

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 15:12:20

tonyk, Зачем задерживать нажатие кнопки? Нажал и обработал. Какие проблемы? Если хочешь второй раз нажать, то это другая тема.

Приплыли. Я описал стандартный алгоритм подавления дребезга. Повторное нажатие и автоповтор- это другая тема.

Добавлено after 14 minutes 30 seconds:
ivan dimir писал(а):Хорошо.Но как лучше уйти от дребезга контакта?В кнопке.

Использовать кнопки со встроенными SR-триггерами. Только вот зачем? Алгоритм, описанный мной выше, очень просто реализуется конечным автоматом, поэтому даже на стареньких 8051 работал быстро и требовал мало ресурсов.

Я плохо понял, чё там за проблема выше, но, по-моему, ты неправильно изменяешь значения переменных в прерываниях. И компилятор тут не причём. Смотри:
Код:
    switch( _spi_n )
    {
        case 1:
        {
            spi = SPI1;
            APB_n = 2;
            APB_freq = getAPB2frequency();

            taskENTER_CRITICAL();
            {
                // Включаеи тактирование порта.
                RCC -> APB2ENR |= RCC_APB2ENR_SPI1EN;

            }
            taskEXIT_CRITICAL();

            break;
        }

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

Re: stm32 cubeide два инкремента не совместимы.

Вт янв 18, 2022 15:46:59

FreeRTOS. я не пользуюсь этой системой.А что это такое. ?Регистры знаю немного.

Добавлено after 1 minute 47 seconds:
Я думал меню создать на switch.Или я не так всё понял.Ну я ж не русский.
Ответить