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

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


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

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. но показывает нули.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 

Снимок.PNG

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

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

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

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

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

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

В 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 пользователей онлайн

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

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