dimir 2 2 июля, 2023 Опубликовано 2 июля, 2023 · Жалоба У меня возникло пару вопросов по аппаратному энкодеру.Програмный энкодер всё хорошо пошёл.Но вот с аппаратным незадача.Вхожу я в определённое меню и кручу энкодер сохраняя значения в оперативке в переменной.Вхожу я в следующее меню .А значения не обнуляются а сохраняются вчём загвоздка? Модератор: нет нужды писать жирным шрифтом всё сообщение! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 133 2 июля, 2023 Опубликовано 2 июля, 2023 · Жалоба вкоде 1 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 2 июля, 2023 Опубликовано 2 июля, 2023 · Жалоба А принцип этого кода ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 133 2 июля, 2023 Опубликовано 2 июля, 2023 · Жалоба Тот же что и в программном. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 2 июля, 2023 Опубликовано 2 июля, 2023 · Жалоба причем тут энкодер? значение таймера при аппаратном считывании энкодера увеличивается/уменьшается при вращении, а уж что с ним, значением, дальше делать это личный код каждого. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 2 июля, 2023 Опубликовано 2 июля, 2023 · Жалоба В 02.07.2023 в 12:44, mitya1698 сказал: причем тут энкодер? значение таймера при аппаратном считывании энкодера увеличивается/уменьшается при вращении, а уж что с ним, значением, дальше делать это личный код каждого. Ну а как правильно настроить код что бы сохранялось предыдущая переменная? Алгоритм? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
mitya1698 18 2 июля, 2023 Опубликовано 2 июля, 2023 · Жалоба a = b; p.s. лето - экстрасенсы в отпусках. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 2 июля, 2023 Опубликовано 2 июля, 2023 (изменено) · Жалоба Spoiler #include"main.h" #include<stdio.h> #define SYSCLOCK 72000000U __IO uint32_t tmpreg; __IO uint32_t SysTick_CNT = 0; //volatile uint16_t adc_data=0; uint16_t txData[255]; __IO uint8_t fl_adc; volatile uint16_t adc_data[4]={0}; uint16_t NewState,OldState,Vol,upState,downState; volatile unsigned char sec,min,hour,day,date,month,year; volatile unsigned char menu_btn; volatile unsigned char menu_lcd; uint8_t status; uint8_t dt[8]; uint16_t raw_temper; float temper; char c; struct { volatile uint16_t Ua; volatile uint16_t Ub; volatile uint16_t Uc; volatile uint16_t Ia; volatile uint16_t Ib; volatile uint16_t Ic; }par,*par_p; char buf0[20]; char buf1[20]; char buf2[20]; char buf3[20]; char buf4[20]; char buf5[20]; char buf6[20]; char buf7[20]; char buf8[20]; char buf9[50]; char buf10[50]; volatile unsigned char flag=0; volatile unsigned char flag1=0; volatile unsigned int pauza; //uint16_t a; volatile unsigned int pauza1=0; volatile unsigned char flag2=0; volatile unsigned char flag3=0; volatile unsigned int pauza2=0; volatile unsigned int pauza3=0; volatile unsigned char a1; volatile unsigned char a2; volatile unsigned char b1; volatile unsigned char b2; volatile unsigned char c1; volatile unsigned char c2; volatile unsigned char d1; volatile unsigned char d2; volatile unsigned int a; volatile unsigned int b; volatile unsigned int d; unsigned int result_a; unsigned int result_b; unsigned int result_c; unsigned int result_d; uint8_t BAT1 [8]= { 0B01110, 0B01010, 0B11111, 0B10001, 0B10001, 0B10001, 0B10001, 0B11111 }; uint8_t BAT2 [8]= { 0B01110, 0B01010, 0B11111, 0B10001, 0B10001, 0B10001, 0B11111, 0B11111 }; uint8_t BAT3 [8]= { 0B01110, 0B01010, 0B11111, 0B10001, 0B10001, 0B11111, 0B11111, 0B11111 }; uint8_t BAT4 [8]= { 0B01110, 0B01010, 0B11111, 0B10001, 0B11111, 0B11111, 0B11111, 0B11111 }; uint8_t BAT5 [8]= { 0B01110, 0B01010, 0B11111, 0B11111, 0B11111, 0B11111, 0B11111, 0B11111 }; struct { volatile unsigned char a1; volatile unsigned char a2; volatile unsigned char b1; volatile unsigned char b2; volatile unsigned char c1; volatile unsigned char c2; volatile unsigned char d1; volatile unsigned char d2; unsigned short int a; unsigned short int b; unsigned short int c; unsigned short int d; unsigned int result_a; unsigned int result_b; unsigned int result_c; unsigned int result_d; volatile unsigned char MA[10]; }danie; struct { volatile unsigned char menu_btn; volatile unsigned char menu_lcd; char buf0[50]; char buf1[50]; char buf2[50]; char buf3[50]; char buf4[50]; char buf5[50]; char buf6[50]; char buf7[50]; char buf8[50]; char buf9[50]; char buf10[50]; char buf11[50]; char buf12[50]; volatile unsigned char flag; volatile unsigned char flag1; volatile unsigned int pauza0; volatile unsigned int pauza1; volatile unsigned int pauza2; volatile unsigned int pauza3; volatile unsigned char flag2; volatile unsigned char flag3; volatile unsigned char flag4; volatile unsigned char flag5; volatile unsigned char flag6; volatile unsigned char flag7; volatile unsigned char flag8; volatile unsigned char flag_eeprom_error; volatile unsigned char flag_eeprom; volatile unsigned char flag_obriv_a; volatile unsigned char flag_obriv_b; volatile unsigned char flag_obriv_c; volatile unsigned char bit_obriv_a; volatile unsigned char bit_obriv_b; volatile unsigned char bit_obriv_c; volatile unsigned char flag_port_peregruz; volatile unsigned char bit_status_A; volatile unsigned char bit_status_B; volatile unsigned char bit_status_C; volatile unsigned char bit_status_D; volatile unsigned int a; volatile unsigned int b; volatile unsigned int c; volatile unsigned int d; volatile unsigned int count; }nastroyki,*nastroyki_n; struct { volatile unsigned int pauza1; } timer; struct { volatile unsigned int pauza1_A; volatile unsigned int pauza1_B; volatile unsigned int pauza1_C; volatile unsigned int pauza1_D; }timers; void DMA1_Channel1_IRQHandler (void) { if(DMA1->ISR & DMA_ISR_TCIF1) { DMA1->IFCR|= DMA_IFCR_CTCIF1; } if(DMA1->ISR& DMA_ISR_TEIF1) { DMA1->IFCR|= DMA_IFCR_CTEIF1; } } void DMA1_Channe4_IRQHandler (void) { if(DMA1->ISR& DMA_ISR_TCIF4) { DMA1->IFCR|= DMA_IFCR_CTCIF4; } if(DMA1->ISR& DMA_ISR_TEIF4) { DMA1->IFCR|= DMA_IFCR_CTEIF4; } } void TIM1_UP_IRQHandler(void) { if(TIM1->SR & TIM_SR_UIF) { TIM1->SR &= ~ TIM_SR_UIF; /* switch(nastroyki_n->menu_btn) { case 0: a=TIM3->CNT; a++; break; case 1: break; case 2: break; case 3: break; case 4: nastroyki_n->menu_btn=0; break; } */ } } void TIM2_IRQHandler (void) { if(TIM2->SR & TIM_SR_UIF) { TIM2->SR &= ~ TIM_SR_UIF; IWDG->KR = 0xAAAA; if((GPIOB->IDR&GPIO_IDR_IDR5)==0) { //nastroyki.flag1=1; // TIM3->CNT=0; nastroyki_n->flag=1; //nastroyki_n->pauza1++; //pauza1=0; } if(nastroyki_n->flag==1) { nastroyki_n->pauza1++; } if(nastroyki_n->pauza1==10) { nastroyki_n-> menu_lcd++; nastroyki_n-> menu_btn++; // menu_btn++; } if(GPIOB->IDR&GPIO_IDR_IDR5) { nastroyki_n->flag=0; nastroyki_n->pauza1=0; } /* if((nastroyki_n->flag==1)&&(GPIOB->IDR&GPIO_IDR_IDR5)&&(nastroyki_n->pauza1>10)&&(nastroyki_n->pauza1<100)) { nastroyki_n->flag=0; // nastroyki.flag1=0; nastroyki_n->pauza1=0; //nastroyki.pauza=0; nastroyki_n-> menu_lcd++; menu_btn++; } if((nastroyki_n->flag==1)&&(GPIOB->IDR&GPIO_IDR_IDR5)&&(nastroyki_n->pauza1>100)) { nastroyki_n->flag=0; //nastroyki.flag1=0; nastroyki_n->pauza1=0; nastroyki_n-> menu_lcd=0; menu_btn=0; } */ } } void TIM3_IRQHandler (void) { if(TIM3->SR & TIM_SR_UIF) { TIM3->SR &= ~ TIM_SR_UIF; } } void TIM4_IRQHandler (void) { if(TIM4->SR & TIM_SR_UIF) { TIM4->SR &= ~ TIM_SR_UIF; pauza++; //IWDG->KR = 0xAAAA; if(pauza==40) { // GPIOA-> BSRR |=GPIO_BSRR_BS5; GPIOC->ODR|=GPIO_ODR_ODR13; } if(pauza==80) { GPIOC->ODR&=~GPIO_ODR_ODR13; // GPIOA-> BSRR |=GPIO_BSRR_BR5; pauza=0; } } } void SysTick_Handler(void) { if(SysTick_CNT > 0) SysTick_CNT--; } void init_systimer(void) { MODIFY_REG(SysTick->LOAD,SysTick_LOAD_RELOAD_Msk,SYSCLOCK / 1000 - 1); CLEAR_BIT(SysTick->VAL, SysTick_VAL_CURRENT_Msk); SET_BIT(SysTick->CTRL, SysTick_CTRL_CLKSOURCE_Msk | SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk); } void delay(__IO uint32_t tck) { while(tck) { tck--; } } //---------------------------------------------------------- void delay_ms(__IO uint32_t ms) { MODIFY_REG(SysTick->VAL,SysTick_VAL_CURRENT_Msk,SYSCLOCK / 1000 - 1); SysTick_CNT = ms; while(SysTick_CNT) {} } void DelayMicro(__IO uint32_t micros) { micros *=(SystemCoreClock / 1000000) / 9; while (micros--); } void NMI_Handler(void) { if((RCC->CIR & RCC_CIR_CSSF) != 0) // HSE fail { RCC->CIR |= RCC_CIR_CSSC; // Clear CSSF flag } } void RCC_init(void) { FLASH->ACR |=FLASH_ACR_PRFTBE ; FLASH->ACR|=FLASH_ACR_LATENCY_2; RCC->CR |=RCC_CR_HSEON ; while(!(RCC->CR&RCC_CR_HSERDY )) { } RCC->CR |=RCC_CR_CSSON ; RCC->CFGR|=RCC_CFGR_PLLSRC; RCC->CFGR|=RCC_CFGR_PLLXTPRE_HSE; RCC->CFGR|=RCC_CFGR_PLLMULL9; RCC->CFGR|=RCC_CFGR_HPRE_DIV1; //_VAL2FLD(RCC_CFGR_HPRE,1); RCC->CFGR|=RCC_CFGR_PPRE1_DIV2 ;//_VAL2FLD(RCC_CFGR_PPRE1,2); RCC->CFGR|=RCC_CFGR_PPRE2_DIV1; //_VAL2FLD(RCC_CFGR_PPRE2,1); RCC->CFGR|= RCC_CFGR_ADCPRE_DIV6; RCC->CR|=RCC_CR_PLLON; while(!(RCC->CR&RCC_CR_PLLRDY)) { } RCC->CFGR|=RCC_CFGR_SW_PLL; while(!(RCC->CFGR&RCC_CFGR_SWS_PLL )) { } } void WWDT_init(void) { RCC->APB1ENR =RCC_APB1ENR_WWDGEN; WWDG->CFR|=_VAL2FLD(WWDG_CFR_WDGTB,0); WWDG->CFR|=WWDG_CFR_EWI; } void IWDT_init(void) { RCC->CSR|= RCC_CSR_LSION; //while(!(RCC->CSR &RCC_CSR_LSIRDY )); IWDG->KR =0x5555; IWDG->PR|= _VAL2FLD(IWDG_PR_PR,0); // IWDG->PR &=~(IWDG_PR_PR_2|IWDG_PR_PR_1|IWDG_PR_PR_0); // 4096 IWDG->RLR =3000;//0x7FF; while (!((IWDG->SR & IWDG_SR_PVU) && (IWDG->SR & IWDG_SR_RVU))){} // wait while bist of PVU and RVU will be set. IWDG->KR =0xCCCC; // Start count down; } int main(void) { //nastroyki_n->menu_lcd=0; // Timer=&timer; //par_p=∥ nastroyki_n=&nastroyki; IWDT_init(); RCC_init(); init_systimer(); APB_init(); GPIO_init(); timer_1_init(); timer_2_init(); timer3_encoder(); //timer_3_init(); timer_4_init(); // USART1_Init(); // USART1_DMA_Init(); // adc1_DMA1_init(); I2C1_Init(); //I2C2_Init(); LCD_ini(); LCD_Clear(); LCD_CreateChar(BAT1,1); LCD_CreateChar(BAT2,2); LCD_CreateChar(BAT3,3); // LCD_CreateChar( BAT4,4); LCD_CreateChar(BAT5,5); //ADC1->CR2 |= ADC_CR2_SWSTART; while(1) { //par_p->Ua=adc_data[1]; // IWDG->KR= 0xAAAA; //sprintf(nastroyki.buf0,"a=%4d",adc_data[0]); //LCD_SetPos(0,0); //LCD_String(nastroyki.buf0); //sprintf(nastroyki.buf1,"d=%4d",adc_data[1]); //LCD_SetPos(0,1); // LCD_String(nastroyki.buf1); //IWDG->KR= 0xAAAA; // LCD_SetPos(0,0); // LCD_SendChar('K'); // LCD_SendChar('p'); // LCD_SendChar('o'); // LCD_SendChar(0xBB); // LCD_SendChar(0xB8); // LCD_SendChar(0xBA); // LCD_PrintMyChar(2); switch(nastroyki_n->menu_btn) { case 0: IWDG->KR= 0xAAAA; // nastroyki_n->count=TIM3->CNT; // a++; //nastroyki_n->a=nastroyki_n->count; NewState=TIM3->CNT; if(NewState!=OldState) { nastroyki_n->a=NewState; OldState=NewState; } break; case 1: IWDG->KR= 0xAAAA; //nastroyki_n->b=TIM3->CNT; NewState=TIM3->CNT; if(NewState!=OldState) { nastroyki_n->b=NewState; OldState=NewState; } break; case 2: IWDG->KR= 0xAAAA; break; case 3: IWDG->KR= 0xAAAA; break; case 4: nastroyki_n->menu_btn=0; break; } switch(nastroyki_n->menu_lcd) { case 0: IWDG->KR= 0xAAAA; //nastroyki_n->a=TIM3->CNT; sprintf(nastroyki_n->buf0,"a=%2d ",nastroyki_n->a); LCD_SetPos(0,0); LCD_SendChar('M'); LCD_SendChar('a'); LCD_SendChar(0xBC); LCD_SendChar('a'); LCD_SendChar(' '); LCD_PrintMyChar(1); LCD_SetPos(0,1); LCD_String(nastroyki_n->buf0); break; case 1: IWDG->KR= 0xAAAA; // nastroyki_n->b=TIM3->CNT; sprintf(nastroyki_n->buf1,"b=%2d ",nastroyki_n->b); LCD_SetPos(0,0); LCD_SendChar(0xA8); LCD_SendChar('a'); LCD_SendChar(0xBE); LCD_SendChar('a'); LCD_SendChar(' '); LCD_PrintMyChar(2); LCD_SetPos(0,1); LCD_String(nastroyki_n->buf1); break; case 2: IWDG->KR= 0xAAAA; sprintf(nastroyki_n->buf2,"c=%2d ",nastroyki_n->c); LCD_SetPos(0,0); LCD_SendChar('K'); LCD_SendChar('p'); LCD_SendChar('o'); LCD_SendChar(0xBB); LCD_SendChar(0xB8); LCD_SendChar(0xBA); LCD_PrintMyChar(2); LCD_SetPos(0,1); LCD_String(nastroyki_n->buf2); break; case 3: IWDG->KR= 0xAAAA; sprintf(nastroyki_n->buf3,"d=%2d ",nastroyki_n->d); LCD_SetPos(0,0); LCD_SendChar(0xA4); LCD_SendChar('a'); LCD_SendChar(0xC7); LCD_SendChar(0xE5); LCD_SendChar(' '); LCD_PrintMyChar(5); // LCD_SendChar(0x9B); LCD_SetPos(0,1); LCD_String(nastroyki_n->buf3); break; case 4: nastroyki_n-> menu_lcd=0; break; } } } Вот этот код рабочий.Он переработан мной.Прошу обяснения. Модератор: прячьте длинный код под спойлер! Изменено 2 июля, 2023 пользователем dimir Я спрятал длинный код под сплоер Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
haker_fox 60 2 июля, 2023 Опубликовано 2 июля, 2023 · Жалоба Модератор: @dimir, я уже Вас предупреждал, что писать свои вопросы необходимо внятно. Сейчас они снова похожи больше на флейм. А сейчас отвечу уже как обычный пользователь, не модератор. Вот смотрю я Ваш листинг, и у меня создаётся ощущение, что Ваши вопросы - последствия не очень хорошего владения языком программирования. Об этом говорит обилие ключевых слов volatile в коде, посимвольный вывод строк на дисплей и т.п. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 2 июля, 2023 Опубликовано 2 июля, 2023 · Жалоба В 02.07.2023 в 19:13, haker_fox сказал: Модератор: @dimir, я уже Вас предупреждал, что писать свои вопросы необходимо внятно. Сейчас они снова похожи больше на флейм. А сейчас отвечу уже как обычный пользователь, не модератор. Вот смотрю я Ваш листинг, и у меня создаётся ощущение, что Ваши вопросы - последствия не очень хорошего владения языком программирования. Об этом говорит обилие ключевых слов volatile в коде, посимвольный вывод строк на дисплей и т.п. Да я и русский то не очень.А чем вам не нравится volatile?. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dimir 2 2 июля, 2023 Опубликовано 2 июля, 2023 · Жалоба У меня другая проблема перепрыгивают цифры.Вроде настроил филтр.Ноесть дребезг. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться