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

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


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

unsigned int Encoder(unsigned int EncData)
{
	static unsigned char EncState; //предыдущее состояние энкодера
	static unsigned char New;	//новое состояние энкодера
	New = PINB & 0x03;	// Берем текущее значение и сравниваем со старым	
	// Смотря в какую сторону оно поменялось увеличиваем или уменьшаем счетный регистр
	
	switch(EncState)
	{
		case 2:
		{
			if(New == 3) EncData++;
			if(New == 0) EncData--;
			break;
		}
		
		case 0:
		{
			if(New == 2) EncData++;
			if(New == 1) EncData--;
			break;
		}
		case 1:
		{
			if(New == 0) EncData++;
			if(New == 3) EncData--;
			break;
		}
		case 3:
		{
			if(New == 1) EncData++;
			if(New == 2) EncData--;
			break;
		}
	}
	
	EncState = New;		// Записываем новое значение
	return New;
}
int main(void)
{
	unsigned int inst_volt=512;
    lcd_poz(0);
    lcd_chisla(Encoder(inst_volt));

хочу с помощью энкодера изменять значение inst_volt. но показывает нули.

где я накосячил?

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

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

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

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

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для заряда литий-железофосфатных (LiFePO4) аккумуляторов

Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей. Подробнее>>

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

17 часов назад, Дмитрий Мамедиев сказал:

хочу с помощью энкодера изменять....

где я накосячил?

Вообще то у квадратурного энкодера ШЕСТНАДЦАТЬ возможных состояний, образующихся из  двух текущих бит входов энкодера и двух предыдущих.

Из 16-ти состояний  только ДВЕНАДЦАТЬ не являются ошибочными. Остальные некорректны. По четыре состояния (из 12) относятся к  каждому из ТРЕХ вариантов: инкремент, декремент, отсутствие счета. По каждому из трех этих корректных состояний нужно переписывать текущее состояние в предыдущее. По ошибочным никаких действий делать вообще не требуется (включая перезапись).

Кроме всего этого нужно ФИЛЬТРОВАТЬ дребезг механического энкодера. ДО ОБРАБОТКИ состояний.

Таблица машины состояний энкодера:

 

Снимок.PNG

戦う前に相手のベルトの色に注目

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

В 16.04.2019 в 12:56, ruhi сказал:

Программа должна делать то что задумано!

Давно так не смеялся. Покажите мне хотябы одну программу которая соответствует этому критерию. Нет таких, кроме учебных примеров размером не более страницы.

 

В 16.04.2019 в 15:08, ARV сказал:

Вот я сейчас привду пример кода, а вы мне скажите, есть ли там ошибка и в какой строке (т.е. выполните роль компилятора)

Это не работа компилятора. Отлов таких ошибок - удел статического анализатора. КОмпилятору пофиг как и с какими числами работать, текст исходного кода программы - это для человека. Который ошибается. И нет ни одной программы в которых не было бы ошибок.

 

В 16.04.2019 в 12:56, ruhi сказал:

Так вы делите ошибки на те от которых надо избавляться, и те от которых избавляться не надо?

От всех ошибок надо избавляться, но дял каждого вида ошибок эффективны разные методы и подходы. Быть внимательным и не делать ошибок - это тоже подход, довольно универсальный но крайне неэффективный. Поэтому люди посмтоянно придумывают как бы сделать так чтобы ошибки вообще не возникали или быстро становились фатальными, которые не обнаружить сложно.

Учение - изучение правил. Опыт - изучение исключений.

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

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

Отлов таких ошибок - удел статического анализатора.

Давайте как-то отделять мух от котлет.  Слово "должен" неприменимо ни к компилятору, ни к анализатору, ни к чему бы то нибыло еще, кроме программиста. Много статических анализаторов в знаете, которые применяются в среде любителе МК? По-моему, не стоит притягивать за уши все, что кажется правильным и красивым.

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

Покажите мне хотябы одну программу которая соответствует этому критерию

Опять обобщаете? Все мои программы делают то, что я задумал - этого вам достаточно? И среди них крайне мало таких, чтобы умещались "на одну страницу".

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

От всех ошибок надо избавляться

Опять... Кому надо? Программисту-профессионалу, у которого в KPI указано, что отсутствие warning в компиляции дает плюс в карму - да, надо. А МНЕ, например, надо ли избавляться от всех-всех-всех warning-ов? Например, от самого ндоедливого "в операторе switch не все комбинации переменной отслеживаются" (т.е. про отсутствие метки default)? 

Ну и вообще говоря, ошибок в неверном использовании макросов нет от слова вообще...

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

13 часа назад, Alexeyslav сказал:

Давно так не смеялся. Покажите мне хотябы одну программу которая соответствует этому критерию.

Ну да! Типа делаем утюг, получается холодильник! Все же нормально - получилось ЖЕ (чо ТА) !

Можно только позавидовать веселости вашего бытия!

Можно сделать все! Но чем больше можно, тем больше нельзя!

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

В 16.04.2019 в 12:56, ruhi сказал:

Программа должна делать то что задумано!

Всеми битами за! и не важно что у тебя листинг два километра, лишь бы памяти хватило))))

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

14 минуты назад, Геннадий сказал:

В двух километрах листинга, может срываться два килограмма багов. Или не важно?:)

Если программа работает как задумано с багами, значит так задумано:D

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

52 минуты назад, Геннадий сказал:

может срываться два килограмма багов

Тут ведь как? Если баг не словил - бага нет. Это не суслик, который есть, даже если его не видно. С багами иначе: не видно, значит, нет.

