stm32 cubeide два инкремента не совместимы.

Кто любит RISC в жизни, заходим, не стесняемся.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Dimon456 »

Eddy_Em писал(а):А твой код "софтового таймера" - ад какой-то.
Опять мне присваивают чужое.
Этот код взять отсюда.
Значит так, друзья, вы уж сами определитесь что такое КА, а то вы, по ходу дела, каждый по своему видите реализацию этих КА.
Реклама
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32 cubeide два инкремента не совместимы.

Сообщение tonyk »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4164651#p4164651"]tonyk, я поторопился, надо было так

Код: Выделить всё

   KA = 0;
   while (1) {
     switch (KA) {
       case 0: инит_всего();   KA = 1; break;
       case 1: опрос_кнопок(); KA = 2; break;
       case 2: действие();     KA = 3; break;
       case 3: вывод_лсд();    KA = 1; break;
       default: в пиииии.....();
     }
   }
[/uquote]
И всё равно неправильно! Я же говорю, теорию изучи. У тебя тут ни Мили, ни Мур.

Добавлено after 1 minute 33 seconds:
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4164670#p4164670"]Dimon456, все равно неправильно. У тебя - не конечный автомат, а тупой последовательный код, написанный через жопу![/uquote]
Дядя Эдик часто резок и прямолинеен до грубости, но тут я с ним полностью согласен.
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Dimon456 »

Eddy_Em, и tonyk, мне это, КА, без надобности.
И так что-то и без КА могу сляпать, а читается код, не читается, мне до балды.
Другой реализации я пока не видел, будем придерживаться этой.

Добавлено after 3 hours 24 minutes 46 seconds:
Конечный автомат
Спойлер

Код: Выделить всё

	#define BTN_LOCK_TIME   50						// время обработки дребезга в папугаях 
	#define BTN_LONG_TIME   150						// время фиксации длинного нажатия в папугаях

	//настройка портов и линий 					
	#define BTN_PIN        	GPIOB->IDR				// порт кнопок 
	#define BTN_LINE1   	GPIO_Pin_5				// линии кнопок 
	#define BTN_LINE2   	GPIO_Pin_0	
	#define BTN_LINE3   	GPIO_Pin_1
	#define BTN_LINE3   	GPIO_Pin_2		

	//определения флагов кнопок
	#define BTN_SHRT1   	(1<<0)					// флаги короткого нажатия кнопок 
	#define BTN_SHRT2   	(1<<1)
	#define BTN_SHRT3   	(1<<2)
	#define BTN_LINE4   	(1<<3)
 
	#define BTN_LONG1   	(1<<4)					// флаги длинного нажатия кнопок 
	#define BTN_LONG2   	(1<<5)
	#define BTN_LONG3   	(1<<6)
	#define BTN_LONG4   	(1<<7)
 
//глобальные переменные
volatile uint8_t BtnFlags;              //регистр флагов нажатых кнопок 

//функция инициализации портов  
void BtnInit (void)                              
{    
лень писать
}

//функция циклического опроса кнопок (вызывать с частотой хГц, например в прерывании) 
void BtnExe (void)                                 
{    
	static uint8_t BtnLockBit;                 //защелка (защита от дребезга) 
	static uint16_t BtnLockCoun;               //счетчик защелки (защита от дребезга) 
	static uint16_t BtnLongCoun;               //счетчик длинного нажатия 
	static uint8_t BtnMascLast;                //запомнить маску нажатой кнопки для анализа после отжатия кнопки 

	unsigned uint8_t BtnMask = 0;  
	if (~BTN_PIN & BTN_LINE1) 	BtnMask = BTN_SHRT1;//формирование маски нажатых кнопок
	if (~BTN_PIN & BTN_LINE2) 	BtnMask = BTN_SHRT2;
	if (~BTN_PIN & BTN_LINE3) 	BtnMask = BTN_SHRT3;
	if (~BTN_PIN & BTN_LINE4) 	BtnMask = BTN_SHRT4;

	//основной алгоритм обработки событий кнопки 
	if (BtnMask){                               //клавиша нажата 
		BtnMascLast = BtnMask;                  //запоминаем для использования после отпускания кнопки 

		if (BtnLockCoun < (BTN_LOCK_TIME)){ 
			BtnLockCoun++;                      //обработка дребезга 
			return; 
		} 

		BtnLockBit=1;                           //нажатие зафиксировано      
		if (BtnLongCoun >= (BTN_LONG_TIME))                                
			return; 
		
		if (++BtnLongCoun >= (BTN_LONG_TIME)) 
			BtnFlags |= (BtnMask << 4);         //установка бита длинного нажатия (старшие 4 бита флагов) 
	} 

	else{                                       //клавиша отжата             
		if (BtnLockCoun){                       //обработка дребезга 
			BtnLockCoun --; 
			return; 
		} 

		if (! BtnLockBit)                     	//отжатие зафиксировано 
			return; 

		BtnLockBit =0; 
		if (BtnLongCoun < (BTN_LONG_TIME)) 
			BtnFlags |= BtnMascLast;            //установка бита короткого нажатия (младшие 4 бита флагов) 
		
		BtnLongCoun = 0; 
	} 
} 


