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

Вопросы от начинающих по МК


Рекомендуемые сообщения

6 minutes ago, Дмитрий Вас said:

она просто принимает

Для принятия возвращаемого значения надо это значение куда-то положить, например вот так:

speed = start(speed);

т.е. функция отработала, и результат присвоили обратно в переменную speed.

 

6 minutes ago, Дмитрий Вас said:

совсем запутался

В тексте объявлен цикл for() и в этом цикле будет выполняться одна операция return s, следующая строчка кода, потому что нету точки с запятой после for().

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

  • Ответов 8,9т
  • Создана
  • Последний ответ

Топ авторов темы

16 minutes ago, Дмитрий Вас said:

вообще первый раз вижу такой набор букаф

без этого "набора букаф" будет невозможно собрать код с -Wall -Werror -Wextra, если внутри функции не используется данный аргумент.

А еще есть инструкции, позволяющие из одного case'а в другой перетекать без ошибки компилятора. Обычно для этого пишут __attribute__ ((fallthrough)), но в не сильно старых gcc можно и просто в комментах написать // fallthrough или даже // FALLTHRU

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

@Eddy_Em где об этом почитать, ни в одном учебнике не встречал подобного. все что уяснил  что подобные команды находятся в определенных библиотеках. подключил библиотеку, можешь использовать набор определенных команд. читаешь описание что они делают.

20 минут назад, Yurkin2015 сказал:

speed = start(speed);

понял

21 минуту назад, Yurkin2015 сказал:

В тексте объявлен цикл for() и в этом цикле будет выполняться одна операция return s,

задумано так чтобы переменная "глобально"  увеличивалась с определенной скоростью.

 

24 минуты назад, Yurkin2015 сказал:

потому что нету точки с запятой после for().

после }; фигурной скобки?

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

11 minutes ago, Дмитрий Вас said:

фигурной скобки?

Тут в дискуссии участвует два варианта написания функции start(). Я имел в виду первый вариант.

В Вашем варианте всё нормально - будет выполняться в цикле то, что в фигурных скобках.

14 minutes ago, Дмитрий Вас said:

задумано ...чтобы переменная "глобально"  увеличивалась

Ну так и используйте прямо эту переменную speed в функции start(), не надо никаких "int s" добавлять в функцию.

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре. 

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

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;
		}

в комментарии написано где проскакивает. 

Безымянный.jpg

if (button_shot && speed==0)//первое короткое

вот эта проверка не выполняется 

Изменено пользователем Дмитрий Вас
Ссылка на комментарий
Поделиться на другие сайты

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Just now, Дмитрий Вас said:

проскакивает

Вот на чёрной картинке: куда фигурные скобки подевались после первого ифа?

Вот этот "return button_short" будет выполняться всегда и будет всегда выходить из этого места и остальное проскакивать.

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

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

2 часа назад, Alex сказал:

А что у вас делает эта функция :


int start (int s)
{
    for(;s <=400;s ++)
    return s ;
}

?
Объясните на словах.

@Дмитрий Мамедиев , ответьте.

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

27 minutes ago, Дмитрий Вас said:

можно и так и так

Если использовать speed внутри функции start(), то переменная speed будет плавно увеличиваться.

Если использовать снаружи speed = start(speed), то было speed = 0, затем пока start() считает, speed будет всё ноль-ноль-ноль, наконец после выполнения start() переменная скачком изменится до speed = 401, никакой плавности не останется.

Изменено пользователем Yurkin2015
Ссылка на комментарий
Поделиться на другие сайты

8 минут назад, Alex сказал:

ответьте.

увеличивает переменную до 401 и возвращаааает, а так то да выходит возвращать ее не нужно если она глобальная?

9 минут назад, Yurkin2015 сказал:

Если использовать speed внутри функции start(), то переменная speed будет плавно увеличиваться.

выходит изначально у меня было правильно

31 минуту назад, Yurkin2015 сказал:

куда фигурные скобки подевались после первого ифа

они там есть просто почему то подсветились

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

@Дмитрий Вас  На чёрной картинке - желтая полоса, это где в данный момент остановлено выполнение программы? Это картинка из отладчика?

Чтобы помочь, нужно увидеть весь код программы, иначе какие-то загадки приходится разгадывать ...

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

11 часов назад, Yurkin2015 сказал:

Чтобы помочь, нужно увидеть весь код программы

Этого мало. Нужно ещё как-то залезть в голову автору кода и попытаться понять, что он хотел реализовать этим кодом.

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

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;
		}
	}
	
}


вот код целиком

еще по мимо всего пуск и стоп должны проходить плавно

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

@Дмитрий Вас   Вот в программе главная функция main(). В этот main() процессор заходит при старте и крутится там вечно, выполняет всякие полезные вещи: определяет нажатия кнопки, включает старт , стоп и реверс и всё такое.

Но в этом коде  есть пара строк c оператором return. Как только программа выполнит этот оператор, она тут же выскочит из main() в никуда. Этот return означает "вернуться из функции". А куда из main() возвращаться-то?!?

За пределами main() жизни нет. Надо убрать строчки с return.

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

теперь другая проблема. не заходит внутрь 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);
}

 

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

причем начинается выполнение прыгает на скобку, а затем на флаг. а после уже на for

скобка.jpg

флаг.jpg

и бесконечно с for на if не заходя в него

1 минуту назад, Alex сказал:

мы верим в Вас

не этого я ожидал заходя на форум

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

22 minutes ago, Дмитрий Вас said:

speed тоже пришлось так обозвать

Значит, где-то в коде проблемы. Потому что если переменная не меняется внутри прерывания, объявлять ее волатильной не нужно.

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

11 минут назад, Eddy_Em сказал:

Значит, где-то в коде проблемы.

какого рода могут быть проблемы? код выложен на предыдущей странице

без volatile переменную speed как будто не видит

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

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

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

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

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

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

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

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

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу

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