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

stm32 подвесание ипрограммы при настройки кнопки дикремента

Пн янв 17, 2022 19:56:15

Настроил две кнопки одна ++ .Другая _--.Инкремент и декремент. При нажатии кнопки с декрементом подвесает программа7.Что делать?на 5 ато и 10 раз нажатия подвесает.

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 20:04:56

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

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 20:26:44

Вы имеете ввиду что плохая фльтрация питания?На минусовой шине отрецательный потенциал.Это апаратная проблема?

Добавлено after 11 minutes:
Re: stm32 подвесание ипрограммы при настройки кнопки дикремента
С avr такие проблемы не были.Как решить вопрос.

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 20:34:28

Какое, блин, питание! Я про
Код:
uint32_t counter = 0;
--counter;

А где-то дальше ты проверяешь
Код:
if(counter == 11) counter = 0;

и прозевал, что там ядрены миллионы.

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 20:52:10

Дело в коде.Понял именно в минусовом?.А переменную любую другую можно обьявить.А почему uint32_t?

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 20:53:13

Блин, покажи ты код уже! Я гадать что ли должен, где у тебя там проблема?

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 21:01:41

Блин, покажи ты код уже! Я гадать что ли должен, где у тебя там проблема?

[code][/code]
while(1)
{
if(!(GPIOC->IDR&GPIO_IDR_IDR_3 ))
{
delay_ms(10);
// pauza++; // IWDG->KR = 0xAAAA;
flag4=1;
// flag=1;
// flag5=1;
// delay_ms(10);
//TIM3->CNT=0;
//pauza=0;
}

if(flag4==1&&GPIOC->IDR&GPIO_IDR_IDR_3)
{
// delay_ms(10);
flag4=0;
//flag=0;

//pauza=0;

menu++;
menu_en++;
// pauza=0;


}
if(menu_en==1)
{

// if(TIM3->CNT>50)
//{
// GPIOC-> BSRR |=GPIO_BSRR_BS13;
//GPIOD->BSRR |= GPIO_BSRR_BS1;
// }
// else
// {
// GPIOC-> BSRR |=GPIO_BSRR_BR13;
//GPIOD->BSRR |= GPIO_BSRR_BR1;
//}
}
if(menu_en==2)
{

//a++;

}
if(menu_en==3)
{

// TIM3->CNT=0;
//min1= TIM3->CNT;

}
if(menu_en==4)
{
//TIM3->CNT=0;

// hour1=TIM3->CNT;
}
if(menu_en==5)
{
//day1=TIM3->CNT;
}
if(menu_en==6)
{
// date1=TIM3->CNT;
}
if(menu_en==7)
{
//month1=TIM3->CNT;
}
if(menu_en==8)
{
//year1=TIM3->CNT;
}
if(menu_en==9)
{
if((GPIOC->IDR&GPIO_IDR_IDR_5)==0)
{
//__disable_irq ();
// delay_ms(5);

if (pauza>2)
{
pauza=0;
if ( a==1023)
{
a=0;
}
a++; // TIM2->CNT=0;
// __enable_irq ();

}


}




if((GPIOC->IDR&GPIO_IDR_IDR_6)==0)
{
// __disable_irq ();


if (pauza>2)
{
pauza=0;
if (a==0)
{
a=1023; // if (a==0)
} //{
// }
a--;


}

}
}
if(menu_en==10)
{
menu_en=0;
}


if(menu==0)
{


I2C2->CR1|=I2C_CR1_ACK;

I2C2->CR1|= I2C_CR1_START;
while (!(I2C2->SR1& I2C_SR1_SB)){};
(void) I2C2->SR1;
I2C2->DR = 0b11010000 ;
while (!(I2C2->SR1& I2C_SR1_ADDR)){};
(void) I2C2->SR1;
(void) I2C2->SR2;
// I2C2->DR= 0 ;
//while (!(I2C2->SR1 & I2C_SR1_TXE)){};

I2C2->DR=0x00;//0b00000000 ;
while (!(I2C2->SR1 & I2C_SR1_TXE)){};
I2C2->CR1|= I2C_CR1_START;
while (!(I2C2->SR1& I2C_SR1_SB)){};
(void) I2C2->SR1;
I2C2->DR= 0b11010001 ;
while (!(I2C2->SR1& I2C_SR1_ADDR)){};
(void) I2C2->SR1;
(void) I2C2->SR2;
while (!(I2C2->SR1& I2C_SR1_RXNE)){};

sec= I2C2->DR;
while (!(I2C2->SR1& I2C_SR1_RXNE)){};
min= I2C2->DR;
while (!(I2C2->SR1& I2C_SR1_RXNE)){};
hour=I2C2->DR;

while (!(I2C2->SR1& I2C_SR1_RXNE)){};
day=I2C2->DR;
while (!(I2C2->SR1& I2C_SR1_RXNE)){};
date=I2C2->DR;
while (!(I2C2->SR1& I2C_SR1_RXNE)){};
month=I2C2->DR;
//I2C2->CR1&=~I2C_CR1_ACK;
while (!(I2C2->SR1& I2C_SR1_RXNE)){};
year = I2C2->DR;
I2C2->CR1&=~I2C_CR1_ACK;
I2C2->CR1|= I2C_CR1_STOP;

sec = RTC_ConvertFromDec(sec); //����������� � ���������� ������
min = RTC_ConvertFromDec(min); //����������� � ���������� ������
hour = RTC_ConvertFromDec(hour); //����������� � ���������� ������
day = RTC_ConvertFromDec(day); //����������� � ���������� ������
year = RTC_ConvertFromDec(year); //����������� � ���������� ������
month = RTC_ConvertFromDec(month); //����������� � ���������� ������

date = RTC_ConvertFromDec(date); //����������� � ���������� ������ uart_transmit ()

LCD_SetPos(0,0);

LCD_SendChar( date/10 + 0x30);
LCD_SendChar( date%10 + 0x30);
LCD_SendChar('.');
LCD_SendChar( month/10 + 0x30);
LCD_SendChar( month%10 + 0x30);
LCD_SendChar('.');
LCD_SendChar('2');
LCD_SendChar('0');
LCD_SendChar(year/10 + 0x30);
LCD_SendChar(year%10 + 0x30);
LCD_SendChar(' ');
LCD_SendChar(' ');
LCD_SendChar(' ');
LCD_SendChar('-');
LCD_SendChar(day + 0x30);
// LCD_SendChar((char) (day%10) + 0x30);
LCD_SetPos(0,1);
LCD_SendChar(hour/10 + 0x30);
LCD_SendChar(hour%10 + 0x30);
LCD_SendChar(':');
LCD_SendChar(min/10 + 0x30);
LCD_SendChar(min%10 + 0x30);
LCD_SendChar(':');
// sec = RTC_ConvertFromDec(sec);
LCD_SendChar(sec/10 + 0x30);
LCD_SendChar(sec%10 + 0x30);
LCD_SendChar(' ');
LCD_SendChar(' ');
LCD_SendChar(' ');
LCD_SendChar(' ');
LCD_SendChar(' ');
//USART_TX((uint16_t),"MAMA");
//sprint(buf10,"text");
USART_TX((uint8_t*)"Mama",13);
//tx_str1(buf10);
//USART_TX ("MAMA");
// tx_uart1(0xF0);
}
if(menu==1)
{
LCD_SetPos(0,0);
// LCD_SendChar('3');
LCD_PrintMyChar(0);
LCD_SendChar(' ');
LCD_SendChar('H');
LCD_SendChar('o');
LCD_PrintMyChar(3);
LCD_PrintMyChar(2);
LCD_PrintMyChar(4);
LCD_SendChar(' ');
LCD_SendChar('p');
// LCD_PrintMyChar(5);
LCD_SendChar('o');
LCD_PrintMyChar(5);
LCD_SendChar('o');
LCD_PrintMyChar(4);
LCD_SendChar(' ');
LCD_SendChar(' ');
LCD_SetPos(0,1);
LCD_SendChar('C');
LCD_SendChar(' ');
LCD_SendChar('H');
LCD_SendChar('o');
LCD_PrintMyChar(3);
LCD_PrintMyChar(1);
LCD_PrintMyChar(4);
LCD_SendChar(' ');
LCD_PrintMyChar(6);
LCD_SendChar('o');
LCD_PrintMyChar(7);
LCD_SendChar('o');
LCD_PrintMyChar(4);
// LCD_SendChar(' ');
// tx_str1("MAMA");
// tx_uart1('M');
// delay_ms(100);
}
if(menu==2)
{

I2C2->CR1|=I2C_CR1_ACK;

I2C2->CR1|= I2C_CR1_START;
while (!(I2C2->SR1& I2C_SR1_SB)){};
(void) I2C2->SR1;
I2C2->DR = 0b11010000 ;
while (!(I2C2->SR1& I2C_SR1_ADDR)){};
(void) I2C2->SR1;
(void) I2C2->SR2;
// I2C2->DR= 0 ;
//while (!(I2C2->SR1 & I2C_SR1_TXE)){};
I2C2->DR= 0b00000000 ;
while (!(I2C2->SR1 & I2C_SR1_TXE)){};
I2C2->CR1|= I2C_CR1_START;
while (!(I2C2->SR1& I2C_SR1_SB)){};
(void) I2C2->SR1;
I2C2->DR= 0b11010001 ;
while (!(I2C2->SR1& I2C_SR1_ADDR)){};
(void) I2C2->SR1;
(void) I2C2->SR2;
while (!(I2C2->SR1& I2C_SR1_RXNE)){};

sec= I2C2->DR;
while (!(I2C2->SR1& I2C_SR1_RXNE)){};
min= I2C2->DR;
while (!(I2C2->SR1& I2C_SR1_RXNE)){};
hour=I2C2->DR;

while (!(I2C2->SR1& I2C_SR1_RXNE)){};
day=I2C2->DR;
while (!(I2C2->SR1& I2C_SR1_RXNE)){};
date=I2C2->DR;
while (!(I2C2->SR1& I2C_SR1_RXNE)){};
month=I2C2->DR;
//I2C2->CR1&=~I2C_CR1_ACK;
while (!(I2C2->SR1& I2C_SR1_RXNE)){};
year = I2C2->DR;
I2C2->CR1&=~I2C_CR1_ACK;
I2C2->CR1|= I2C_CR1_STOP;

sec = RTC_ConvertFromDec(sec); //����������� � ���������� ������
min = RTC_ConvertFromDec(min); //����������� � ���������� ������
hour = RTC_ConvertFromDec(hour); //����������� � ���������� ������
day = RTC_ConvertFromDec(day); //����������� � ���������� ������
year = RTC_ConvertFromDec(year); //����������� � ���������� ������
month = RTC_ConvertFromDec(month); //����������� � ���������� ������
date = RTC_ConvertFromDec(date); //����������� � ���������� ������ uart_transmit ()
sprintf(buf1,"%02d.%02d.20%02d -%d ", date, month,year,day);
LCD_SetPos(0,0);
LCD_String(buf1);
sprintf(buf2,"%02d:%02d:%02d ",hour,min,sec);
LCD_SetPos(0,1);
LCD_String(buf2);

}
if(menu==3)
{

sprintf(buf4,"min1=%2d %2d ",min1,min);

LCD_SetPos(0,0);
LCD_String(buf4);

LCD_SetPos(0,1);

LCD_String(" ");
if(!(GPIOC->IDR&GPIO_IDR_ID4 ))
{
delay_ms(10);
//flag=1;
flag1=1 ;
}
if(flag1==1&&GPIOC->IDR&GPIO_IDR_ID4)
{

//flag=0;
flag1=0;
//pauza=0;
min=min1;
I2C2->CR1|=I2C_CR1_ACK;
I2C2->CR1|= I2C_CR1_START;
while (!(I2C2->SR1& I2C_SR1_SB)){};
(void) I2C2->SR1;
I2C2->DR = 0b11010000 ;
while (!(I2C2->SR1& I2C_SR1_ADDR)){};
(void) I2C2->SR1;
(void) I2C2->SR2;

I2C2->DR= 0x00 ;
while (!(I2C2->SR1 & I2C_SR1_TXE)){};
I2C2->DR=RTC_ConvertFromBinDec(sec=0);
I2C2->DR= 0x01 ;
while (!(I2C2->SR1 & I2C_SR1_TXE)){};
I2C2->DR=RTC_ConvertFromBinDec(min);
while (!(I2C2->SR1 & I2C_SR1_TXE)){};
I2C2->CR1|= I2C_CR1_STOP;

}
}
if(menu==4)
{

sprintf(buf5,"hour1=%2d %2d ",hour1,hour);

LCD_SetPos(0,0);
LCD_String(buf5);

LCD_SetPos(0,1);

LCD_String(" ");
if(!(GPIOC->IDR&GPIO_IDR_ID4 ))
{
delay_ms(10);
// flag=1;
flag1=1;

}
if(flag1==1&&GPIOC->IDR&GPIO_IDR_ID4 )
{
//flag=0;
flag1=0;
//pauza=0;
hour=hour1;

// I2C2->CR1|=I2C_CR1_ACK;

I2C2->CR1|= I2C_CR1_START;
while (!(I2C2->SR1& I2C_SR1_SB)){};
(void) I2C2->SR1;
I2C2->DR = 0b11010000 ;
while (!(I2C2->SR1& I2C_SR1_ADDR)){};
(void) I2C2->SR1;
(void) I2C2->SR2;
I2C2->DR= 0x02 ;
while (!(I2C2->SR1 & I2C_SR1_TXE)){};

I2C2->DR=RTC_ConvertFromBinDec(hour);
while (!(I2C2->SR1 & I2C_SR1_TXE)){};
I2C2->CR1|= I2C_CR1_STOP;
}
}
if(menu==5)
{
sprintf(buf6,"day1=%d %d ",day1,day);
LCD_SetPos(0,0);
LCD_String(buf6);
LCD_SetPos(0,1);
LCD_String(" ");
if(!(GPIOC->IDR&GPIO_IDR_ID4 ))
{
delay_ms(10);
// flag=1;
flag1=1;
}
if(flag1==1&&GPIOC->IDR&GPIO_IDR_ID4 )
{
//flag=0;
flag1=0;
// pauza=0;
day=day1;

// I2C2->CR1|=I2C_CR1_ACK;

I2C2->CR1|= I2C_CR1_START;
while (!(I2C2->SR1& I2C_SR1_SB)){};
(void) I2C2->SR1;
I2C2->DR = 0b11010000 ;
while (!(I2C2->SR1& I2C_SR1_ADDR)){};
(void) I2C2->SR1;
(void) I2C2->SR2;
I2C2->DR= 0x03 ;
while (!(I2C2->SR1 & I2C_SR1_TXE)){};

I2C2->DR=RTC_ConvertFromBinDec(day);
while (!(I2C2->SR1 & I2C_SR1_TXE)){};
I2C2->CR1|= I2C_CR1_STOP;
}
}
if(menu==6)
{
sprintf(buf7,"date1=%2d %2d ",date1,date);
LCD_SetPos(0,0);
LCD_String(buf7);
LCD_SetPos(0,1);
LCD_String(" ");
if(!(GPIOC->IDR&GPIO_IDR_ID4 ))
{
//flag=1;
delay_ms(10);
flag1=1;

}
if(flag1==1&&GPIOC->IDR&GPIO_IDR_ID4 )
{
// flag=0;
flag1=0;
pauza=0;
date =date1;

I2C2->CR1|=I2C_CR1_ACK;

I2C2->CR1|= I2C_CR1_START;
while (!(I2C2->SR1& I2C_SR1_SB)){};
(void) I2C2->SR1;
I2C2->DR = 0b11010000 ;
while (!(I2C2->SR1& I2C_SR1_ADDR)){};
(void) I2C2->SR1;
(void) I2C2->SR2;
I2C2->DR= 0x04 ;
while (!(I2C2->SR1 & I2C_SR1_TXE)){};

I2C2->DR=RTC_ConvertFromBinDec(date);
while (!(I2C2->SR1 & I2C_SR1_TXE)){};
I2C2->CR1|= I2C_CR1_STOP;
}
}
if(menu==7)
{
sprintf(buf8,"month1=%2d %2d ",month1,month);
LCD_SetPos(0,0);
LCD_String(buf8);
LCD_SetPos(0,1);
LCD_String(" ");
if(!(GPIOC->IDR&GPIO_IDR_ID4 ))
{
delay_ms(10);
//flag=1;
flag1=1;
}
if(flag1==1&&GPIOC->IDR&GPIO_IDR_ID4 )
{
//flag=0;
flag1=0;
// pauza=0;
month=month1;

I2C2->CR1|=I2C_CR1_ACK;

I2C2->CR1|= I2C_CR1_START;
while (!(I2C2->SR1& I2C_SR1_SB)){};
(void) I2C2->SR1;
I2C2->DR = 0b11010000 ;
while (!(I2C2->SR1& I2C_SR1_ADDR)){};
(void) I2C2->SR1;
(void) I2C2->SR2;
I2C2->DR= 0x05 ;
while (!(I2C2->SR1 & I2C_SR1_TXE)){};

I2C2->DR=RTC_ConvertFromBinDec(month);
while (!(I2C2->SR1 & I2C_SR1_TXE)){};
I2C2->CR1|= I2C_CR1_STOP;
}
}
if(menu==8)
{
sprintf(buf9,"year1=20%02d,20%02d ",year1,year);
LCD_SetPos(0,0);
LCD_String(buf9);
LCD_SetPos(0,1);
LCD_String(" ");
if(!(GPIOC->IDR&GPIO_IDR_ID4 ))
{
// flag=1;
delay_ms(10);
flag1=1;

}
if(flag1==1&&GPIOC->IDR&GPIO_IDR_ID4 )
{
flag=0;
flag1=0;
// pauza=0;
year =year1;

I2C2->CR1|=I2C_CR1_ACK;

I2C2->CR1|= I2C_CR1_START;
while (!(I2C2->SR1& I2C_SR1_SB)){};
(void) I2C2->SR1;
I2C2->DR = 0b11010000 ;
while (!(I2C2->SR1& I2C_SR1_ADDR)){};
(void) I2C2->SR1;
(void) I2C2->SR2;
I2C2->DR= 0x06 ;
while (!(I2C2->SR1 & I2C_SR1_TXE)){};

I2C2->DR=RTC_ConvertFromBinDec(year);
while (!(I2C2->SR1 & I2C_SR1_TXE)){};
I2C2->CR1|= I2C_CR1_STOP;
}
}
if(menu==9)
{
sprintf(buf10,"a=%2d ",a);
LCD_SetPos(0,0);
LCD_String(buf10);
LCD_SetPos(0,1);
LCD_String(" ");
a1=a/256;
a2=a%256;
if(!(GPIOC->IDR&GPIO_IDR_IDR_4 ))
{
delay_ms(10);
// flag=1;
flag1=1;

}
if(flag1==1&&GPIOC->IDR&GPIO_IDR_IDR_4 )
{
// flag=0;
// delay_ms(10);
flag1=0;
// pauza=0;


// I2C1->CR1|=I2C_CR1_ACK;

I2C1->CR1|= I2C_CR1_START;
while (!(I2C1->SR1& I2C_SR1_SB)){};
(void) I2C1->SR1;
I2C1->DR = 0xA0 ;
while (!(I2C1->SR1& I2C_SR1_ADDR)){};
(void) I2C1->SR1;
(void) I2C1->SR2;
I2C1->DR= 0;
while (!(I2C1->SR1 & I2C_SR1_TXE)){};
I2C1->DR= 1;
while (!(I2C1->SR1 & I2C_SR1_TXE)){};
I2C1->DR=a1;
while (!(I2C1->SR1 & I2C_SR1_TXE)){};
I2C1->DR=a2;
while (!(I2C1->SR1 & I2C_SR1_TXE)){};
I2C1->CR1|= I2C_CR1_STOP;
}
}
if(menu==10)
{
sprintf(buf10,"a=%2d ",a);
LCD_SetPos(0,0);
LCD_String(buf10);
LCD_SetPos(0,1);
LCD_String(" ");
}
if(menu==11)
{
menu=0;
}
//IWDG->KR = 0xAAAA;
}
}
volatile unsigned int a,b;
во такой код

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 21:08:47