//чтени маски нажатых кнопок  
//возвращает маску нажатых кнопок (бит 0-3 - коротк нажат, бит 4-7 - длинн нажат) 
uint8_t BtnGet (void)                               
{    
    uint8_t temp = BtnFlags; 
    BtnFlags = 0; 
    return temp; 
}



button = BtnGet();				//читаем значение кнопок

if (button == BTN_SHRT1) {}
if (button == BTN_SHRT2) {}
if (button == BTN_SHRT3) {}
if (button == BTN_SHRT4) {}

if (button == BTN_LONG1) {}
if (button == BTN_LONG2) {}
if (button == BTN_LONG3) {}
if (button == BTN_LONG4) {}
Энкодер прикрутить
Спойлер

Код: Выделить всё

// Посмотреть относительное перемещение (по сравнению с прошлым вызовом)
int16_t enc_GetRelativeMove(void)
{
	// Для хранения предыдущего значения счетчика
	static uint16_t CNT_last = 0;
	// Текущее значение, чтоб только один раз было запрошено
	uint16_t CNT_now = TIM3->CNT;
	// Посчитаем перемещение
	int16_t  CNT_diff = (int16_t)(CNT_now - CNT_last);
	// Сохраним текущее значение как предыдущее
	CNT_last = CNT_now;
	// Вернем перемещение
	return CNT_diff;
}

temp = (int8_t)enc_GetRelativeMove();

if (temp < 0) { - temp }
if (temp > 0) { + temp }
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Eddy_Em »

Dimon456, ну кто ж пишет комментарии на русском? Это же вообще ниже плинтуса!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Аlex »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4164988#p4164988"]Dimon456, ну кто ж пишет комментарии на русском?[/uquote]Наверное тот, кто хорошо им владеет ? :shock:
Это же вообще ниже плинтуса!
Такая реакция, как будто он на арабском написал :)))
Реклама
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Dimon456 »

Наверное проблемы с кодировкой.

Мне нравится микро-меню на конечных автоматах
Спойлервзял тупо вот так вот натыкал
Изображение
на выходе получаем что-то вроде

Код: Выделить всё

// Menus	Name	| Next	| Prev	| Parent	| Child	| SelectFunction
MENU_ITEM(m_0, m_1, null_menu, null_menu, null_menu, STANDART_SCREEN);	// STANDART_SCREEN
MENU_ITEM(m_1, m_2, null_menu, null_menu, null_menu, POWER);			// POWER
MENU_ITEM(m_2, m_3, null_menu, null_menu, null_menu, CHARGE);			// CHARGE
MENU_ITEM(m_3, m_4, null_menu, null_menu, null_menu, OPERATION);		// OPERATION
MENU_ITEM(m_4, m_0, null_menu, null_menu, null_menu, TIME);				// TIME
MENU_ITEM(m_5, m_7, null_menu, m_6, m_6, SETTING_ENTER);				// SETTING_ENTER
MENU_ITEM(m_6, null_menu, null_menu, m_5, m_5, CLEER_PARAMETRS);		// CLEER_PARAMETRS
MENU_ITEM(m_7, m_13, m_5, m_8, m_10, CALIBRATIONS_DEVICES);				// CALIBRATIONS_DEVICES
MENU_ITEM(m_8, m_11, null_menu, m_9, m_7, UMAX_LIMIT);					// UMAX_LIMIT
MENU_ITEM(m_9, m_12, null_menu, m_10, m_8, IMAX_LIMIT);					// IMAX_LIMIT
MENU_ITEM(m_10, null_menu, null_menu, m_7, m_9, SAVE_SETTINGS);			// SAVE_SETTINGS
MENU_ITEM(m_11, null_menu, m_8, null_menu, null_menu, UMAX_LIMIT_1);	// UMAX_LIMIT_1
MENU_ITEM(m_12, null_menu, m_9, null_menu, null_menu, IMAX_LIMIT_1);	// IMAX_LIMIT_1
MENU_ITEM(m_13, m_15, null_menu, m_14, m_14, CALIBRATION_VOLTMETR);		// CALIBRATION_VOLTMETR
MENU_ITEM(m_14, m_17, null_menu, m_13, m_13, CALIBRATION_AMPERMETR);	// CALIBRATION_AMPERMETR
MENU_ITEM(m_15, m_16, m_13, null_menu, null_menu, VOLTMETR_1);			// VOLTMETR_1
MENU_ITEM(m_16, m_15, m_15, null_menu, null_menu, VOLTMETR_2);			// VOLTMETR_2
MENU_ITEM(m_17, m_18, m_14, null_menu, null_menu, AMPERMETR_1);			// AMPERMETR_1
MENU_ITEM(m_18, m_17, m_17, null_menu, null_menu, AMPERMETR_2);			// AMPERMETR_2
и даже не задумываясь над этим.

