stm32 cubeide два инкремента не совместимы.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
Ну хорошо а как в тиках Знак > или >= или == как будет правильно работать.Если в прерывании мы выставляем тики.В AVR запрещают прерывания потом разрешают при знаке > и >=.А как в stm32?
- Реклама
Re: stm32 cubeide два инкремента не совместимы.
ivan dimir, чисто ради интереса, ты же электрик, на одной фазе 6В, на двух других 300В, напряжение измерено по отношению фаза и нуль. В чем причина?
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
Две причины. Перекос фаз говорит что на этой фазе перегруз. А если на других 300.То плохой ноль на подстанции или на подходе по ЛЭП или ВЛ(воздушная линия).Одна фаза перегружена.Если бы был уверенный ноль.То такого перекоса не было.Ну 6в по мне это КЗ короткое замыкание.Почти 30 лет стажа.
Добавлено after 1 minute 23 seconds:
Dimon456, Вы наверное работаете программистом?.
Добавлено after 1 minute 23 seconds:
Dimon456, Вы наверное работаете программистом?.
- AlanDrakes
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Пн июл 04, 2016 16:51:22
- Откуда: Россия, Омск
Re: stm32 cubeide два инкремента не совместимы.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4162843#p4162843"]Ну хорошо а как в тиках Знак > или >= или == как будет правильно работать.Если в прерывании мы выставляем тики.В AVR запрещают прерывания потом разрешают при знаке > и >=.А как в stm32?[/uquote]
Какие тики выставляем? Зачем?
В прерывании обычно делают минимальную обработку.
А те операторы, что Вы перечислили, это:
> - оператор сравнения: больше
>= - оператор сравнения: больше или равно
== - оператор сравнения: равно.
Прерывание - лишь выполнение кода в другом месте.
Скажем, Вы читаете Есенина, вдруг рядом пролетает муха и её нужно отогнать. Затем Вы продолжаете чтение.
Операторы сравнения - это операторы сравнения.
Прерывания запрещают для атомарности операций. Некоторые любят это делать без причины, поскольку чаще всего это излишне.
Какие тики выставляем? Зачем?
В прерывании обычно делают минимальную обработку.
А те операторы, что Вы перечислили, это:
> - оператор сравнения: больше
>= - оператор сравнения: больше или равно
== - оператор сравнения: равно.
Прерывание - лишь выполнение кода в другом месте.
Скажем, Вы читаете Есенина, вдруг рядом пролетает муха и её нужно отогнать. Затем Вы продолжаете чтение.
Операторы сравнения - это операторы сравнения.
Прерывания запрещают для атомарности операций. Некоторые любят это делать без причины, поскольку чаще всего это излишне.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
В моём случае если настройки определить в основной цикл. Нужно это или нет?..И ещё я правильно ответил на ваш вопрос по поводу перекоса фаз?
- Реклама
Re: stm32 cubeide два инкремента не совместимы.
Я удивлен, наш электрик не знает этого, хотя в начальниках ходит, инженер. Его первый вопрос был - а такое бывает.ivan dimir писал(а):Ну 6в по мне это КЗ короткое замыкание.
Нет, я уголь в топку кидаю, за это платят.ivan dimir писал(а): Вы наверное работаете программистом?
А за программу пока заплатят, и заплатят ли, больше времени потратишь.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
Ну в начальниках я никогда не ходил.А вот бетон на работе приходилось.Мисить.Дело не хитрое.Подобноле бывает.Но не 6 в и 300 в .А фА 150в ф В 200 в .И фС 300 в.6в в трёхфазном токе относительно 0.4кВ классифицируется как короткое оносительно нуля.
Добавлено after 3 minutes 12 seconds:
Да и за это остался без работы.Не захотел бетон месить. Я нанимался электриком.Почему я так спросил.Потому что тут и неполное короткое.И непоолный обрыв.Это редко.В моей практики такого не было.
Добавлено after 3 minutes 12 seconds:
Да и за это остался без работы.Не захотел бетон месить. Я нанимался электриком.Почему я так спросил.Потому что тут и неполное короткое.И непоолный обрыв.Это редко.В моей практики такого не было.
Re: stm32 cubeide два инкремента не совместимы.
И это нормально? Ну-ну.ivan dimir писал(а):Хотя если флаг таки не выставится - то процессор и не выйдет из цикла и программа зависнет.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
Код: Выделить всё
А вот так правильно?
Re: stm32 cubeide два инкремента не совместимы.
[uquote="ivan dimir",url="/forum/viewtopic.php?p=4162956#p4162956"]
while (!(I2C1->SR1 & I2C_SR1_TXE));
А вот так правильно?[/uquote]
Код ниже- это компиляция из нескольких источников. Основной вдохновитель- Vladislav_S. В waitBit() нужно добавить счётчик циклов, тогда код, даже теоретически, никогда не зависнет.
Код: Выделить всё
А вот так правильно?[/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 два инкремента не совместимы.
Хорошо.Но как лучше уйти от дребезга контакта?В кнопке.
Добавлено after 1 minute 4 seconds:
Может лучше ацп использовать?
Добавлено after 25 minutes 18 seconds:
А при нажатии + а потом - виснет программа?
Добавлено after 1 minute 4 seconds:
Может лучше ацп использовать?
Добавлено after 25 minutes 18 seconds:
А при нажатии + а потом - виснет программа?
Re: stm32 cubeide два инкремента не совместимы.
Есть несколько алгоритмов. По-моему, один из самых простых:
1) если поймали фронт сигнала нажатия кнопки, запустили таймер задержки для этой кнопки;
2) если таймер закончил счёт, то проверяем состояние кнопки. Если состояние кнопки всё равно нажатое, то действительно нажали кнопку.
Дребезг не только у кнопок, но и сигнальных контактов. На кнопках дребезг, обычно, 10-50мс, а вот на конечниках с оборудования может доходить до 500мс. Поэтому я и похихикал про аппаратное подавление дребезга конденсатором на 0.1мкФ.
1) если поймали фронт сигнала нажатия кнопки, запустили таймер задержки для этой кнопки;
2) если таймер закончил счёт, то проверяем состояние кнопки. Если состояние кнопки всё равно нажатое, то действительно нажали кнопку.
Дребезг не только у кнопок, но и сигнальных контактов. На кнопках дребезг, обычно, 10-50мс, а вот на конечниках с оборудования может доходить до 500мс. Поэтому я и похихикал про аппаратное подавление дребезга конденсатором на 0.1мкФ.
-
linkov1959
- Держит паяльник хвостом
- Сообщения: 923
- Зарегистрирован: Пн сен 10, 2018 19:16:28
Re: stm32 cubeide два инкремента не совместимы.
tonyk, Зачем задерживать нажатие кнопки? Нажал и обработал. Какие проблемы? Если хочешь второй раз нажать, то это другая тема.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
[uquote="linkov1959",url="/forum/viewtopic.php?p=4163075#p4163075"]tonyk, Зачем задерживать нажатие кнопки? Нажал и обработал. Какие проблемы? Если хочешь второй раз нажать, то это другая тема.[/uquote]
А при нажатии дикримента подвесает.Инкремент работает в норме.
А при нажатии дикримента подвесает.Инкремент работает в норме.
- AlanDrakes
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Пн июл 04, 2016 16:51:22
- Откуда: Россия, Омск
Re: stm32 cubeide два инкремента не совместимы.
Если обработка кнопки приводит к зависанию - то что-то не так в коде.
Проверьте, что:
1. Выполнение кода точно доходит до обработчика нажатия;
2. Обработчик при нажатии кнопки выполняется ОДИН раз;
3. Обработчик после обработки ФАКТА нажатия кнопки, отдаёт управление коду за ним;
4. В конце концов, что после 1-2-3 что-то происходит и это можно увидеть. Да хотя бы диоды подключите на ножки, чтобы видеть события. Если не хочется диоды - используйте вывод в консоль (SW-TRACE) и выводите сообщения в эту самую консоль. Всё станет в разы понятнее.
Собственно, я всегда стараюсь придерживаться этих правил и код работает.
А по логам значительно проще понять что где происходит (главное не повесить ядро самими логами и использовать их минимально необходимое количество).
Проверьте, что:
1. Выполнение кода точно доходит до обработчика нажатия;
2. Обработчик при нажатии кнопки выполняется ОДИН раз;
3. Обработчик после обработки ФАКТА нажатия кнопки, отдаёт управление коду за ним;
4. В конце концов, что после 1-2-3 что-то происходит и это можно увидеть. Да хотя бы диоды подключите на ножки, чтобы видеть события. Если не хочется диоды - используйте вывод в консоль (SW-TRACE) и выводите сообщения в эту самую консоль. Всё станет в разы понятнее.
Собственно, я всегда стараюсь придерживаться этих правил и код работает.
А по логам значительно проще понять что где происходит (главное не повесить ядро самими логами и использовать их минимально необходимое количество).
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
Не та переменная била установленна.Тип не тот unsigned int.unsigned short int-нужно.В мкрочип студии таких багов небыло.Да и в Атолике не было.И ещё один факт кнопки не тактовые.Замыкаешь контакты идёт.А так Нужно повторно.Не достаёт площадка.Дорого но некачественно.Китай.
- AlanDrakes
- Прорезались зубы
- Сообщения: 236
- Зарегистрирован: Пн июл 04, 2016 16:51:22
- Откуда: Россия, Омск
Re: stm32 cubeide два инкремента не совместимы.
Для STM32 unsigned int = uint32_t, unsigned short int скорее всего окажется uint16_t. Вторая на 32 битном ядре может оказаться медленнее.
> В мкрочип студии таких багов небыло.
Не факт, что баг. Для разной архитектуры размер int'а может меняться. Это стандарт языка Си.
> В мкрочип студии таких багов небыло.
Не факт, что баг. Для разной архитектуры размер int'а может меняться. Это стандарт языка Си.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
[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 по байтно.Функции использовал.А они особенно по приёму не читают.Да я как Шариков .Взять и разделить.
> В мкрочип студии таких багов небыло.
Не факт, что баг. Для разной архитектуры размер int'а может меняться. Это стандарт языка Си.[/uquote]
в этом то и прикол что unsigned int а я считаю декремент.И у меня в коде вроде переход нуля если я поменяю код напишу как ваш колега подсказал.У меня идут значения через ноль потом показывает минус и уменьшаются в минусах.Проверенно в железе.Я сижу и играюсь.И поменял я просто тип переменной.uint32_t -пишет ошибку кода.Так как число 2 байтовое то я его принимаю побайтно a=((unsigned int )a1<<8)|a2;
и вывожу на экран потом разделяю
a1=a/256;
a2=a%256;
и записую в EEPROM по байтно.Функции использовал.А они особенно по приёму не читают.Да я как Шариков .Взять и разделить.
Re: stm32 cubeide два инкремента не совместимы.
[uquote="linkov1959",url="/forum/viewtopic.php?p=4163075#p4163075"]tonyk, Зачем задерживать нажатие кнопки? Нажал и обработал. Какие проблемы? Если хочешь второй раз нажать, то это другая тема.[/uquote]
Приплыли. Я описал стандартный алгоритм подавления дребезга. Повторное нажатие и автоповтор- это другая тема.
Добавлено after 14 minutes 30 seconds:
Я плохо понял, чё там за проблема выше, но, по-моему, ты неправильно изменяешь значения переменных в прерываниях. И компилятор тут не причём. Смотри:
Программа работает под многозадачной FreeRTOS. Обрати внимание на включение тактирования порта. Мораль сей басни такова: любое изменение переменной должно делаться только в одном потоке, а если нужно делать его из нескольких потоков или прерываний, то операция изменения должна обрамляться критической секцией. Иначе словишь двойной инкремент или декремент.
Приплыли. Я описал стандартный алгоритм подавления дребезга. Повторное нажатие и автоповтор- это другая тема.
Добавлено after 14 minutes 30 seconds:
Использовать кнопки со встроенными SR-триггерами. Только вот зачем? Алгоритм, описанный мной выше, очень просто реализуется конечным автоматом, поэтому даже на стареньких 8051 работал быстро и требовал мало ресурсов.ivan dimir писал(а):Хорошо.Но как лучше уйти от дребезга контакта?В кнопке.
Я плохо понял, чё там за проблема выше, но, по-моему, ты неправильно изменяешь значения переменных в прерываниях. И компилятор тут не причём. Смотри:
Код: Выделить всё
switch( _spi_n )
{
case 1:
{
spi = SPI1;
APB_n = 2;
APB_freq = getAPB2frequency();
taskENTER_CRITICAL();
{
// Включаеи тактирование порта.
RCC -> APB2ENR |= RCC_APB2ENR_SPI1EN;
}
taskEXIT_CRITICAL();
break;
}-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 cubeide два инкремента не совместимы.
FreeRTOS. я не пользуюсь этой системой.А что это такое. ?Регистры знаю немного.
Добавлено after 1 minute 47 seconds:
Я думал меню создать на switch.Или я не так всё понял.Ну я ж не русский.
Добавлено after 1 minute 47 seconds:
Я думал меню создать на switch.Или я не так всё понял.Ну я ж не русский.