Офигеть! Я — Ванга! Прямо даже с "==11" угадал =D
Адский говнокод. Пиши нормально. И не забывай проверять на декремент, когда твое значение равно нулю!

P.S. Тебе про switch никто не рассказывал, да?
Последний раз редактировалось Eddy_Em Пн янв 17, 2022 21:11:19, всего редактировалось 1 раз.

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 21:12:50

i[code][/code]
if((GPIOC->IDR&GPIO_IDR_IDR_5)==0)
if((GPIOC->IDR&GPIO_IDR_IDR_6)==0)
вот в этих кнопках настройки.На AVR работало.Код придуман мною.Тут подвесает программа .При многократном нажатии - -

Добавлено after 2 minutes 58 seconds:
Офигеть! Я — Ванга! Прямо даже с "==11" угадал =D
Адский говнокод. Пиши нормально. И не забывай проверять на декремент, когда твое значение равно нулю!

P.S. Тебе про switch никто не рассказывал, да?

А как можно проверять декремент?.А код с инкрементом?

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 21:13:24

ivan dimir, ты вообще читаешь, что тебе пишут?

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 21:17:22

Читаю.но switch для переключения по меню?
Я понял.Неправильно написан код с декрементом и проверкой.
Последний раз редактировалось ivan dimir Пн янв 17, 2022 21:19:37, всего редактировалось 1 раз.

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 21:19:21

