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

Кто любит RISC в жизни, заходим, не стесняемся.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

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

Сообщение ivan dimir »

Ну хорошо а как в тиках Знак > или >= или == как будет правильно работать.Если в прерывании мы выставляем тики.В AVR запрещают прерывания потом разрешают при знаке > и >=.А как в stm32?
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

ivan dimir, чисто ради интереса, ты же электрик, на одной фазе 6В, на двух других 300В, напряжение измерено по отношению фаза и нуль. В чем причина?
Реклама
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

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

Сообщение ivan dimir »

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

Добавлено after 1 minute 23 seconds:
Dimon456, Вы наверное работаете программистом?.
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

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

Сообщение AlanDrakes »

[uquote="ivan dimir",url="/forum/viewtopic.php?p=4162843#p4162843"]Ну хорошо а как в тиках Знак > или >= или == как будет правильно работать.Если в прерывании мы выставляем тики.В AVR запрещают прерывания потом разрешают при знаке > и >=.А как в stm32?[/uquote]
Какие тики выставляем? Зачем?
В прерывании обычно делают минимальную обработку.
А те операторы, что Вы перечислили, это:
> - оператор сравнения: больше
>= - оператор сравнения: больше или равно
== - оператор сравнения: равно.

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

Операторы сравнения - это операторы сравнения.
Прерывания запрещают для атомарности операций. Некоторые любят это делать без причины, поскольку чаще всего это излишне.
Реклама
Эиком - электронные компоненты и радиодетали
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

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

Сообщение ivan dimir »

В моём случае если настройки определить в основной цикл. Нужно это или нет?..И ещё я правильно ответил на ваш вопрос по поводу перекоса фаз?
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

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

Сообщение Dimon456 »

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

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

Сообщение ivan dimir »

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

Добавлено after 3 minutes 12 seconds:
Да и за это остался без работы.Не захотел бетон месить. Я нанимался электриком.Почему я так спросил.Потому что тут и неполное короткое.И непоолный обрыв.Это редко.В моей практики такого не было.
tonyk
Это не хвост, это антенна
Сообщения: 1312
Зарегистрирован: Вт ноя 19, 2019 06:10:18

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

Сообщение tonyk »

ivan dimir писал(а):Хотя если флаг таки не выставится - то процессор и не выйдет из цикла и программа зависнет.
И это нормально? Ну-ну.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

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

Сообщение ivan dimir »

while (!(I2C1->SR1 & I2C_SR1_TXE));
А вот так правильно?
tonyk
Это не хвост, это антенна
Сообщения: 1312
Зарегистрирован: Вт ноя 19, 2019 06:10:18

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

Сообщение tonyk »

[uquote="ivan dimir",url="/forum/viewtopic.php?p=4162956#p4162956"] while (!(I2C1->SR1 & I2C_SR1_TXE));
А вот так правильно?[/uquote]
Код ниже- это компиляция из нескольких источников. Основной вдохновитель- Vladislav_S. В waitBit() нужно добавить счётчик циклов, тогда код, даже теоретически, никогда не зависнет.
Спойлер

Код: Выделить всё

int16
I2C_Master::readRegister8( uint8 _addr, uint8 _reg, uint8* _data, int16* _status )
{
    int16
        cnt = 0;

    uint32
        st;

    // Wait for BUSY line
    do
    {
        st = i2c -> SR2;
    }
    while( st & I2C_SR2_BUSY );

    // Generate START condition
    i2c -> CR1 |= ( I2C_CR1_START | I2C_CR1_PE | I2C_CR1_ACK );

    do
    {
        st = i2c -> SR1;
    }
    while( !( st & I2C_SR1_SB ) );

    i2c -> DR = ( _addr << 1 );             // Write device address (W)

    if( !( waitBit< I2C_SR1_ADDR >() ) )
    {
        return( 0 );
    }

    ( void ) i2c -> SR2;                    // Read SR2

    if( !waitBit< I2C_SR1_TXE >() )
    {
        return( 0 );
    }

    i2c -> DR = _reg;

    i2c -> CR1 |= ( I2C_CR1_STOP | I2C_CR1_PE );    // Generate STOP condition

    asm( "nop" );

    i2c -> CR1 |= ( I2C_CR1_START | I2C_CR1_PE );   // Generate START condition

    do
    {
        st = i2c -> SR1;
    }
    while( !( st & I2C_SR1_SB ) );

    i2c -> DR = ( _addr << 1 ) | 0x01;      // Write device address (R)

    if( !( waitBit< I2C_SR1_ADDR >() ) )
    {
        return( 0 );
    }

    i2c -> CR1 &= ~( I2C_CR1_ACK );         // No ACK
    ( void ) i2c -> SR2;                    // Read SR2

    if( !( waitBit< I2C_SR1_RXNE >() ) )
    {
        return( 0 );
    }

    uint8
        value = ( uint8 ) i2c -> DR;        // Read value

    if( _data )
    {
        *_data = value;
        cnt++;
    }

    i2c -> CR1 |= ( I2C_CR1_STOP | I2C_CR1_PE );    // Generate STOP condition

    if( _status )
    {
        *_status &= ~( I2C_ERROR::BUSY );
    }

    return( cnt );
}

