stm32 подвесание ипрограммы при настройки кнопки дикремента
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
stm32 подвесание ипрограммы при настройки кнопки дикремента
Настроил две кнопки одна ++ .Другая _--.Инкремент и декремент. При нажатии кнопки с декрементом подвесает программа7.Что делать?на 5 ато и 10 раз нажатия подвесает.
- Реклама
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
А код ванговать должны?
Скорей всего, ты переходишь через ноль, а с большим значением переменной какой-нибудь косяк вытворяешь.
Скорей всего, ты переходишь через ноль, а с большим значением переменной какой-нибудь косяк вытворяешь.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
Вы имеете ввиду что плохая фльтрация питания?На минусовой шине отрецательный потенциал.Это апаратная проблема?
Добавлено after 11 minutes:
Re: stm32 подвесание ипрограммы при настройки кнопки дикремента
С avr такие проблемы не были.Как решить вопрос.
Добавлено after 11 minutes:
Re: stm32 подвесание ипрограммы при настройки кнопки дикремента
С avr такие проблемы не были.Как решить вопрос.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
Какое, блин, питание! Я про
А где-то дальше ты проверяешь
и прозевал, что там ядрены миллионы.
Код: Выделить всё
uint32_t counter = 0;
--counter;
Код: Выделить всё
if(counter == 11) counter = 0;-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
Дело в коде.Понял именно в минусовом?.А переменную любую другую можно обьявить.А почему uint32_t?
- Реклама
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
Блин, покажи ты код уже! Я гадать что ли должен, где у тебя там проблема?
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4163148#p4163148"]Блин, покажи ты код уже! Я гадать что ли должен, где у тебя там проблема?[/uquote]
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;
во такой код
Код: Выделить всё
{
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
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
Офигеть! Я — Ванга! Прямо даже с "==11" угадал =D
Адский говнокод. Пиши нормально. И не забывай проверять на декремент, когда твое значение равно нулю!
P.S. Тебе про switch никто не рассказывал, да?
Адский говнокод. Пиши нормально. И не забывай проверять на декремент, когда твое значение равно нулю!
P.S. Тебе про switch никто не рассказывал, да?
Последний раз редактировалось Eddy_Em Пн янв 17, 2022 21:11:19, всего редактировалось 1 раз.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
i
if((GPIOC->IDR&GPIO_IDR_IDR_5)==0)
if((GPIOC->IDR&GPIO_IDR_IDR_6)==0)
вот в этих кнопках настройки.На AVR работало.Код придуман мною.Тут подвесает программа .При многократном нажатии - -
Добавлено after 2 minutes 58 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4163167#p4163167"]Офигеть! Я — Ванга! Прямо даже с "==11" угадал =D
Адский говнокод. Пиши нормально. И не забывай проверять на декремент, когда твое значение равно нулю!
P.S. Тебе про switch никто не рассказывал, да?[/uquote]
А как можно проверять декремент?.А код с инкрементом?
Код: Выделить всё
if((GPIOC->IDR&GPIO_IDR_IDR_6)==0)
вот в этих кнопках настройки.На AVR работало.Код придуман мною.Тут подвесает программа .При многократном нажатии - -
Добавлено after 2 minutes 58 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4163167#p4163167"]Офигеть! Я — Ванга! Прямо даже с "==11" угадал =D
Адский говнокод. Пиши нормально. И не забывай проверять на декремент, когда твое значение равно нулю!
P.S. Тебе про switch никто не рассказывал, да?[/uquote]
А как можно проверять декремент?.А код с инкрементом?
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
ivan dimir, ты вообще читаешь, что тебе пишут?
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
Читаю.но switch для переключения по меню?
Я понял.Неправильно написан код с декрементом и проверкой.
Я понял.Неправильно написан код с декрементом и проверкой.
Последний раз редактировалось ivan dimir Пн янв 17, 2022 21:19:37, всего редактировалось 1 раз.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
ivan dimir, скажи: какой ты национальности? Русский у тебя на совершенно паршивом уровне. Если знаешь английский лучше - пиши на нем.
Ну и менталитет твой, точней, образ мышления, явно не европейский. Китаец что ли?
Ну и менталитет твой, точней, образ мышления, явно не европейский. Китаец что ли?
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
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;
Добавлено 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
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
Отлично! А, может, все же по-английски?гагауз
Итак, всю эту портянку if'ов заменяй на один switch:
Код: Выделить всё
switch(counter){
case 0:
...
break;
cace 1:
...
...
default:
...
}-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4163215#p4163215"]
Итак, всю эту портянку if'ов заменяй на один switch:
Ну и проверяй: если нажали '+', а у тебя уже 10, то либо перескакивай на нуль, либо оставляй 10. Аналогично с нулем: если нажали '-', то либо перескакивай на 10, либо оставляй нуль. Вот так, например.[/uquote]
у меня будет два switch один для кнопок другой для LCD.А для настройки параметров я изменил переменную unsigned short int a,b;если среднее слово убрать получается подвесание.Да ещё кнопка не тактовая.А так программа настроек верна.Ваш вариант настраиваю параметр а он шурует дальше..Не иеню.Ваше меню лучше.Перепроверю
Добавлено after 1 minute 22 seconds:
Re: stm32 подвесание ипрограммы при настройки кнопки дикремента
я не спустился с гор.Мой предки кочевали по степи и Азии
Добавлено after 22 minutes 10 seconds:
Re: stm32 подвесание ипрограммы при настройки кнопки дикремента
у меня есть вопрос спецам.Ка замедлить значение в ++ или в - -.
Отлично! А, может, все же по-английски?гагауз
Итак, всю эту портянку if'ов заменяй на один switch:
Код: Выделить всё
switch(counter){
case 0:
...
break;
cace 1:
...
...
default:
...
}у меня будет два switch один для кнопок другой для LCD.А для настройки параметров я изменил переменную unsigned short int a,b;если среднее слово убрать получается подвесание.Да ещё кнопка не тактовая.А так программа настроек верна.Ваш вариант настраиваю параметр а он шурует дальше..Не иеню.Ваше меню лучше.Перепроверю
Добавлено after 1 minute 22 seconds:
Re: stm32 подвесание ипрограммы при настройки кнопки дикремента
я не спустился с гор.Мой предки кочевали по степи и Азии
Добавлено after 22 minutes 10 seconds:
Re: stm32 подвесание ипрограммы при настройки кнопки дикремента
у меня есть вопрос спецам.Ка замедлить значение в ++ или в - -.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
При чем здесь горы? Я вот в КЧР живу, местные "горцы" тоже никогда гор не видели, пока их не согнали с Булгарии.
В твоем случае главная проблема — жуткий уровень понимания С! Ну начни ты с Кернигана и Ритчи. Почитай, порешай задания. Потом по С99 недельку-другую потренируйся.
Не стоит делать огромные функции: их просто невозможно быстро окинуть взором (если на один экран не влезают). Лучше разбивай на мелочь, хоть даже static inline. А в случае меню вообще удобно будет структуру сделать: строка - название пункта, флаги (если надо) да указатель на функцию, которая должна быть выполнена при активации данного пункта меню.
Благодаря сложным структурам, на С можно даже эдакую ООПщину реализовать.
В твоем случае главная проблема — жуткий уровень понимания С! Ну начни ты с Кернигана и Ритчи. Почитай, порешай задания. Потом по С99 недельку-другую потренируйся.
Не стоит делать огромные функции: их просто невозможно быстро окинуть взором (если на один экран не влезают). Лучше разбивай на мелочь, хоть даже static inline. А в случае меню вообще удобно будет структуру сделать: строка - название пункта, флаги (если надо) да указатель на функцию, которая должна быть выполнена при активации данного пункта меню.
Благодаря сложным структурам, на С можно даже эдакую ООПщину реализовать.
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
Булгари одни из моих предков.На структуры .Толко сейчас перехоржу.Указатель пока не использовал.Много переменных.Но со структурами Код немного больше.Но удобно.СААОЛ кардаш(спасибо брат).Не китайский не английский.А турецкий ближе.Но он другой.На Структурах я переделал проект Бобёр.Барьер токовый с управлением по уровням верх низ(для скважины.)Был AVR а сейчас STM32 .Но это сложнее.Так как сделать вывод медленнее?
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
ivan dimir, я тебе ссылку кидал, там есть и обработка кнопок. Как я это делаю: сразу, как изменяется состояние кнопки, выставляю флаг. Дальше в течение некоторого времени (от 20 до 100 миллисекунд - в зависимости от железяки) вообще не реагирую на смену состояния. Ну, а потом уже опять контролирую. Никаких прерываний не нужно, все-таки, клавиатура - это ЧТИ (ЧеловекоТыкательный Интерфейс), достаточно конечного автомата.
Да, крайне рекомендую освоить автоматное программирование. Можно делать вложенные автоматы, иерархические, и т.д., и т.п. И в итоге это дает легкий удобный код, а не убожество из нагромождения ифов и свичей.
P.S. Звиняй, по-тюркски не говорю, у меня вообще с языками сложно, еле освоил два. А китайский самоучитель у меня уже больше года в сортире лежит - непонятна мне их логика. Вот свояк у меня знает не меньше четырех языков (свободно общается с русскими, тюрками, армянами и ассирийцами).
Да, крайне рекомендую освоить автоматное программирование. Можно делать вложенные автоматы, иерархические, и т.д., и т.п. И в итоге это дает легкий удобный код, а не убожество из нагромождения ифов и свичей.
P.S. Звиняй, по-тюркски не говорю, у меня вообще с языками сложно, еле освоил два. А китайский самоучитель у меня уже больше года в сортире лежит - непонятна мне их логика. Вот свояк у меня знает не меньше четырех языков (свободно общается с русскими, тюрками, армянами и ассирийцами).
-
ivan dimir
- Мучитель микросхем
- Сообщения: 440
- Зарегистрирован: Вс дек 29, 2019 08:05:21
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4163275#p4163275"]ivan dimir, я тебе ссылку кидал, там есть и обработка кнопок. Как я это делаю: сразу, как изменяется состояние кнопки, выставляю флаг. Дальше в течение некоторого времени (от 20 до 100 миллисекунд - в зависимости от железяки) вообще не реагирую на смену состояния. Ну, а потом уже опять контролирую. Никаких прерываний не нужно, все-таки, клавиатура - это ЧТИ (ЧеловекоТыкательный Интерфейс), достаточно конечного автомата.
Да, крайне рекомендую освоить автоматное программирование. Можно делать вложенные автоматы, иерархические, и т.д., и т.п. И в итоге это дает легкий удобный код, а не убожество из нагромождения ифов и свичей.
P.S. Звиняй, по-тюркски не говорю, у меня вообще с языками сложно, еле освоил два. А китайский самоучитель у меня уже больше года в сортире лежит - непонятна мне их логика. Вот свояк у меня знает не меньше четырех языков (свободно общается с русскими, тюрками, армянами и ассирийцами).[/uquote]
Как это ? Автоматом.А таймер в качестве задержки можно использовать?Я чужой код трудно читаю.По поводу кгнопок.У меня всё просто.В это раз я неправильно выбрал переменную.
Да, крайне рекомендую освоить автоматное программирование. Можно делать вложенные автоматы, иерархические, и т.д., и т.п. И в итоге это дает легкий удобный код, а не убожество из нагромождения ифов и свичей.
P.S. Звиняй, по-тюркски не говорю, у меня вообще с языками сложно, еле освоил два. А китайский самоучитель у меня уже больше года в сортире лежит - непонятна мне их логика. Вот свояк у меня знает не меньше четырех языков (свободно общается с русскими, тюрками, армянами и ассирийцами).[/uquote]
Как это ? Автоматом.А таймер в качестве задержки можно использовать?Я чужой код трудно читаю.По поводу кгнопок.У меня всё просто.В это раз я неправильно выбрал переменную.
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: stm32 подвесание ипрограммы при настройки кнопки дикреме
Таймер нужно использовать - SysTick, пусть отсчитывает системное время (я обычно в миллисекундах условных считаю). А конечные автоматы запоминают условное время нажатия или отпускания кнопки, а состояние меняют лишь спустя определенное количество единиц этого времени. Использовать всякие delay'и в коде можно разве что на стадии инициализации (когда требуется подождать некоторое время, скажем, для инициализации дисплея), да и то, если ждать нужно много, лучше это обернуть в конечный автомат. Тогда человек не будет офигевать от тормозов железки, да и значительно снизится вероятность просрать какое-нибудь событие.


