| Форум РадиоКот 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/ |
|


