Jump to content

Recommended Posts

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

и возвращает

Функция выполняется так, как написано у автора:

принять значение переменной, затем  401 раз его вернуть, увеличивая на 1 после каждого раза. Но вернуть получится только один раз, естественно, в первом же круге цикла for(). Причём возвращаемое значение никто не принимает, оно так и остаётся умирать внутри функции start().

 

 

Share this post


Link to post
Share on other sites

 

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

увеличивает ее до 400 и возвращает

И возвращает 401 =D

И да, проще уж было так:

int start (__attribute__((__unused__)) int s){return 401;}

Share this post


Link to post
Share on other sites
Только что, Yurkin2015 сказал:

затем  401 раз его вернуть,

 

Только что, Yurkin2015 сказал:

Но вернуть получится только один раз,

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

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

Причём возвращаемое значение никто не принимает, оно так и остаётся умирать внутри функции start().

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

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

__attribute__((__unused__)

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

функция старт на данный момент:

int start(int s)//плавный старт
{
	for (;s<=400;)
	{
		if (Flag_IT_timer1)
		{
			Flag_IT_timer1 = 0;
			s++;
		}
	}
	return s;
	// подключаем выходы генератора сигнала PSC к выходам порта
	//PSOC0 = (1 << POEN0B) | (1 << POEN0A);
	//PSOC1 = (1 << POEN1B) | (1 << POEN1A);
	//PSOC2 = (1 << POEN2B) | (1 << POEN2A);
}

 

Share this post


Link to post
Share on other sites

Приглашаем на вебинар «Экономичные решения МЕAN WELL для надежных разработок» (30.09.2021)

Компания Компэл приглашает 30 сентября на вебинар посвященный экономичным решениям МЕAN WELL. На вебинаре мы рассмотрим, как решения MEAN WELL позволяют сэкономить при выборе недорогого источника питания. Будут представлены основные группы источников питания по конструктивным признакам и по областям применения в контексте их стоимости или их особенностей, позволяющих снизить затраты на электропитание конечного устройства.
Подробнее

Posted (edited)
6 minutes ago, Дмитрий Вас said:

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

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

speed = start(speed);

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

 

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

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

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

Edited by Yurkin2015

Share this post


Link to post
Share on other sites

Модульные RJ-соединители KLS — масштабное пополнение склада Компэл

Продуктовая линейка компании KLS на складе Компэл пополнилась модульными соединителями типа RJ. Ассортимент представлен неэкранированными соединителями RJ11, RJ12 и RJ45 для построения базовых информационных сетей, а также экранированными RJ45 с трансформатором для реализации систем передачи данных между узлами ЛВС.

Подробнее

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

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

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

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

Share this post


Link to post
Share on other sites

Вебинар «Microchip и современный подход к искусственному интеллекту. Разворачиваем нейронную сеть на 32-битном микроконтроллере» (13.10.2021)

Приглашаем всех желающих 13 октября 2021 г. посетить вебинар, посвященный искусственному интеллекту, машинному обучению и решениям для их реализации от Microchip. Современные среды для глубинного обучения нейронных сетей позволяют без детального изучения предмета развернуть искусственную нейронную сеть (ANN) не только на производительных микропроцессорах и ПЛИС, но и на 32-битных микроконтроллерах. А благодаря широкому портфолио Microchip, включающему в себя диапазон компонентов от микроконтроллеров и датчиков до ПЛИС, средств скоростной передачи и хранения информации, возможно решить весь спектр задач, возникающий при обучении, верификации и развёртывании модели ANN.
Подробнее

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

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

speed = start(speed);

понял

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

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

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

 

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

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

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

Share this post


Link to post
Share on other sites

STMicroelectronics: электростатический разряд больше не проблема

Защита от статического электричества необходима каждому современному устройству. Компания STMicroelectronics представляет решения, соответствующие стандарту IEC61000-4-2, а также специальное приложение PROTECTION FINDER, которое поможет легкого и эффективно подобрать необходимые компоненты. Рассмотрим практические примеры защиты от ESD, отраслевые стандарты и ряд ключевых параметров важных при проектировании электростатической защиты устройств.
Подробнее

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
Posted (edited)
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)//первое короткое

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

Edited by Дмитрий Вас

Share this post


Link to post
Share on other sites
Just now, Дмитрий Вас said:

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

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

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

Share this post


Link to post
Share on other sites
49 minutes ago, Дмитрий Вас said:

где об этом почитать

Просто набрать в консоли man gcc

Share this post


Link to post
Share on other sites

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

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

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


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

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

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

Share this post


Link to post
Share on other sites
Posted (edited)
27 minutes ago, Дмитрий Вас said:

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

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

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

Edited by Yurkin2015

Share this post


Link to post
Share on other sites
8 минут назад, Alex сказал:

ответьте.

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

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites
11 часов назад, Yurkin2015 сказал:

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

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

Share this post


Link to post
Share on other sites
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;
		}
	}
	
}


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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

Дмитрий Вас, мы верим в Вас ! :)

Share this post


Link to post
Share on other sites

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

скобка.jpg

флаг.jpg

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

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

мы верим в Вас

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

Share this post


Link to post
Share on other sites

Flag_IT_timer1 нужно объявить как volatile для начала.

Share this post