Мне продолжать?
Реклама
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32 cubeide два инкремента не совместимы.

Сообщение ivan dimir »

[uquote="Dimon456",url="/forum/viewtopic.php?p=4165062#p4165062"]Наверное проблемы с кодировкой.

Мне нравится микро-меню на конечных автоматах
Спойлервзял тупо вот так вот натыкал
Изображение
на выходе получаем что-то вроде

Код: Выделить всё

// Menus	Name	| Next	| Prev	| Parent	| Child	| SelectFunction
MENU_ITEM(m_0, m_1, null_menu, null_menu, null_menu, STANDART_SCREEN);	// STANDART_SCREEN
MENU_ITEM(m_1, m_2, null_menu, null_menu, null_menu, POWER);			// POWER
MENU_ITEM(m_2, m_3, null_menu, null_menu, null_menu, CHARGE);			// CHARGE
MENU_ITEM(m_3, m_4, null_menu, null_menu, null_menu, OPERATION);		// OPERATION
MENU_ITEM(m_4, m_0, null_menu, null_menu, null_menu, TIME);				// TIME
MENU_ITEM(m_5, m_7, null_menu, m_6, m_6, SETTING_ENTER);				// SETTING_ENTER
MENU_ITEM(m_6, null_menu, null_menu, m_5, m_5, CLEER_PARAMETRS);		// CLEER_PARAMETRS
MENU_ITEM(m_7, m_13, m_5, m_8, m_10, CALIBRATIONS_DEVICES);				// CALIBRATIONS_DEVICES
MENU_ITEM(m_8, m_11, null_menu, m_9, m_7, UMAX_LIMIT);					// UMAX_LIMIT
MENU_ITEM(m_9, m_12, null_menu, m_10, m_8, IMAX_LIMIT);					// IMAX_LIMIT
MENU_ITEM(m_10, null_menu, null_menu, m_7, m_9, SAVE_SETTINGS);			// SAVE_SETTINGS
MENU_ITEM(m_11, null_menu, m_8, null_menu, null_menu, UMAX_LIMIT_1);	// UMAX_LIMIT_1
MENU_ITEM(m_12, null_menu, m_9, null_menu, null_menu, IMAX_LIMIT_1);	// IMAX_LIMIT_1
MENU_ITEM(m_13, m_15, null_menu, m_14, m_14, CALIBRATION_VOLTMETR);		// CALIBRATION_VOLTMETR
MENU_ITEM(m_14, m_17, null_menu, m_13, m_13, CALIBRATION_AMPERMETR);	// CALIBRATION_AMPERMETR
MENU_ITEM(m_15, m_16, m_13, null_menu, null_menu, VOLTMETR_1);			// VOLTMETR_1
MENU_ITEM(m_16, m_15, m_15, null_menu, null_menu, VOLTMETR_2);			// VOLTMETR_2
MENU_ITEM(m_17, m_18, m_14, null_menu, null_menu, AMPERMETR_1);			// AMPERMETR_1
MENU_ITEM(m_18, m_17, m_17, null_menu, null_menu, AMPERMETR_2);			// AMPERMETR_2
и даже не задумываясь над этим.

Мне продолжать?
[/uquote]
MENU_ITEM-это что постоянная?А через указатель как сделать меню?
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: stm32 cubeide два инкремента не совместимы.

Сообщение AlanDrakes »

MENU_ITEM() - может оказаться макросом, результатом которого будет константа, которая хранится во Flash памяти как статический массив. Удобно. У себя я сделал через структуры:

