-
Постов
248 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные dimir
-
-
Контакты реле можно использовать как кнопку управления .Я уже решил данную проблему.Смещением включения порта В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 их контакты.
-
В 06.09.2023 в 13:46, VladislavS сказал:
Держи нас в курсе!
Ну да вы же профиссианал.Куда мне до вас.Я звёзд с неба не хватаю.А почему не стабильно работает .Проблемма аппаратная или програмная?.Если аппаратная .То как выйти с тупика.?
-
Опубликовано · Изменено пользователем haker_fox
Тему переместил в раздел STM32. Длинный код убрал под спойлер. Текст сообщения отформатировал. · ПожаловатьсяSpoilervoid 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.И двигатель стал. Проблема в том что нет стабильной работы
уровней.Контролер работает стабильно.А подпрограмма в прерывании по таймеру. -
В 23.07.2023 в 11:24, EdgeAligned сказал:
Мамонты вялятся на пляжУ - лето жеж. А чо каво случилося то? Воопервых, не используйте кириллицу или иные национальные алфавиты в путях к проекту и его файлам. Вовторых, просто откройте проект. Не получается? Просто создайте новый проект и закиньте в него все ваши сишные файлы.
Проблему решил .Всё перевёл на латынь.И при создании проекта не нужно удалять все файлы оставить 2 сишных файла кроме main.c.Если удалить эти файлы а я их раньше удалял.Пишет ошибку.Вот так работает 1.13.0
-
Опубликовано · Изменено пользователем dimir · Пожаловаться
Насчёт кирилицы только латынь.Вы имеете ввиду создать проект.А расширением h? Тоже закинуть?Попробую.
-
Опубликовано · Изменено пользователем dimir · Пожаловаться
Вообщем Warning исчез когда text file encoding other UTF-8.Почему?Правда я не коплировал проект.А после если галочку установить так как на фото .То работает..И закрываю проект.Открываю тоже самое.
-
Опубликовано · Изменено пользователем haker_fox
Тему перенёс. · ПожаловатьсяПроблем с импортом проектов пишет.
Описание Путь к ресурсу Тип расположения Проект 'stm32_bobr2' не имеет явно заданной кодировки stm32_bobr2 /stm32_bobr2 Нет явной кодировки проекта
Что делать не знаю.Кто из спецов может подсказать?
-
Так куда мне вставить подпрограмму что бы точку светило в динамической индикации.А скажите у вас часто бывало что в протеусе работает как часы а в реале не работает программа и на оборот.В Протеусе глюк а в железе всё работает?
-
Опубликовано · Изменено пользователем dimir · Пожаловаться
В 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;} }
-
В 11.07.2023 в 12:30, xvr сказал:
Можно. Самое простое не декодировать числа (в 7 сегментов) при выводе, а складывать в буфер индикации декодиованное значение. Тогда точка будет зажигаться просто установкой соответствуещего бита в соотвествующем элементе буфера
Пример можете привести?
-
В 11.07.2023 в 10:20, v05 сказал:
А у меня тоже один вопрос. Что получится если к члену приделать перо? Член корреспондент, не так ли?
Вы правы.Но как то же выводят число вещественное?
-
А у меня ещё один вопрос.Можно ли изменить программу что бы зажигалась точка при определённом условии в разрядах?
-
В 10.07.2023 в 20:42, xvr сказал:
Обычно делают в 2 фазы - формирование строки из вашего числа в памяти, и отдельно вывод этой строки на индикатор.
Не стоит пытаться совместить эти фазы
Ну пример не мой.А ваш пример покажите?
-
В 10.07.2023 в 18:38, v05 сказал:
Ага. Вопрос был просто с акцентом. Ужос!( И эти люди пишут на электрониксе...!
Акцент есть и будет.Акцент на вывод вещественное число на 7-сегментный индикатор так и не нашёл примеров с динамической индикацией?
-
Опубликовано · Изменено пользователем dimir · Пожаловаться
Спойлер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 сигментный.Как мне вывести вещественное число ?Помогите советом.
-
У меня другая проблема перепрыгивают цифры.Вроде настроил филтр.Ноесть дребезг.
-
В 02.07.2023 в 19:13, haker_fox сказал:
Модератор: @dimir, я уже Вас предупреждал, что писать свои вопросы необходимо внятно. Сейчас они снова похожи больше на флейм.
А сейчас отвечу уже как обычный пользователь, не модератор. Вот смотрю я Ваш листинг, и у меня создаётся ощущение, что Ваши вопросы - последствия не очень хорошего владения языком программирования. Об этом говорит обилие ключевых слов volatile в коде, посимвольный вывод строк на дисплей и т.п.
Да я и русский то не очень.А чем вам не нравится volatile?.
-
Опубликовано · Изменено пользователем dimir
Я спрятал длинный код под сплоер · Пожаловаться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; } } } Вот этот код рабочий.Он переработан мной.Прошу обяснения.
Модератор: прячьте длинный код под спойлер!
-
В 02.07.2023 в 12:44, mitya1698 сказал:
причем тут энкодер? значение таймера при аппаратном считывании энкодера увеличивается/уменьшается при вращении, а уж что с ним, значением, дальше делать это личный код каждого.
Ну а как правильно настроить код что бы сохранялось предыдущая переменная? Алгоритм?
-
А принцип этого кода ?
-
У меня возникло пару вопросов по аппаратному энкодеру.Програмный энкодер всё хорошо пошёл.Но вот с аппаратным незадача.Вхожу я в определённое меню и кручу энкодер сохраняя значения в оперативке в переменной.Вхожу я в следующее меню .А значения не обнуляются а сохраняются вчём загвоздка?
Модератор: нет нужды писать жирным шрифтом всё сообщение!
-
у меня возникла непонятка с настройкой GPIO с настройкой аппаратного энкодера на stm32f103.На stm32 f407 всё понятно.GPIO настраиваю на альтернативную функцию .Потом регистры настраиваю альтернативной функции .Да и программная подтяжка лог 1.А сдесь?Кто может подказать?
-
А пример поразрядно?
-
sendcharlcd(tt/10+0x30);//Преобразуем число в код числа sendcharlcd(tt%10+0x30);
А меня интересует вот это произведение .Только одно но если число до 1000.Или если число после запятой сотые?
stm32F1 24c32n проблема с адресами ячеек
в STM
Опубликовано · Пожаловаться
у меня возникла проблема записи на 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".