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

dimir

Участник
  • Постов

    248
  • Зарегистрирован

  • Посещение

Сообщения, опубликованные dimir


  1. у меня возникла проблема записи на 24c32n.Вернее 4 двухбайтные числа записывает и сохраняет .Я записываю а повторно вхожу в меню после ресета пишет или 255 или 476? Я так понял что проблема в адресе ячеек памяти.Что можете посоветовать.А да  найти адресацию в данной памяти и как понят.Счисление адреса.?Зарание спасибо.

    Спойлер


         I2C1->CR1&=~ I2C_CR1_POS;
             I2C1->CR1|=I2C_CR1_ACK;
            I2C1->CR1|= I2C_CR1_START ;
            while (!(I2C1->SR1& I2C_SR1_SB)){};
            (void) I2C1->SR1;
            I2C1->DR =  0b10100000 ;
            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->CR1|= I2C_CR1_START;
             while (!(I2C1->SR1& I2C_SR1_SB)){};
            (void) I2C1->SR1;
            I2C1->DR = 0b10100001;
            while (!(I2C1->SR1& I2C_SR1_ADDR)){};
            (void) I2C1->SR1;
            (void) I2C1->SR2;
            while (!(I2C1->SR1& I2C_SR1_RXNE)){};
             tm1= I2C1->DR;
             while (!(I2C1->SR1& I2C_SR1_RXNE)){};
              tm2= I2C1->DR;
             I2C1->CR1&=~I2C_CR1_ACK;
             I2C1->CR1|= I2C_CR1_STOP;

                    I2C1->CR1&=~ I2C_CR1_POS;
                     I2C1->CR1|=I2C_CR1_ACK;
                    I2C1->CR1|= I2C_CR1_START ;
                    while (!(I2C1->SR1& I2C_SR1_SB)){};
                    (void) I2C1->SR1;
                    I2C1->DR = 0b10100000;
                    while (!(I2C1->SR1& I2C_SR1_ADDR)){};
                   (void) I2C1->SR1;
                    (void) I2C1->SR2;
                    I2C1->DR = 2;
                      while (!(I2C1->SR1 & I2C_SR1_TXE)){};
                      I2C1->DR = 3;
                    while (!(I2C1->SR1 & I2C_SR1_TXE)){};
                    I2C1->CR1|= I2C_CR1_START;
                     while (!(I2C1->SR1& I2C_SR1_SB)){};
                    (void) I2C1->SR1;
                    I2C1->DR = 0b10100001;
                    while (!(I2C1->SR1& I2C_SR1_ADDR)){};
                    (void) I2C1->SR1;
                    (void) I2C1->SR2;
                    while (!(I2C1->SR1& I2C_SR1_RXNE)){};
                       b1= I2C1->DR;
                     while (!(I2C1->SR1& I2C_SR1_RXNE)){};
                        b2= I2C1->DR;
                     I2C1->CR1&=~I2C_CR1_ACK;
                     I2C1->CR1|= I2C_CR1_STOP;

                     I2C1->CR1&=~ I2C_CR1_POS;
                     I2C1->CR1|=I2C_CR1_ACK;
                    I2C1->CR1|= I2C_CR1_START ;
                    while (!(I2C1->SR1& I2C_SR1_SB)){};
                    (void) I2C1->SR1;
                    I2C1->DR =0b10100000;
                    while (!(I2C1->SR1& I2C_SR1_ADDR)){};
                   (void) I2C1->SR1;
                    (void) I2C1->SR2;
                    I2C1->DR= 4;
                      while (!(I2C1->SR1 & I2C_SR1_TXE)){};
                      I2C1->DR= 5;
                    while (!(I2C1->SR1 & I2C_SR1_TXE)){};
                    I2C1->CR1|= I2C_CR1_START;
                     while (!(I2C1->SR1& I2C_SR1_SB)){};
                    (void) I2C1->SR1;
                    I2C1->DR = 0b10100001;
                    while (!(I2C1->SR1& I2C_SR1_ADDR)){};
                    (void) I2C1->SR1;
                    (void) I2C1->SR2;
                    while (!(I2C1->SR1& I2C_SR1_RXNE)){};
                    c1= I2C1->DR;
                     while (!(I2C1->SR1& I2C_SR1_RXNE)){};
                     c2= I2C1->DR;
                     I2C1->CR1&=~I2C_CR1_ACK;
                     I2C1->CR1|= I2C_CR1_STOP;

                     I2C1->CR1&=~ I2C_CR1_POS;
                     I2C1->CR1|=I2C_CR1_ACK;
                    I2C1->CR1|= I2C_CR1_START ;
                    while (!(I2C1->SR1& I2C_SR1_SB)){};
                    (void) I2C1->SR1;
                    I2C1->DR = 0b10100000;
                    while (!(I2C1->SR1& I2C_SR1_ADDR)){};
                   (void) I2C1->SR1;
                    (void) I2C1->SR2;
                    I2C1->DR= 6;
                      while (!(I2C1->SR1 & I2C_SR1_TXE)){};
                      I2C1->DR= 7;
                    while (!(I2C1->SR1 & I2C_SR1_TXE)){};
                    I2C1->CR1|= I2C_CR1_START;
                     while (!(I2C1->SR1& I2C_SR1_SB)){};
                    (void) I2C1->SR1;
                    I2C1->DR = 0b10100001;
                    while (!(I2C1->SR1& I2C_SR1_ADDR)){};
                    (void) I2C1->SR1;
                    (void) I2C1->SR2;
                    while (!(I2C1->SR1& I2C_SR1_RXNE)){};
                    d1= I2C1->DR;
                     while (!(I2C1->SR1& I2C_SR1_RXNE)){};
                     d2= I2C1->DR;
                     I2C1->CR1&=~I2C_CR1_ACK;
                     I2C1->CR1|= I2C_CR1_STOP;

                                I2C1->CR1|= I2C_CR1_START ;
                                while (!(I2C1->SR1& I2C_SR1_SB)){};
                                (void) I2C1->SR1;
                                I2C1->DR = 0b10100000;
                                while (!(I2C1->SR1& I2C_SR1_ADDR)){};
                               (void) I2C1->SR1;
                                (void) I2C1->SR2;
                                I2C1->DR= 10;
                                  while (!(I2C1->SR1 & I2C_SR1_TXE)){};
                                  I2C1->DR= 11;
                                while (!(I2C1->SR1 & I2C_SR1_TXE)){};
                                I2C1->CR1|= I2C_CR1_START;
                                 while (!(I2C1->SR1& I2C_SR1_SB)){};
                                (void) I2C1->SR1;
                                I2C1->DR = 0b10100001;
                                while (!(I2C1->SR1& I2C_SR1_ADDR)){};
                                (void) I2C1->SR1;
                                (void) I2C1->SR2;
                                while (!(I2C1->SR1& I2C_SR1_RXNE)){};
                                a1= I2C1->DR;
                                 while (!(I2C1->SR1& I2C_SR1_RXNE)){};
                                 a2= I2C1->DR;
                                 I2C1->CR1&=~I2C_CR1_ACK;
                                 I2C1->CR1|= I2C_CR1_STOP;


                      a=((unsigned int )a1<<8)|a2;
                     b=((unsigned int ) b1<<8)|b2;
                     c=((unsigned int )c1<<8)|c2;
                     d=((unsigned int ) d1<<8)|d2;
                   tm=((unsigned int ) tm1<<8)|tm2;

    Вот кусок кода он рабочий кроме параметра "a". 

  2. Контакты реле можно использовать  как кнопку управления .Я уже решил данную проблему.Смещением включения порта В12 и понял причину почему подвисает подпрограмма.1 нужен интервал времени между включением и выключением. и 2 сместил В12 относительно включения В6

    Спойлер
    void TIM3_IRQHandler (void)
    {
    	if(TIM3->SR & TIM_SR_UIF)
    	{
    		TIM3->SR &= ~ TIM_SR_UIF;
    		 IWDG->KR= 0xAAAA;
    
    
    
    
    
    
    		          if((GPIOB->IDR&GPIO_IDR_IDR0)==0)
    		           {
    
    		        		 pauza1=0;
    		           }
    		          else
    		           {
    
    		        		pauza1++;
    		        	}
    		        // program_start();
    		//     if(flag_uroven==1)
    		//     {
    		            	//flag_uroven=0;
    
    		                     if(pauza1==20)
    		         		     {
    
    		         		    	 flag_start2=0;
    		         		    	// flag_peregruz=0;
    		         		     }
    
    		         		   if(pauza1==1400)
    		         		   {
    
    		         				GPIOC->BSRR|=GPIO_BSRR_BS13;
    		         			   GPIOA-> BSRR |=GPIO_BSRR_BS6;
    
    		         		    }
    		         		   if(pauza1==1410)
    		         		   {
    
    		         			  flag_start2=1;//On ADC
    		         		   }
    		         		  if(pauza1==1450)
    		         		  {
    		         			GPIOB->BSRR|=GPIO_BSRR_BS12;
    		         		   }
    		         		   if(pauza1==1501)
    		         		  {
    
    		         		       GPIOA-> BSRR |=GPIO_BSRR_BR6;
    		         		      GPIOC->BSRR|=GPIO_BSRR_BR13;
    		         		      //flag_uroven=0;
    
    		         		  }
    
    
    
    
    
    
    
    
    
    
    
    	}
    }

     

    Вот 2 прерывания по таймеру порт В0 на вход верхний уровень.Порт В1  тоже на вход нижний уровень. а В 12 для отключения системы (насоса) В6 для включения насоса или клапана водоснабжения выходные реле подключаются параллельно.А входными цепями управляют  2 реле на ~24v их контакты.

  3. В 06.09.2023 в 13:46, VladislavS сказал:

    Держи нас в курсе! 

    Ну да вы же профиссианал.Куда мне до вас.Я звёзд с неба не хватаю.А почему не стабильно работает .Проблемма аппаратная или програмная?.Если аппаратная .То как выйти с тупика.?

  4. Spoiler
    void TIM2_IRQHandler (void)
    {
    	if(TIM2->SR & TIM_SR_UIF)
    	{
    		TIM2->SR &= ~ TIM_SR_UIF;
    		 IWDG->KR= 0xAAAA;
    
    		 if((GPIOB->IDR&GPIO_IDR_IDR1)==0)
              {
    		    GPIOB->BSRR|=GPIO_BSRR_BR12;
    				        	// flag4=0;
    				        	// flag_uroven=0;
    		 }
    
    
    
    
                 if((GPIOB->IDR&GPIO_IDR_IDR5)==0)
    			  {
    
    			  			nastroyki.flag=1;
    
    
    			  	}
    
                    if(nastroyki.flag==1)
                    {
                    	nastroyki.pauza1++;
                    }
    
                    if(nastroyki.pauza1==10)
                    {
                    	menu_lcd++;
                    	menu_btn++;
                    }
                    if(GPIOB->IDR&GPIO_IDR_IDR5)
                    {
                    	nastroyki.flag=0;
                    	nastroyki.pauza1=0;
                    }
    
    	}
    
    
    
    }
    void TIM3_IRQHandler (void)
    {
    	if(TIM3->SR & TIM_SR_UIF)
    	{
    		TIM3->SR &= ~ TIM_SR_UIF;
    		 IWDG->KR= 0xAAAA;
    
    
    
    
    
    
    		          if((GPIOB->IDR&GPIO_IDR_IDR0)==0)
    		           {
    
    		        		 pauza1=0;
    		           }
    		          else
    		           {
    
    		        		pauza1++;
    		        	}
    		        // program_start();
    		//     if(flag_uroven==1)
    		//     {
    		            	//flag_uroven=0;
    		                 if(pauza1>=20)
    		         		     {
    
    		         		    	 flag_start2=0;
    		         		    	// flag_peregruz=0;
    		         		     }
    
    		         		   if(pauza1>=1400)
    		         		   {
    
    		         			   GPIOB->BSRR|=GPIO_BSRR_BS12;
    
    		         				GPIOC->BSRR|=GPIO_BSRR_BS13;
    		         			   GPIOA-> BSRR |=GPIO_BSRR_BS6;
    
    		         		  }
    		         		   if(pauza1>=1410)
    		         		   {
    
    		         			  flag_start2=1;//On ADC
    		         		   }
    
    		         		   if(pauza1>=1501)
    		         		  {
    
    		         		       GPIOA-> BSRR |=GPIO_BSRR_BR6;
    		         		      GPIOC->BSRR|=GPIO_BSRR_BR13;
    		         		      //flag_uroven=0;
    
    		         		  }
    
    
    
    
    
    
    
    
    
    
    
    	}
    }

    Решил я сделать автомат уровня воды для эл. насоса .Написал программу.А она работает со збоем.В качестве управление уровнями на GPIO выбрал контакты реле ~24 v .Если ёмкость пуста реле отключённые.А при отключении работают тики в прерывании по таймеру и через минуту загрузки процессора включается двигатель.Так организован нижний уровень .А верхний уровень так.Когда насос работает срабатывает первое реле срабатывает и через время срабатывает GPIO устанавливается в лог 1.Вода дошла до верхнего уровня и GPIO устанавливается в лог 0.И двигатель стал. Проблема в том что нет стабильной работы
    уровней.Контролер работает стабильно.А подпрограмма в прерывании по таймеру.

  5. В 23.07.2023 в 11:24, EdgeAligned сказал:

    Мамонты вялятся на пляжУ - лето жеж. А чо каво случилося то? Воопервых, не используйте кириллицу или иные национальные алфавиты в путях к проекту и его файлам. Вовторых, просто откройте проект. Не получается? Просто создайте новый проект и закиньте в него все ваши сишные файлы.

    Проблему решил .Всё перевёл на латынь.И при создании проекта не нужно удалять все файлы оставить 2 сишных файла кроме main.c.Если удалить эти файлы а я их раньше удалял.Пишет ошибку.Вот так работает 1.13.0 

  6. Вообщем Warning исчез когда  text file encoding other UTF-8.Почему?Правда я не коплировал проект.А после если галочку установить так как на фото .То работает..И закрываю проект.Открываю тоже самое.

  7. Проблем с импортом проектов пишет.

    Описание Путь к ресурсу Тип расположения
    Проект 'stm32_bobr2' не имеет явно заданной кодировки stm32_bobr2 /stm32_bobr2 Нет явной кодировки проекта

    Что делать не знаю.Кто из спецов может подсказать?

  8. Так куда мне вставить подпрограмму что бы точку светило в динамической индикации.А скажите у вас часто бывало что в протеусе работает как часы а в реале не работает программа и на оборот.В Протеусе глюк а в железе всё работает?

  9. В 11.07.2023 в 17:44, xvr сказал:
    unsigned char buf[4];
    unsigned char n_count =0;
    
    ISR (TIMER1_COMPA_vect)
    {
            PORTB &= ~(1<<PORTB4); //низкий уровень
            
            SPDR = buf[n_count];
            while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
            
            SPDR = (1 << n_count) ^ 0xF;
            while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
            //сгенерируем отрицательный фронт для записи в STORAGE REGISTER
            PORTB |= (1<<PORTB4); //высокий уровень
    
            ++n_count;
            n_count &= 3;
    }
    
    void putc(int position, char symbol)
    {
      char encoded;
      switch(symbol)
      {
        case '0': encoded = 0b00111111; break;
        case '1': encoded - ....
      }
      buf[position] = encoded;
    }
    
    void add_comma(int position)
    {
      buf[position] |= 0x80;
    }

    предполагаю что точка в старшей позиции (и включается 1)

    Ну и в putc лучше сделать массив для перекодировки, а не switch

    Нужно точку выделить в отдельный разряд но как это сджелать.Эксперименты показывают(в протеусе)что выделение точки возможно.Но как прописать её как разряд.Правда работает не так как  нужно.

    Спойлер
    ISR (TIMER1_COMPA_vect)
    {
    	
     //if(N==0) { PORTB|=127; PORTD=8; segment(A1); }
     if(N==1) { PORTB|=127; PORTD=4; segment(A2); }
     if(N==2) { PORTB|=127; PORTD=2; segment(A3); }
    	 if (N==0)
    	 {
               //PORTB |= 127; // минусовой знак (-)
                     // PORTD=8;
    		 
                     //segment(A1);
                     
    		 
    		if (adc_data[0] < 512) {
                     // PORTD&=~(1<<PD3);
               PORTB |= 128; // минусовой знак (-)
                     segment(A1);
                     
    			}
    			 else {
                      PORTD=8;
                     
    			PORTB &= ~128; // плюсовой знак (+)
    		} 
    	 }
    	 
    // if(N==3) { PORTB|=127; PORTD=1; segment(A3); }
     
     N+=1;
     if(N==2){N=0;}
    }

     

     

  10. В 11.07.2023 в 12:30, xvr сказал:

    Можно. Самое простое не декодировать числа (в 7 сегментов) при выводе, а складывать в буфер индикации декодиованное значение. Тогда точка будет зажигаться просто установкой соответствуещего бита в соотвествующем элементе буфера

     

    Пример можете привести?

  11. В 11.07.2023 в 10:20, v05 сказал:

    А у меня тоже один вопрос. Что получится если к члену приделать перо? Член корреспондент, не так ли?

    Вы правы.Но как  то же выводят число вещественное?

  12. В 10.07.2023 в 20:42, xvr сказал:

    Обычно делают в 2 фазы - формирование строки из вашего числа в памяти, и отдельно вывод этой строки на индикатор.

    Не стоит пытаться совместить эти фазы

    Ну пример не мой.А ваш пример покажите?

  13. В 10.07.2023 в 18:38, v05 сказал:

    Ага. Вопрос был просто с акцентом. Ужос!( И эти люди пишут на электрониксе...!

    Акцент есть и будет.Акцент на вывод вещественное число на 7-сегментный индикатор так и не нашёл примеров с динамической индикацией?

  14. Спойлер

    void ledprint(unsigned int number)
    {
        R1 = number%10;
        R2 = number%100/10;
        R3 = number%1000/100;
        R4 = number/1000;
    }

    void segchar (unsigned char seg)
    {

        switch(seg)

        {
            case 0: SPDR = 0b11000000; break;

            case 1: SPDR = 0b11111001; break;

            case 2: SPDR = 0b10100100; break;

            case 3: SPDR = 0b10110000; break;

            case 4: SPDR = 0b10011001; break;

            case 5: SPDR = 0b10010010; break;

            case 6: SPDR = 0b10000010; break;

            case 7: SPDR = 0b11111000; break;

            case 8: SPDR = 0b10000000; break;

            case 9: SPDR = 0b10010000; break;


            case 10: SPDR = 0b10111111; break; // знак —

            case 11: SPDR = 0b11111111; break; // пустое место

            case 12: SPDR = 0b11000110; break; // буква С для показаний температуры
            case 13: SPDR = 0b01111111; break; // буква С для показаний температуры

        }

    }


    void PORTS_init(void)
    {
        
        
    }
    ISR (TIMER1_COMPA_vect)
    {
        if(n_count==0)
        {
            PORTB &= ~(1<<PORTB4); //низкий уровень
            
            segchar(R1);
            while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
            
            SPDR = 0b00001110;
            while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
            //сгенерируем отрицательный фронт для записи в STORAGE REGISTER
            PORTB |= (1<<PORTB4); //высокий уровень
            //PORTB &= ~(1<<PORTB4); //низкий уровень
            
        }
        if(n_count==1)
        {
            PORTB &= ~(1<<PORTB4); //низкий уровень
            
            segchar(R2);
            while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
            
            SPDR = 0b00001101;
            while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
            //сгенерируем отрицательный фронт для записи в STORAGE REGISTER
            PORTB |= (1<<PORTB4); //высокий уровень
            //PORTB &= ~(1<<PORTB4); //низкий уровень
            
        }
        if(n_count==2)
        {
            PORTB &= ~(1<<PORTB4); //низкий уровень
            
            segchar(R3);
            while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
            
            SPDR = 0b00001011;
            while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
            //сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER
            PORTB |= (1<<PORTB4); //высокий уровень
            //PORTB &= ~(1<<PORTB4); //низкий уровень
            
        }
        if(n_count==3)
        {
            PORTB &= ~(1<<PORTB4); //низкий уровень
            
            segchar(R4);
            while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
            
            SPDR = 0b00000111;
            while(!(SPSR & (1<<SPIF)));//подождем пока данные передадутся
            //сгенерируем отрицательный фронт дл¤ записи в STORAGE REGISTER
            PORTB |= (1<<PORTB4); //высокий уровень
            //PORTB &= ~(1<<PORTB4); //низкий уровень
            
        }
        
        n_count++;
        if (n_count>3) n_count=0;
    }
    //--------------------------------------------

    void timers_init(void)
    {
        TCCR1B |= (1<<WGM12); // устанавливаем режим СТС (сброс по совпадению)
        TIMSK |= (1<<OCIE1A);    //устанавливаем бит разрешения прерывания 1ого счетчика по совпадению с OCR1A(H и L)
        OCR1AH = 0b00001111; //записываем в регистр число для сравнения
        OCR1AL = 0b01000010;
        TCCR1B |= (1<<CS11);//установим делитель.
    }
    void SPI_init(void)
    {
       DDRB |= ((1<<PORTB4)|(1<<PORTB5)|(1<<PORTB7)); //ножки SPI на выход

        PORTB &= ~((1<<PORTB4)|(1<<PORTB5)|(1<<PORTB7)); //низкий уровень

       SPCR = ((1<<SPE)|(1<<MSTR));//включим шину, объявим ведущим    
        
    }

    Есть у меня дисплей LED 7 сигментный.Как мне вывести вещественное число ?Помогите советом.

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

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

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

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

  16. 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;
    
    		}
    	}
    }
    Вот этот код рабочий.Он переработан мной.Прошу обяснения.

     

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

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

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

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

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

     

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

  19. у меня возникла непонятка с настройкой GPIO с настройкой аппаратного энкодера на stm32f103.На stm32 f407 всё понятно.GPIO настраиваю на альтернативную функцию .Потом регистры настраиваю альтернативной функции .Да и программная  подтяжка лог 1.А сдесь?Кто может подказать?

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