ivan dimir, скажи: какой ты национальности? Русский у тебя на совершенно паршивом уровне. Если знаешь английский лучше - пиши на нем.
Ну и менталитет твой, точней, образ мышления, явно не европейский. Китаец что ли?

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

гагауз.Огуз

Добавлено after 16 minutes 28 seconds:
Re: stm32 подвесание ипрограммы при настройки кнопки дикремента
sprintf(buf10,"a=%2d ",a);выдаёт ошибку переменная а неправильно обьявлена.
LCD_SetPos(0,0);
LCD_String(buf10);
LCD_SetPos(0,1);
LCD_String(" ");
a1=a/256;
a2=a%256;

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 21:52:35

гагауз

Отлично! А, может, все же по-английски?
Итак, всю эту портянку if'ов заменяй на один switch:
Код:
switch(counter){
  case 0:
     ...
  break;
  cace 1:
     ...
  ...
  default:
     ...
}

Ну и проверяй: если нажали '+', а у тебя уже 10, то либо перескакивай на нуль, либо оставляй 10. Аналогично с нулем: если нажали '-', то либо перескакивай на 10, либо оставляй нуль. Вот так, например.

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 22:31:12

гагауз

Отлично! А, может, все же по-английски?
Итак, всю эту портянку if'ов заменяй на один switch:
Код:
switch(counter){
  case 0:
     ...
  break;
  cace 1:
     ...
  ...
  default:
     ...
}