Link to post
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...

  • Сообщения

    • Это в дежурки , которая? Снаббером скорее перегрузил. По схеме чет я не нашёл защиту от перегрузки..
    • @rahimov08 , если вас в университете действительно готовят на инженера, то вам должны были рассказать, что прежде чем бросаться что-то трясти, инженер должен подумать. Ну то, что скважность не в микросекундах, а безразмерная, это вам потом преподаватель надеюсь скажет, но даже если предположить, что это длительность импульса, задание всё равно нужно уточнить. Изменяется с каким дискретом? С какой точностью? Или вообще изменяется непрерывно (сервопривод, всё-таки...)? В зависимости от ответа на эти вопросы в задании меняется всё. И схемотехника, и даже принципиальная возможность реализовать на МК. А помочь вам - вообще безнадёжно. У вас в задании указано: Что считать будем?  
    • Ежу понятно, что схема не от Вашего стабилизатора. Ищите родную схему.
    • Если конденсаторный, т.е. статический то как выше. Тонкая пленка - диэлектрик между пластинами. Толстая - между конденсаторами. Конденсаторы соединить параллельно и подавать частоту. Пружина закреплена на стержне будет прижимать бутерброд к основанию. Роль пружин будет исполнять и пленка. Допустим, толщина 1 конденсатора 0.1 мм. По 20 мкм фольга и 60 мкм изолятор. И 100 мкм толщина слоя между конденсаторами. Вместе 0.2 мм. Диаметр 50 мм. Считал в онлайн-калькуляторе емкость 289.6795пФ. Энергия хранимая в нем при 1000В (если не пробъет) 0.00000145 Дж (1.45 мкДж). Допустим, частота 1000 Гц, через такой конденсатор пройдет 1450 мкДж или 1.45 мДж. Чтобы набрать мощность 1.45 Дж, надо в 1000 раз больше, т.е. 0.2*1000=200мм или 20 см. Вывод. 20 см/1000Гц/1000V/1.45W /50mm. Наверное, что 1000V да 1000 Гц это гарантированный пробой даже приличной пленки. Не говоря уже о том, что размеры пленки должны быть не 50 мм, а намного больше, чтобы исключить пробой по воздуху/клею. Клей взять эпоксидный прикинуть слой клея 10 мкм, тогда слой изолятора 50 мкм/90 мкм Допустим, что частота 30 кГц, можно передать около 30W. Нужен ток около 30mA И как можно допридумать, чтобы заработало?
    • Здравствуйте, уважаемые форумчане. В одном из своих проектов столкнулся со следующей проблемой. Необходимо реализовать эффект заполнения светодиодной полосы (как полоса загрузки). В ходе поиска в интернете чего-то подобного нашёл схему плавного розжига светодиодов на n-канальном мосфете и rc цепочке и решил, что если последовательно включить такую схему, то для моих целей это идеальный вариант. Но, столкнулся с рядом проблем (схема на фото во вложении).  1) Собирая данную схему на макетной плате, я уже был готов к тому, что загорится только 1й светодиод. Но, почему-то, загораются все разом (без задержек и плавного розжига)  2) Перед тем как покупать мосфеты, проверил эту схему в крупном масштабе на реле (но щелкание десятка реле это совсем не камильфо в моём устройстве), всё работало как нужно с 2мя "Но". Первое - не было плавного розжига (само собой, это понятно). Второе - вместо керамических конденсаторов я использовал электролитические. (Может ли выбор конденсаторов влиять на rc цепь?) 3) оставил полоску светодиодов гореть на некоторе время и заметил, что часть диодов периодически то погаснет, то начинает гореть тусклее. Никакой системы не проглядывается, при этом, светодиоды не перегарают. При выключении/включении снова загораются все и горят нормально.  Направьте, пожалуйста, в нужном направлении. Как победить данную проблему, чтобы всё работало так, как нужно?   P.S. Крайне желательно, чтобы диоды остались так же независимы друг от друга. Каждый из них со своей схемой должен будет размещаться на отдельной плате 17х25мм(максимум) с возможностью увеличить/уменьшить количество этих плат на конечном устройстве (рекламный стенд).    Upd.: PPS. У первого мосфета забыл дорисовать конденсатор, но он там должен быть.   
    • Повторю ответ... Думаю, вы всё поняли теперь..
  • Similar Content

    • By Илья1964
      Нужен специалист, ориентирующийся в MotionLab3 для настройки серводрайвера EVEREST XCR ETHERCAT SERVO DRIVE (EVE-XCR-E) от компании INGENIA для привода отечественного BLDC (0,7 кВт). Энкодер магнитный от компании RLS. Мануал с описанием MotionLab3 можно скачать здесь https://doc.ingeniamc.com/mot3/documentation/motionlab3-user-manual, сам пакет здесь https://doc.ingeniamc.com/mot3/downloads  .  BLDC сидит на оси  линейного перемещения и должен вращаться влево-вправо. Никаких особых хитростей в движении мотора нет.
    • By Klumjuk
      Добрый день! Никак не могу найти резистор R97 на плате бумбокса. Можете определить на фото, либо как-нибудь объяснить мне, где он...
      Вот фотка основной платы,и платы зарядки.
      (На основной плате обозначен контролер заряда,если что)


    • By Klumjuk
      Сгорел контроллер питания в колонке, батарейка 7.4 вольта. Помогите подобрать такой же контролер, либо аналог. Весь интернет обрыл,ничего не нашёл (

    • By Иванов Владимир
      Здравствуйте! Я профан в этой теме, но по работе нужно. Хочу собрать так скажем приёмник на микроконтроллере, чтоб демодулировал сигнал. Сигнал собираюсь подавать с компа. Типо на мк подключённый к компу послать модулированный сигнал. Задача в том чтоб запрограммировать сам мк на демодуляцию. Какой мк и отладочную плату посоветуете?
×
×
  • Create New...