Код: Выделить всё

typedef struct ScreenItem {
	SCREEN_OBJECT obj_type;				// Element type
	char *menu_text;				// Menu text link
	void (*exec_func)(uint8_t v);			// Menu callback or null
	uint16_t Left, Top, Width, Height;		// Coordinates of menu item	
	int TextColor, BGColor;				// Colors
	const uint8_t *Pictogramm;			// Pointer to pictogramm, or NULLPTR
} ScreenItem_t;

ScreenItem_t Scr1_Button2 = {SO_BUTTON, "ADC", *TestPress2, 0, 54, 32, 32, COLOR_LIME, COLOR_BLACK, NULLPTR};
ScreenItem_t Scr1_Button8 = {SO_BUTTON, "Voltage", *VScreenItem_t ScrTDR_Sw = {SO_BUTTON + SO_ADJUSTABLE, "<- Pairs ->", *TDR_SwitchPairs, 132, 200, 134, 21 ,COLOR_LIME, COLOR_BLACK, NULLPTR};
ScreenItem_t ScrTDR_quit = {SO_BUTTON, "Exit", *TDR_Exit, 269, 200, 50, 21, COLOR_LIME, COLOR_BLACK, NULLPTR};
oltageTest_CB, 180, 54, 90, 32, COLOR_LIME, COLOR_BLACK, NULLPTR};
ScreenItem_t ScrSett_BrLVL = {SO_BUTTON + SO_ADJUSTABLE, "BackLight", *BLPress_CallBack, 0, 51, 110, 35, COLOR_WHITE, COLOR_BLACK, NULLPTR};
Опять же, это для графического меню с указателями и красивостями.
После этого элементы объединяются в массивы указателей на кнопки, а на массивы указателей ссылаются экраны.

Ну это так, к слову.

ScanButtons(); - удобная абстракция, чтобы основной цикл не раздувался, был компактнее и проще в отладке. В моём коде эта функция проходится по пинам, проверяет их состояние, работает с таймерами и вызывает обработчики событий нажатия кнопки. Так же может вызывать событие удержания кнопки (но это в другом устройстве было сделано).
И получаем следующее:
main -> while(1) -> Scanuttons() -> OnButtonPress(n) -> SomeFunc[n]();
В другом проекте всё происходит не столь тривиально, но это другая история.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Eddy_Em »

Аlex, уважающий себя человек не будет в коде писать комментарии на языке, отличном от английского! Ведь это будет означать, что 99.9% населения Шарика комментарии не поймут.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Аlex »

Eddy_Em, смотря для чего эти комментарии пишутся. Если я пишу для себя, то я буду их писать на своём родном языке. И мне пофиг, поймёт там кто их, или нет.
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Eddy_Em »

Аlex, но тогда не выкладывай это на всеобщее обозрение! Некошерно же!!!
И вообще, идеал - когда в исходниках нет символов выше 127 символов ASCII.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: stm32 cubeide два инкремента не совместимы.

Сообщение VladislavS »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4165184#p4165184"]И вообще, идеал - когда в исходниках нет символов выше 127 символов ASCII.[/uquote]Обоснуй. А то может я всю жизнь всё неправильно делал?
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Аlex »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4165184#p4165184"]Аlex, но тогда не выкладывай это на всеобщее обозрение![/uquote]Да не выдумывай.
Твои фразы звучат как "Не пишите тут на форуме на Русском языке ! Это ниже плинтуса !".
tonyk
Это не хвост, это антенна
Сообщения: 1309
Зарегистрирован: Вт ноя 19, 2019 06:10:18

Re: stm32 cubeide два инкремента не совместимы.

Сообщение tonyk »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4165175#p4165175"]Аlex, уважающий себя человек не будет в коде писать комментарии на языке, отличном от английского! Ведь это будет означать, что 99.9% населения Шарика комментарии не поймут.[/uquote]
Дядя Эдик в своём репертуаре: пятничное обострение максимализма и перфекционизма вкупе с заносами на поворотах. Не обращайте внимание, воспаление пройдёт вместе с пятницей. Пора уже привыкнуть и не реагировать, а то вы своими комментами только возбуждаете у него приступ. :)))
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение AVI-crak »