Ну и проверяй: если нажали '+', а у тебя уже 10, то либо перескакивай на нуль, либо оставляй 10. Аналогично с нулем: если нажали '-', то либо перескакивай на 10, либо оставляй нуль. Вот так, например.

у меня будет два switch один для кнопок другой для LCD.А для настройки параметров я изменил переменную unsigned short int a,b;если среднее слово убрать получается подвесание.Да ещё кнопка не тактовая.А так программа настроек верна.Ваш вариант настраиваю параметр а он шурует дальше..Не иеню.Ваше меню лучше.Перепроверю

Добавлено after 1 minute 22 seconds:
Re: stm32 подвесание ипрограммы при настройки кнопки дикремента
я не спустился с гор.Мой предки кочевали по степи и Азии

Добавлено after 22 minutes 10 seconds:
Re: stm32 подвесание ипрограммы при настройки кнопки дикремента
у меня есть вопрос спецам.Ка замедлить значение в ++ или в - -.

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 22:51:17

При чем здесь горы? Я вот в КЧР живу, местные "горцы" тоже никогда гор не видели, пока их не согнали с Булгарии.
В твоем случае главная проблема — жуткий уровень понимания С! Ну начни ты с Кернигана и Ритчи. Почитай, порешай задания. Потом по С99 недельку-другую потренируйся.
Не стоит делать огромные функции: их просто невозможно быстро окинуть взором (если на один экран не влезают). Лучше разбивай на мелочь, хоть даже static inline. А в случае меню вообще удобно будет структуру сделать: строка - название пункта, флаги (если надо) да указатель на функцию, которая должна быть выполнена при активации данного пункта меню.
Благодаря сложным структурам, на С можно даже эдакую ООПщину реализовать.

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 23:09:29

