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

Приглашаем на вебинар «Инновационные технологии Analog Devices в области управления питанием» (11.08.2021)

В программе вебинара технология Silent Switcher® - сочетание высокого КПД и сверхмалого уровня ЭМИ, технология uModule® - высокоинтегрированные решения для источников питания, микро- и нанопотребляющие DC/DC-преобразователи, решения для резервного питания, цифровое управление системой питания (PSM), безоптронные изолированные обратноходовые преобразователи. В практической части вебинара будут продемонстрированы примеры работы с инструментами Analog Devices для проектирования источников питания.
Подробнее

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

Концевые микропереключатели KLS – простая и надежная коммутация по оптимальной цене

На складе Компэл широко представлены нажимные переключатели от KLS в стандартных и миниатюрных корпусах с различными типами актуаторов. Микропереключатели серий KLS7-KW10 и KLS7-KW4-3Z соответствуют строгим стандартам электрической безопасности и эффективности, что гарантирует надежную коммутацию цепей управления.

Подробнее

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

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

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

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

Share this post


Link to post
Share on other sites

Датчики STMicroelectronics – новые возможности систем умного дома ST

Согласно прогнозам аналитиков, в ближайшие пару лет будет наблюдаться заметный рост рынка датчиков движения и положения для умного дома. Компания STMicroelectronics предлагает одну из самых широких линеек MEMS-датчиков, включая акселерометры, гироскопы, цифровые компасы, модули IMU, микрофоны и датчики параметров окружающей среды. Рассмотрим применение датчиков и тенденции их развития.
Подробнее

@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
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...

  • Сообщения

    • КС107А стекло, Стабилитрон кремниевый, 0.7В Там даже на 0,4 вольта есть стабилитрон.
    • Я имел в виду вот так сложить и каждую обмотку к своей паре ключей.А вторичку на всей куче трансформаторов намотать.Я такую намотку видел и она работала.
    • Хотел предложить провод для ремонта дорожек 0.01 мм, он продаётся в любом магазине оборудования\расходников для ремонта телефонов:
    • Нет. Я убираю грабли с их пути. Мне непонятно, что Вы так ощерились-то? Свою аудиторию Вы не потеряете, не надо переживать. Всегда найдутся желающие учиться на своих ошибках и они придут сюда с очередной просьбой помочь запустить Ланзар. Вы многого не знаете о самогоне. И натурального в нем очень мало, а вот изопропанола, изоамилола и производных много, плюс тяжелые хвостовые фракции и легкие ЭАФ, которые почти никто не отбирает при перегонке. Пейте, травитесь, кто же против. Печень будет "рада".
    • Ну я так проигрыватель купил тоже)) sony ps636, по нему инфы тоже было очень мало, в основном видео. Я предположил что он был прообразом феникса 008 - уж больно все похоже. Ну и купил. А насчет денона - у него схема схожая с pma-500v и выше. Я в схемотехнике не силен потому не могу утверждать что модели pma500/700 и так далее являются усовершенствованием одной модели, но «вроде как похоже». 
    • В статье представлена схема простого емкостного датчика приближения на КМОП микросхемах дискретной логики Ссылка на статью: //cxem.net/house/1-499.php Автор статьи: //cxem.net/profile/119/
  • Similar Content

    • By Maxim Frantskevich
      Возникла проблема, не знаем как прошить STM8S003F3P6. Уже как только не пытались, кучи различных программ ставили, различными способами пытались подкопаться, всё равно выдаёт либо что не видит, либо просто некую ошибку. По поводу этих ошибок тоже сколько не копались, всё равно ничего. ST-Link рабочий, подключение хорошее. Нужно залить код для управления маленьким движком, чтобы выдавало либо +5В, либо -5В.
      Такое ощущение, что этот контроллер уже просто не поддерживается многими программами.
      Может кто-нибудь из вас знает что можно сделать, или как правильно прошить этот аппарат? Потому что уже кучу роликов на ютубе пересмотрели, форумов перечитали, никак не выходит. Получилось только сделать, чтобы программа увидела STM-ку.
      Благодарю за помощь)
    • By leonid1908
      Проявление неисправности: полное молчание, никакой реакции... Нигде ничего об этом пульте нет, хотя... на али экспрессе есть такой пульт, ну и цена тоже есть....



    • By Михаил Карнаухов
      В общем, во встроенных библиотеках Proteus нет МК PIC12F635. И мне нужна какая-нибудь сторонняя библиотека, что бы там был этот МК
    • By Sergey Krugov
      Доброго времени суток дня и ночи!!! Я конечно понимаю, что за это время уже успел надоесть вам, но прошу откликнуться к просьбе о помощи. 
      Проблема заключается в следующем:

      В данной схеме используется Atmega8
      Фьюзы:

      При симуляции схемы происходит следующее:


      А дальше ничего не происходит. 
      Возникает также проблема такого рода: 

      Почему-то Протеус ругается на это,  но при удалении этой строки из кода в Протеусе, схема начинает вроде бы работать, но дальше setup на ЖКИ ничего не появлется. Очень прошу помочь понять, что не так. Мб на железе это всё бы и работало. Как разрешить эту проблему в программе?
      Я буду очень благодарен всем, кто откликнется на мою проблему. Надеюсь вы не оставите это без внимания. Очень надеюсь...
×
×
  • Create New...