////////////////////////////////////////////////////////////////////////////////

template< uint32 _aBit >
bool I2C_Master::waitBit( void )
{
    uint32
        status;

    do
    {
        status = i2c -> SR1;

        if( status & ( I2C_SR1_AF | I2C_SR1_ARLO | I2C_SR1_BERR ) )
        {
            i2c -> CR1 = ( I2C_CR1_PE | I2C_CR1_STOP );
            i2c -> SR1 = 0;

            return( false );
        }

    }
    while( !( status & _aBit ) );

    return( true );
}

ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

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

Сообщение ivan dimir »

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

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

Добавлено after 25 minutes 18 seconds:
А при нажатии + а потом - виснет программа?
tonyk
Это не хвост, это антенна
Сообщения: 1312
Зарегистрирован: Вт ноя 19, 2019 06:10:18

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

Сообщение tonyk »

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

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

Дребезг не только у кнопок, но и сигнальных контактов. На кнопках дребезг, обычно, 10-50мс, а вот на конечниках с оборудования может доходить до 500мс. Поэтому я и похихикал про аппаратное подавление дребезга конденсатором на 0.1мкФ.
linkov1959
Держит паяльник хвостом
Сообщения: 923
Зарегистрирован: Пн сен 10, 2018 19:16:28

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

Сообщение linkov1959 »

tonyk, Зачем задерживать нажатие кнопки? Нажал и обработал. Какие проблемы? Если хочешь второй раз нажать, то это другая тема.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

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

Сообщение ivan dimir »

[uquote="linkov1959",url="/forum/viewtopic.php?p=4163075#p4163075"]tonyk, Зачем задерживать нажатие кнопки? Нажал и обработал. Какие проблемы? Если хочешь второй раз нажать, то это другая тема.[/uquote]
А при нажатии дикримента подвесает.Инкремент работает в норме.
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

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

Сообщение AlanDrakes »

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

Собственно, я всегда стараюсь придерживаться этих правил и код работает.
А по логам значительно проще понять что где происходит (главное не повесить ядро самими логами и использовать их минимально необходимое количество).
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

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

Сообщение ivan dimir »

Не та переменная била установленна.Тип не тот unsigned int.unsigned short int-нужно.В мкрочип студии таких багов небыло.Да и в Атолике не было.И ещё один факт кнопки не тактовые.Замыкаешь контакты идёт.А так Нужно повторно.Не достаёт площадка.Дорого но некачественно.Китай.
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

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

Сообщение AlanDrakes »

Для STM32 unsigned int = uint32_t, unsigned short int скорее всего окажется uint16_t. Вторая на 32 битном ядре может оказаться медленнее.
> В мкрочип студии таких багов небыло.
Не факт, что баг. Для разной архитектуры размер int'а может меняться. Это стандарт языка Си.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

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

Сообщение ivan dimir »

[uquote="AlanDrakes",url="/forum/viewtopic.php?p=4163463#p4163463"]Для STM32 unsigned int = uint32_t, unsigned short int скорее всего окажется uint16_t. Вторая на 32 битном ядре может оказаться медленнее.
> В мкрочип студии таких багов небыло.
Не факт, что баг. Для разной архитектуры размер int'а может меняться. Это стандарт языка Си.[/uquote]
в этом то и прикол что unsigned int а я считаю декремент.И у меня в коде вроде переход нуля если я поменяю код напишу как ваш колега подсказал.У меня идут значения через ноль потом показывает минус и уменьшаются в минусах.Проверенно в железе.Я сижу и играюсь.И поменял я просто тип переменной.uint32_t -пишет ошибку кода.Так как число 2 байтовое то я его принимаю побайтно a=((unsigned int )a1<<8)|a2;
и вывожу на экран потом разделяю
a1=a/256;
a2=a%256;
и записую в EEPROM по байтно.Функции использовал.А они особенно по приёму не читают.Да я как Шариков .Взять и разделить.
tonyk
Это не хвост, это антенна
Сообщения: 1312
Зарегистрирован: Вт ноя 19, 2019 06:10:18

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

Сообщение tonyk »

[uquote="linkov1959",url="/forum/viewtopic.php?p=4163075#p4163075"]tonyk, Зачем задерживать нажатие кнопки? Нажал и обработал. Какие проблемы? Если хочешь второй раз нажать, то это другая тема.[/uquote]
Приплыли. Я описал стандартный алгоритм подавления дребезга. Повторное нажатие и автоповтор- это другая тема.

Добавлено 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. Обрати внимание на включение тактирования порта. Мораль сей басни такова: любое изменение переменной должно делаться только в одном потоке, а если нужно делать его из нескольких потоков или прерываний, то операция изменения должна обрамляться критической секцией. Иначе словишь двойной инкремент или декремент.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

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

Сообщение ivan dimir »

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

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

Вернуться в «ARM»