Булгари одни из моих предков.На структуры .Толко сейчас перехоржу.Указатель пока не использовал.Много переменных.Но со структурами Код немного больше.Но удобно.СААОЛ кардаш(спасибо брат).Не китайский не английский.А турецкий ближе.Но он другой.На Структурах я переделал проект Бобёр.Барьер токовый с управлением по уровням верх низ(для скважины.)Был AVR а сейчас STM32 .Но это сложнее.Так как сделать вывод медленнее?

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 23:14:18

ivan dimir, я тебе ссылку кидал, там есть и обработка кнопок. Как я это делаю: сразу, как изменяется состояние кнопки, выставляю флаг. Дальше в течение некоторого времени (от 20 до 100 миллисекунд - в зависимости от железяки) вообще не реагирую на смену состояния. Ну, а потом уже опять контролирую. Никаких прерываний не нужно, все-таки, клавиатура - это ЧТИ (ЧеловекоТыкательный Интерфейс), достаточно конечного автомата.
Да, крайне рекомендую освоить автоматное программирование. Можно делать вложенные автоматы, иерархические, и т.д., и т.п. И в итоге это дает легкий удобный код, а не убожество из нагромождения ифов и свичей.
P.S. Звиняй, по-тюркски не говорю, у меня вообще с языками сложно, еле освоил два. А китайский самоучитель у меня уже больше года в сортире лежит - непонятна мне их логика. Вот свояк у меня знает не меньше четырех языков (свободно общается с русскими, тюрками, армянами и ассирийцами).

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 23:19:30

