Yurkin2015 Опубликовано 18 июня, 2021 Поделиться Опубликовано 18 июня, 2021 (изменено) 6 minutes ago, Дмитрий Вас said: она просто принимает Для принятия возвращаемого значения надо это значение куда-то положить, например вот так: speed = start(speed); т.е. функция отработала, и результат присвоили обратно в переменную speed. 6 minutes ago, Дмитрий Вас said: совсем запутался В тексте объявлен цикл for() и в этом цикле будет выполняться одна операция return s, следующая строчка кода, потому что нету точки с запятой после for(). Изменено 18 июня, 2021 пользователем Yurkin2015 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Eddy_Em Опубликовано 18 июня, 2021 Поделиться Опубликовано 18 июня, 2021 16 minutes ago, Дмитрий Вас said: вообще первый раз вижу такой набор букаф без этого "набора букаф" будет невозможно собрать код с -Wall -Werror -Wextra, если внутри функции не используется данный аргумент. А еще есть инструкции, позволяющие из одного case'а в другой перетекать без ошибки компилятора. Обычно для этого пишут __attribute__ ((fallthrough)), но в не сильно старых gcc можно и просто в комментах написать // fallthrough или даже // FALLTHRU 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
Дмитрий Вас Опубликовано 18 июня, 2021 Поделиться Опубликовано 18 июня, 2021 @Eddy_Em где об этом почитать, ни в одном учебнике не встречал подобного. все что уяснил что подобные команды находятся в определенных библиотеках. подключил библиотеку, можешь использовать набор определенных команд. читаешь описание что они делают. 20 минут назад, Yurkin2015 сказал: speed = start(speed); понял 21 минуту назад, Yurkin2015 сказал: В тексте объявлен цикл for() и в этом цикле будет выполняться одна операция return s, задумано так чтобы переменная "глобально" увеличивалась с определенной скоростью. 24 минуты назад, Yurkin2015 сказал: потому что нету точки с запятой после for(). после }; фигурной скобки? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
Yurkin2015 Опубликовано 18 июня, 2021 Поделиться Опубликовано 18 июня, 2021 11 minutes ago, Дмитрий Вас said: фигурной скобки? Тут в дискуссии участвует два варианта написания функции start(). Я имел в виду первый вариант. В Вашем варианте всё нормально - будет выполняться в цикле то, что в фигурных скобках. 14 minutes ago, Дмитрий Вас said: задумано ...чтобы переменная "глобально" увеличивалась Ну так и используйте прямо эту переменную speed в функции start(), не надо никаких "int s" добавлять в функцию. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 18 июня, 2021 Поделиться Опубликовано 18 июня, 2021 (изменено) 15 минут назад, Yurkin2015 сказал: Ну так и используйте прямо эту переменную speed в функции start(), не надо никаких "int s" добавлять в функцию. переписал но я думаю это не ошибка, можно и так и так if (!button && button_time > 0 && button_time < 200) { button_time = 0; button_shot = 1; return button_shot; } //здесь проскакивает if (button_shot && speed==0)//первое короткое { speed = start(speed); button_shot = 0; } в комментарии написано где проскакивает. if (button_shot && speed==0)//первое короткое вот эта проверка не выполняется Изменено 18 июня, 2021 пользователем Дмитрий Вас 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 18 июня, 2021 Поделиться Опубликовано 18 июня, 2021 Just now, Дмитрий Вас said: проскакивает Вот на чёрной картинке: куда фигурные скобки подевались после первого ифа? Вот этот "return button_short" будет выполняться всегда и будет всегда выходить из этого места и остальное проскакивать. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Eddy_Em Опубликовано 18 июня, 2021 Поделиться Опубликовано 18 июня, 2021 49 minutes ago, Дмитрий Вас said: где об этом почитать Просто набрать в консоли man gcc 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 18 июня, 2021 Поделиться Опубликовано 18 июня, 2021 Задал один вопрос автору, чтобы услышать конкретно его взгляд на его же собственный код, но начали обсуждать этот кусок говнокода куча человек.... 2 часа назад, Alex сказал: А что у вас делает эта функция : int start (int s) { for(;s <=400;s ++) return s ; } ? Объясните на словах. @Дмитрий Мамедиев , ответьте. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 18 июня, 2021 Поделиться Опубликовано 18 июня, 2021 (изменено) 27 minutes ago, Дмитрий Вас said: можно и так и так Если использовать speed внутри функции start(), то переменная speed будет плавно увеличиваться. Если использовать снаружи speed = start(speed), то было speed = 0, затем пока start() считает, speed будет всё ноль-ноль-ноль, наконец после выполнения start() переменная скачком изменится до speed = 401, никакой плавности не останется. Изменено 18 июня, 2021 пользователем Yurkin2015 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 18 июня, 2021 Поделиться Опубликовано 18 июня, 2021 8 минут назад, Alex сказал: ответьте. увеличивает переменную до 401 и возвращаааает, а так то да выходит возвращать ее не нужно если она глобальная? 9 минут назад, Yurkin2015 сказал: Если использовать speed внутри функции start(), то переменная speed будет плавно увеличиваться. выходит изначально у меня было правильно 31 минуту назад, Yurkin2015 сказал: куда фигурные скобки подевались после первого ифа они там есть просто почему то подсветились 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 18 июня, 2021 Поделиться Опубликовано 18 июня, 2021 @Дмитрий Вас , Вы - Дмитрий Мамедиев ? Это Ваш код ? 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 18 июня, 2021 Поделиться Опубликовано 18 июня, 2021 Только что, Alex сказал: Это Ваш код ? да просто так получилось что на телефоне один акк а на компе другой 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 19 июня, 2021 Поделиться Опубликовано 19 июня, 2021 вопрос остался не решенным. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 19 июня, 2021 Поделиться Опубликовано 19 июня, 2021 @Дмитрий Вас На чёрной картинке - желтая полоса, это где в данный момент остановлено выполнение программы? Это картинка из отладчика? Чтобы помочь, нужно увидеть весь код программы, иначе какие-то загадки приходится разгадывать ... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 20 июня, 2021 Поделиться Опубликовано 20 июня, 2021 11 часов назад, Yurkin2015 сказал: Чтобы помочь, нужно увидеть весь код программы Этого мало. Нужно ещё как-то залезть в голову автору кода и попытаться понять, что он хотел реализовать этим кодом. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 20 июня, 2021 Поделиться Опубликовано 20 июня, 2021 4 часа назад, Alex сказал: что он хотел реализовать этим кодом. первое короткое нажатие на кнопку -- пуск, последующее короткое --- реверс, длинное нажатие кнопки -- стоп #define F_CPU 8000000UL #include <avr/io.h> #include <avr/interrupt.h> #include <util/delay.h> #include <stdio.h> #include <stdlib.h> #include <avr/io.h> //#define button (!(PIND&(1<<5))) unsigned char Flag_IT_timer1; unsigned char button_time=0; unsigned char button_long=0; unsigned char button_shot=0; short speed = 0; int button = 0; void port_ini (void) { //усилитель DDRB&=~(1<<3)|(1<<4);//вход усилителя для измерения тока //ЛСД DDRC|=((1<<4)|(1<<5)|(1<<6)|(1<<7)); DDRB|=((1<<2)|(1<<5)); //ШИМ DDRD|=(1<<0);DDRC|=(1<<0); DDRB|=((1<<0)|(1<<1)|(1<<6)|(1<<7)); //энкодер DDRD&=~(1<<5)|(1<<6)|(1<<7); PORTD=(1<<5)|(1<<6)|(1<<7); } void start(void)//плавный старт { for (;speed<=400;) { if (Flag_IT_timer1) { Flag_IT_timer1 = 0; speed++; } } // подключаем выходы генератора сигнала PSC к выходам порта //PSOC0 = (1 << POEN0B) | (1 << POEN0A); //PSOC1 = (1 << POEN1B) | (1 << POEN1A); //PSOC2 = (1 << POEN2B) | (1 << POEN2A); } void revers (void) { int s_new; if (speed>0) { s_new = ~speed + 1; for (;speed>=s_new;) { if (Flag_IT_timer1) { Flag_IT_timer1 = 0; speed--; } } } if (speed<0) { s_new = ~speed + 1; for(;speed>=s_new;) { if (Flag_IT_timer1) { Flag_IT_timer1 = 0; speed++; } } } } void stop (void)// стоп { for(;speed>=0;) { if (Flag_IT_timer1) { Flag_IT_timer1 = 0; speed--; } } for(;speed<=0;) { if (Flag_IT_timer1) { Flag_IT_timer1 = 0; speed++; } } // отключаем выходы генератора сигнала PSC к выходам порта //PSOC0 &=~ (1 << POEN0B) | (1 << POEN0A); //PSOC1 &=~ (1 << POEN1B) | (1 << POEN1A); //PSOC2 &=~ (1 << POEN2B) | (1 << POEN2A); } void Timer_init(void) { //инициализация энкодера содержит настройки таймера 1 TCCR1A = 0x00; TCCR1B |= (1<<CS11); // делитель на 8 TCNT1 = 0; // Обнуляем счетный регистр OCR1A=250; // Настраиваем регистр сравнения 100 раз в секунду //CS12 CS11 CS10 //0 0 0 нет тактирования //0 0 1 /1 //0 1 0 /8 //0 1 1 /64 //1 0 0 /256 //1 0 1 /1024 //1 1 0 External clock source on T1 pin. Clock on falling edge. //1 1 1 1 External clock source on T1 pin. Clock on rising edge. // Разрешаем прерывание таймера по совпадению с OCR1A TIMSK |= (1<<OCIE1A); } ISR(TIMER1_COMPA_vect) { Flag_IT_timer1 = 1; TCNT1=0; // Обнуляем счетчик } int main(void) { DDRB=0b11111101; PORTB=0b00000010; Timer_init(); sei(); while (1) { if (Flag_IT_timer1) { Flag_IT_timer1=0; if(button) { button_time++; } } //---------------------работаем вне таймера 1 с результатами энкодера------------ if (!button && button_time>200)//т.к. таймер срабатывает 100 раз в сек. то 200 будет = 2с { button_time = 0; button_long = 1; return button_long; } if (!button && button_time > 0 && button_time < 200) { button_time = 0; button_shot = 1; return button_shot; } if (button_shot && speed==0)//первое короткое { start(); button_shot = 0; } if (button_shot)//любое другое короткое нажатие { revers(); button_shot = 0; } if (button_long) { stop(); button_long = 0; } } } вот код целиком еще по мимо всего пуск и стоп должны проходить плавно 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Yurkin2015 Опубликовано 20 июня, 2021 Поделиться Опубликовано 20 июня, 2021 @Дмитрий Вас Вот в программе главная функция main(). В этот main() процессор заходит при старте и крутится там вечно, выполняет всякие полезные вещи: определяет нажатия кнопки, включает старт , стоп и реверс и всё такое. Но в этом коде есть пара строк c оператором return. Как только программа выполнит этот оператор, она тут же выскочит из main() в никуда. Этот return означает "вернуться из функции". А куда из main() возвращаться-то?!? За пределами main() жизни нет. Надо убрать строчки с return. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Мамедиев Опубликовано 20 июня, 2021 Поделиться Опубликовано 20 июня, 2021 Ну так то да этот return по идее там вообще не нужен. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 22 июня, 2021 Поделиться Опубликовано 22 июня, 2021 теперь другая проблема. не заходит внутрь if, хотя Flag стоит в единице void start(void)//плавный старт { for (;speed<=400;) { if (Flag_IT_timer1) { Flag_IT_timer1 = 0; speed++; } } // подключаем выходы генератора сигнала PSC к выходам порта //PSOC0 = (1 << POEN0B) | (1 << POEN0A); //PSOC1 = (1 << POEN1B) | (1 << POEN1A); //PSOC2 = (1 << POEN2B) | (1 << POEN2A); } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 22 июня, 2021 Поделиться Опубликовано 22 июня, 2021 Дмитрий Вас, мы верим в Вас ! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 22 июня, 2021 Поделиться Опубликовано 22 июня, 2021 причем начинается выполнение прыгает на скобку, а затем на флаг. а после уже на for и бесконечно с for на if не заходя в него 1 минуту назад, Alex сказал: мы верим в Вас не этого я ожидал заходя на форум 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Eddy_Em Опубликовано 22 июня, 2021 Поделиться Опубликовано 22 июня, 2021 Flag_IT_timer1 нужно объявить как volatile для начала. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 22 июня, 2021 Поделиться Опубликовано 22 июня, 2021 9 минут назад, Eddy_Em сказал: volatile помогло, причем speed тоже пришлось так обозвать 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Eddy_Em Опубликовано 22 июня, 2021 Поделиться Опубликовано 22 июня, 2021 22 minutes ago, Дмитрий Вас said: speed тоже пришлось так обозвать Значит, где-то в коде проблемы. Потому что если переменная не меняется внутри прерывания, объявлять ее волатильной не нужно. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Дмитрий Вас Опубликовано 22 июня, 2021 Поделиться Опубликовано 22 июня, 2021 11 минут назад, Eddy_Em сказал: Значит, где-то в коде проблемы. какого рода могут быть проблемы? код выложен на предыдущей странице без volatile переменную speed как будто не видит 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы публикуете как гость. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.