Перейти к содержанию
    

stm32F1 аппаратный энкодер

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

 

Модератор: нет нужды писать жирным шрифтом всё сообщение!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

причем тут энкодер? значение таймера при аппаратном считывании энкодера увеличивается/уменьшается при вращении, а уж что с ним, значением, дальше делать это личный код каждого.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 02.07.2023 в 12:44, mitya1698 сказал:

причем тут энкодер? значение таймера при аппаратном считывании энкодера увеличивается/уменьшается при вращении, а уж что с ним, значением, дальше делать это личный код каждого.

Ну а как правильно настроить код что бы сохранялось предыдущая переменная? Алгоритм?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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=&par;
  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;

		}
	}
}
Вот этот код рабочий.Он переработан мной.Прошу обяснения.

 

Модератор: прячьте длинный код под спойлер!

Изменено пользователем dimir
Я спрятал длинный код под сплоер

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Модератор: @dimir, я уже Вас предупреждал, что писать свои вопросы необходимо внятно. Сейчас они снова похожи больше на флейм.

А сейчас отвечу уже как обычный пользователь, не модератор. Вот смотрю я Ваш листинг, и у меня создаётся ощущение, что Ваши вопросы - последствия не очень хорошего владения языком программирования. Об этом говорит обилие ключевых слов volatile в коде, посимвольный вывод строк на дисплей и т.п.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 02.07.2023 в 19:13, haker_fox сказал:

Модератор: @dimir, я уже Вас предупреждал, что писать свои вопросы необходимо внятно. Сейчас они снова похожи больше на флейм.

А сейчас отвечу уже как обычный пользователь, не модератор. Вот смотрю я Ваш листинг, и у меня создаётся ощущение, что Ваши вопросы - последствия не очень хорошего владения языком программирования. Об этом говорит обилие ключевых слов volatile в коде, посимвольный вывод строк на дисплей и т.п.

Да я и русский то  не очень.А чем вам не нравится volatile?.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...