Нафлудили-то аж на пять страниц, при это самое главное пропустили - Иван начал осваивать логику. Это уже прогресс, хотя и кривой как всё что он пишет. От детских болезней так и не избавился. Я пытался разговорить его, где он брал ресурсы для обучения - с целью заблокировать заразу, но Иван молчит как партизан.
Вот сейчас опять уйдёт в анабиоз на пару месяцев, а потом выкатит очередной шедевр, от которого мозги плавятся.
Аватара пользователя
AlanDrakes
Прорезались зубы
Сообщения: 236
Зарегистрирован: Пн июл 04, 2016 16:51:22
Откуда: Россия, Омск

Re: stm32 cubeide два инкремента не совместимы.

Сообщение AlanDrakes »

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=4165184#p4165184"]Аlex, но тогда не выкладывай это на всеобщее обозрение! Некошерно же!!!
И вообще, идеал - когда в исходниках нет символов выше 127 символов ASCII.[/uquote]
И тут у меня пошли флэшбеки китайских исходников с индусскими корнями.
Для себя пишу от настроения - на русском и на английском. Перемежая их время от времени.
По большей части никому мой код не нужен, а сам разберусь потом.
Dimon456
Мудрый кот
Сообщения: 1849
Зарегистрирован: Вс дек 25, 2016 08:34:54

Re: stm32 cubeide два инкремента не совместимы.

Сообщение Dimon456 »

В чем то "Дядя Эдик" прав, рано или поздно IDE сломает этот коммент, да так сломает, что потом не возможно будет восстановить. Это факт.
AVI-crak писал(а):а потом выкатит очередной шедевр, от которого мозги плавятся.
Вот так вот не надо говорить, чего стоит только вот этот шедевр
Спойлер

Код: Выделить всё

// threshold in ms for press/hold
#define PRESSTHRESHOLD  (9)
#define HOLDTHRESHOLD   (199)

// events
typedef enum{
    EVT_NONE,   // no events with given key
    EVT_PRESS,  // pressed
    EVT_HOLD,   // hold more than KEY_HOLDTIME ms
    EVT_RELEASE // released
} keyevent;
		
		uint16_t d = (uint16_t)(Tms - lastT);
        keybase *k = &allkeys[i];
        keyevent e = k->event;

            switch(e){
                case EVT_NONE: // just pressed
                case EVT_RELEASE:
                    if((k->counter += d) > PRESSTHRESHOLD)
                        k->event = EVT_PRESS;
                break;
                case EVT_PRESS: // hold
                    if((k->counter += d)> HOLDTHRESHOLD)
                        k->event = EVT_HOLD;
                break;
                default:
                break;
            }
вот от него точно будут не только мозги плавиться, но и еще кое что за плавится. Или может вы считаете что у других интеллект равносильный вашему?
А с чего вы начинали? Ответьте мне на вопрос. Случайно не с такого же шедевра, как у ТС? Или может сразу начали с методов эффективного программирования?

Ни кто не ответил на его вопрос
ivan dimir писал(а):А через указатель как сделать меню?
Там везде указатели используются, куда не плюнь.
ivan dimir существует много разновидностей этих микро-меню, инет кишит ими, даже на asm есть, правда для avr.
По степени управления различаются от одной кнопки. две кнопки, три кнопки, до целых клавиатур.
Но либо так не подходит, либо эдак, либо слишком заумно сделано, хотя подробная инструкция имеется.

В моем меню
Спойлер

Код: Выделить всё

	typedef const struct Menu_Item {
		const struct Menu_Item *Next; /**< указатель на следующий пункт меню этого пункта меню */
		const struct Menu_Item *Previous; /**< указатель на предыдущий пункт меню этого пункта меню */
		const struct Menu_Item *Parent; /**< указатель на родительский пункт меню этого пункта меню */
		const struct Menu_Item *Child; /**< указатель на дочерний пункт меню этого пункта меню */
		void (*SelectCallback)(void); /**< указатель на функцию */
	} Menu_Item_t;

Код: Выделить всё

MENU_ITEM(m_0, m_1, null_menu, null_menu, null_menu, STANDART_SCREEN);	// STANDART_SCREEN
к каждому пункту привязана своя функция, к примеру

Код: Выделить всё

STANDART_SCREEN();
я ее могу наполнить так, как захочу, наполнить теми данными какими мне надо.

В коде я отслеживаю в каком пункте меню нахожусь и выполняю с ним те действия которые требуется

Код: Выделить всё

id = menu->SelectCallback;
Спойлер

Код: Выделить всё

        if (button == BTN_SHRT3) {
        	if(id == SETTING_ENTER) { lcd_clear(); Menu_Navigate(MENU_CHILD); }
        	if(id == CLEER_PARAMETRS) { lcd_clear(); Menu_Navigate(MENU_CHILD); }
        	if(id == CALIBRATIONS_DEVICES) { lcd_clear(); Menu_Navigate(MENU_CHILD); }
        	if(id == UMAX_LIMIT || id == IMAX_LIMIT) { lcd_clear(); Menu_Navigate(MENU_CHILD); }

        	if(id==CALIBRATION_VOLTMETR || id==CALIBRATION_AMPERMETR) { lcd_clear(); Menu_Navigate(MENU_CHILD); }

        	if(id==STANDART_SCREEN || id==POWER || id==CHARGE || id==OPERATION || id==TIME) {
                if (U_I == 0) { x_pwm_1 -=10; }
                if (U_I == 1) { x_pwm_2 -=10; }
        	}
Читаемо это, не читаемо, да ... с высокой горки.
Минус - большой размер кода. Плюс - практично и эффективно.
Если пример нужен, могу дать.
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение AVI-crak »

Dimon456 писал(а):А с чего вы начинали? Ответьте мне на вопрос. Случайно не с такого же шедевра, как у ТС? Или может сразу начали с методов эффективного программирования?
Да так-же как все, с моргалки светодиодом. Разница в том что мне были интересны внутренности мк, отчего пришлось изучать документацию и множество примеров. К тому-же выбранная IDE сразу демонстрировала код в асме при пошаговом режиме - это дало стимул писать не так как в примерах, а после - вообще не так.
Мериться мозгами желания не имею, тут без меня желающих навалом - у каждого второго и длинше и ширше, и вообще иного цвета.
ivan dimir
Мучитель микросхем
Сообщения: 440
Зарегистрирован: Вс дек 29, 2019 08:05:21

Re: stm32 cubeide два инкремента не совместимы.

Сообщение ivan dimir »

Вот мой код по изменению инкремента.С борьбой дребезга контактов.
Спойлер

Код: Выделить всё

		               if(READ_BIT(GPIOB->IDR,GPIO_IDR_IDR_5)==0)
						  {
				        	  // delay_ms(10);
		            	   pauza++;
						  			if(pauza>200)
						  			{

						  				flag=1;

						  			}
						  		//	pauza++;


						  	}

		               else

		               {
		            	   pauza2++;

		            	  //. flag=0;
		            	   if(pauza2>200)
		            	   {

		            		   flag1=1;

		            	   }
		            	  // pauza2++;

		               }


						     if(flag==1&&flag1==1)
						    {
						    	// delay_ms(10);
							  flag=0;
							  flag1=0;
							  pauza=0;
							  pauza2=0;
							  menu_lcd++;
							  menu_btn++;

						    }
Аватара пользователя
AVI-crak
Прорезались зубы
Сообщения: 202
Зарегистрирован: Сб янв 09, 2016 15:51:17
Контактная информация:

Re: stm32 cubeide два инкремента не совместимы.

Сообщение AVI-crak »

Иван, научись не использовать условия, ну или максимально сокращать их до простейшей математики.
Ну и с форматированием текста немного поработать нужно. Почти все IDE имеют кнопку "сделать красиво" - форматируют код.
Пришлось твой код в кучу собирать, а то так и косоглазие получить можно.
Спойлер

Код: Выделить всё

 if(READ_BIT(GPIOB->IDR,GPIO_IDR_IDR_5)==0)
    {
        pauza++;
        if(pauza>200)flag=1;
    }else
    {
        pauza2++;
        if(pauza2>200) flag1=1;
    };
  if((flag==1)&&(flag1==1))
    {
        flag=0;
        flag1=0;
        pauza=0;
        pauza2=0;
        menu_lcd++;
        menu_btn++;
    };
	
/// чем-то выполнять каждую 1мс
    uint32_t tmp;
    tmp = (GPIOB->IDR >> 5) & 1; // масса кнопки Vcc
    tmp = 1 - tmp; //  масса кнопки Gnd
    pauza = pauza * tmp + tmp; // 255 раз подряд единица
    tmp = pauza >> 5; // > 255 
    tmp = 1 - tmp;
    pauza *= tmp; // условие обнуляет pauza
    if (tmp == 0) 
    {
        menu_lcd++;
        menu_btn++;
    };
  
Умножения, сдвиги, сложения и вычитания - все эти команды выполняются за один такт.
Один условный оператор тормозит выполнение программы на 1-12 тактов.
Вообще-то антидребезг выполняется гораздо проще, но если уж хочется...
Ответить

Вернуться в «ARM»