Само собой, баги надо устранять. Баг - это как раз поведение программы не такое, как задуманное. А задумывается, обычно, поведение программы в каких-то определенных ограничительных рамках, при выходе за которые МОГУТ быть баги. И в любительстве это вполне нормально.

Например, термостабилизаор для инкубатора. Мы вполне можем считать, что он будет функционировать при показаниях дтчика температуры в пределах 36-40 градусов (я точно не помню, но это не важно для примера). Закладывать в программе контроль этих пределов - хорошо, но не обязательно, ибо если температура достигла этих границ - выводок цыплят погиб однозначно.

Так вот, если терморегулятор не будет отключать нагрев при температуре 41 градус или наоборот, включать его, если она опустилась до 35, это не будет багом... Это будет фича :) 

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

не хотите вы в ветке по энкодерам отвечать, значит вернусь сюда. нацарапал я вот такой код

ISR(INT0_vect)//для atmega328 если появился сигнал на int0  PD2
{
	if (PINB&(1<<7))//то если на PB7 появилась 1 (крутим влево)
	{
		EncData++;
	}
	if (!(PINB&(1<<7)))//если на PB7 0 (крутим вправо)
	{
		EncData--;
	}
	_delay_ms(20);// антидребезг
	EIFR=(1<<INT0);//сбрасываем флаг прерывания 
}

но как мне в него передавать в качестве EncData разные переменные? по типу как в функцию, я хочу в одном случае в качестве EncData передавать одну переменную в другом случае другую

unsigned int prerivania (unsigned int EncData)
{
	////
}

 

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

7 минут назад, Дмитрий Мамедиев сказал:

нацарапал я вот такой код

Я же вам дал код, посмотрите разберитесь исходник можно в инете найти. Сделайте на таймере тогда не нужно будет ненужные _delay ставить против дребезга.

 

13 минуты назад, Дмитрий Мамедиев сказал:

но как мне в него передавать в качестве EncData разные переменные?

Ну и в основном цикле я вам показал через указатель очень хорошо получается.

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

Atmega328p имеет прерывания от смены уровня на входах "Pin Change Interrupt", поэтому нет необходимости постоянно дублировать алгоритм только на INT0. Это на будущее...

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

1 минуту назад, Геннадий сказал:

нет необходимости постоянно дублировать алгоритм только на INT0. Это на будущее...

сегодня с этим разобрался. но после у меня будет другой мк. которого нет в протеусе

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

Только что, Дмитрий Мамедиев сказал:

но как мне в него передавать в качестве EncData разные переменные?

У вас какая-то путаница: что куда вы собрались передавать? Обработчик прерывания у вас УЖЕ использует ГЛОБАЛЬНУЮ volatile-переменную для счета, вот с нею вы и должны работать. Эта переменная у вас должна показывать дельту (т.е. приращение) любой иной переменной, которую вы захотите впоследствии при помощи энкодера менять. Например, так: voltage += EncData (после этого EncData надо обнулить). Лучше всего это делать отдельной функцией, но можно и просто руками:

// руками

voltage += EncData; EncData = 0;

// функцией, чтобы однообразно менять любые переменные

int change_by_encoder(int var){
	int result = var += EncData;
	EncData = 0;
	return result;
}

// пользоваться функцией так:
voltage = change_by_encoder(voltage);

Для простоты я бы очень настоятельно советовал определить EncData так: volatile int8_t EncData; чтобы не париться с атомарным доступом к ней.

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

1 час назад, Дмитрий Мамедиев сказал:

но как мне в него передавать в качестве EncData разные переменные? по типу как в функцию, я хочу в одном случае в качестве EncData передавать одну переменную в другом случае другую

А чем отличается чтение одной переменной от чтения другой ? Типы разные, что-ли ? Или что ?

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

А чем отличается чтение одной переменной от чтения другой ? Типы разные, что-ли ? Или что ?
Нет. Нужно управлять напряжением а в случае нажатия на ручку, изменять ток.
Ссылка на комментарий
Поделиться на другие сайты

2 часа назад, Дмитрий Мамедиев сказал:

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

И что ? А для чего разные переменные то ? Чем будет отличаться чтение одной общей переменной, от двух разных ?

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

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

И что ?

пишем функцию int funk (char value) далее когда ее используем передаем в нее значение которое нужно изменить

funk (volt)

funk(amper)

а с обработчиком ISR(INT0_vect) так не прокатит.

выходит нужно для volt и amper писать отдельно?

 

кстати вот такую ошибку пишет: 
Error        static declaration of '__vector_1' follows non-static declaration  

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

Только что, Дмитрий Мамедиев сказал:

пишем функцию

Я вам привел пример того, как "пишем функцию" и как потом ею пользуемся. Не читали, что ли?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

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

@Дмитрий Мамедиев , Вы не вникаете в суть ответов. Только поверхностно.
Вот есть у Вас 2 куска кода, в которых Вы считываете 2 разные переменные, модифицируемые где-то там в одном месте. Чем будут такие чтения отличаться от чтения одной единственной переменной, модифицируемой в том же самом месте ?

Отвечу сразу за Вас - НИЧЕМ ! Вы наживаете гемор себе на "мягкое место" ...

А если всё-таки Вы пришли к такому варианту, то Вы зашли в какой-то непонятный и запутанный тупик. Пересмотрите логику и алгоритм своей программы.

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

@Дмитрий Мамедиев , и ещё. Опрашивать энкодер через внешние прерывания - мазохизм. Такой же, как и опрашивать кнопки по внешним прерываниям.
Делать доли-микросекундный отклик от устройств, которые физически работают на миллисекунды (а для человека - вообще десятые доли секунды) - ананизм. Как зубы лечить через .опу.

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

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

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

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

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

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

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

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

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

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

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

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