Например TDA7294

Форум РадиоКот :: Просмотр темы - stm32 подвесание ипрограммы при настройки кнопки дикремента
Форум РадиоКот
https://radiokot.ru/forum/

stm32 подвесание ипрограммы при настройки кнопки дикремента
https://radiokot.ru/forum/viewtopic.php?f=59&t=180710
Страница 1 из 2

Автор:  ivan dimir [ Пн янв 17, 2022 19:56:15 ]
Заголовок сообщения:  stm32 подвесание ипрограммы при настройки кнопки дикремента

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

Автор:  Eddy_Em [ Пн янв 17, 2022 20:04:56 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

Автор:  ivan dimir [ Пн янв 17, 2022 20:26:44 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

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

Автор:  Eddy_Em [ Пн янв 17, 2022 20:34:28 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

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

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

Автор:  ivan dimir [ Пн янв 17, 2022 20:52:10 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

Автор:  Eddy_Em [ Пн янв 17, 2022 20:53:13 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

Автор:  ivan dimir [ Пн янв 17, 2022 21:01:41 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

[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;
во такой код

Автор:  Eddy_Em [ Пн янв 17, 2022 21:08:47 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

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

Автор:  ivan dimir [ Пн янв 17, 2022 21:12:50 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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 никто не рассказывал, да?

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

Автор:  Eddy_Em [ Пн янв 17, 2022 21:13:24 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

Автор:  ivan dimir [ Пн янв 17, 2022 21:17:22 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Читаю.но switch для переключения по меню?
Я понял.Неправильно написан код с декрементом и проверкой.

Автор:  Eddy_Em [ Пн янв 17, 2022 21:19:21 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

Автор:  ivan dimir [ Пн янв 17, 2022 21:36:38 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

гагауз.Огуз

Добавлено 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;

Автор:  Eddy_Em [ Пн янв 17, 2022 21:52:35 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Цитата:
гагауз

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

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

Автор:  ivan dimir [ Пн янв 17, 2022 22:31:12 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

Цитата:
гагауз

Отлично! А, может, все же по-английски?
Итак, всю эту портянку 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 подвесание ипрограммы при настройки кнопки дикремента
у меня есть вопрос спецам.Ка замедлить значение в ++ или в - -.

Автор:  Eddy_Em [ Пн янв 17, 2022 22:51:17 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

Автор:  ivan dimir [ Пн янв 17, 2022 23:09:29 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

Автор:  Eddy_Em [ Пн янв 17, 2022 23:14:18 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

Автор:  ivan dimir [ Пн янв 17, 2022 23:19:30 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

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

Автор:  Eddy_Em [ Пн янв 17, 2022 23:34:50 ]
Заголовок сообщения:  Re: stm32 подвесание ипрограммы при настройки кнопки дикреме

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

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/