ivan dimir, я тебе ссылку кидал, там есть и обработка кнопок. Как я это делаю: сразу, как изменяется состояние кнопки, выставляю флаг. Дальше в течение некоторого времени (от 20 до 100 миллисекунд - в зависимости от железяки) вообще не реагирую на смену состояния. Ну, а потом уже опять контролирую. Никаких прерываний не нужно, все-таки, клавиатура - это ЧТИ (ЧеловекоТыкательный Интерфейс), достаточно конечного автомата.
Да, крайне рекомендую освоить автоматное программирование. Можно делать вложенные автоматы, иерархические, и т.д., и т.п. И в итоге это дает легкий удобный код, а не убожество из нагромождения ифов и свичей.
P.S. Звиняй, по-тюркски не говорю, у меня вообще с языками сложно, еле освоил два. А китайский самоучитель у меня уже больше года в сортире лежит - непонятна мне их логика. Вот свояк у меня знает не меньше четырех языков (свободно общается с русскими, тюрками, армянами и ассирийцами).

Как это ? Автоматом.А таймер в качестве задержки можно использовать?Я чужой код трудно читаю.По поводу кгнопок.У меня всё просто.В это раз я неправильно выбрал переменную.

Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Пн янв 17, 2022 23:34:50

Таймер нужно использовать - SysTick, пусть отсчитывает системное время (я обычно в миллисекундах условных считаю). А конечные автоматы запоминают условное время нажатия или отпускания кнопки, а состояние меняют лишь спустя определенное количество единиц этого времени. Использовать всякие delay'и в коде можно разве что на стадии инициализации (когда требуется подождать некоторое время, скажем, для инициализации дисплея), да и то, если ждать нужно много, лучше это обернуть в конечный автомат. Тогда человек не будет офигевать от тормозов железки, да и значительно снизится вероятность просрать какое-нибудь событие.
Ответить